@wrongstack/core 0.275.0 → 0.276.2
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/{agent-bridge-D9JkPvJ0.d.ts → agent-bridge-D7A-eu3C.d.ts} +1 -1
- package/dist/{agent-subagent-runner-CArSFKFl.d.ts → agent-subagent-runner-CEuw4ATz.d.ts} +16 -10
- package/dist/{brain-DCkB5_e7.d.ts → brain-BLOyN5ZP.d.ts} +127 -1
- package/dist/{compactor-CzSvxM1g.d.ts → compactor-DcBpaJsI.d.ts} +1 -1
- package/dist/{config-BzFRKkg7.d.ts → config-Bf5mj-ad.d.ts} +20 -2
- package/dist/{context-BrLe8pJy.d.ts → context-CLnUMW5g.d.ts} +40 -2
- package/dist/coordination/index.d.ts +43 -24
- package/dist/coordination/index.js +849 -648
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +28 -28
- package/dist/defaults/index.js +1636 -845
- package/dist/defaults/index.js.map +1 -1
- package/dist/execution/index.d.ts +16 -16
- package/dist/execution/index.js +218 -49
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/prompt-enhancer.d.ts +1 -1
- package/dist/extension/index.d.ts +7 -7
- package/dist/extension/index.js.map +1 -1
- package/dist/{global-mailbox-CXkugtNQ.d.ts → global-mailbox-Iqfkgmwu.d.ts} +3 -3
- package/dist/{goal-store-DUwdbdoY.d.ts → goal-store-DGb6b5Ed.d.ts} +1 -1
- package/dist/hq/index.d.ts +6 -6
- package/dist/hq/index.js +178 -75
- package/dist/hq/index.js.map +1 -1
- package/dist/{index-CtlizLTK.d.ts → index-Cn0NOshr.d.ts} +10 -5
- package/dist/{index-neOCEy6q.d.ts → index-L4RZN9jJ.d.ts} +2 -2
- package/dist/index.d.ts +56 -48
- package/dist/index.js +2789 -1546
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +6 -6
- package/dist/infrastructure/index.js +26 -7
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/kernel/index.d.ts +20 -12
- package/dist/kernel/index.js +55 -9
- package/dist/kernel/index.js.map +1 -1
- package/dist/{mailbox-types-_7gaY0Rl.d.ts → mailbox-types-DTl7bRH3.d.ts} +3 -1
- package/dist/{mcp-servers-MLL6bMlv.d.ts → mcp-servers-CuZGf9fI.d.ts} +4 -4
- package/dist/models/index.d.ts +5 -5
- package/dist/models/index.js +223 -139
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-CrkcxQ-g.d.ts → models-registry-8XOdxWQu.d.ts} +16 -1
- package/dist/{multi-agent-coordinator-Dc_HuG9p.d.ts → multi-agent-coordinator-CiRtKVTk.d.ts} +8 -1
- package/dist/{null-fleet-bus-BMZwMin7.d.ts → null-fleet-bus-d9G-bVy9.d.ts} +26 -22
- package/dist/observability/index.d.ts +2 -2
- package/dist/{path-resolver-uVK4BatM.d.ts → path-resolver-BhIb6mtd.d.ts} +8 -3
- package/dist/{permission-CJR1qfOi.d.ts → permission-BCbQDR2s.d.ts} +1 -1
- package/dist/{permission-policy-DLVKKk4w.d.ts → permission-policy-C0ikndX_.d.ts} +2 -18
- package/dist/{pipeline-BYR-Vdau.d.ts → pipeline-Dl6XbfE7.d.ts} +10 -6
- package/dist/{provider-model-resolve-iREK_1lG.d.ts → provider-model-resolve-B70epO19.d.ts} +3 -3
- package/dist/{provider-runner-i7SQXZuC.d.ts → provider-runner-DZ808MSM.d.ts} +3 -3
- package/dist/{retry-policy-BmY5ooh3.d.ts → retry-policy-Dt3_z8Aj.d.ts} +1 -1
- package/dist/sdd/index.d.ts +19 -10
- package/dist/sdd/index.js +411 -240
- package/dist/sdd/index.js.map +1 -1
- package/dist/{secret-vault-C9leEMzr.d.ts → secret-vault-BUJ2d1gB.d.ts} +1 -1
- package/dist/security/index.d.ts +5 -5
- package/dist/security/index.js +30 -6
- package/dist/security/index.js.map +1 -1
- package/dist/{selector-qjpee9BF.d.ts → selector-BCkWgdwy.d.ts} +1 -1
- package/dist/{session-event-bridge-m7y--I-H.d.ts → session-event-bridge-CMvIO59_.d.ts} +1 -1
- package/dist/{session-reader-BjLH4V9n.d.ts → session-reader-C8aiChUu.d.ts} +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +68 -30
- package/dist/storage/index.js +839 -528
- package/dist/storage/index.js.map +1 -1
- package/dist/{strategy-compactor-C2bmlWYg.d.ts → strategy-compactor-DI1OHVbB.d.ts} +10 -10
- package/dist/{todos-checkpoint-oDS9IBNS.d.ts → todos-checkpoint-Ddd2CGr0.d.ts} +56 -9
- package/dist/{tool-executor-D4YdaJ-M.d.ts → tool-executor-Bmd5Ygoo.d.ts} +45 -10
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/types/index.d.ts +20 -20
- package/dist/types/index.js +331 -98
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +16 -3
- package/dist/utils/index.js +159 -83
- package/dist/utils/index.js.map +1 -1
- package/dist/{worktree-manager-A1Efnvs0.d.ts → worktree-manager-DBdl_5rs.d.ts} +4 -1
- package/instructions/agents/shadow-agent.md +3 -3
- package/instructions/coordination/director-preamble.md +3 -3
- package/instructions/modes/research-web.md +4 -4
- package/package.json +1 -1
- package/skills/research-web/SKILL.md +26 -26
- package/skills/research-web/SKILL.save.md +1 -1
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/blocks.ts","../../src/types/messages.ts","../../src/types/tool.ts","../../src/types/tool-markers.ts","../../src/utils/atomic-write.ts","../../src/utils/term.ts","../../src/utils/color.ts","../../src/utils/context-evidence.ts","../../src/utils/deep-merge.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/json-schema-validate.ts","../../src/utils/merge-models-payload.ts","../../src/utils/message-invariants.ts","../../src/utils/regex-guard.ts","../../src/utils/string.ts","../../src/utils/tool-subject.ts","../../src/utils/tool-wire-compact.ts","../../src/utils/token-estimate.ts","../../src/utils/tool-output-serializer.ts","../../src/utils/tool-result-render-mode.ts","../../src/utils/wstack-paths.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/types/config.ts","../../src/types/default-config.ts","../../src/types/secret-vault.ts","../../src/security/secret-vault.ts","../../src/infrastructure/logger.ts","../../src/infrastructure/token-counter.ts","../../src/types/memory.ts","../../src/execution/compaction-core.ts","../../src/execution/compactor.ts","../../src/infrastructure/path-resolver.ts","../../src/execution/regex-patterns.ts","../../src/execution/error-handler.ts","../../src/execution/retry-policy.ts","../../src/types/prompt.ts","../../src/types/prompt-registry.ts","../../src/types/design-kit.ts","../../src/security/secret-scrubber.ts","../../src/models/models-registry.ts","../../src/types/mode-prompts.ts","../../src/types/mode.ts","../../src/types/context-window.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/types/spec.ts","../../src/types/task-graph.ts","../../src/security/capabilities.ts","../../src/execution/tool-executor.ts","../../src/core/conversation-state.ts","../../src/core/context.ts","../../src/storage/session-reader.ts"],"names":["ToolErrorCategory","path","stat","resolve","open","isRecord","path3","randomBytes","path4","key","walk","fsp","oldVersion","newVersion","path5","fsp2","tokens","hasToolUse","os2","fs3","path7","fs4","readFileSync","path8","statSync","handlers","path9","fs5","randomUUID","path10","path11","fs6"],"mappings":";;;;;;;;;;AA2EO,SAAS,YAAY,CAAA,EAAiC;AAC3D,EAAA,OAAO,EAAE,IAAA,KAAS,MAAA;AACpB;AACO,SAAS,eAAe,CAAA,EAAoC;AACjE,EAAA,OAAO,EAAE,IAAA,KAAS,UAAA;AACpB;AACO,SAAS,kBAAkB,CAAA,EAAuC;AACvE,EAAA,OAAO,EAAE,IAAA,KAAS,aAAA;AACpB;AACO,SAAS,aAAa,CAAA,EAAkC;AAC7D,EAAA,OAAO,EAAE,IAAA,KAAS,OAAA;AACpB;AACO,SAAS,gBAAgB,CAAA,EAAqC;AACnE,EAAA,OAAO,EAAE,IAAA,KAAS,UAAA;AACpB;;;AC/DO,SAAS,SAAS,OAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,OAAA;AAC3E;AAEO,SAAS,OAAO,OAAA,EAA0C;AAC/D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAM,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAuB,IAAI,CAAA,CACvC,KAAK,EAAE,CAAA;AACZ;;;ACyNO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,mBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,mBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AALE,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;;;ACxOL,IAAM,qBAAA,GAAwB,CAAC,OAAA,EAAS,iBAAA,EAAmB,MAAM;ACPxE,eAAsB,WAAA,CACpB,UAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,GAAA,GAAWC,cAAQ,UAAU,CAAA;AACnC,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAASA,eAAS,UAAU,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAIhG,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAS,EAAA,CAAA,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,EAAQ,CAAA;AAAA,IACpF,CAAA,MAAO;AACL,MAAA,MAAS,aAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAS,EAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,IAAA,EAAK;AAAA,MAChB,CAAA,SAAE;AACA,QAAA,MAAM,GAAG,KAAA,EAAM;AAAA,MACjB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMC,KAAAA,GAAO,MAAS,EAAA,CAAA,IAAA,CAAK,UAAU,CAAA;AACrC,MAAA,IAAA,GAAOA,MAAK,IAAA,GAAO,GAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,MAAA,MAAS,EAAA,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,eAAA,CAAgB,KAAK,UAAU,CAAA;AASrC,IAAA,IAAI,IAAA,KAAS,KAAA,CAAA,IAAa,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS;AACtD,MAAA,IAAI;AACF,QAAA,MAAS,EAAA,CAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI;AACF,MAAA,MAAS,UAAO,GAAG,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAqEA,IAAM,sBAAA,uBAA6B,GAAA,CAAI,CAAC,SAAS,OAAA,EAAS,QAAA,EAAU,WAAW,CAAC,CAAA;AAEhF,eAAe,eAAA,CAAgB,MAAc,EAAA,EAA2B;AACtE,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AACpC,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI;AACF,MAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,MAAA;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAM,OAAQ,GAAA,EAA+B,IAAA;AAC7C,MAAA,IAAI,CAAC,QAAQ,CAAC,sBAAA,CAAuB,IAAI,IAAI,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,MAAA,EAAQ;AACrE,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,QAAQ,CAACC,QAAAA,KAAY,WAAWA,QAAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF;AACA,EAAA,MAAM,OAAA;AACR;;;ACtJA,IAAM,YAAY,MAAe,OAAO,YAAY,WAAA,IAAe,CAAC,CAAC,OAAA,CAAQ,MAAA;AAItE,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,SAAA,EAAU,IAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpD;AA4HA,SAAS,OAAA,CACP,GACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,KAAA,KAAU,YAAY,OAAO,KAAA;AAE1D,EAAY;AACV,IAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAMF;AAkDO,SAAS,QAAA,CACd,CAAA,EACA,MAAA,GAA6B,OAAA,CAAQ,MAAA,EAC5B;AACT,EAAA,OAAO,OAAA,CAAQ,GAAG,MAAM,CAAA;AAC1B;;;AC1NA,IAAM,aAAa,MAAe;AAChC,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,OAAO,KAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,GAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,WAAA,EAAY;AACrB,CAAA;AAEA,SAAS,QAAQ,KAAA,EAAoC;AACnD,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,EAAA,IAAI,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI,OAAO,KAAA;AAChC,EAAA,OAAO,CAAC,qBAAA,CAAsB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACjD;AAEA,IAAM,QAAQ,UAAA,EAAW;AAEzB,IAAM,IAAA,GACJ,CAACC,KAAAA,EAAc,KAAA,KACf,CAAC,CAAA,KACC,KAAA,GAAQ,CAAA,KAAA,EAAQA,KAAI,CAAA,CAAA,EAAI,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,CAAA,GAAM,CAAA;AAEzC,IAAM,KAAA,GAAQ;AAAA,EACnB,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EACpB,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACpB,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACnB,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACtB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACzB,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACpB,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACvB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACxB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5B,IAAA,EAAM,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EAC3B,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAI;AAC1B,CAAA;AC5BA,IAAM,gBAAA,GAAmB,GAAA;AAWlB,SAAS,0BAAA,GAAmD;AACjE,EAAA,OAAO;AAAA,IACL,cAAc,EAAC;AAAA,IACf,eAAe,EAAC;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,WAAW,EAAC;AAAA,IACZ,WAAW,EAAC;AAAA,IACZ,eAAe,EAAC;AAAA,IAChB,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AA6GO,SAAS,2BAA2B,GAAA,EAAsB;AAC/D,EAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,KAAA,CAAM,eAAe,IAAA,EAAM;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AACzC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AAChD,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,CACxC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAA,IAAY,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAU,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAC3F,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACd,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAC9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,KAAK,KAAA,GAAQ,CAAA,GAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,QACzC,KAAK,MAAA,GAAS,CAAA,GAAI,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA,GAAM;AAAA,OAC9C,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,GAAa,2BAAA,GAA8B,EAAA;AAC7D,MAAA,MAAM,MAAM,IAAA,CAAK,aAAA,GAAgB,CAAA,WAAA,EAAc,IAAA,CAAK,aAAa,CAAA,CAAA,GAAK,EAAA;AACtE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,OAAA,IAAW,MAAM,CAAA,EAAG,IAAI,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CACtB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,YAAY,CAAA,CAC7C,KAAA,CAAM,GAAG,CAAA;AACZ,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CACtB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,MAAM,CAAA,CACvC,KAAA,CAAM,EAAE,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,UAAA,EAAY,GAAG,UAAU,CAAA;AAC3C,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAO,IAAA,CAAK,YAAA,GAAe,CAAA,GAAA,EAAM,IAAA,CAAK,YAAY,CAAA,OAAA,CAAA,GAAY,EAAA;AACpE,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAC3F,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA,UAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACnG,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,KAAK,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,KAAK,OAAO,CAAA,EAAG,SAAS,CAAA,EAAG,WAAW,GAAG,IAAI,CAAA;AAAA,OACvG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,CAAc,KAAA,CAAM,EAAE,CAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAC5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,gBAAA,EAAkB,OAAO,MAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,GAAS,gBAAgB,CAAA,OAAA,CAAA;AACtF;AAMA,SAAS,eAAe,GAAA,EAAoC;AAC1D,EAAA,IAAI,CAAC,IAAI,eAAA,EAAiB;AACxB,IAAC,GAAA,CAA2D,kBAC1D,0BAAA,EAA2B;AAAA,EAC/B;AACA,EAAA,OAAO,GAAA,CAAI,eAAA;AACb;;;ACxMO,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EAC1C,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAOM,SAAS,iBAAiB,CAAA,EAAuB;AACtD,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,IAAA,IAAS,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAW,CAAA;AACxF;AA6EO,SAAS,SAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,GAA4B,EAAC,EACpB;AACT,EAAA,MAAM;AAAA,IACJ,kBAAA,GAAqB,cAAA;AAAA,IACrB,SAAA,GAAY,SAAA;AAAA,IACZ,YAAA,GAAe,IAAA;AAAA,IACf;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,kBAAA,KAAuB,iBAAiB,KAAA,GAAQ,IAAA;AAAA,EACzD;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,kBAAA,KAAuB,iBAAiB,KAAA,GAAQ,IAAA;AAAA,EACzD;AAIA,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,IACE,cAAc,mBAAA,IACd,gBAAA,CAAiB,IAAI,CAAA,IACrB,gBAAA,CAAiB,KAAK,CAAA,EACtB;AACA,MAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,GAAG,KAAK,CAAC,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,kBAAA,KAAuB,iBAAiB,KAAA,GAAQ,IAAA;AAAA,EACzD;AAGA,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,OAAO,kBAAA,KAAuB,iBAAiB,KAAA,GAAQ,IAAA;AAAA,EACzD;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,QAAA,GAAW,KAAA;AACjB,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,OAAA,EAAQ;AAElD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,IAAA,IAAI,YAAA,IAAgB,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,EAAG;AAEjD,IAAA,MAAM,QAAA,GAAW,IAAI,CAAC,CAAA;AACtB,IAAA,IACE,MAAM,IAAA,IACN,OAAO,MAAM,QAAA,IACb,CAAC,MAAM,OAAA,CAAQ,CAAC,KAChB,QAAA,KAAa,IAAA,IACb,OAAO,QAAA,KAAa,QAAA,IACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AAEA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,QAAA,EAAU,GAAG,OAAO,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAMtD,MAAA,IAAI,0BAAA,IAA8B,CAAC,gBAAA,CAAiB,CAAC,CAAA,EAAG;AACtD,QAAA,0BAAA,CAA2B,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA;AAAA,MACzD;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,QAAA,EAAU,GAAG,OAAO,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAG1B,MAAA,IACE,0BAAA,IACA,MAAM,OAAA,CAAQ,CAAC,KACf,CAAC,gBAAA,CAAiB,CAAC,CAAA,EACnB;AACA,QAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AAChE,QAAA,0BAAA,CAA2B,CAAA,EAAG,WAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,MACrD;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EAIF;AAEA,EAAA,OAAO,GAAA;AACT;;;AChMO,SAAS,eAAe,GAAA,EAAsB;AACnD,EAAA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACxD;;;ACFO,SAAS,aAAA,CAAiB,OAA6B,KAAA,EAAmB;AAC/E,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,MAAM,MAAM,IAAI,KAAA,CAAkD,8BAA8B,CAAA;AAChG,IAAA,GAAA,CAAI,IAAA,GAAO,oBAAA;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AACA,EAAA,OAAO,KAAA;AACT;;;ACWO,SAAS,qBAAA,CAAsB,OAAgB,MAAA,EAAsC;AAC1F,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,CAAC,CAAA;AACjC,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC3C;AAYA,IAAM,gBAAA,GAAmB,EAAA;AAEzB,SAAS,IAAA,CACP,KAAA,EACA,MAAA,EACAH,MAAAA,EACA,QACA,KAAA,EACM;AAKN,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAMA,MAAAA,IAAQ,QAAA;AAAA,MACd,OAAA,EAAS,yCAAyC,gBAAgB,CAAA,CAAA;AAAA,KACnE,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG;AACjD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAMA,MAAAA,IAAQ,QAAA;AAAA,QACd,OAAA,EAAS,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,OACtF,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAMA,MAAAA,IAAQ,QAAA;AAAA,QACd,SAAS,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAA,MAAA,EAAS,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,OAC7D,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,aAAA,CAAc,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AACvC,MAAA,IAAI,EAAE,OAAO,GAAA,CAAA,EAAM;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAASA,QAAM,GAAG,CAAA,EAAG,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,MACjF;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,MAAW,CAAC,KAAK,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAChE,QAAA,IAAI,OAAO,GAAA,EAAK;AACd,UAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,SAAA,EAAW,QAAA,CAASA,QAAM,GAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,IAAW,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,EAAO;AACnE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,CAAO,KAAA,EAAqB,CAAA,EAAGA,MAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,SAAS,SAAA,CAAU,OAAgB,IAAA,EAAuB;AACxD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA;AAAA,IAC1B,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACzD,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC5D,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,SAAA;AAAA,IAC1B,KAAK,MAAA;AACH,MAAA,OAAO,KAAA,KAAU,IAAA;AAAA,IACnB,KAAK,OAAA;AACH,MAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC5B,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,cAAc,CAAA,EAAqB;AAC1C,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,aAAa,CAAA,EAAoB;AACxC,EAAA,IAAI,CAAA,KAAM,MAAM,OAAO,MAAA;AACvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,OAAA;AAC7B,EAAA,OAAO,OAAO,CAAA;AAChB;AAEA,SAAS,QAAA,CAAS,QAAgB,GAAA,EAAqB;AACrD,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACzB;AAEA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,SAAa,CAAA,KAAM,CAAA;AAC3C,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,IAAA,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,EAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AAClC,IAAA,IAAI,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,KAAA;AAAA,MAAM,CAAC,MACf,SAAA,CAAW,CAAA,CAA8B,CAAC,CAAA,EAAI,CAAA,CAA8B,CAAC,CAAC;AAAA,KAChF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;AClIO,SAAS,kBAAA,CACd,MACA,OAAA,EACkB;AAClB,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,IAAA,GAAA,CAAI,EAAE,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA;AAAA,EAClC;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACtD,IAAA,MAAM,QAAA,GAAW,IAAI,EAAE,CAAA;AACvB,IAAA,GAAA,CAAI,EAAE,IAAI,QAAA,GAAW,aAAA,CAAc,UAAU,UAAU,CAAA,GAAI,cAAc,UAAU,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAyB,OAAA,EAA+C;AAC7F,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,EACvB;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACjE,IAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,IAAA,MAAA,CAAO,GAAG,IAAI,QAAA,GAAW,UAAA,CAAW,UAAU,OAAO,CAAA,GAAI,EAAE,GAAG,OAAA,EAAQ;AAAA,EACxE;AACA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA;AAAA,IAEH,GAAG,cAAA,CAAe;AAAA,MAChB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,IACD;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CAAW,MAAsB,OAAA,EAAyC;AACjF,EAAA,MAAM,MAAA,GAAyB,EAAE,GAAG,IAAA,EAAM,GAAG,OAAA,EAAQ;AAGrD,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAO;AAC/B,IAAA,MAAA,CAAO,QAAQ,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,QAAQ,KAAA,EAAM;AAAA,EACnD;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM;AAC7B,IAAA,MAAA,CAAO,OAAO,EAAE,GAAG,KAAK,IAAA,EAAM,GAAG,QAAQ,IAAA,EAAK;AAAA,EAChD;AACA,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,OAAA,CAAQ,UAAA,EAAY;AACzC,IAAA,MAAA,CAAO,aAAa,EAAE,GAAG,KAAK,UAAA,EAAY,GAAG,QAAQ,UAAA,EAAW;AAAA,EAClE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAAyC;AAC9D,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA,EAAG;AACrD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,EACvB;AACA,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAO;AACxB;AAGA,SAAS,eAAkD,GAAA,EAAoB;AAC7E,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,GAAA,CAAI,CAAY,CAAA,GAAI,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT;;;ACrEO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,qBAA+B,EAAC;AACtC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,MAAiB,EAAC;AAExB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,QAAA,CAAS,CAAC,CAAC,CAAA;AAC1C,IAAA,IAAI,GAAA,GAAM,QAAA;AAEV,IAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,CAAC,MAAA,KAAW;AAC3C,QAAA,MAAM,OAAuB,EAAC;AAC9B,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,KAAA,CAAM,SAAS,UAAA,IAAc,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACvD,YAAA,eAAA,CAAgB,IAAA,CAAK,MAAM,EAAE,CAAA;AAC7B,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACjB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,GAAA;AAAA,IACpB;AAEA,IAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,UAAU,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,CAAC,MAAA,KAAW;AAC3C,QAAA,MAAM,OAAuB,EAAC;AAC9B,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,KAAA,CAAM,SAAS,aAAA,IAAiB,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACnE,YAAA,kBAAA,CAAmB,IAAA,CAAK,MAAM,WAAW,CAAA;AACzC,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACjB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,GAAA;AAAA,IACpB;AAEA,IAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACvB,MAAA,eAAA,EAAA;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACd;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAU,GAAA,GAAM,QAAA;AAAA,IAC1B,MAAA,EAAQ,EAAE,OAAA,EAAS,eAAA,EAAiB,oBAAoB,eAAA;AAAgB,GAC1E;AACF;AAEA,SAAS,WAAW,GAAA,EAAmC;AACrD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAyB,CAAA,CAAE,SAAS,UAAU,CAAA;AAChF;AAEA,SAAS,cAAc,GAAA,EAAmC;AACxD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAA4B,CAAA,CAAE,SAAS,aAAa,CAAA;AACtF;AAEA,SAAS,WAAW,GAAA,EAAuC;AACzD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,GAAA,EAAK,IAAA,KAAS,WAAA,EAAa,OAAO,GAAA;AACtC,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,GAAG,CAAA,EAAG;AACtC,IAAA,IAAI,MAAM,IAAA,KAAS,UAAA,EAAY,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAAuC;AAC5D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,GAAA,EAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,GAAA;AACjC,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,GAAG,CAAA,EAAG;AACtC,IAAA,IAAI,MAAM,IAAA,KAAS,aAAA,EAAe,GAAA,CAAI,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAA0C;AAC/D,EAAA,OAAO,GAAA,IAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,UAAU,EAAC;AAC5D;AAEA,SAAS,UAAA,CACP,KACA,EAAA,EACgB;AAChB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,GAAA;AACxC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,GAAA,CAAI,OAAA,CAAQ,UAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AACxF,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK;AACjC;AAEA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,OAAO,IAAI,OAAA,KAAY,QAAA,SAAiB,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA;AAC1E,EAAA,OAAO,GAAA,CAAI,QAAQ,MAAA,KAAW,CAAA;AAChC;;;ACpHA,IAAM,eAAA,GAAkB,GAAA;AAGxB,IAAM,kBAAA,GAA4C;AAAA,EAChD,0BAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAYO,SAAS,gBAAA,CAAiB,SAAiB,KAAA,EAA4C;AAC5F,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,0BAAA,EAA2B;AAAA,EACzD;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,kBAAA,EAAmB;AAAA,EACjD;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,eAAA,EAAiB;AACpC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,gBAAA,EAAmB,eAAe,CAAA,WAAA,CAAA,EAAc;AAAA,EAC9E;AACA,EAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA,EAAG;AACpB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EACE;AAAA,OACJ;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,IAAI,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,KAC/C;AAAA,EACF;AACF;;;ACjDO,SAAS,QAAA,CAAS,GAAW,GAAA,EAAqB;AACvD,EAAA,OAAO,CAAA,CAAE,MAAA,IAAU,GAAA,GAAM,CAAA,GAAI,CAAA,EAAG,EAAE,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,MAAA,CAAA;AACrD;;;ACVA,IAAM,mBAAA,GAAsB,UAAA;AAErB,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,OAAO,MAAM,OAAA,CAAQ,mBAAA,EAAqB,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AACjE;AAEO,SAAS,qBAAqB,KAAA,EAAuB;AAC1D,EAAA,OAAO,iBAAA,CAAkB,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AACpD;AAEO,SAAS,iBAAiB,UAAA,EAA6B;AAC5D,EAAA,OAAO,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,OAAA;AAC1E;AAEO,SAAS,mBAAA,CACd,QAAA,EACA,KAAA,EACA,UAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,EAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAU,CAAA;AAC5B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,iBAAiB,UAAU,CAAA,GAAI,qBAAqB,KAAK,CAAA,GAAI,kBAAkB,KAAK,CAAA;AAAA,IAC7F;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AAC1D,IAAA,OAAO,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,IAAA,OAAO,oBAAA,CAAqB,IAAI,IAAI,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,QAAA,EAAU;AAC/B,IAAA,OAAO,iBAAA,CAAkB,IAAI,GAAG,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,IAAA,OAAO,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;;;ACrBA,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,4BAAA,GAA+B,GAAA;AAErC,IAAM,YAAA,uBAAmB,OAAA,EAA2C;AAU7D,SAAS,4BAAA,CACd,IAAA,EACA,IAAA,GAA4C,EAAC,EAClB;AAC3B,EAAA,MAAM,iBAAA,GACJ,IAAA,CAAK,mBAAA,KAAwB,MAAA,IAAa,KAAK,yBAAA,KAA8B,MAAA;AAC/E,EAAA,IAAI,iBAAA,IAAqB,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,EAAM;AAClE,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAEA,EAAA,MAAM,OAAA,GAAqC;AAAA,IACzC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,MACX,KAAK,WAAA,IAAe,EAAA;AAAA,MACpB,KAAK,mBAAA,IAAuB;AAAA,KAC9B;AAAA,IACA,WAAA,EAAa,yBAAA;AAAA,MACX,IAAA,CAAK,WAAA;AAAA,MACL,KAAK,yBAAA,IAA6B;AAAA;AACpC,GACF;AAEA,EAAA,IAAI,iBAAA,IAAqB,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,EAAM;AAClE,IAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,yBAAA,CACd,MAAA,EACA,mBAAA,GAAsB,4BAAA,EACG;AACzB,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,EAAQ,mBAAmB,CAAA;AAC7D,EAAA,OAAO,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,GAAU,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE;AACxE;AAEA,SAAS,iBAAA,CAAkB,MAAe,mBAAA,EAAsC;AAC9E,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,SAAS,iBAAA,CAAkB,IAAA,EAAM,mBAAmB,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA;AAE5B,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,GAAA,KAAQ,aAAA,IAAiB,OAAO,KAAA,KAAU,QAAA,EAAU;AACtD,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,kBAAA,CAAmB,KAAA,EAAO,mBAAmB,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,iBAAA,CAAkB,KAAA,EAAO,mBAAmB,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,MAAc,QAAA,EAA0B;AAClE,EAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAClD,EAAA,IAAI,UAAA,CAAW,MAAA,IAAU,QAAA,EAAU,OAAO,UAAA;AAC1C,EAAA,IAAI,YAAY,EAAA,EAAI,OAAO,UAAA,CAAW,KAAA,CAAM,GAAG,QAAQ,CAAA;AAEvD,EAAA,MAAM,YAAY,QAAA,GAAW,EAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,UAAA,EAAY,SAAS,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,GAAI,QAAA,GAAW,SAAS,CAAA,CAAE,OAAA,EAAQ;AAC9E,EAAA,OAAO,GAAG,IAAI,CAAA,IAAA,CAAA;AAChB;AAEA,SAAS,oBAAA,CAAqB,MAAc,KAAA,EAAuB;AACjE,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAAA,IACvB,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAAA,IAC5B,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAAA,IAC5B,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAK;AAAA,GAC9B;AACA,EAAA,IAAI,eAAe,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAI,CAAA,SAAU,WAAA,GAAc,CAAA;AAElE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAC1C,EAAA,IAAI,SAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA,SAAU,KAAA,GAAQ,CAAA;AAErD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA;AACzC,EAAA,OAAO,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,IAAI,KAAA,GAAQ,KAAA;AACpD;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;;;AC7FA,IAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,aAAA,GAAgB,GAAA,KACxD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,aAAa,CAAC,CAAA;AAmBpD,IAAM,sBAAA,GAAyB,YAAA;AAC/B,IAAM,KAAA,uBAAY,GAAA,EAAsB;AAExC,SAAS,SAAS,GAAA,EAAuB;AACvC,EAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA,EAAK,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAE;AAC3C,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,KAAA;AACT;AA4BA,IAAM,cAAA,uBAAqB,GAAA,EAAoB;AAE/C,IAAM,sBAAgC,EAAC;AAEvC,IAAM,uBAAA,GAA0B,GAAA;AAEhC,SAAS,iBAAA,CAAkB,KAAa,OAAA,EAA0C;AAChF,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACvC,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,IAAI,cAAA,CAAe,QAAQ,uBAAA,EAAyB;AAGlD,IAAA,OAAO,eAAe,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,uBAAA,GAA0B,CAAC,CAAA,EAAG;AACpE,MAAA,MAAM,MAAA,GAAS,oBAAoB,KAAA,EAAM;AACzC,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAAA,IACxD;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAG,CAAA;AAC5B,EAAA,cAAA,CAAe,GAAA,CAAI,KAAK,QAAQ,CAAA;AAChC,EAAA,mBAAA,CAAoB,KAAK,GAAG,CAAA;AAC5B,EAAA,OAAO,QAAA;AACT;AAOO,SAAS,wBAAwB,KAAA,EAAwB;AAC9D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,mBAAmB,KAAK,CAAA;AAC9D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACzC;AAGA,EAAA,OAAO,iBAAA,CAAkB,KAAK,SAAA,CAAU,KAAK,GAAG,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAClF;AAKO,SAAS,yBAAyB,OAAA,EAAmC;AAC1E,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,mBAAmB,OAAO,CAAA;AAClE,EAAA,OAAO,iBAAA,CAAkB,KAAK,SAAA,CAAU,OAAO,GAAG,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA;AACpF;AAKO,SAAS,mBAAmB,IAAA,EAAsB;AACvD,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC;AAQO,SAAS,qBAAqB,GAAA,EAAsB;AACzD,EAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,UAAU,OAAO,kBAAA,CAAmB,IAAI,OAAO,CAAA;AAC1E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAQ,KAAA,IAAS,kBAAA,CAAmB,EAAE,IAAI,CAAA;AAAA,SAAA,IAChD,EAAE,IAAA,KAAS,UAAA,EAAY,KAAA,IAAS,uBAAA,CAAwB,EAAE,KAAK,CAAA;AAAA,SAAA,IAC/D,EAAE,IAAA,KAAS,aAAA,EAAe,KAAA,IAAS,wBAAA,CAAyB,EAAE,OAAO,CAAA;AAAA,SACzE,KAAA,IAAS,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA;AACT;AAaO,SAAS,sBAAsB,QAAA,EAAsC;AAC1E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,IAAY,CAAA,CAAE,aAAa,CAAA,EAAG;AACxD,MAAA,KAAA,IAAS,CAAA,CAAE,UAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,IAAS,qBAAqB,CAAC,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,sBAAsB,IAAA,EAI3B;AAET,EAAA,MAAM,SAAU,IAAA,CAAgD,aAAA;AAChE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,GAAS,GAAG,OAAO,MAAA;AAErD,EAAA,MAAM,OAAA,GAAU,6BAA6B,IAAI,CAAA;AACjD,EAAA,OACE,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,GAC5B,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA,GACtC,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AAE1D;AAqBO,SAAS,qBAAA,CACd,QAAA,EACA,YAAA,EACA,KAAA,EACA,iBAAyB,sBAAA,EACF;AAEvB,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,cAAA,GAAiB,mBAAmB,QAAQ,CAAA;AAAA,EAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAClC,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,aAAa,CAAA,EAAG;AAIzD,QAAA,MAAM,SAAU,CAAA,CAA0C,UAAA;AAC1D,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,GAAS,CAAA,EAAG;AAC5C,UAAA,cAAA,IAAkB,MAAA;AAClB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAW,CAAA,CAA2B,OAAA;AAC5C,QAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,UAAA,cAAA,IAAkB,mBAAmB,OAAO,CAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjC,UAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,YAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,cAAA,IAAK,CAAA,CAAoC,SAAS,MAAA,EAAQ;AACxD,gBAAA,cAAA,IAAkB,kBAAA,CAAoB,EAAuB,IAAI,CAAA;AAAA,cACnE,CAAA,MAAO;AACL,gBAAA,cAAA,IAAkB,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,cACxD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,YAAA,GAAe,mBAAmB,YAAY,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AACtC,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,IACE,OAAO,CAAA,KAAM,QAAA,IACb,MAAM,IAAA,IACL,CAAA,CAAoC,SAAS,MAAA,EAC9C;AACA,QAAA,YAAA,IAAgB,kBAAA,CAAoB,EAAuB,IAAI,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,WAAA,IAAe,sBAAsB,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,YAAA,GAAe,WAAA;AAK9C,EAAA,QAAA,CAAS,cAAc,EAAE,OAAA,GAAU,KAAA;AAEnC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,cAAA;AAAA,IACV,YAAA,EAAc,YAAA;AAAA,IACd,KAAA,EAAO,WAAA;AAAA,IACP;AAAA,GACF;AACF;;;AC3QA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,iBAAA,GAAoB,EAAA;AAI1B,IAAM,YAAA,GAAe,oBAAA;AAEd,SAAS,0BAAA,CAA2B,IAAA,GAAoC,EAAC,EAAG;AACjF,EAAA,MAAM,QAAA,GAAW,KAAK,0BAAA,IAA8B,GAAA;AAEpD,EAAA,SAAS,SAAA,CAAU,KAAA,EAAgB,OAAA,GAAsC,EAAC,EAAW;AACnF,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAI/E,MAAA,IAAI,OAAA,CAAQ,MAAM,SAAA,EAAW;AAC3B,QAAA,IAAI;AACF,UAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,QACpD,CAAA,CAAA,MAAQ;AAAA,QAGR;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA,CAAQ,QAAA,EAAU,KAAA,EAAsB,QAAQ,KAAK,CAAA;AACtF,QAAA,IAAI,OAAA,KAAY,QAAW,OAAO,OAAA;AAClC,QAAA,OAAO,uBAAA,CAAwB,OAAA,CAAQ,QAAA,EAAU,KAAoB,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,UAAW,KAAA,EAAmC;AAChD,QAAA,MAAM,IAAK,KAAA,CAAkC,IAAA;AAC7C,QAAA,OAAO,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,KAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MAClE;AACA,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,OAAO,KAAK,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,SAAS,UAAA,CAAW,MAAc,eAAA,EAA8D;AAC9F,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,IAAA,EAAM,4CAAA,EAA8C,SAAA,EAAW,CAAA,EAAE;AAAA,IAC5E;AACA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,eAAA,GAAkB,SAAA,EAAU;AAAA,IACxD;AACA,IAAA,MAAM,MAAA,GAAS;AAAA,iBAAA,EAAiB,YAAY,eAAe,CAAA;AAAA,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AACpD,IAAA,MAAM,YAAY,eAAA,GAAkB,WAAA;AACpC,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,OAAO,EAAE,IAAA,EAAM,4CAAA,EAA8C,SAAA,EAAW,CAAA,EAAE;AAAA,IAC5E;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,IAAI,CAAA;AAC5C,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAA,EAAW,CAAA,EAAE;AAAA,EAC5D;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,UAAA,EAAY,QAAA,EAAS;AAC3C;AAEA,SAAS,gBAAA,CAAiB,QAAA,EAAkB,GAAA,EAAkB,KAAA,EAAoC;AAChG,EAAA,IAAI,aAAa,MAAA,IAAU,OAAO,GAAA,CAAI,MAAM,MAAM,QAAA,EAAU;AAC1D,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,YAAA;AAAA,QACE,CAAA,MAAA,EAAS,gBAAgB,KAAA,EAAO,MAAM,KAAK,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA,IAAK,WAAW,CAAA,CAAA;AAAA,QAClF;AAAA,UACE,MAAA,EAAQ,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA;AAAA,UACvC,KAAA,EAAO,eAAA,CAAgB,KAAA,EAAO,OAAO,CAAA;AAAA,UACrC,WAAA,EAAa,IAAI,aAAa,CAAA;AAAA,UAC9B,QAAA,EAAU,IAAI,UAAU,CAAA;AAAA,UACxB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,UAC1B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,UACpB,IAAA,EAAM,IAAI,MAAM;AAAA;AAClB,OACF;AAAA,MACA,IAAI,MAAM;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,KAAA,CAAM,QAAQ,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG;AACxD,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,SAAS,CAAA;AAC/C,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,CAAA,MAAA,EAAS,eAAA,CAAgB,OAAO,SAAS,CAAA,IAAK,WAAW,CAAA,CAAA,EAAI;AAAA,QACxE,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAAA,QACnC,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAAA,QACnC,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,aAAa,CAAA;AAAA,QAC1C,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,QAC1B,IAAA,EAAM,IAAI,MAAM;AAAA,OACjB,CAAA;AAAA,MACD,iBAAA,CAAkB,OAAA,EAAS,eAAA,CAAgB,KAAA,EAAO,aAAa,CAAC;AAAA,KACjE,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG;AACvD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC3C,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,OAAA,EAAS;AAAA,QACpB,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,QACtB,QAAA,EAAU,IAAI,UAAU,CAAA;AAAA,QACxB,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,OAAA,EAAS,IAAI,SAAS;AAAA,OACvB,CAAA;AAAA,MACD,OAAO,GAAA,CAAI,SAAS,CAAA,KAAM,QAAA,GAAW,CAAA;AAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,GAAK,MAAA;AAAA,MACrE,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA;AAAA,EAAW,gBAAA,CAAiB,KAAK,CAAC,CAAA,CAAA,GAAK;AAAA,KAC3D,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG;AACtD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC3C,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,YAAA;AAAA,QACE,GAAG,QAAQ,CAAA,EAAA,EAAK,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA,IAAK,eAAA,CAAgB,KAAA,EAAO,OAAO,KAAK,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA,IAAK,EAAE,GAAG,IAAA,EAAK;AAAA,QACpI;AAAA,UACE,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAAA,UACnC,OAAO,KAAA,CAAM,MAAA;AAAA,UACb,SAAA,EAAW,IAAI,WAAW;AAAA;AAC5B,OACF;AAAA,MACA,gBAAA,CAAiB,OAAO,YAAY;AAAA,KACrC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,OAAO,GAAA,CAAI,MAAM,MAAM,QAAA,EAAU;AAC1D,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,YAAA;AAAA,QACE,CAAA,MAAA,EAAS,YAAY,GAAA,EAAK,MAAM,KAAK,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA,IAAK,OAAO,CAAA,CAAA;AAAA,QAC9E;AAAA,UACE,WAAA,EAAa,IAAI,aAAa,CAAA;AAAA,UAC9B,UAAA,EAAY,IAAI,YAAY,CAAA;AAAA,UAC5B,SAAA,EAAW,IAAI,WAAW;AAAA;AAC5B,OACF;AAAA,MACA,IAAI,MAAM;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,OAAA,IAAW,OAAO,GAAA,CAAI,SAAS,MAAM,QAAA,EAAU;AAC9D,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,YAAA;AAAA,QACE,CAAA,OAAA,EAAU,YAAY,GAAA,EAAK,KAAK,KAAK,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,OAAO,CAAA,CAAA;AAAA,QAC7E;AAAA,UACE,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,UACpB,YAAA,EAAc,IAAI,cAAc;AAAA;AAClC,OACF;AAAA,MACA,IAAI,SAAS;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,SAAA,IAAa,KAAA,CAAM,QAAQ,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG;AAC3D,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAS,CAAA,CAAE,OAAOI,SAAQ,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAsC;AAAA,MAC1C,aAAa,SAAA,EAAW;AAAA,QACtB,cAAA,EAAgB,IAAI,gBAAgB,CAAA;AAAA,QACpC,kBAAA,EAAoB,IAAI,oBAAoB,CAAA;AAAA,QAC5C,OAAA,EAAS,IAAI,SAAS;AAAA,OACvB;AAAA,KACH;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAA,EAAG;AACpD,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,YAAA,CAAa;AAAA,UACX,aAAa,CAAA,MAAA,EAAS,WAAA,CAAY,GAAG,MAAM,CAAA,IAAK,WAAW,CAAA,CAAA,EAAI;AAAA,YAC7D,YAAA,EAAc,EAAE,cAAc;AAAA,WAC/B,CAAA;AAAA,UACD,OAAO,CAAA,CAAE,MAAM,MAAM,QAAA,GAAW,CAAA,CAAE,MAAM,CAAA,GAAI;AAAA,SAC7C;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,kBAAA,EAAoB;AACvC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAA,CAAQ,MAAA,GAAS,kBAAkB,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,MAAM,CAAA,KAAM,QAAA,EAAU;AACnC,IAAA,MAAM,IAAA,GAAO,IAAI,MAAM,CAAA;AACvB,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,QAAA,EAAU;AAAA,QACrB,IAAA,EAAM,IAAI,MAAM,CAAA;AAAA,QAChB,YAAA,EAAc,IAAI,cAAc,CAAA;AAAA,QAChC,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,QAClC,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,QACtB,IAAA,EAAM,IAAI,MAAM,CAAA;AAAA,QAChB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,GAAI,GAAA,CAAI,OAAO,CAAA,CAAE,MAAA,GAAS,MAAA;AAAA,QAC3D,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,QAC1B,IAAA,EAAM,IAAI,MAAM;AAAA,OACjB,CAAA;AAAA,MACD,YAAY,IAAI;AAAA,KACjB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,OAAO,GAAA,CAAI,QAAQ,MAAM,QAAA,EAAU;AAC5D,IAAA,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAA,CACG,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,aACjE,OAAO,GAAA,CAAI,QAAQ,CAAA,KAAM,QAAA,EACzB;AACA,IAAA,OAAO,oBAAA,CAAqB,QAAA,EAAU,GAAA,EAAK,KAAK,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAC9B,IAAA,OAAO,mBAAA,CAAoB,QAAA,EAAU,GAAA,EAAK,KAAK,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,OAAO,GAAA,CAAI,WAAW,MAAM,QAAA,EAAU;AAC/D,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,MAAA,EAAQ;AAAA,QACnB,IAAA,EAAM,IAAI,MAAM,CAAA;AAAA,QAChB,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,GAAS,MAAA;AAAA,QACxD,KAAA,EAAO,eAAA,CAAgB,KAAA,EAAO,OAAO,CAAA;AAAA,QACrC,KAAA,EAAO,IAAI,OAAO;AAAA,OACnB,CAAA;AAAA,MACD,IAAI,WAAW;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,MAAA,IAAU,KAAA,CAAM,QAAQ,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG;AACxD,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAS,CAAA,CAAE,OAAOA,SAAQ,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7D,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,KAAA,EAAO,WAAW,CAAA,IAAK,EAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA,IAAK,MAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,EAAO,SAAS,CAAA,IAAK,EAAA;AACjD,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,EAAO,QAAQ,CAAA;AAC1C,MAAA,OAAO,CAAC,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IAC9D,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,CAAQ,SAAS,eAAA,EAAiB;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAA,CAAQ,MAAA,GAAS,eAAe,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,CAAA,MAAA,EAAS,WAAA,CAAY,KAAK,QAAQ,CAAA,IAAK,UAAU,CAAA,CAAA,EAAI;AAAA,QAChE,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,QAAQ,eAAe,CAAA;AAAA,QAC/C,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,QAC1B,WAAA,EAAa,IAAI,aAAa;AAAA,OAC/B,CAAA;AAAA,MACD,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,KACvC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,CAAI,iBAAiB,CAAC,CAAA,EAAG;AACjE,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,iBAAiB,CAAA,CAAE,OAAOA,SAAQ,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1D,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,UAAU,CAAA,IAAK,SAAA;AAC/C,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAA,EAAG,SAAS,CAAA,IAAK,WAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,OAAO,CAAA,IAAK,EAAA;AACzC,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA;AAChC,MAAA,OAAO,CAAC,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/D,CAAC,CAAA;AACD,IAAA,IAAI,KAAA,CAAM,SAAS,kBAAA,EAAoB;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,MAAA,GAAS,kBAAkB,CAAA,uBAAA,CAAyB,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,OAAA,EAAS;AAAA,QACpB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,QAC1B,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,QAClB,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,QACtB,SAAA,EAAW,IAAI,WAAW;AAAA,OAC3B,CAAA;AAAA,MACD,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,IAAI,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,QAAQ;AAAA,KAChE,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAa,UAAA,IAAc,KAAA,CAAM,QAAQ,GAAA,CAAI,UAAU,CAAC,CAAA,EAAG;AAC7D,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAU,CAAA,CAAE,OAAOA,SAAQ,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CACX,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAA,CAC3B,GAAA;AAAA,MAAI,CAAC,CAAA,KACJ;AAAA,QACE,WAAA,CAAY,CAAA,EAAG,MAAM,CAAA,IAAK,WAAA;AAAA,QAC1B,CAAA,QAAA,EAAW,WAAA,CAAY,CAAA,EAAG,SAAS,KAAK,SAAS,CAAA,CAAA;AAAA,QACjD,CAAA,OAAA,EAAU,WAAA,CAAY,CAAA,EAAG,QAAQ,KAAK,SAAS,CAAA,CAAA;AAAA,QAC/C,CAAA,OAAA,EAAU,WAAA,CAAY,CAAA,EAAG,QAAQ,KAAK,SAAS,CAAA,CAAA;AAAA,QAC/C,WAAA,CAAY,GAAG,MAAM;AAAA,OACvB,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,KAAK;AAAA,KACf;AACF,IAAA,IAAI,QAAA,CAAS,SAAS,kBAAA,EAAoB;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAA,GAAS,kBAAkB,CAAA,iBAAA,CAAmB,CAAA;AAAA,IAC3F;AACA,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,UAAA,EAAY;AAAA,QACvB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,QAC1B,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,QAClB,SAAA,EAAW,IAAI,WAAW;AAAA,OAC3B,CAAA;AAAA,MACD,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,IAAI,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,QAAQ;AAAA,KAChE,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,KAAkB,KAAA,EAAwB;AAClE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA,IAAK,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA,IAAK,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA,IAAK,EAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,aAAa,CAAA,MAAA,EAAS,WAAA,CAAY,KAAK,QAAQ,CAAA,IAAK,QAAQ,CAAA,CAAA,EAAI;AAAA,IAC7E,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,IAC1B,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,IAC1B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,IACpB,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,IACpB,WAAA,EAAa,IAAI,aAAa,CAAA;AAAA,IAC9B,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,IAC1B,KAAA,EAAO,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA;AAAA,IACtC,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,MAAM;AAAA,GACpC,CAAA;AAED,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,MAAA;AAAA,MACA,YAAA,CAAa;AAAA,QACX,SAAA;AAAA,QACA,CAAA,aAAA,CAAA;AAAA,QACA,CAAA,UAAA,EAAa,GAAA,CAAI,WAAW,CAAA,IAAK,CAAC,CAAA,CAAA;AAAA,QAClC,CAAA,OAAA,EAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAC,CAAA,CAAA;AAAA,QAC5B,CAAA,OAAA,EAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAC,CAAA,CAAA;AAAA,QAC5B,CAAA,YAAA,EAAe,GAAA,CAAI,aAAa,CAAA,IAAK,CAAC,CAAA,CAAA;AAAA,QACtC,iBAAiB,MAAM;AAAA,OACxB;AAAA,KACF,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,MAAA;AAAA,IACA,CAAA;AAAA,EAAmB,oBAAA,CAAqB,MAAA,IAAU,oBAAoB,CAAC,CAAA;AAAA,GACxE,CAAA;AACH;AAEA,SAAS,oBAAA,CAAqB,QAAA,EAAkB,GAAA,EAAkB,KAAA,EAAwB;AACxF,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA,IAAK,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA,IAAK,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,UAAU,CAAA,IAAK,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA,IAAK,EAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,eAAe,CAAA,IAAK,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,aAAa,QAAA,EAAU;AAAA,IACpC,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,IAC1B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,IACpB,QAAA,EAAU,IAAI,UAAU,CAAA;AAAA,IACxB,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,IAClC,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,IAClC,WAAA,EAAa,IAAI,aAAa,CAAA;AAAA,IAC9B,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,IAClB,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,IACpB,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,IACtB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,IAC1B,KAAA,EAAO,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA;AAAA,IACtC,GAAA,EAAK,eAAA,CAAgB,KAAA,EAAO,KAAK;AAAA,GAClC,CAAA;AAED,EAAA,IAAI,aAAa,CAAA,IAAK,MAAA,KAAW,MAAM,QAAA,KAAa,QAAA,IAAY,YAAY,CAAA,CAAA,EAAI;AAC9E,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,MAAA;AAAA,MACA,YAAA,CAAa;AAAA,QACX,SAAA;AAAA,QACA,eAAA;AAAA,QACA,UAAU,MAAM,CAAA,CAAA;AAAA,QAChB,YAAY,QAAQ,CAAA,CAAA;AAAA,QACpB,QAAA,KAAa,QAAA,GAAW,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,GAAK,MAAA;AAAA,QACrD,iBAAiB,MAAM;AAAA,OACxB;AAAA,KACF,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,QAAA,KAAa,QAAA,EAAU;AAC3C,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,MAAA;AAAA,MACA,YAAA,CAAa;AAAA,QACX,SAAA;AAAA,QACA,gBAAA;AAAA,QACA,iBAAiB,OAAO,CAAA,CAAA;AAAA,QACxB,iBAAiB,MAAM;AAAA,OACxB;AAAA,KACF,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,MAAA;AAAA,IACA,CAAA;AAAA,EAAmB,oBAAA,CAAqB,MAAA,IAAU,sBAAsB,CAAC,CAAA;AAAA,GAC1E,CAAA;AACH;AAEA,SAAS,iBAAA,CAAkB,SAAmB,IAAA,EAAkC;AAC9E,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,cAAA;AACjC,EAAA,IAAI,IAAA,KAAS,oBAAA,EAAsB,OAAO,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAChF,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,gBAAA,CAAiB,SAAS,aAAa,CAAA;AAEpE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,MAAA,GAAS,qBAAqB,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAI,KAAK,EAAC;AACzC,IAAA,IAAA,CAAK,KAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACzC,IAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,CAAA,EAAG,OAAO,gBAAA,CAAiB,SAAS,cAAc,CAAA;AAEtE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,EAAQ;AAClC,IAAA,SAAA,EAAA;AACA,IAAA,IAAI,YAAY,eAAA,EAAiB;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,qBAAqB,CAAA;AAClD,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,GAAG,IAAI,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,oBAAA,EAAuB,MAAM,MAAM,CAAA;AAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,OAAO,eAAA,EAAiB;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,GAAO,eAAe,CAAA,eAAA,CAAiB,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAe,gBAAA,CAAiB,WAAA,EAAa,EAAA,EAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;AAEA,SAAS,qBACP,IAAA,EAC0D;AAC1D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,QAAQ,CAAC,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,GAAG,OAAO,MAAA;AACrC,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAC,KAAK,EAAA,EAAG;AAChE;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,sBAAA,EAAwB,OAAO,IAAA;AAEnD,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,IAAI,GAAA;AAAA,MACF,KAAA,CACG,GAAA;AAAA,QACC,CAAC,IAAA,KAAS,8BAAA,CAA+B,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,CAAA,IAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC;AAAA,OAC1F,CACC,OAAO,OAAO;AAAA,KACnB,CAAE,IAAA;AAAA,IACF;AAAA,GACF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,CAAE,MAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,MAAA;AACtF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,MAAA;AAIxF,EAAA,MAAM,YAAqC,EAAC;AAC5C,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AACvF,MAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,IAAA,IAAI,aAAa,eAAA,EAAiB;AAClC,IAAA,SAAA,EAAA;AACA,IAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,iBAAiB,CAAC,CAAC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,aAAa,cAAA,EAAgB;AAAA,QAC3B,KAAA,EAAO,SAAA;AAAA,QACP,KAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,MACD,MAAM,KAAA,CAAM,CAAA,EAAG,sBAAsB,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,MAChD,uBAAuB,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,MAAA,GAAS,sBAAsB,CAAC,CAAA,cAAA;AAAA,KAC1E,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,MAAA,GAAkC,CAAC,SAAA,CAAU,CAAC,CAAE,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,IAAA,IAAI,QAAQ,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,MAAA,EAAQ;AACjC,IAAA,IAAI,KAAA,GAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,OAAA,GAAU,QAAA,KAAa,EAAA,GAAK,KAAA,GAAQ,QAAQ,QAAA,GAAW,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAO,CAAA,cAAA,CAAgB,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,GAAA,EAAK,CAAA,EAAA,EAAK;AACjC,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA;AAAA,IAC7B;AACA,IAAA,QAAA,GAAW,GAAA;AAAA,EACb;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,QAAA,GAAW,CAAA;AAC3C,EAAA,IAAI,WAAW,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAQ,CAAA,uBAAA,CAAyB,CAAA;AAEvF,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,aAAa,cAAA,EAAgB;AAAA,MAC3B,KAAA,EAAO,SAAA;AAAA,MACP,KAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,eAAe,CAAA;AAAA,MAC5C,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAAA,IACD,OAAA,CAAQ,KAAK,IAAI;AAAA,GAClB,CAAA;AACH;AAEA,SAAS,qBAAqB,MAAA,EAAwB;AACpD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAClC,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,GAAA,EAAK,OAAO,OAAO,OAAA,EAAQ;AAE/C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,MAAA,GACJ,kGAAA;AACF,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAClC,IAAA,UAAA,EAAA;AACA,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAA,EAAK;AAC7E,MAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,MAAM,KAAA,CAAM,IAAI,EAAE,IAAA,CAAK,IAAI,EAAE,OAAA,EAAQ;AAAA,EAC9C;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAClD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,GAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,OAAA,GAAU,QAAA,KAAa,EAAA,GAAK,KAAA,GAAQ,QAAQ,QAAA,GAAW,CAAA;AAC7D,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAO,CAAA,SAAA,CAAW,CAAA;AAAA,IACpD;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,EAAE,CAAA;AAC3B,IAAA,QAAA,GAAW,KAAA;AAAA,EACb;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AAChC;AAEA,SAAS,iBAAiB,MAAA,EAAoC;AAC5D,EAAA,OAAO,MAAA,CACJ,KAAA,CAAM,OAAO,CAAA,CACb,KAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,mBAAmB,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AACjF;AAEA,SAAS,sBAAsB,GAAA,EAA2B;AACxD,EAAA,OACE,OAAO,IAAI,QAAQ,CAAA,KAAM,YACzB,OAAO,GAAA,CAAI,QAAQ,CAAA,KAAM,QAAA,IACzB,OAAO,IAAI,QAAQ,CAAA,KAAM,QAAA,IACzB,OAAO,GAAA,CAAI,UAAU,MAAM,QAAA,IAC3B,OAAO,GAAA,CAAI,WAAW,CAAA,KAAM,QAAA;AAEhC;AAEA,SAAS,mBAAA,CAAoB,QAAA,EAAkB,GAAA,EAAkB,KAAA,EAAwB;AACvF,EAAA,MAAM,UAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA,IAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AAC/E,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,UAAU,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,aAAa,WAAA,GAAc,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,WAAW,KAAK,QAAA,EAAU;AAAA,MACnE,SAAA,EAAW,GAAA,CAAI,WAAW,CAAA,IAAK,IAAI,UAAU,CAAA;AAAA,MAC7C,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,MAC1B,GAAA,EAAK,IAAI,KAAK,CAAA;AAAA,MACd,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,MACtB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,MAC1B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,MACpB,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,MACpB,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,MAClB,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,MACtB,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,MAC1B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,MACpB,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,MACpB,WAAA,EAAa,IAAI,aAAa,CAAA;AAAA,MAC9B,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,MACpB,QAAA,EAAU,IAAI,UAAU,CAAA;AAAA,MACxB,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,MAClC,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,MAClC,WAAA,EAAa,IAAI,aAAa;AAAA,KAC/B,CAAA;AAAA,IACD,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA,GAAI,CAAA;AAAA,EAAW,WAAA,CAAY,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA,GAAK,MAAA;AAAA,IACrE,MAAA,GAAS,CAAA;AAAA,EAAY,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,IAChC,MAAA,GAAS,CAAA;AAAA,EAAY,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,IAChC,MAAA,GAAS,CAAA;AAAA,EAAY,MAAM,CAAA,CAAA,GAAK;AAAA,GACjC,CAAA;AACH;AAEA,SAAS,uBAAA,CAAwB,UAAkB,GAAA,EAA0B;AAC3E,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,MAAA,IAAI,OAAO,MAAA,IAAU,YAAA,IAAgB,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3D,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MAClC;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,MAAM,KAAA,CAAM,CAAC,SAAS,OAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EAAM,gBAAA,CAAiB,KAAiB,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EAAM,iBAAA,CAAkB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,WAAW,WAAA,CAAY,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,YAAA,CAAa,CAAC,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,EAAG,GAAG,MAAM,CAAC,CAAA;AAClE;AAEA,SAAS,YAAA,CAAa,OAAe,MAAA,EAA6B;AAChE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,MAAM,EAChC,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,IAAQ,KAAA,KAAU,EAAE,CAAA,CAC3E,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,UAAA,CAAW,iBAAA,CAAkB,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AACzE,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,KAAK,KAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,KAAA;AAC9D;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAiB,KAAA,GAAQ,EAAA,EAAI,QAAQ,kBAAA,EAA4B;AACzF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACrC,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,GAAI,UAAU,CAAA,GACV,CAAC,uBAAuB,OAAO,CAAA,sCAAA,CAAwC,IACvE;AAAC,GACP,CAAE,KAAK,IAAI,CAAA;AACb;AAEA,SAAS,iBAAA,CAAkB,KAAA,EAAkB,KAAA,GAAQ,kBAAA,EAA4B;AAC/E,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,UAAA,CAAW,WAAA,CAAY,IAAI,CAAA,EAAG,GAAK,CAAC,CAAA;AACtF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACrC,EAAA,IAAI,OAAA,GAAU,CAAA;AACZ,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAO,CAAA,sCAAA,CAAwC,CAAA;AACnF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,aAAa,QAAA,EAA6C;AACjE,EAAA,OAAO,QAAA,CACJ,IAAI,CAAC,OAAA,KAAa,OAAO,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,EAAQ,GAAI,MAAU,CAAA,CAC9E,MAAA,CAAO,CAAC,OAAA,KAA+B,CAAC,CAAC,OAAO,CAAA,CAChD,KAAK,IAAI,CAAA;AACd;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC3E,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AACxC,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAEA,SAAS,UAAA,CAAW,KAAA,EAAe,GAAA,GAAM,YAAA,EAAsB;AAC7D,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,EAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,GAAA,GACrB,OAAA,GACA,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,EAAE,CAAC,CAAA,IAAA,EAAO,QAAQ,MAAM,CAAA,OAAA,CAAA;AACxD;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAEA,SAAS,WAAA,CAAY,KAAkB,GAAA,EAAiC;AACtE,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,WAAA,CAAY,KAAkB,GAAA,EAAiC;AACtE,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,gBAAA,CAAiB,KAAkB,GAAA,EAAuB;AACjE,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,CAAA,GAC/D,EAAC;AACP;AAEA,SAAS,eAAA,CAAgB,OAAgB,GAAA,EAAiC;AACxE,EAAA,IAAI,CAACA,SAAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,eAAA,CAAgB,OAAgB,GAAA,EAAiC;AACxE,EAAA,IAAI,CAACA,SAAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,gBAAA,CAAiB,OAAgB,GAAA,EAAiC;AACzE,EAAA,IAAI,CAACA,SAAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS,QAAQ,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1F,EAAA,OAAO,MAAA;AACT;AAEA,SAASA,UAAS,KAAA,EAAsC;AACtD,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;AAEA,SAAS,SAAS,KAAA,EAA2D;AAC3E,EAAA,OAAO,KAAA,KAAU,QAAQ,CAAC,QAAA,EAAU,UAAU,SAAS,CAAA,CAAE,QAAA,CAAS,OAAO,KAAK,CAAA;AAChF;;;AC7vBO,IAAM,+BAAA,GAAwD,QAAA;AAS9D,SAAS,8BAA8B,KAAA,EAAkD;AAC9F,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA;AACtC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACrC,EAAA,IAAI,QAAQ,QAAA,IAAY,GAAA,KAAQ,UAAA,IAAc,GAAA,KAAQ,QAAQ,OAAO,QAAA;AACrE,EAAA,IAAI,QAAQ,QAAA,IAAY,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,SAAS,OAAO,QAAA;AACnE,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,2BAAA,CACd,OACA,QAAA,EACsB;AACtB,EAAA,OAAO,6BAAA,CAA8B,KAAA,GAAQ,QAAQ,CAAC,CAAA,IAAK,+BAAA;AAC7D;ACuHO,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AAC7C,EAAA,IAAI,OAAA,IAAW,QAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG,OAAYC,cAAQ,OAAO,CAAA;AACrE,EAAA,OAAYA,KAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,EAAQ,EAAG,aAAa,CAAA;AAC9C;;;ACnIO,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,cAAA,EAAgB,gBAAA;AAAA,EAChB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAEpB,cAAA,EAAgB,gBAAA;AAAA,EAChB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAEzB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAElB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,oBAAA,EAAsB,sBAAA;AAAA;AAAA,EAEtB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAElB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAExB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA;AAAA,EAEf,gBAAA,EAAkB,kBAAA;AAAA,EAClB,OAAA,EAAS;AACX;AAwBO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAChC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAQT;AACD,IAAA,KAAA,CAAM,KAAK,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,OAAA;AACjC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,KAAA;AACvC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAmB;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,GAAU,CAAA,CAAA,EAAI,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/D,IAAA,OAAO,GAAG,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,OAAO,GAAG,GAAG,CAAA,CAAA;AAAA,EAC5C;AACF;AAEA,SAAS,cAAc,GAAA,EAAsC;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAC7B,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,CACjC,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AACtC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACrD;AAOO,IAAM,SAAA,GAAN,cAAwB,eAAA,CAAgB;AAAA,EACpC,QAAA;AAAA,EAET,YAAY,IAAA,EAcT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,MAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAS,EAAE,IAAA,EAAM,KAAK,QAAA,EAAU,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AACF;AAKO,IAAM,WAAA,GAAN,cAA0B,eAAA,CAAgB;AAAA,EAC/C,YAAY,IAAA,EAQT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,KAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAKO,IAAM,WAAA,GAAN,cAA0B,eAAA,CAAgB;AAAA,EACtC,UAAA;AAAA,EAET,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,yBAAA;AAAA,MACvC,SAAS,EAAE,MAAA,EAAQ,KAAK,UAAA,EAAY,GAAG,KAAK,OAAA,EAAQ;AAAA,MACpD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACF;AAMO,IAAM,UAAA,GAAN,cAAyB,eAAA,CAAgB;AAAA,EAC9C,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,gBAAgB,SAAA,GAAY,OAAA;AAAA,MAChE,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,SAAS,WAAA,CAAY,qBAAA;AAAA,MAC3D,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAQO,SAAS,iBAAA,CACd,GAAA,EACA,IAAA,GAA6E,WAAA,CAAY,gBAAA,EACxE;AACjB,EAAA,IAAI,GAAA,YAAe,iBAAiB,OAAO,GAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,IAAI,UAAA,CAAW;AAAA,IACpB,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,KAAS,SAAA,GAAY,WAAA,CAAY,gBAAA,GAAmB,IAAA;AAAA,IAC1D,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,YAAA,GAAN,cAA2B,eAAA,CAAgB;AAAA,EACvC,SAAA;AAAA,EAET,YAAY,IAAA,EAMT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,uBAAuB,OAAA,GAAU,SAAA;AAAA,MACrE,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,iBAAA;AAAA,MACvC,SAAS,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,GAAG,KAAK,OAAA,EAAQ;AAAA,MACtD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AACF;AAMO,IAAM,QAAA,GAAN,cAAuB,eAAA,CAAgB;AAAA,EAC5C,YAAY,IAAA,EAQT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,mBAAmB,SAAA,GAAY,OAAA;AAAA,MACnE,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,aAAA;AAAA,MACvC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AACF;AAKO,IAAM,OAAA,GAAN,cAAsB,eAAA,CAAgB;AAAA,EAClC,IAAA;AAAA,EAET,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,cAAA;AAAA,MACvC,SAAS,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,GAAG,KAAK,OAAA,EAAQ;AAAA,MAC5C,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACnB;AACF;AAgBO,IAAM,UAAA,GAAN,cAAyB,eAAA,CAAgB;AAAA,EACrC,MAAA;AAAA,EAET,YAAY,IAAA,EAKT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,WAAA,CAAY,gBAAA;AAAA,MAClB,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,KAAK,MAAA,IAAU,GAAA;AAAA,MACnD,SAAS,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AACF;AAiBO,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EACvD,YAAY,IAAA,EAMT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,WAAA,CAAY,gBAAA;AAAA,MAClB,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,KAAA;AAAA,MACb,SAAS,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,GAAG,KAAK,OAAA,EAAQ;AAAA,MAC9C,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAIO,SAAS,kBAAkB,GAAA,EAAsC;AACtE,EAAA,OAAO,GAAA,YAAe,eAAA;AACxB;AAEO,SAAS,YAAY,GAAA,EAAgC;AAC1D,EAAA,OAAO,GAAA,YAAe,SAAA;AACxB;AAEO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,GAAA,YAAe,WAAA;AACxB;AAEO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,GAAA,YAAe,WAAA;AACxB;AAEO,SAAS,eAAe,GAAA,EAAmC;AAChE,EAAA,OAAO,GAAA,YAAe,YAAA;AACxB;AAEO,SAAS,aAAa,GAAA,EAAiC;AAC5D,EAAA,OAAO,GAAA,YAAe,UAAA;AACxB;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,OAAO,GAAA,YAAe,OAAA;AACxB;AAEO,SAAS,sBAAsB,GAAA,EAA0C;AAC9E,EAAA,OAAO,GAAA,YAAe,mBAAA;AACxB;AAEO,SAAS,aAAa,GAAA,EAAiC;AAC5D,EAAA,OAAO,GAAA,YAAe,UAAA;AACxB;AAEO,SAAS,WAAW,GAAA,EAA+B;AACxD,EAAA,OAAO,GAAA,YAAe,QAAA;AACxB;;;AC7MO,IAAM,aAAA,GAAN,cAA4B,eAAA,CAAgB;AAAA,EACjC,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EAEhB,YACE,OAAA,EACA,MAAA,EACA,WACA,UAAA,EACA,IAAA,GAA8E,EAAC,EAC/E;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA;AAAA,MACA,IAAA,EAAM,oBAAA,CAAqB,MAAA,EAAQ,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAClD,SAAA,EAAW,UAAA;AAAA,MACX,QAAA,EAAU,MAAA,IAAU,GAAA,GAAM,OAAA,GAAU,SAAA;AAAA,MACpC,WAAA,EAAa,SAAA;AAAA,MACb,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,MAC9B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcS,QAAA,GAAmB;AAC1B,IAAA,MAAM,OAAO,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,IAAI,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,UAAU,IAAI,IAAI,CAAA,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAM,SAAA,GACrB,SAAS,IAAA,CAAK,IAAA,CAAK,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,KAAK,IAAA,CAAK,SAAA,CAAU,SAAS,EAAA,GAAK,QAAA,GAAM,EAAE,CAAA,CAAA,CAAA,GACtF,EAAA;AACJ,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAA,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA;AAAA,EACxB;AACF;AAEA,SAAS,cAAA,CAAe,QAAgB,IAAA,EAAuB;AAC7D,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,eAAA;AACzB,EAAA,IAAI,SAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,EAAK,OAAO,eAAe,MAAM,CAAA,CAAA,CAAA;AAC/E,EAAA,IAAI,SAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,EAAK,OAAO,iBAAiB,MAAM,CAAA,CAAA,CAAA;AACjF,EAAA,IAAI,SAAS,sBAAA,IAA0B,MAAA,KAAW,GAAA,EAAK,OAAO,gBAAgB,MAAM,CAAA,CAAA,CAAA;AACpF,EAAA,IAAI,SAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,EAAK,OAAO,cAAc,MAAM,CAAA,CAAA,CAAA;AAC9E,EAAA,IAAI,SAAS,iBAAA,IAAqB,MAAA,KAAW,GAAA,EAAK,OAAO,cAAc,MAAM,CAAA,CAAA,CAAA;AAC7E,EAAA,IAAI,SAAS,uBAAA,IAA2B,MAAA,KAAW,GAAA,EAAK,OAAO,oBAAoB,MAAM,CAAA,CAAA,CAAA;AACzF,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAA;AAC7C,EAAA,IAAI,UAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK,OAAO,QAAQ,MAAM,CAAA,eAAA,CAAA;AACxD,EAAA,IAAI,IAAA,EAAM,OAAO,CAAA,EAAG,IAAI,KAAK,MAAM,CAAA,CAAA,CAAA;AACnC,EAAA,OAAO,QAAQ,MAAM,CAAA,CAAA;AACvB;AAYO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA;AAAA,EAEjC,cAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EAEhB,YAAY,IAAA,EAOT;AACD,IAAA,KAAA;AAAA,MACE,CAAA,aAAA,EAAgB,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,oBAAA,EAAkB,IAAA,CAAK,aAAa,CAAA,SAAA,EAAY,IAAA,CAAK,aAAa,CAAA,QAAA,EAAW,KAAK,SAAS,CAAA,WAAA,CAAA;AAAA,MACxI,GAAA;AAAA,MACA,IAAA;AAAA;AAAA,MACA,IAAA,CAAK,UAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,SAAS,CAAA,qBAAA,EAAwB,IAAA,CAAK,SAAS,CAAA,IAAA,EAAO,KAAK,aAAa,CAAA,eAAA;AAAA,SAC1E;AAAA,QACA,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,UAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AACF;AAEA,SAAS,oBAAA,CAAqB,QAAgB,IAAA,EAA0B;AACtE,EAAA,IAAI,MAAA,KAAW,CAAA,EAAG,OAAO,WAAA,CAAY,sBAAA;AACrC,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,qBAAA;AACtE,EAAA,IAAI,IAAA,KAAS,sBAAA,IAA0B,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,oBAAA;AAC1E,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,mBAAA;AACtE,EAAA,IAAI,IAAA,KAAS,uBAAA,IAA2B,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,wBAAA;AAC3E,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,WAAA,CAAY,sBAAA;AACvC,EAAA,IAAI,MAAA,IAAU,GAAA,EAAK,OAAO,WAAA,CAAY,qBAAA;AACtC,EAAA,OAAO,WAAA,CAAY,wBAAA;AACrB;;;ACtSO,SAAS,yBACd,GAAA,EACiB;AACjB,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,KAAA;AAC9B,EAAA,IAAI,OAAO,GAAA,KAAQ,SAAA,EAAW,OAAO,MAAM,QAAA,GAAW,KAAA;AACtD,EAAA,MAAM,UAAA,uBAAiB,GAAA,CAAqB;AAAA,IAC1C,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA,GAAM,KAAA;AACrC;AAEO,IAAM,yBAAA,GAA4B;AAClC,IAAM,4BAAA,GAA+B;AAMrC,SAAS,yBAAyB,KAAA,EAAwB;AAC/D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,yBAAA;AACtC,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,SAAS,4BAAA,EAA8B;AACnE,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,IAAI,GAAG,OAAO,yBAAA;AAC7C,EAAA,OAAO,IAAA;AACT;;;ACvIO,IAAM,oBAAA,GAAuB,OAAO,MAAA,CAAO;AAAA,EAChD,wBAAA,EAA0B,OAAA;AAAA,EAC1B,aAAA,EAAe,GAAA;AAAA,EACf,kBAAA,EAAoB,GAAA;AAAA,EACpB,gBAAA,EAAkB,IAAA;AAAA,EAClB,0BAAA,EAA4B,GAAA;AAAA,EAC5B,eAAA,EAAiB,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/B,eAAA,EAAiB,IAAA;AAAA,EACjB,qBAAA,EAAuB;AACzB,CAAC;AAGM,IAAM,sBAAA,GAAyB,OAAO,MAAA,CAAO;AAAA,EAClD,SAAA,EAAW,EAAA;AAAA,EACX,cAAA,EAAgB;AAClB,CAAC;AAGM,IAAM,uBAAA,GAA0B,OAAO,MAAA,CAAO;AAAA,EACnD,kBAAA,EAAoB;AACtB,CAAC;AAOM,IAAM,8BAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,EAC1D,OAAA,EAAS,KAAA;AAAA,EACT,eAAA,EAAiB;AACnB,CAAC;AAGM,IAAM,8BAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,EAC1D,UAAA,EAAY,UAAA;AAAA,EACZ,QAAA,EAAU;AAAA,IACR,YAAA,EAAc;AAAA,MACZ,UAAA,EAAY;AAAA;AACd;AAEJ,CAAC;AAGM,IAAM,0BAAA,GAA6B;;;ACNnC,IAAM,wBAAA,GAA2B,cAAA;AAOjC,SAAS,0BAA0B,OAAA,EAAyB;AACjE,EAAA,OAAO,QAAQ,OAAO,CAAA,CAAA,CAAA;AACxB;;;ACnCA,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,IAAA,GAAO,aAAA;AAEb,IAAM,aAAA,GAAgB,GAAA;AAMtB,IAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAClD,IAAM,uBAAA,GAA0B,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,SAAA;AAc5D,IAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAC7C,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,wBACJ,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,WAAW,SAAA,GAAY,SAAA;AAGjE,IAAM,WAAW,CAAA,IAAK,EAAA;AACtB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,aAAA,GAAgB,KAAK,IAAA,GAAO,IAAA;AAGlC,SAAS,kBAAA,GAAyC;AAChD,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA;AACnD,EAAA,OAAO,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,MAAA;AACjC;AAGA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,qBAAA,IAAyB,GAAA,CAAI,QAAA,CAAS,GAAG,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AACnG;AAGA,SAAS,SAAA,CAAU,YAAoB,IAAA,EAAsB;AAC3D,EAAA,OAAO,UAAA,CAAW,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW;AAAA,IAC7C,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAGA,SAAS,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,UAAA,EAA4B;AACpF,EAAA,MAAM,IAAA,GAAOC,YAAY,cAAc,CAAA;AACvC,EAAA,MAAM,EAAA,GAAKA,YAAY,QAAQ,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,GAAA,EAAK,EAAE,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AACjE,EAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAC9B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA;AAC9C,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,SAAA,CAAU,IAAA,CAAK,KAAK,GAAG,CAAA;AAAG,EAAA,GAAA,IAAO,SAAA,CAAU,MAAA;AAC3C,EAAA,GAAA,CAAI,GAAG,IAAI,UAAA,GAAa,GAAA;AAAM,EAAA,GAAA,IAAO,CAAA;AACrC,EAAA,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,CAAA;AAAG,EAAA,GAAA,IAAO,cAAA;AAC5B,EAAA,EAAA,CAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAAG,EAAA,GAAA,IAAO,QAAA;AAC1B,EAAA,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AAAG,EAAA,GAAA,IAAO,SAAA;AAC3B,EAAA,EAAA,CAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAChB,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,aAAA,CAAc,KAAa,OAAA,EAAmD;AACrF,EAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,WAAA,CAAY;AAAA,MACpB,OAAA,EACE,yBAAyB,OAAO,CAAA,sGAAA,CAAA;AAAA,MAElC,MAAM,WAAA,CAAY,cAAA;AAAA,MAClB,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,MAAM,SAAA,CAAU,MAAA;AACpB,EAAA,MAAM,OAAA,GAAU,IAAI,GAAG,CAAA;AAAI,EAAA,GAAA,IAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,MAAM,cAAc,CAAA;AAAG,EAAA,GAAA,IAAO,cAAA;AAC7D,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,MAAM,QAAQ,CAAA;AAAG,EAAA,GAAA,IAAO,QAAA;AACrD,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,MAAM,SAAS,CAAA;AAAG,EAAA,GAAA,IAAO,SAAA;AACvD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,MAAM,SAAS,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,EAAM,GAAA,EAAK,EAAE,CAAA;AAC/C,EAAA,QAAA,CAAS,WAAW,GAAG,CAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA;AACjE,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,OAAA,EAAQ;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,WAAA,CAAY;AAAA,MACpB,OAAA,EACE,0CAA0C,OAAO,CAAA,6EAAA,CAAA;AAAA,MAEnD,MAAM,WAAA,CAAY,cAAA;AAAA,MAClB,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AACF;AAMA,SAAS,wBAAwB,OAAA,EAAuB;AACtD,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAClC,EAAA,IAAI;AACF,IAAA,MAAML,KAAAA,GAAU,aAAS,OAAO,CAAA;AAChC,IAAA,MAAM,UAAA,GAAaA,MAAK,IAAA,GAAO,GAAA;AAC/B,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,SAAA,CAAU;AAAA,QAC1B,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,kCAAA;AAAA,QACP,SAAS,CAAA,SAAA,EAAY,OAAO,aAAa,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA,iBAAA,EAAe,cAAc,QAAA,CAAS,CAAC,CAAC,CAAA,aAAA,EAAgB,aAAA,CAAc,SAAS,CAAC,CAAC,IAAI,OAAO,CAAA,CAAA;AAAA,QAC3J,OAAA;AAAA,QACA,YAAA,EAAc,aAAA;AAAA,QACd,UAAA;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAGR;AACF;AAeO,IAAM,qBAAN,MAAyD;AAAA,EAC7C,OAAA;AAAA,EACT,GAAA;AAAA,EACA,WAAA,GAAsB,CAAA;AAAA,EAE9B,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,UAAA,GAAqB;AAEvB,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,eAAA,EAAgB;AACpC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,YAAY,KAAA,EAAwB;AAClC,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,wBAAA,CAAyB,KAAK,KAAK,CAAA;AAAA,EACzE;AAAA,EAEA,QAAQ,SAAA,EAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG,OAAO,SAAA;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,eAAA,EAAgB;AACjC,IAAA,MAAM,EAAA,GAAKK,YAAY,QAAQ,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,GAAA,EAAK,EAAE,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC3E,IAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAC9B,IAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,IAAA,CAAK,WAAW,CAAA;AACzD,IAAA,OAAO,GAAG,MAAM,CAAA,EAAG,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAAA,EAC7F;AAAA,EAEA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,GAAG,OAAO,KAAA;AAErC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,wBAAwB,CAAA;AACxD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,WAAA,CAAY;AAAA,QACpB,OAAA,EAAS,wCAAA;AAAA,QACT,MAAM,WAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,EAAE,KAAA,EAAO,iBAAA;AAAkB,OACrC,CAAA;AAAA,IACH;AACA,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,CAAC,EAAE,MAAM,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,WAAA,CAAY;AAAA,QACpB,OAAA,EAAS,wCAAA;AAAA,QACT,MAAM,WAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,EAAE,KAAA,EAAO,iBAAA;AAAkB,OACrC,CAAA;AAAA,IACH;AACA,IAAA,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,GAAI,KAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACtC,IAAA,IAAI,EAAA,CAAG,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,WAAA,CAAY;AAAA,MAChD,OAAA,EAAS,4BAAA;AAAA,MACT,MAAM,WAAA,CAAY,mBAAA;AAAA,MAClB,SAAS,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,GAAG,MAAA;AAAO,KAClD,CAAA;AACD,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW,MAAM,IAAI,WAAA,CAAY;AAAA,MAClD,OAAA,EAAS,6BAAA;AAAA,MACT,MAAM,WAAA,CAAY,mBAAA;AAAA,MAClB,SAAS,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,IAAI,MAAA;AAAO,KACpD,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAK,eAAA,EAAgB;AACjC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,EAAM,GAAA,EAAK,EAAE,CAAA;AAC/C,IAAA,QAAA,CAAS,WAAW,GAAG,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA;AAChE,IAAA,OAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAwD;AACtD,IAAA,MAAM,aAAa,IAAA,CAAK,WAAA;AACxB,IAAA,MAAM,MAAA,GAASA,YAAY,SAAS,CAAA;AACpC,IAAA,MAAM,aAAa,UAAA,GAAa,CAAA;AAEhC,IAAG,GAAA,CAAA,SAAA,CAAeC,cAAQ,IAAA,CAAK,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,IAAA,IAAI,UAAA,EAAY;AAGd,MAAG,GAAA,CAAA,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,IAC7F,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,uBAAuB,CAAA;AACvD,MAAA,cAAA,CAAe,IAAA,CAAK,YAAY,CAAC,CAAA;AACjC,MAAA,UAAA,CAAW,cAAA,CAAe,MAAM,CAAA,GAAI,UAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AACjD,MAAG,kBAAc,IAAA,CAAK,OAAA,EAAS,YAAY,EAAE,IAAA,EAAM,KAAO,CAAA;AAAA,IAC5D;AACA,IAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAEpC,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,EAAE,YAAY,UAAA,EAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,4BAAA,GAAqC;AAC3C,IAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,CAAK,GAAA,EAAK;AAC9B,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,KAAK,OAAA,EAAS,WAAA,CAAY,KAAK,GAAA,EAAK,IAAA,CAAK,WAAA,EAAa,UAAU,CAAA,EAAG;AAAA,QAClF,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,eAAA,GAA0B;AAQhC,IAAA,IAAI,IAAA,CAAK,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAS,GAAA,CAAA,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAIxC,MAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,QAAA,MAAM,EAAE,KAAAC,IAAAA,EAAK,OAAA,KAAY,aAAA,CAAc,GAAA,EAAK,KAAK,OAAO,CAAA;AACxD,QAAA,IAAA,CAAK,GAAA,GAAMA,IAAAA;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AACpC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AAGA,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAE5B,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAEpC,QAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,uBAAA,EAAyB;AAE1C,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,eAAe,MAAM,CAAA;AACnD,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,cAAc,CAAA,EAAG;AACjC,UAAA,MAAM,IAAI,WAAA,CAAY;AAAA,YACpB,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,yBAAA,CAAA;AAAA,YAC9C,MAAM,WAAA,CAAY,cAAA;AAAA,YAClB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,WAClC,CAAA;AAAA,QACH;AACA,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,cAAA,CAAe,MAAM,CAAA;AACzC,QAAA,MAAMA,IAAAA,GAAM,GAAA,CAAI,QAAA,CAAS,cAAA,CAAe,SAAS,CAAC,CAAA;AAClD,QAAA,IAAIA,IAAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,UAAA,MAAM,IAAI,WAAA,CAAY;AAAA,YACpB,OAAA,EAAS,yBAAyB,IAAA,CAAK,OAAO,wBAAwBA,IAAAA,CAAI,MAAM,oBAAoB,SAAS,CAAA,CAAA,CAAA;AAAA,YAC7G,MAAM,WAAA,CAAY,cAAA;AAAA,YAClB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,aAAA,EAAe,SAAA,EAAW,WAAA,EAAaA,IAAAA,CAAI,MAAA;AAAO,WACrF,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,IAAA,CAAKA,IAAG,CAAA;AAC1B,QAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAEpC,QAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AAGA,MAAA,MAAM,IAAI,WAAA,CAAY;AAAA,QACpB,OAAA,EACE,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,IAAA,EAAO,IAAI,MAAM,CAAA,iBAAA,EACzC,SAAS,CAAA,WAAA,EAAc,uBAAuB,CAAA,oDAAA,CAAA;AAAA,QAE7D,MAAM,WAAA,CAAY,cAAA;AAAA,QAClB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,aAAA,EAAe,SAAA,EAAW,WAAA,EAAa,GAAA,CAAI,MAAA;AAAO,OACrF,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,MAAM,GAAA;AAAA,IAC9D;AAGA,IAAG,GAAA,CAAA,SAAA,CAAeD,cAAQ,IAAA,CAAK,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAMD,YAAY,SAAS,CAAA;AAGjC,IAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,IAAA,MAAM,eAAe,UAAA,GAAa,WAAA,CAAY,GAAA,EAAK,CAAA,EAAG,UAAU,CAAA,GAAI,GAAA;AAGpE,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,KAAK,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,GAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC1E,SAAS,GAAA,EAAK;AACZ,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,MAAM,GAAA;AAE5D,MAAA,MAAM,GAAA,GAAS,GAAA,CAAA,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACxC,MAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,QAAA,MAAM,EAAE,KAAK,SAAA,EAAW,OAAA,KAAY,aAAA,CAAc,GAAA,EAAK,KAAK,OAAO,CAAA;AACnE,QAAA,IAAA,CAAK,GAAA,GAAM,SAAA;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AACpC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AACA,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAE5B,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AACpC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AACA,MAAA,IAAI,GAAA,CAAI,WAAW,uBAAA,EAAyB;AAE1C,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,eAAe,MAAM,CAAA;AACnD,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,cAAc,CAAA,EAAG;AACjC,UAAA,MAAM,IAAI,WAAA,CAAY;AAAA,YACpB,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,yBAAA,CAAA;AAAA,YAC9C,MAAM,WAAA,CAAY,cAAA;AAAA,YAClB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,WAClC,CAAA;AAAA,QACH;AACA,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,cAAA,CAAe,MAAM,CAAA;AACzC,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,cAAA,CAAe,SAAS,CAAC,CAAA;AACxD,QAAA,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAChC,QAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,QAAA,uBAAA,CAAwB,KAAK,OAAO,CAAA;AACpC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AACA,MAAA,MAAM,IAAI,WAAA,CAAY;AAAA,QACpB,OAAA,EACE,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,IAAA,EAAO,IAAI,MAAM,CAAA,iBAAA,EACzC,SAAS,CAAA,WAAA,EAAc,uBAAuB,CAAA,oDAAA,CAAA;AAAA,QAE7D,MAAM,WAAA,CAAY,cAAA;AAAA,QAClB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,aAAA,EAAe,SAAA,EAAW,WAAA,EAAa,GAAA,CAAI,MAAA;AAAO,OACrF,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAWO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,IAAA,EACG;AACH,EAAA,MAAM,OAAO,IAAA,EAAM,IAAA,KAAS,CAAC,GAAA,KAAgB,OAAA,CAAQ,KAAK,GAAG,CAAA,CAAA;AAI7D,EAAA,OAAOG,KAAAA,CAAK,GAAA,EAAK,KAAA,EAAO,CAAC,GAAG,GAAA,KAAQ;AAClC,IAAA,IAAI;AACF,MAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA;AAAA,QACE,qCAAqC,GAAG,CAAA,GAAA,EAAM,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,OACxF;AACA,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,KAAA,EACG;AACH,EAAA,OAAOA,KAAAA,CAAK,KAAK,KAAA,EAAO,CAAC,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjD;AAEA,SAASA,KAAAA,CAAQ,IAAA,EAAS,KAAA,EAAoB,SAAA,EAAkD;AAC9F,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,IAAA,KAASA,MAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,aAAA,CAAc,CAAC,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAIA,KAAAA,CAAK,CAAA,EAAG,OAAO,SAAS,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AASA,IAAM,kBAAA,GACJ,+JAAA;AAIF,IAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAEzD,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,EAAE,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,OAAO,kBAAA,CAAmB,KAAK,EAAE,CAAA;AACnC;AAMA,eAAsB,sBAAA,CACpB,UAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI,UAAmC,EAAC;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AACjD,IAAA,OAAA,GAAU,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAA;AACpD,EAAA,MAAUA,SAAWH,KAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE7D,EAAA,MAAM,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACjF,EAAA,MAAM,wBAAwB,UAAU,CAAA;AAC1C;AAUA,eAAsB,uBAAA,CACpB,UAAA,EACA,KAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAUG,EAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,EACzC;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,EACzC;AACA,EAAA,MAAM,OAAA,GAAU,EAAE,CAAA,EAAG,CAAA,EAAE;AACvB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AACjD,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAM,UAAA,EAAW;AAE5D,EAAA,MAAM,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAChF,EAAA,MAAM,uBAAA;AAAA,IACJ,UAAA;AAAA,IACA,MAAA,GAAS,EAAE,IAAA,EAAM,CAAC,QAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI;AAAA,GACjD;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,CAAA,EAAG,MAAM,UAAA,EAAW;AACjD;AAgBA,eAAsB,gBAAA,CACpB,UAAA,EACA,KAAA,EACA,MAAA,EACoF;AACpF,EAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,IAAA,KAAS,MAAM;AAAA,EAAC,CAAA,CAAA;AACpC,EAAA,MAAM,OAAO,MAAA,EAAQ,IAAA,KAAS,CAAC,GAAA,KAAgB,OAAA,CAAQ,KAAK,GAAG,CAAA,CAAA;AAG/D,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAUA,EAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,EAAE,UAAA,EAAAC,WAAAA,EAAY,YAAAC,WAAAA,EAAW,GAAI,MAAM,SAAA,EAAU;AACnD,IAAA,GAAA,CAAI,CAAA,6BAAA,EAAgCD,WAAU,CAAA,SAAA,EAAOC,WAAU,CAAA,qCAAA,CAAkC,CAAA;AACjG,IAAA,OAAO,EAAE,SAAS,CAAA,EAAG,UAAA,EAAAD,aAAY,UAAA,EAAAC,WAAAA,EAAY,MAAM,UAAA,EAAW;AAAA,EAChE;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,CAAA,2BAAA,EAA8B,UAAU,CAAA,2CAAA,CAAwC,CAAA;AACrF,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,YAAY,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAW;AAAA,EACpG;AAGA,EAAA,MAAM,UAAU,EAAE,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAc;AAC/C,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAOzD,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sCAAA,EAAyC,QAAQ,MAAA,CAAO,MAAM,oGACO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,iDAAA;AAAA,KAEhG;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AAEnB,IAAA,MAAM,EAAE,UAAA,EAAAD,WAAAA,EAAY,YAAAC,WAAAA,EAAW,GAAI,MAAM,SAAA,EAAU;AACnD,IAAA,GAAA,CAAI,CAAA,6BAAA,EAAgCD,WAAU,CAAA,SAAA,EAAOC,WAAU,CAAA,0CAAA,CAAuC,CAAA;AACtG,IAAA,OAAO,EAAE,SAAS,CAAA,EAAG,UAAA,EAAAD,aAAY,UAAA,EAAAC,WAAAA,EAAY,MAAM,UAAA,EAAW;AAAA,EAChE;AAGA,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,MAAM,SAAA,EAAU;AAGnD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,SAAA,EAAW,KAAK,CAAA;AAGlD,EAAA,MAAM,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACnF,EAAA,MAAM,uBAAA,CAAwB,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA;AAElD,EAAA,GAAA,CAAI,gCAAgC,UAAU,CAAA,SAAA,EAAO,UAAU,CAAA,sBAAA,EAAoB,OAAA,CAAQ,CAAC,CAAA,SAAA,CAAW,CAAA;AACvG,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,GAAG,UAAA,EAAY,UAAA,EAAY,MAAM,UAAA,EAAW;AACxE;AAaA,SAAS,gBAAA,CACP,IAAA,EACA,KAAA,EACA,OAAA,EACA,aAAa,EAAA,EACV;AACH,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,IAAA,EAAM,CAAA,KACrB,gBAAA,CAAiB,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG;AAAA,KAC9D;AAAA,EACF;AACA,EAAA,MAAM,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,MAAM,UAAU,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,CAAA;AACpD,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,EAAG;AACjD,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACxB,QAAA,OAAA,CAAQ,CAAA,EAAA;AAAA,MACV,CAAA,CAAA,MAAQ;AAIN,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,OAAO,CAAA;AAC3B,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,MACX;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,CAAA,EAAG,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AASA,SAAS,aAAA,CAAiB,MAAS,KAAA,EAAuB;AACxD,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,SAAS,aAAA,CAAc,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,aAAA,CAAc,CAAC,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,EAAG;AAEtF,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,aAAA,CAAc,CAAA,EAAG,KAAK,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQA,eAAe,uBAAA,CACb,UACA,IAAA,EACe;AACf,EAAA,MAAM,OAAO,IAAA,EAAM,IAAA,KAAS,CAAC,GAAA,KAAgB,OAAA,CAAQ,KAAK,GAAG,CAAA,CAAA;AAC7D,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,MAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AACxC,MAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA;AAAA,UACE,mEAAmE,QAAQ,CAAA,4BAAA;AAAA,SAC7E;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,CAAc,UAAU,CAAC,QAAA,EAAU,kBAAkB,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,IACvF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA;AAAA,QACE,oDAAoD,QAAQ,CAAA,kEAAA;AAAA,OAC9D;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAUF,EAAA,CAAA,KAAA,CAAM,UAAU,GAAK,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,kBAAA,GAAyC;AAChD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,QAAQ,GAAA,CAAI,IAAA;AACrD,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,IAAI,GAAG,OAAO,MAAA;AACjD,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,UAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AACnE,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,SAAA,CAAa,IAAA,EAAS,KAAA,EAAoB,OAAA,EAA2B;AAC5E,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,IAAA,KAAS,UAAU,IAAA,EAAM,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,aAAA,CAAc,CAAC,CAAA,IAAK,CAAC,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACtF,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACxB,MAAA,OAAA,CAAQ,CAAA,EAAA;AAAA,IACV,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AC5wBA,IAAM,UAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,MAAA,GAAkD;AAAA,EACtD,OAAO,KAAA,CAAM,GAAA;AAAA,EACb,MAAM,KAAA,CAAM,MAAA;AAAA,EACZ,MAAM,KAAA,CAAM,IAAA;AAAA,EACZ,OAAO,KAAA,CAAM,IAAA;AAAA,EACb,OAAO,KAAA,CAAM;AACf,CAAA;AAEA,IAAM,UAAA,uBAAiB,GAAA,CAAc,CAAC,SAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAChF,IAAM,8BAAc,IAAI,GAAA,CAAY,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AA+B/C,IAAM,aAAA,GAAN,MAAM,cAAA,CAAgC;AAAA;AAAA,EAE3C,OAAwB,kBAAA,GAAqB,GAAA;AAAA,EAE7C,KAAA;AAAA,EACQ,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,sBAAA,GAAyB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAezB,IAAA,GAAsB,QAAQ,OAAA,EAAQ;AAAA,EACtC,MAAA,GAA+B,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,IAAY,KAAA,GAAuB;AACjC,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,IAAA;AAAA,EAChD;AAAA,EACA,IAAY,MAAM,IAAA,EAAqB;AACrC,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,IAAA;AAAA,cAC1B,IAAA,GAAO,IAAA;AAAA,EACnB;AAAA,EAEA,WAAA,CAAY,IAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,IAAS,aAAA,CAAc,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AACzE,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AAClC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,IAAU,cAAA,CAAe,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAC7E,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,KAAW,KAAA;AAC9B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,IAAgB,EAAA,GAAK,IAAA,GAAO,IAAA;AACrD,IAAA,IAAI,KAAK,IAAA,EAAM;AAQb,MAAA,MAAM,GAAA,GAAWG,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CACf,IAAA,CAAK,YAAY;AAChB,QAAA,MAAUC,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1C,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,KAAa,GAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5B;AAAA,EACA,IAAA,CAAK,KAAa,GAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,EAC3B;AAAA,EACA,IAAA,CAAK,KAAa,GAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,EAC3B;AAAA,EACA,KAAA,CAAM,KAAa,GAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5B;AAAA,EACA,KAAA,CAAM,KAAa,GAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAA,EAA2C;AAQ/C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,cAAA,CAAc,SAAS,CAAA;AACnD,IAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,KAAA,CAAM,WAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,QAAA,EAAS;AACjD,IAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,KAAA,CAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,IAAA,KAAA,CAAM,yBAAyB,IAAA,CAAK,sBAAA;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,cAAc,IAAA,EAAoB;AACxC,IAAA,IAAI,IAAA,CAAK,sBAAA,EAAA,GAA2B,cAAA,CAAc,kBAAA,KAAuB,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CACf,IAAA,CAAK,YAAY;AAChB,MAAA,IAAI,EAAA;AACJ,MAAA,IAAI;AACF,QAAA,EAAA,GAAK,MAAUA,QAAK,IAAI,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,CAAG,IAAA,GAAO,IAAA,CAAK,YAAA,EAAc;AACjC,MAAA,IAAI;AACF,QAAA,MAAUA,MAAG,CAAA,EAAG,IAAI,MAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AACzC,QAAA,MAAUA,EAAA,CAAA,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC1B;AAAA,EAEQ,GAAA,CAAI,KAAA,EAAiB,GAAA,EAAa,GAAA,EAAqB;AAC7D,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AACrC,IAAA,IAAI,IAAI,OAAA,EAAS;AACjB,IAAA,MAAM,EAAA,GAAA,iBAAK,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAClC,IAAA,MAAM,QAAiC,EAAE,EAAA,EAAI,OAAO,GAAA,EAAK,GAAG,KAAK,QAAA,EAAS;AAC1E,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,KAAA,CAAM,GAAA,GAAM,GAAA,YAAe,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,GAAI,GAAA;AAAA,IAClF;AAKA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;AAAA,CAAA;AACrC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CACf,IAAA,CAAK,MAAUA,EAAA,CAAA,UAAA,CAAW,IAAA,CAAK,IAAA,EAAO,IAAI,CAAC,CAAA,CAC3C,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,MAAA,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;AAAA,CAAI,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,EAAE,CAAC,IAAI,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,MAAA,CAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA,CAAA;AACpF,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,QAAA,CAAS,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC;AAAA,CAAI,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAG,IAAI;AAAA,CAAI,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,GAAA,EAAmC;AACxD,EAAA,OAAO,GAAA,IAAO,UAAA,CAAW,GAAA,CAAI,GAAe,IAAK,GAAA,GAAmB,MAAA;AACtE;AAEA,SAAS,eAAe,GAAA,EAAoC;AAC1D,EAAA,OAAO,GAAA,IAAO,WAAA,CAAY,GAAA,CAAI,GAAG,IAAK,GAAA,GAAoB,QAAA;AAC5D;AAEA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,IAAI,eAAe,KAAA,EAAO,OAAO,KAAA,CAAM,GAAA,CAAI,IAAI,OAAO,CAAA;AACtD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC9B;AACF;AAOO,IAAM,UAAA,GAAqB;AAAA;AAAA;AAAA,EAGhC,KAAA,EAAO,OAAA;AAAA,EACP,OAAO,MAAM;AAAA,EAAC,CAAA;AAAA,EACd,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,OAAO,MAAM;AAAA,EAAC,CAAA;AAAA,EACd,OAAO,MAAM;AAAA,EAAC,CAAA;AAAA,EACd,OAAO,MAAM;AACf;;;AC/PA,IAAM,oBAAA,GAAuB,GAAA;AAOtB,IAAM,sBAAN,MAAkD;AAAA,EAC/C,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,CAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,CAAA;AAAA,EACJ,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACT,UAAA,uBAAiB,GAAA,EAAwB;AAAA;AAAA,EAEzC,SAAA,GAAY,CAAA;AAAA,EACZ,aAAA,GAAgB,CAAA;AAAA,EAExB,WAAA,CAAY,IAAA,GAAkH,EAAC,EAAG;AAChI,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,OAAA,CAAQ,OAAc,KAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,IAAa,MAAM,SAAA,IAAa,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,UAAA,IAAc,CAAA;AAEvC,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,KAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,SAAA,IAAa,CAAA;AAExC,IAAA,MAAM,QAAQ,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACnD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC5B,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA,IAAc,KAAA,EAAO;AAE7C,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,IAAQ,oBAAA,EAAsB;AAChD,QAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACvC,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,CAAC,KAAK,EAAE,CAAA;AAAA,MACtC;AAEA,MAAA,KAAK,IAAA,CAAK,SACP,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAC5B,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,QAC1B;AAIA,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACrB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,iCAAA,EAAmC,EAAE,KAAA,EAAO,KAAA,IAAS,aAAa,CAAA;AACpF,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AACH,MAAA;AAAA,IACF;AAIA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA,EAGA,gBAAA,CAAiB,OAAc,QAAA,EAA+B;AAC5D,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,IAAa,MAAM,SAAA,IAAa,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,UAAA,IAAc,CAAA;AAEvC,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,KAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,SAAA,IAAa,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,IAAQ,oBAAA,EAAsB;AAChD,MAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,CAAC,KAAK,EAAE,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,KAAA,GAAe;AACb,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,oBAAA,GAA6D;AAC3D,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,KAAK,aAAA,EAAc;AAAA,EAChE;AAAA,EAEA,YAAA,GAAkF;AAChF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,MAC5B,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MAC9B,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,SAAA,GAAY,KAAK,UAAU,CAAA;AAAA,MAC9C,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,UAAA,GAAyB;AAIvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,KAAA;AACpC,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,aAAa,IAAA,CAAK,UAAA;AAAA,MAClB,QAAA,EAAU,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,KAAK,SAAA,GAAY;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,iBAAA,EAAmB;AAAA,MACnC,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,MAClB,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,UAAA;AAAW,KACjG,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,UAAA,CAAW,OAAc,KAAA,EAAyB;AACxD,IAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,aAAc,KAAA,CAAM,KAAA,GAAQ,MAAa,KAAA,CAAM,KAAA;AACrE,IAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,cAAe,KAAA,CAAM,MAAA,GAAS,MAAa,KAAA,CAAM,MAAA;AACxE,IAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,EAAW;AACtC,MAAA,IAAA,CAAK,SAAA,IAAc,KAAA,CAAM,SAAA,GAAY,GAAA,GAAa,KAAA,CAAM,SAAA;AAAA,IAC1D;AACA,IAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAa,MAAM,YAAA,KAAiB,MAAA;AACtF,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,KAAiB,kBAAA,GAAqB,IAAI,KAAA,CAAM,UAAA,CAAA;AAC3E,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,CAAA;AAC3C,IAAA,IAAI,YAAA,KAAiB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,UAAA,CAAA,EAAa;AAC5D,MAAA,IAAA,CAAK,aAAc,YAAA,GAAe,GAAA,IAAc,KAAA,CAAM,YAAA,IAAgB,MAAM,UAAA,IAAc,CAAA,CAAA;AAAA,IAC5F;AACA,IAAA,IAAI,YAAA,KAAiB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,UAAA,CAAA,EAAa;AAC5D,MAAA,IAAA,CAAK,aAAc,YAAA,GAAe,GAAA,IAAc,KAAA,CAAM,YAAA,IAAgB,MAAM,UAAA,IAAc,CAAA,CAAA;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,SAAS,eAAe,CAAA,EAA8B;AACpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA;AAAA,IAChB,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA;AAAA,IACnB,UAAA,EAAY,EAAE,IAAA,EAAM,WAAA;AAAA,IACpB,YAAA,EAAc,CAAA,CAAE,IAAA,EAAM,cAAA,IAAkB,EAAE,IAAA,EAAM,WAAA;AAAA,IAChD,YAAA,EAAc,CAAA,CAAE,IAAA,EAAM,cAAA,KAAmB,CAAA,CAAE,IAAA,EAAM,KAAA,KAAU,MAAA,GAAY,CAAA,CAAE,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,MAAA;AAAA,GAC5F;AACF;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAM,CAAA,GAAI,GAAA;AAClC;;;AClMO,IAAM,kBAAA,GAAiD;AAAA,EAC5D,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc;AAChB;;;ACuCA,SAAS,sBAAA,GAAkC;AACzC,EAAA,OAAO,OAAA,CAAQ,IAAI,UAAU,CAAA,KAAM,iBAAiB,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,KAAM,GAAA;AAC1F;AAGA,SAAS,qBAAA,CAAsB,OAAe,OAAA,EAAkC;AAC9E,EAAA,IAAI,CAAC,wBAAuB,EAAG;AAC/B,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,KAAK,SAAA,CAAU;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,MACP,KAAA;AAAA,MACA,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,MAC5B,yBAAyB,OAAA,CAAQ,uBAAA;AAAA;AAAA,MAEjC,uBACE,OAAA,CAAQ,kBAAA,GAAqB,IACzB,OAAA,CAAQ,uBAAA,GAA0B,QAAQ,kBAAA,GAC1C,CAAA;AAAA,MACN,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,MAC5B,yBAAyB,OAAA,CAAQ,uBAAA;AAAA,MACjC,uBACE,OAAA,CAAQ,kBAAA,GAAqB,IACzB,OAAA,CAAQ,uBAAA,GAA0B,QAAQ,kBAAA,GAC1C,CAAA;AAAA,MACN,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,SAAS,OAAA,CAAQ;AAAA,KAClB;AAAA,GACH;AACF;AAOO,IAAM,gBAAA,GAAmB,qBAAA;AAgBzB,SAAS,eAAe,CAAA,EAAqB;AAClD,EAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AACpE,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AAC5E;AAYO,SAAS,iBAAA,CAAkB,UAA8B,SAAA,EAA2B;AACzF,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,gBAAgB,QAAA,CAAS,MAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,IAAK,SAAA,GAAY,WAAW,CAAA,EAAA,EAAK;AACtE,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,WAAA,EAAa;AAC/C,MAAA,SAAA,EAAA;AACA,MAAA,aAAA,GAAgB,CAAA;AAAA,IAClB;AAAA,EACF;AAKA,EAAA,IAAI,oBAAA,GAAuB,CAAA;AAC3B,EAAA,IAAI,yBAAA,GAA4B,CAAA;AAChC,EAAA,OAAO,gBAAgB,CAAA,EAAG;AACxB,IAAA,oBAAA,EAAA;AACA,IAAA,MAAM,KAAA,GAAQ,SAAS,aAAa,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,GAAgB,CAAC,CAAA;AACvC,IAAA,IAAI,CAAC,SAAS,CAAC,IAAA,IAAQ,MAAM,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AAC3E,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,YAAY,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AAC3E,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AACjE,IAAA,yBAAA,IAA6B,SAAA,CAAU,UAAA;AACvC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACxB,IAAA,aAAA,EAAA;AAAA,EACF;AAEA,EAAA,IAAI,wBAAuB,EAAG;AAC5B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,SAAA,CAAU;AAAA,QACb,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,sCAAA;AAAA,QACP,cAAc,QAAA,CAAS,MAAA;AAAA,QACvB,SAAA;AAAA,QACA,aAAA;AAAA,QACA,oBAAA;AAAA,QACA,yBAAA;AAAA,QACA,uBAAA,EACE,oBAAA,GAAuB,CAAA,GAAI,yBAAA,GAA4B,oBAAA,GAAuB;AAAA,OACjF;AAAA,KACH;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,mBAAA,CACP,eACA,UAAA,EAC0C;AAC1C,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,IAAA,UAAA,EAAA;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAClC,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,aAAA,GAAgB,KAAA,CAAM,WAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,SAAA,qBAAc,IAAI,GAAA,CAAI,CAAC,aAAa,CAAC,CAAA;AACrC,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,IAAI,kBAAkB,MAAA,EAAW,OAAO,EAAE,OAAA,EAAS,OAAO,UAAA,EAAW;AAErE,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,UAAA,EAAA;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC/B,IAAA,IAAI,SAAA,GAAY,UAAU,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,OAAO,aAAA,EAAe;AACpE,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAW;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAA,EAAW;AACtC;AAeO,SAAS,mBAAA,CACd,UACA,IAAA,EACa;AACb,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAOhE,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,mBAAA,GAAsB,EAAA;AAC1B,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,uBAAA,GAA0B,CAAA;AAC9B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAA,IAAiB,CAAC,cAAc,CAAA,EAAA,EAAK;AACvD,IAAA,kBAAA,EAAA;AACA,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,MAAA,uBAAA,EAAA;AACA,MAAA,MAAM,YACH,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,wBAAA,CAAyB,EAAE,OAAO,CAAA,IAAK,IAAA,CAAK,cAAA,IACxE,EAAE,IAAA,KAAS,UAAA,IAAc,wBAAwB,CAAA,CAAE,KAAK,KAAK,IAAA,CAAK,cAAA;AACrE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,mBAAA,GAAsB,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,qBAAA;AAAA,IACE,eACI,8CAAA,GACA,2CAAA;AAAA,IACJ;AAAA,MACE,cAAc,QAAA,CAAS,MAAA;AAAA,MACvB,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,uBAAA;AAAA,MACA,kBAAA,EAAoB,CAAA;AAAA,MACpB,uBAAA,EAAyB,CAAA;AAAA,MACzB,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS;AAAA;AACX,GACF;AAEA,EAAA,IAAI,CAAC,cAAc,OAAO,EAAE,UAAiC,KAAA,EAAO,CAAA,EAAG,SAAS,KAAA,EAAM;AAQtF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,uBAAA,GAA0B,CAAA;AAC9B,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,mBAAA,EAAqB,CAAA,GAAI,aAAA,EAAe,CAAA,EAAA,EAAK;AACxD,IAAA,kBAAA,EAAA;AACA,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,IAAA,MAAM,WAAW,GAAA,CAAI,OAAA;AACrB,IAAA,IAAI,UAAA;AACJ,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,QAAA,CAAS,QAAQ,GAAA,EAAA,EAAO;AAC9C,MAAA,uBAAA,EAAA;AACA,MAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,QAAA,MAAMC,OAAAA,GAAS,uBAAA,CAAwB,CAAA,CAAE,KAAK,CAAA;AAC9C,QAAA,IAAIA,OAAAA,GAAS,KAAK,cAAA,EAAgB;AAClC,QAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,CAAA,EAAGA,OAAM,CAAA;AAC1D,QAAA,KAAA,IAAS,KAAK,GAAA,CAAI,CAAA,EAAGA,OAAAA,GAAS,uBAAA,CAAwB,WAAW,CAAC,CAAA;AAClE,QAAA,UAAA,KAAe,SAAS,KAAA,EAAM;AAC9B,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,OAAO,WAAA,EAAY;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC9B,MAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,CAAA,CAAE,OAAO,CAAA;AACjD,MAAA,IAAI,MAAA,GAAS,KAAK,cAAA,EAAgB;AAClC,MAAA,KAAA,IAAS,MAAA;AACT,MAAA,MAAM,MAAA,GAA0B;AAAA,QAC9B,IAAA,EAAM,aAAA;AAAA,QACN,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,OAAA,EAAS,0BAAA,CAA2B,CAAA,EAAG,MAAM,CAAA;AAAA,QAC7C,UAAU,CAAA,CAAE;AAAA,OACd;AACA,MAAA,UAAA,KAAe,SAAS,KAAA,EAAM;AAC9B,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA;AAAA,IACpB;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,KAAS,SAAS,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,EAAK,SAAS,UAAA,EAAW;AACxC,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAOA,IAAA,IAAI,wBAAuB,EAAG;AAC5B,MAAA,MAAM,QAAQ,uBAAA,GAA0B,kBAAA;AAExC,MAAA,IAAI,QAAQ,EAAA,EAAI;AAEd,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,KAAK,SAAA,CAAU;AAAA,YACb,KAAA,EAAO,OAAA;AAAA,YACP,KAAA,EAAO,+BAAA;AAAA,YACP,OAAA,EAAS,CAAA,sBAAA,EAAyB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,0DAAA,CAAA;AAAA,YAClD,cAAc,QAAA,CAAS,MAAA;AAAA,YACvB,kBAAA;AAAA,YACA;AAAA,WACD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,qBAAA,CAAsB,oCAAA,EAAsC;AAAA,IAC1D,cAAc,QAAA,CAAS,MAAA;AAAA,IACvB,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA,WAAA,EAAa,KAAA;AAAA,IACb;AAAA,GACD,CAAA;AAED,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,IAAW,OAAO,IAAA,GAAQ,QAAA,EAAwB,OAAO,OAAA,EAAQ;AACtF;AAEA,SAAS,4BAAA,CACP,OACA,MAAA,EACyB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,EAAG;AAC5D,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,0BAAA,CAA2B,KAAK,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA,IACL,mBAAA,EAAqB,IAAI,MAAM,CAAA,kDAAA,CAAA;AAAA,IAC/B,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ;AAAA,GACF;AACF;AAEA,SAAS,2BAA2B,KAAA,EAAyB;AAC3D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,WAAW,OAAO,KAAA;AACpE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,GAAA,GAAM,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,OAAA,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA,OAAA,EAAU,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA;AACzD,IAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,SAAS,EAAE,CAAA,CAAA,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,0BAAA,CAA2B,OAAwB,MAAA,EAAwB;AAClF,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,SAAA,EAAY,MAAM,CAAA,OAAA,CAAS,CAAA;AAC1C,EAAA,IAAI,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC/C,EAAA,MAAM,QAAQ,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AACtC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAC7B;AAEA,SAAS,iBAAiB,OAAA,EAA4B;AACpD,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAC3E,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,EAAA,GAAK,4EAAA;AACX,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA;AAC9E,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA,IAAU,GAAA,EAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AAC/C,IAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AAAA,EACrB;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA;AAChB;AAEA,SAAS,eAAe,OAAA,EAAsC;AAC5D,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAC3E,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,IAAA,IACE,CAAC,sFAAA,CAAuF,IAAA;AAAA,MACtF;AAAA,KACF;AAEA,MAAA;AACF,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC/C,IAAA,IAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,oBAAoB,QAAA,EAAsC;AACxE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,IAAA,GAAO,CAAA,CAAE,OAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,IAAI,YAAY,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,aAAA,IAC5B,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,aAAA,EAAe,OAAA,EAAA;AAAA,MAC9D;AACA,MAAA,IAAA,GAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,KAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,IAAK,YAAY,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,CAAA,EAAA,EAAK,OAAO,CAAA,6CAAA,CAAA,GAA6C,EAAA;AACtF,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,MAAM,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAeO,SAAS,YAAY,CAAA,EAAoB;AAC9C,EAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA;AAC5C,EAAA,OAAO,CAAA,CAAE,OAAA,CACN,MAAA,CAAO,WAAW,CAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,GAAG,CAAA;AACb;AAGO,SAASC,YAAW,CAAA,EAAqB;AAC9C,EAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,OAAO,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACpD;AAGO,SAAS,kBAAA,CAAmB,CAAA,EAAY,SAAA,GAAY,GAAA,EAAe;AACxE,EAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,OAAO,EAAE,OAAA,CAAQ,IAAA;AAAA,IACf,CAAC,CAAA,KACC,CAAA,CAAE,SAAS,aAAA,IACV,CAAA,CAAsB,YACtB,OAAQ,CAAA,CAAsB,YAAY,QAAA,GACtC,CAAA,CAAsB,QAAQ,MAAA,GAC/B,IAAA,CAAK,UAAW,CAAA,CAAsB,OAAO,EAAE,MAAA,IAAU;AAAA,GACjE;AACF;AAYO,SAAS,YAAA,CACd,GACA,OAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAC,CAAA,CAAE,WAAA,EAAY;AAGxC,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,KAAMA,WAAAA,CAAW,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,CAAA,EAAW;AAChF,IAAA,MAAM,SAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA;AACjF,IAAA,IAAIA,WAAAA,CAAW,CAAC,CAAA,IAAK,SAAA,EAAW,OAAO,CAAA;AAAA,EACzC;AAGA,EAAA,IAAI,OAAA,EAAS,iBAAiB,CAAA,CAAE,IAAA,KAAS,UAAUA,WAAAA,CAAW,CAAC,MAAM,KAAA,EAAO;AAE1E,IAAA,MAAM,SAAA,GAAY,gEAAA,CAAiE,IAAA,CAAK,IAAI,CAAA;AAC5F,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,MAAM,MAAA,GACJ,mEACG,IAAA,CAAK,IAAI,IAAI,CAAC,CAAA,EACb,aAAY,IAAK,OAAA;AACvB,MAAA,MAAM,SAAS,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,CAAA;AACzD,MAAA,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AACvC,MAAA,IAAI,KAAA,IAAS,GAAG,OAAO,CAAA;AACvB,MAAA,IAAI,KAAA,IAAS,GAAG,OAAO,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,IACE,oFAAA,CAAqF,IAAA;AAAA,MACnF;AAAA,KACF,EACA;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IACE,+IAAA,CAAgJ,IAAA;AAAA,IAC9I;AAAA,GACF,EACA;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IACE,mGAAA,CAAoG,IAAA;AAAA,IAClG;AAAA,GACF,EACA;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IACE,CAAA,CAAE,IAAA,KAAS,WAAA,IACX,uGAAA,CAAwG,IAAA;AAAA,IACtG;AAAA,GACF,EACA;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,kBAAA,CAAmB,CAAC,CAAA,EAAG,OAAO,CAAA;AAGlC,EAAA,IACE,CAAA,CAAE,IAAA,KAAS,MAAA,IACX,CAACA,WAAAA,CAAW,CAAC,CAAA,IACb,oFAAA,CAAqF,IAAA,CAAK,IAAI,CAAA,EAC9F;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,OAAO,CAAA;AACT;AAYO,SAAS,iBAAiB,QAAA,EAAsC;AACrE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,EAAG,EAAE,eAAe,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,gBAAgB,CAAC,CAAA;AAEnC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,UAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,SAAA,GAAY,CAAA,GAAI,CAAA,EAAA,EAAK,SAAS,CAAA,cAAA,CAAA,GAAmB,EAAA;AAChE,IAAA,IAAI,OAAA;AAEJ,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAA,GAAU,KAAK,IAAA,EAAK;AACpB,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,GAAU,cAAc,IAAI,CAAA;AAC5B,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,GAAU,cAAA,CAAe,GAAG,IAAI,CAAA;AAChC,QAAA;AAAA,MACF;AACE,QAAA,OAAA,GAAU,cAAc,IAAI,CAAA;AAAA;AAGhC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,MAAM,OAAO,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,aAAa,UAAU,CAAA,qEAAA;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,gBAAgB,CAAA,EAAoB;AAC3C,EAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,CAAA;AAC1C,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,CAAE,MAAA;AACpF;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACjC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,OAAO,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,OAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACzC,EAAA,OAAO,QAAA,CAAS,SAAS,GAAA,GAAM,CAAA,EAAG,SAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,QAAA;AAChE;AAEA,SAAS,cAAA,CAAe,GAAY,IAAA,EAAsB;AACxD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAExB,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,MAAM,OAAA,GAAU,EAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AAChE,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,uCAAA,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC5C,EAAA,OAAO,SAAA,CAAU,SAAS,GAAA,GAAM,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,MAAA,CAAA,GAAM,SAAA;AACjE;;;ACjnBO,IAAM,kBAAN,MAA2C;AAAA,EAC/B,SAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,KAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAc,IAAA,GAA6C,EAAC,EAA2B;AACnG,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC/C,IAAA,MAAM,aAA0C,EAAC;AACjD,IAAA,MAAM,MAAA,GAAS,wBAAwB,GAAG,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,SAAA,IAAa,IAAA,CAAK,SAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,IAAA,CAAK,cAAA;AAGtD,IAAA,MAAM,QAAQ,mBAAA,CAAoB,GAAA,CAAI,UAAU,EAAE,SAAA,EAAW,gBAAgB,CAAA;AAC7E,IAAA,IAAI,MAAM,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,MAAM,QAAQ,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAK7E,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,SAAS,CAAA;AACvD,MAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAC/E,MAAA,eAAA,GAAkB,MAAA,CAAO,MAAA;AACzB,MAAA,cAAA,GAAiB,MAAA,CAAO,cAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,OAAO,OAAA,EAAS;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,uBAAuB,GAAA,EAAK;AAAA,MAC1C,eAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA,EAAS,YAAA,GAAe,WAAA,IAAe,UAAA,GAAa;AAAA,KACrD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,WAAA;AAAA,MACP,uBAAA,EAAyB,UAAA;AAAA,MACzB,sBAAA,EAAwB,SAAA;AAAA,MACxB,UAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,OAAA,GACtB;AAAA,QACE,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,QACjC,kBAAA,EAAoB,SAAS,MAAA,CAAO,kBAAA;AAAA,QACpC,eAAA,EAAiB,SAAS,MAAA,CAAO;AAAA,OACnC,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,GAAA,EAAsB;AAChD,IAAA,OAAO,qBAAA,CAAsB,IAAI,QAAA,EAAU,GAAA,CAAI,cAAc,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,CAAE,KAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,oBAAA,CACN,GAAA,EACA,SAAA,GAAY,IAAA,CAAK,SAAA,EACoE;AACrF,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,MAAA,GAAS,YAAY,CAAC,CAAA;AAC7D,IAAA,IAAI,SAAA,IAAa,CAAA,EAAG,OAAO,EAAE,OAAO,CAAA,EAAE;AAGtC,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,cAAA,CAAe,CAAC,CAAA,EAAG;AAC1C,QAAA,QAAA,GAAW,CAAA;AACX,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,IAAY,CAAA,EAAG,OAAO,EAAE,OAAO,CAAA,EAAE;AAErC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,iBAAiB,OAAO,CAAA;AAE9C,IAAA,MAAM,aAAA,GACJ,IAAA,CAAK,KAAA,GACD,gBAAA,CAAiB,OAAO,CAAA,IACxB,CAAA,EAAG,OAAA,CAAQ,MAAM,2EACjB,mBAAA,CAAoB,OAAO,CAAA,IAC3B,CAAA,EAAG,QAAQ,MAAM,CAAA,sEAAA,CAAA;AAEvB,IAAA,MAAM,cAAA,GAAiB,2BAA2B,GAAG,CAAA;AACrD,IAAA,MAAM,SAAS,cAAA,GACX,CAAA;AAAA,EAAoB,cAAc;;AAAA;AAAA,EAAwB,aAAa,CAAA,CAAA,GACvE,aAAA;AAEJ,IAAA,MAAM,UAAA,GAAsB;AAAA,MAC1B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,wBAAwB,MAAM,CAAA,CAAA;AAAA,KACzC;AAGA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACxC,IAAA,GAAA,CAAI,MAAM,eAAA,CAAgB,CAAC,UAAA,EAAY,GAAG,IAAI,CAAC,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,gBAAA,CAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;AAAA,MACjE,MAAA;AAAA,MACA,gBAAgB,cAAA,IAAkB;AAAA,KACpC;AAAA,EACF;AACF;AAEA,SAAS,sBAAA,CACP,KACA,IAAA,EAK0B;AAC1B,EAAA,MAAM,WAAW,GAAA,CAAI,eAAA;AACrB,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,eAAA,IAAmB,EAAE;AAAA,EAAK,IAAA,CAAK,kBAAkB,EAAE,CAAA,CAAA;AAC1E,EAAA,MAAM,SAAA,GAAY,QAAQ,QAAA,EAAU,aAAA,EAAe,QAAQ,kCAAA,CAAmC,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1G,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO,IAAA,CAAK,QAAA,EAAU,SAAA,IAAa,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,IAAA,CAC7C,QAAA,EAAU,UAAU,MAAA,IAAU,CAAA,IAAK,CAAA,IACpC,2CAAA,CAA4C,KAAK,MAAM;AAAA,GAC3D;AACA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAK,OAAA,IAAW,CAAC,SAAA,EAAW,MAAA,CAAO,KAAK,uBAAuB,CAAA;AACnE,EAAA,IAAI,KAAK,OAAA,IAAW,CAAC,YAAA,EAAc,MAAA,CAAO,KAAK,yBAAyB,CAAA;AACxE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAO,MAAA,KAAW,CAAA;AAAA,IACtB,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAwB,GAAA,EAA0C;AACzE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,GAAO,qBAAqB,CAAA;AAC/C,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,IAAA;AAClD,EAAA,MAAM,SAAA,GAAY,MAAA;AAClB,EAAA,IACE,OAAO,SAAA,CAAU,SAAA,KAAc,YAC/B,OAAO,SAAA,CAAU,mBAAmB,QAAA,EACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;ACtNA,IAAM,eAAA,GAAkB;AAAA,EACtB,MAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AACF,CAAA;AAEO,IAAM,sBAAN,MAAkD;AAAA,EAC9C,WAAA;AAAA,EACA,GAAA;AAAA,EAET,WAAA,CAAY,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAG;AACvC,IAAA,IAAA,CAAK,GAAA,GAAW,cAAQ,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA;AAAA,EACpD;AAAA,EAEA,kBAAkB,KAAA,EAAuB;AACvC,IAAA,IAAI,GAAA,GAAW,cAAQ,KAAK,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAY,KAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC7B,IAAA,MAAM,IAAA,GAAY,KAAA,CAAA,OAAA,CAAWC,EAAA,CAAA,OAAA,EAAS,CAAA;AACtC,IAAA,MAAM,SAAA,GAAiB,cAAQ,KAAK,CAAA;AACpC,IAAA,OAAO,QAAQ,IAAA,EAAM;AAMnB,MAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,SAAA,EAAW;AACrC,QAAA;AAAA,MACF;AACA,MAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,QAAA,IAAI;AACF,UAAGC,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAM,CAAC,CAAA;AACpC,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAc,cAAQ,GAAG,CAAA;AAC/B,MAAA,IAAI,WAAW,GAAA,EAAK;AACpB,MAAA,GAAA,GAAM,MAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,MAAM,GAAA,GAAW,iBAAW,KAAK,CAAA,GAAI,QAAa,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,KAAK,CAAA;AACzE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAUA,iBAAa,GAAG,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,GAAY,gBAAU,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,OAAA,EAA0B;AACrC,IAAA,MAAM,UAAA,GAAkB,gBAAU,OAAO,CAAA;AACzC,IAAA,MAAM,IAAA,GAAY,KAAA,CAAA,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AAC5C,IAAA,IAAI,UAAA,KAAe,MAAM,OAAO,IAAA;AAChC,IAAA,MAAM,GAAA,GAAW,KAAA,CAAA,QAAA,CAAS,IAAA,EAAM,UAAU,CAAA;AAC1C,IAAA,OAAO,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,CAAM,iBAAW,GAAG,CAAA;AAAA,EACtD;AAAA,EAEA,iBAAiB,OAAA,EAAyB;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,EAAG;AAIhC,MAAA,MAAM,UAAe,KAAA,CAAA,UAAA,CAAW,OAAO,CAAA,GAAS,KAAA,CAAA,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA;AACpE,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,OAAO,CAAA,mCAAA,CAAqC,CAAA;AAG3E,MAAC,IAAoF,QAAA,GAAW,OAAA;AAChG,MAAC,GAAA,CAAoF,cAAc,IAAA,CAAK,WAAA;AACxG,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACvFO,IAAM,cAAA,GAAiB,yDAAA;;;ACgB9B,IAAM,mBAAA,GAAsB,oEAAA;AAMrB,SAAS,wBAAwB,IAAA,EAIjB;AACrB,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAW,IAAA,EAAM,SAAA;AAAA,MACjB,MAAM,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK;AACtB,QAAA,IAAI,EAAE,GAAA,YAAe,aAAA,CAAA,EAAgB,OAAO,IAAA;AAC5C,QAAA,IAAI,IAAI,MAAA,KAAW,GAAA,IAAO,CAAC,sBAAA,CAAuB,GAAG,GAAG,OAAO,IAAA;AAE/D,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACrE,YAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ;AAChC,cAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,mBAAA,EAAoB;AAAA,YACxD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,MAAM,QAAQ,GAAA,EAAK;AACjB,QAAA,IAAI,EAAE,GAAA,YAAe,aAAA,CAAA,IAAkB,GAAA,CAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAIlE,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,EAAM,YAAA,IAAgB,GAAA;AAE1C,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,GAAA,EAAQ,KAAK,GAAA,CAAI,GAAA,EAAO,OAAO,CAAC,CAAA;AACvD,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7C,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,oBAAA,EAAqB;AAAA,MACzD;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,MAAM,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK;AACtB,QAAA,IAAI,EAAE,GAAA,YAAe,aAAA,CAAA,EAAgB,OAAO,IAAA;AAC5C,QAAA,IAAI,GAAA,CAAI,WAAW,GAAA,IAAO,GAAA,CAAI,WAAW,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEzE,QAAA,MAAM,WAAW,IAAA,EAAM,cAAA;AACvB,QAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,EAAU,EAAA;AACjC,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,UAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AACtD,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,MAAM,eAAe,MAAM,QAAA,CAAS,QAAA,CAAS,UAAA,EAAY,IAAI,KAAK,CAAA;AAClE,UAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAI1B,UAAA,MAAM,gBAAgB,IAAA,EAAM,SAAA,IAAY,CAAE,SAAA,GAAY,UAAU,CAAA,EAAG,MAAA;AACnE,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AAC/C,YAAA,IAAI,aAAA,KAAkB,UAAa,CAAC,aAAA,CAAc,SAAS,CAAA,CAAE,EAAE,GAAG,OAAO,KAAA;AACzE,YAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,MAAA,CAAO,iBAAA;AAC1C,YAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,KAAA,IAAS,MAAA,CAAO,iBAAA;AACvD,YAAA,IAAI,SAAA,IAAa,aAAa,OAAO,KAAA;AACrC,YAAA,IAAI,aAAa,YAAA,CAAa,KAAA,IAAS,CAAC,CAAA,CAAE,WAAW,OAAO,KAAA;AAC5D,YAAA,IAAI,YAAA,CAAa,aAAa,MAAA,IAAU,CAAC,EAAE,UAAA,EAAY,KAAA,EAAO,SAAS,OAAO,CAAA;AAC5E,cAAA,OAAO,KAAA;AACT,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAED,UAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,UAAA,MAAM,WAAW,UAAA,CAAW,MAAA;AAAA,YAAO,CAAC,IAAA,EAAM,IAAA,KAAA,CACvC,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA,KAAM,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA,CAAA,GAAK,IAAA,GAAO;AAAA,WAC7D;AAEA,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ,iBAAA;AAAA,YACR,OAAO,QAAA,CAAS;AAAA,WAClB;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AACF,GACF;AACF;AAEO,IAAM,8BAA8B,uBAAA;AAE3C,SAAS,uBAAuB,GAAA,EAA6B;AAC3D,EAAA,OAAO,oBAAoB,IAAA,CAAK;AAAA,IAC9B,GAAA,CAAI,OAAA;AAAA,IACJ,IAAI,IAAA,EAAM,OAAA;AAAA,IACV,IAAI,IAAA,EAAM,IAAA;AAAA,IACV,IAAI,IAAA,EAAM;AAAA,IACV,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9B;AAEO,IAAM,sBAAN,MAAkD;AAAA,EACtC,UAAA;AAAA,EAEjB,WAAA,CAAY,aAAiC,2BAAA,EAA6B;AACxE,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,SAAS,GAAA,EAWP;AAGA,IAAA,IACE,OAAO,YAAA,KAAiB,WAAA,IACxB,eAAe,YAAA,IACf,GAAA,CAAI,SAAS,YAAA,EACb;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,KAAA,EAAM;AAAA,IAC3C;AACA,IAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,KAAA,EAAM;AAAA,IAC3C;AACA,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,IAAA,EAAK;AACrE,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,IAAA,EAAK;AACrE,MAAA,IAAI,GAAA,CAAI,UAAU,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,IAAA,EAAK;AAChE,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,sBAAA,CAAuB,GAAG,CAAA,EAAG;AACrD,QAAA,OAAO,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAA,EAAW,KAAA,EAAM;AAAA,MACtD;AACA,MAAA,IAAI,GAAA,CAAI,UAAU,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,KAAA,EAAM;AAAA,IACnE;AACA,IAAA,IAAI,eAAe,KAAA,IAAS,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5D,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,IAAA,EAAK;AAAA,IAC5C;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,KAAA,EAAM;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAc,GAAA,EAAgD;AAC1E,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9C,MAAA,IAAI,MAAA,KAAW,MAAM,OAAO,MAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACnLO,IAAM,qBAAN,MAAgD;AAAA,EACrD,WAAA,CAAY,KAA4B,OAAA,EAA0B;AAChE,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI,CAAC,GAAA,CAAI,SAAA,EAAW,OAAO,KAAA;AAC3B,MAAA,OAAO,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,IAAW,EAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AACzC,IAAA,IAAI,SAAA,SAAkB,OAAA,GAAU,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,GAAA,EAAoC;AAC9C,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,EAAK,OAAO,CAAA;AAC9B,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,QAAQ,OAAA,EAAyB;AAC/B,IAAA,MAAM,IAAA,GAAO,GAAA;AACb,IAAA,MAAM,GAAA,GAAM,OAAO,CAAA,IAAK,OAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAQ,GAAA,GAAM,MAAM,CAAA;AAAA,EACtC;AACF;;;ACjBO,IAAM,yBAAA,GAA4B;AAAA,EACvC,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAOO,IAAM,sBAAA,GAAgE;AAAA,EAC3E,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe,aAAA;AAAA,EACf,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ,QAAA;AAAA,EACR,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,eAAA;AAAA,EACjB,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,mBAAA,EAAqB,mBAAA;AAAA,EACrB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,aAAA,EAAe;AACjB;AASO,SAAS,kBAAkB,KAAA,EAA+C;AAC/E,EAAA,OAAQ,yBAAA,CAAgD,SAAS,KAAK,CAAA;AACxE;;;ACPA,IAAM,OAAA,GAAU,4BAAA;AAChB,IAAM,WAAA,GAAc,gBAAA;AACpB,IAAM,OAAA,GAAU,IAAA;AAQT,SAAS,yBAAyB,GAAA,EAAkC;AACzE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAC,2BAA2B,CAAA,EAAE;AAC/F,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,IAAI,EAAE,iBAAiB,CAAA,KAAM,CAAA,EAAG,MAAA,CAAO,KAAK,2BAA2B,CAAA;AACvE,EAAA,IAAI,OAAO,CAAA,CAAE,QAAQ,MAAM,QAAA,IAAY,CAAC,EAAE,QAAQ,CAAA;AAChD,IAAA,MAAA,CAAO,KAAK,mCAAmC,CAAA;AACjD,EAAA,IAAI,OAAO,CAAA,CAAE,aAAa,MAAM,QAAA,EAAU,MAAA,CAAO,KAAK,8BAA8B,CAAA;AACpF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,OAA4B,EAAC;AACnC,EAAC,EAAE,SAAS,CAAA,CAAgB,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AAC5C,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AACrB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,CAAC,CAAA,mCAAA,CAAqC,CAAA;AAC7D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,YAAA,CAAc,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,IAAI,OAAO,CAAA,CAAE,UAAU,CAAA,KAAM,QAAA,IAAY,CAAC,WAAA,CAAY,IAAA,CAAK,CAAA,CAAE,UAAU,CAAC,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,CAAC,CAAA,uCAAA,CAAyC,CAAA;AACjE,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,CAAC,IAAA,EAAM,OAAA,EAAS,aAAA,EAAe,UAAU,CAAA,EAAY;AACvE,MAAA,MAAM,CAAA,GAAI,EAAE,KAAK,CAAA;AACjB,MAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,WAAW,CAAA,IAAK,CAAA,CAAE,SAAS,OAAA,EAAS;AACjE,QAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,CAAC,KAAK,KAAK,CAAA,kCAAA,EAAqC,OAAO,CAAA,MAAA,CAAQ,CAAA;AACtF,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAC,CAAA,GAC/B,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,IAC9C,EAAC;AACL,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,EAAA,EAAI,EAAE,IAAI,CAAA;AAAA,MACV,IAAA;AAAA,MACA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,MAChB,WAAA,EAAa,EAAE,aAAa,CAAA;AAAA,MAC5B,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,MACtB,IAAA;AAAA,MACA,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,MACtB,OAAA,EAAS,OAAO,CAAA,CAAE,SAAS,MAAM,QAAA,GAAW,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,OAAA,EAAS,OAAO,CAAA,CAAE,SAAS,MAAM,QAAA,GAAW,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,GAAA,EAAK,OAAO,CAAA,CAAE,KAAK,MAAM,QAAA,GAAW,CAAA,CAAE,KAAK,CAAA,GAAI;AAAA,KAChD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,SAAU,EAAE,EAAA,EAAI,OAAO,MAAA,EAAO;AAClD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,QAAA,EAAU;AAAA,MACR,eAAA,EAAiB,CAAA;AAAA,MACjB,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAAA,MAClB,WAAA,EAAa,EAAE,aAAa,CAAA;AAAA,MAC5B,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAeO,SAAS,YAAA,CACd,OACA,QAAA,EACc;AACd,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA;AAClE,EAAA,MAAM,IAAA,GAAqB,EAAE,KAAA,EAAO,EAAC,EAAG,SAAS,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AACnE,EAAA,KAAA,MAAW,GAAA,IAAO,SAAS,OAAA,EAAS;AAClC,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,SAAA,IAC1C,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,KAAM,IAAI,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,SACrE,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA;AACT;;;ACxJO,IAAM,gBAAgB,CAAC,KAAA,EAAO,cAAA,EAAgB,SAAA,EAAW,WAAW,SAAS;AAI7E,SAAS,cAAc,CAAA,EAA6B;AACzD,EAAA,OAAQ,aAAA,CAAoC,SAAS,CAAC,CAAA;AACxD;;;ACbA,IAAM,QAAA,GAAsB;AAAA;AAAA;AAAA,EAG1B;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,iEAAA,EAAkE;AAAA,EAC/F,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,sDAAA,EAAuD;AAAA,EACpF,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,8DAAA,EAA+D;AAAA,EAC/F,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,kDAAA,EAAmD;AAAA,EACpF,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,uDAAA,EAAwD;AAAA,EAClF,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,gEAAA,EAAiE;AAAA,EAC/F;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IAAc,KAAA,EAAO;AAAA,GAC7B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,oBAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,KAAA;AAAA;AAAA,IAEN,KAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,aAAA;AAAA;AAAA,IAEN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACjE,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,gCAAA,EAAiC;AAAA,EAChE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACnD,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,sBAAA,EAAuB;AAAA;AAAA,EAEnD;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,iBAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA;AAAA;AAAA,IAGN,KAAA,EAAO;AAAA;AAEX,CAAA;AAQA,IAAM,kBAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,kBAAkB,CAAA;AAS5E,IAAM,iBAAiB,IAAI,MAAA,CAAO,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,GAAG,GAAG,CAAA;AAGlG,IAAM,kBAAA,GAAqB,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,kBAAkB,CAAA,CAAG,KAAA;AAMhF,IAAM,qBAAA,GAAwB,gBAAgB,GAAA,CAAI,CAAC,MAAM,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAO/E,IAAM,oBAAoB,EAAA,GAAK,IAAA;AAY/B,SAAS,qBAAqB,IAAA,EAAuB;AACnD,EAAA,OACE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EAC1B,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACpB,IAAA,CAAK,SAAS,aAAa,CAAA;AAAA,EAC3B,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACpB,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACpB,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EACvB,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACpB,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACnB,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EACrB,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACpB,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EACrB,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EACvB,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACxB,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EAC1B,IAAA,CAAK,SAAS,YAAY,CAAA,IAC1B,KAAK,QAAA,CAAS,gBAAgB,CAAA,IAC9B,IAAA,CAAK,QAAA,CAAS,aAAa,KAC3B,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAC7B,IAAA,CAAK,SAAS,UAAU,CAAA,IACxB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAE5B;AAEO,IAAM,wBAAN,MAAsD;AAAA,EAC3D,MAAM,IAAA,EAAsB;AAC1B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAMlB,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAI,CAAA,EAAG,OAAO,IAAA;AAMxC,IAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB;AACpC,MAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,iBAAA,EAAmB,KAAK,MAAM,CAAA;AAErD,MAAA,IAAI,GAAA,GAAM,KAAK,MAAA,EAAQ;AACrB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AACrC,QAAA,IAAI,EAAA,GAAK,CAAA,GAAI,iBAAA,GAAoB,CAAA,QAAS,EAAA,GAAK,CAAA;AAAA,MACjD;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAC1C,MAAA,CAAA,GAAI,GAAA;AAAA,IACN;AACA,IAAA,OAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EACpB;AAAA,EAEQ,SAAS,IAAA,EAAsB;AAGrC,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAI,CAAA,EAAG,OAAO,IAAA;AAMxC,IAAA,IAAI,MAAM,IAAA,CAAK,OAAA;AAAA,MACb,cAAA;AAAA,MACA,CAAC,UAAU,MAAA,KAAW;AAEpB,QAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,MAAM,MAAS,CAAA;AACnD,QAAA,IAAI,GAAA,GAAM,GAAG,OAAO,KAAA;AACpB,QAAA,MAAM,WAAA,GAAc,sBAAsB,GAAG,CAAA;AAC7C,QAAA,OAAO,WAAA,KAAgB,SAAY,WAAA,GAAc,KAAA;AAAA,MACnD;AAAA,KACF;AAGA,IAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,kBAAA,EAAoB,CAAC,MAAA,EAAQ,QAAQ,OAAA,KAAY;AACjE,MAAA,OAAO,GAAG,MAAM,CAAA,4BAAA,CAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAe,GAAA,EAAW;AACxB,IAAA,MAAM,IAAA,uBAAW,OAAA,EAAQ;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAwB;AACrC,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAC9C,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,CAAA;AAChD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAW,CAAA,EAAG,OAAO,CAAA;AAClC,MAAA,IAAA,CAAK,IAAI,CAAW,CAAA;AACpB,MAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,CAAA,CAAE,IAAI,KAAK,CAAA;AACxC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,CAA4B,CAAA,EAAG;AACnE,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,OAAO,MAAM,GAAG,CAAA;AAAA,EAClB;AACF;ACpOA,IAAM,WAAA,GAAc,6BAAA;AAEpB,IAAM,WAAA,GAAc,2BAAA;AACpB,IAAM,sBAAsB,EAAA,GAAK,IAAA;AACjC,IAAM,0BAAA,GAA6B,IAAA;AAkDnC,IAAM,aAAA,GAA4C;AAAA,EAChD,mBAAA,EAAqB,WAAA;AAAA,EACrB,iCAAA,EAAmC,WAAA;AAAA,EACnC,gBAAA,EAAkB,QAAA;AAAA,EAClB,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,cAAA,EAAgB,mBAAA;AAAA,EAChB,aAAA,EAAe,mBAAA;AAAA,EACf,kBAAA,EAAoB,mBAAA;AAAA,EACpB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,6BAAA,EAA+B,mBAAA;AAAA,EAC/B,qBAAA,EAAuB,mBAAA;AAAA,EACvB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,gBAAA,EAAkB;AACpB,CAAA;AAEO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,KAAK,OAAO,aAAA;AACjB,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA;AAC/B;AAEO,IAAM,wBAAN,MAAsD;AAAA;AAAA,EAEnD,OAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EACA,SAAA;AAAA,EACS,SAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EAEjB,YAAY,IAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAAK,WAAA;AACnD,IAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,UAAA,IAAc,mBAAA,IAAuB,GAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAEjB,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,kBAAA,IAAsB,CAAA,GAAI,EAAA,GAAK,IAAA;AAC5D,IAAA,IAAA,CAAK,gBAAgB,eAAA,GAAkB,GAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,IAAoB,0BAAA;AACjD,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GACH,IAAA,CAAK,gBAAA,KACJ,IAAA,CAAK,UAAA,GACGC,KAAA,CAAA,IAAA,CAAUA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,2BAA2B,CAAA,GACnE,MAAA,CAAA;AAAA,EACR;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,GAAwC,EAAC,EAA8B;AAChF,IAAA,IAAI,KAAK,OAAA,IAAW,CAAC,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,OAAA;AAG7C,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA;AACpB,MAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,QAAA,CACZ,IAAA,GAAwC,EAAC,EACzC,mBAAmB,KAAA,EACQ;AAC3B,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,WAAA,EAAY;AAAA,IAChC,SAAS,GAAA,EAAK;AAEZ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,IAAK,GAAI,CAAA;AAE5E,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,2CAA2C,cAAA,CAAe,GAAG,CAAC,CAAA,0BAAA,EAClC,SAAA,CAAU,UAAU,CAAC,CAAA,6CAAA;AAAA,SACnD;AACA,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AACA,MAAA,IAAI,gBAAA,EAAkB;AAEpB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,wCAAA,EACE,cAAA,CAAe,GAAG,CACpB,CAAA,gCAAA;AAAA,SACF;AACA,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,WAAA,GAAyC;AACrD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAEvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,gBAAgB,CAAA;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,GAAA,EAAK;AAAA,QACzC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,GAAA,CAAI,MAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,MAC3E;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,QACtC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AACA,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,gBAAgB,CAAA,EAAA,CAAI,CAAA;AAAA,MACpF;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAA,CAAY,IAAA,GAAwC,EAAC,EAA8B;AAE/F,IAAA,IAAI,KAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,cAAA;AACpD,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,OAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAClD,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC5C,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,EAAC;AACnC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAc,mBAAmB,IAAA,EAE/B;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,kBAAkB,OAAO,MAAA;AACvD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAC3D,MAAA,IAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,SAAS,CAAA,SAAU,MAAA,CAAO,OAAA;AAAA,IAC9D;AACA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,UAAA,EAAY;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB,OACvC,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjD,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,KAAK,IAAA,CAAK,UAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAEA,MAAA,MAAM,WAAA,CAAY,KAAK,gBAAA,EAAkB,IAAA,CAAK,UAAU,QAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAGN,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAC3D,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,MAAa,GAAI,CAAA;AAExF,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,8DAAA,EAAiE,SAAA,CAAU,UAAU,CAAC,CAAA,KAAA;AAAA,SACxF;AACA,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAAyD;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,MAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASC,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAM,CAAA;AACtD,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAqC;AAGzC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,EAAY;AACpC,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,YAAY,EAAE,KAAA,EAAO,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,aAAA,GAA6C;AACjD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,YAAY,EAAA,EAAmD;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,MAAM,CAAA,GAAI,QAAQ,EAAE,CAAA;AACpB,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA,GAAI,MAAA;AAAA,EACvC;AAAA,EAEA,MAAM,QAAA,CAAS,UAAA,EAAoB,OAAA,EAAqD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAClD,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAO,MAAM,SAAA,IAAa,KAAA;AAAA,QAC1B,QAAQ,OAAA,CAAQ,KAAA,CAAM,YAAY,KAAA,EAAO,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,QAC1D,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,eAAA,KAAoB,MAAA;AAAA,QACxD,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,CAAA;AAAA,QACpC,SAAA,EAAW,MAAM,KAAA,EAAO,MAAA;AAAA,QACxB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,iBAAiB,KAAA,CAAM;AAAA,OACzB;AAAA,MACA,MAAM,KAAA,CAAM;AAAA,KACd;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,UAAA,EAAiD;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,MAAA;AACtD,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjD,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,YAAA,IAAgB,EAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,YAAA,IAAgB,EAAA;AAC/C,MAAA,OAAO,EAAA,CAAG,cAAc,EAAE,CAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA;AAAA,EACpB;AAAA,EAEA,MAAM,UAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,MAAA,CAAO,iBAAA;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,EAAQ,IAAK,GAAA;AAAA,IAC/D;AACA,IAAA,OAAA,CAAQ,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA,CAAU,SAAQ,IAAK,GAAA;AAAA,EACnD;AAAA,EAEQ,gBAAgB,CAAA,EAAwC;AAC9D,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQ,cAAA,CAAe,CAAA,CAAE,GAAG,CAAA;AAAA,MAC5B,SAAS,CAAA,CAAE,GAAA;AAAA,MACX,OAAA,EAAS,CAAA,CAAE,GAAA,IAAO,EAAC;AAAA,MACnB,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AAAA,MACpC,KAAK,CAAA,CAAE;AAAA,KACT;AAAA,EACF;AAAA,EAEQ,QAAQ,YAAA,EAA+B;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,YAAY,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AAAA,EAC9D;AAAA,EAEQ,oBAAoB,YAAA,EAA+B;AACzD,IAAA,OAAO,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,YAAY,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,aAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,YAAY,IAAA,EAAkD;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASA,EAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,GAAwB;AACtB,IAAA,OAAYD,KAAA,CAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,EACpC;AACF;AAGA,SAAS,UAAU,OAAA,EAAyB;AAC1C,EAAA,IAAI,OAAA,GAAU,IAAI,OAAO,KAAA;AACzB,EAAA,IAAI,OAAA,GAAU,MAAM,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAC,CAAA,CAAA,CAAA;AACtD,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AACnC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,OAAQ,EAAE,CAAA;AAC1C,IAAA,OAAO,CAAA,GAAI,IAAI,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,GAAM,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAC,CAAA,CAAA,CAAA;AACvC;AAEA,SAAS,WAAW,OAAA,EAAoE;AACtF,EAAA,OAAO,YAAY,MAAA,IAAa,MAAA,CAAO,IAAA,CAAK,OAAO,EAAE,MAAA,GAAS,CAAA;AAChE;ACtZO,SAAS,WAAW,EAAA,EAAoB;AAC7C,EAAA,KAAA,MAAW,GAAA,IAAO,yBAAwB,EAAG;AAC3C,IAAA,IAAI;AACF,MAAA,OAAOE,YAAAA,CAAkBC,WAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,GAAA,CAAK,CAAA,EAAG,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,uBAAA,GAAoC;AAC3C,EAAA,MAAM,IAAA,GAAYA,KAAA,CAAA,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa;AAAA,IACZA,KAAA,CAAA,OAAA,CAAQ,MAAM,0BAA0B,CAAA;AAAA,IACxCA,KAAA,CAAA,OAAA,CAAQ,MAAM,uBAAuB,CAAA;AAAA,IACrCA,KAAA,CAAA,OAAA,CAAQ,MAAM,oBAAoB;AAAA,GACzC;AACA,EAAA,OAAO,WAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAC,WAAA,CAAY,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AACpF;AAEA,SAAS,YAAY,SAAA,EAA4B;AAC/C,EAAA,IAAI;AACF,IAAA,OAAOC,QAAAA,CAAS,SAAS,CAAA,CAAE,WAAA,EAAY;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACKO,IAAM,aAAA,GAAwB;AAAA,EACnC;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,MAAA,EAAQ,EAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS;AAAA,GAClB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,2DAAA;AAAA,IACb,MAAA,EAAQ,WAAW,eAAe,CAAA;AAAA,IAClC,IAAA,EAAM,CAAC,QAAA,EAAU,SAAA,EAAW,UAAU,CAAA;AAAA,IACtC,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AAAA,IACvD,eAAA,EAAiB,CAAC,YAAA,EAAc,kBAAA,EAAoB,qBAAqB,SAAS;AAAA,GACpF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,gCAAA;AAAA,IACb,MAAA,EAAQ,WAAW,cAAc,CAAA;AAAA,IACjC,IAAA,EAAM,CAAC,UAAA,EAAY,OAAA,EAAS,YAAY,CAAA;AAAA,IACxC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,IACjD,eAAA,EAAiB,CAAC,kBAAA,EAAoB,YAAA,EAAc,WAAW;AAAA,GACjE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,iDAAA;AAAA,IACb,MAAA,EAAQ,WAAW,WAAW,CAAA;AAAA,IAC9B,IAAA,EAAM,CAAC,cAAA,EAAgB,QAAA,EAAU,aAAa,CAAA;AAAA,IAC9C,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IAChD,eAAA,EAAiB,CAAC,YAAA,EAAc,kBAAA,EAAoB,eAAe,eAAe;AAAA,GACpF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,6CAAA;AAAA,IACb,MAAA,EAAQ,WAAW,UAAU,CAAA;AAAA,IAC7B,IAAA,EAAM,CAAC,OAAA,EAAS,eAAA,EAAiB,kBAAkB,CAAA;AAAA,IACnD,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IACxD,eAAA,EAAiB,CAAC,YAAA,EAAc,WAAA,EAAa,eAAe;AAAA,GAC9D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,kDAAA;AAAA,IACb,MAAA,EAAQ,WAAW,QAAQ,CAAA;AAAA,IAC3B,IAAA,EAAM,CAAC,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AAAA,IACjC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IAChD,eAAA,EAAiB,CAAC,SAAA,EAAW,YAAA,EAAc,mBAAmB;AAAA,GAChE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,MAAA,EAAQ,WAAW,QAAQ,CAAA;AAAA,IAC3B,IAAA,EAAM,CAAC,QAAA,EAAU,gBAAA,EAAkB,YAAY,CAAA;AAAA,IAC/C,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAAA,IACvD,eAAA,EAAiB,CAAC,eAAA,EAAiB,eAAA,EAAiB,kBAAkB;AAAA,GACxE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,MAAA,EAAQ,WAAW,YAAY,CAAA;AAAA,IAC/B,IAAA,EAAM,CAAC,UAAA,EAAY,eAAA,EAAiB,aAAa,CAAA;AAAA,IACjD,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,IACvD,eAAA,EAAiB,CAAC,kBAAA,EAAoB,mBAAA,EAAqB,eAAe,SAAS;AAAA,GACrF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,wDAAA;AAAA,IACb,MAAA,EAAQ,WAAW,WAAW,CAAA;AAAA,IAC9B,IAAA,EAAM,CAAC,IAAA,EAAM,UAAA,EAAY,UAAU,QAAQ,CAAA;AAAA,IAC3C,iBAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,QAAQ,UAAU,CAAA;AAAA,IAC/D,eAAA,EAAiB,CAAC,cAAc;AAAA,GAClC;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,2CAAA;AAAA,IACb,MAAA,EAAQ,WAAW,OAAO,CAAA;AAAA,IAC1B,IAAA,EAAM,CAAC,MAAA,EAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,IAClC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IACxC,iBAAiB;AAAC,GACpB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,gDAAA;AAAA,IACb,MAAA,EAAQ,WAAW,OAAO,CAAA;AAAA,IAC1B,IAAA,EAAM,CAAC,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,IACvC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC3C,eAAA,EAAiB,CAAC,oBAAA,EAAsB,eAAA,EAAiB,eAAe,mBAAmB;AAAA,GAC7F;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,+EAAA;AAAA,IACb,MAAA,EAAQ,WAAW,cAAc,CAAA;AAAA,IACjC,IAAA,EAAM,CAAC,UAAA,EAAY,KAAA,EAAO,gBAAgB,YAAY,CAAA;AAAA,IACtD,iBAAiB,CAAC,YAAA,EAAc,WAAA,EAAa,QAAA,EAAU,SAAS,iBAAiB,CAAA;AAAA,IACjF,iBAAiB,CAAC,cAAA,EAAgB,YAAA,EAAc,aAAA,EAAe,oBAAoB,cAAc;AAAA;AAErG;;;AC9GO,IAAM,8BAAA,GAAsD;AAE5D,IAAM,oBAAA,GAAqD,OAAO,MAAA,CAAO;AAAA,EAC9E;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,qFAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,MAAM,GAAA,EAAI;AAAA,IAC/C,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,qEAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,GAAA,EAAK,MAAM,IAAA,EAAK;AAAA,IAChD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,4EAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IACjD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,gFAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,GAAA,EAAK,MAAM,IAAA,EAAK;AAAA,IAChD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY;AAAA;AAEhB,CAAC;AAEM,SAAS,sBAAA,GAA8C;AAC5D,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,UAAA,IAAa,CAAE,CAAA;AACpF;AAEO,SAAS,qBAAqB,EAAA,EAAyD;AAC5F,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,OAAO,oBAAA,CAAqB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzD,EAAA,OAAO,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW,EAAE,GAAI,IAAA;AAClE;AAEO,SAAS,sBAAsB,EAAA,EAAuC;AAC3E,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD;AAEO,SAAS,0BAAA,CACd,MAAA,GAAkC,EAAC,EACnC,YAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,MAAA,CAAO,IAAA,IAAQ,8BAAA;AACjD,EAAA,MAAM,OAAO,oBAAA,CAAqB,SAAS,KAAK,aAAA,CAAc,oBAAA,CAAqB,8BAA8B,CAAC,CAAA;AAElH,EAAA,IAAI,IAAA,CAAK,OAAO,8BAAA,EAAgC;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MAC9C,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MAC9C,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW;AAAA,KAChD;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,SAAA;AAAA,IACpC,cAAA,EAAgB,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK;AAAA,GAChD;AACF;AAEO,SAAS,4BAA4B,QAAA,EAAkC;AAC5E,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,KAAM;AACrC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,EAAA,KAAO,QAAA,GAAW,GAAA,GAAM,GAAA;AACzC,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,EAAA,CAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,EAAE,WAAW,CAAA,CAAA;AAAA,EACjE,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACd;;;AClHO,IAAM,0BAAN,MAAyD;AAAA,EAC7C,IAAA,uBAAW,GAAA,EAA+C;AAAA,EAE3E,IAAA,CAAK,KAAoB,EAAA,EAA2B;AAElD,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,KAAA,MAAW,CAAC,EAAA,EAAIC,SAAQ,CAAA,IAAK,KAAK,IAAA,EAAM;AACtC,QAAA,IAAI,EAAA,KAAO,IAAI,IAAA,EAAM;AACrB,QAAA,KAAA,MAAW,KAAKA,SAAAA,EAAU;AACxB,UAAA,IAAI;AACF,YAAA,CAAA,CAAE,GAAG,CAAA;AAAA,UACP,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,GAAG,CAAA;AAAA,QACP,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,SAAA,CAAU,SAAiB,OAAA,EAAmD;AAC5E,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG,IAAI,OAAO,CAAA;AACnC,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,OAAO,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,EAAgC;AACpC,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,OAAO,CAAA;AACxB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AACF;;;AClCO,IAAM,sBAAN,MAAiD;AAAA,EAC7C,OAAA;AAAA,EACA,aAAA;AAAA,EACQ,SAAA;AAAA,EACA,aAAA,uBAAuD,GAAA,EAAI;AAAA,EAC3D,eAAA,uBAAsB,GAAA,EAOrC;AAAA,EACM,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA;AAAA,EAES,cAAA,uBAAqB,GAAA,EAAY;AAAA;AAAA,EAE1C,qBAAA;AAAA,EAER,WAAA,CAAY,QAA2B,SAAA,EAA4B;AACjE,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AAErC,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC3E,MAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAE9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACjC,QAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,GAAG,CAAA;AAAA,QACP,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,GAAA,EAAmC;AAC5C,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,KAAK,GAAA,CAAI,EAAA,IAAM,KAAK,aAAa,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAU,GAAA,EAAmC;AACjD,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,IAAA,GAAA,CAAI,EAAA,GAAK,GAAA;AACT,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EACpC;AAAA,EAEA,UAAU,OAAA,EAAmE;AAC3E,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAuC,CAAA;AAC9D,IAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAuC,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,OAAA,CAAW,GAAA,EAAoB,SAAA,EAA+C;AAClF,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,UAAA,CAAW;AAAA,MACrC,OAAA,EAAS,mBAAA;AAAA,MACT,MAAM,WAAA,CAAY;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,aAAa,IAAA,CAAK,SAAA;AAClC,IAAA,MAAM,gBAAgB,GAAA,CAAI,EAAA;AAO1B,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,UAAA,CAAW;AAAA,QACnB,OAAA,EAAS,sBAAsB,aAAa,CAAA,yEAAA,CAAA;AAAA,QAC5C,MAAM,WAAA,CAAY,gBAAA;AAAA,QAClB,OAAA,EAAS,EAAE,aAAA;AAAc,OAC1B,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,aAAa,CAAA;AAErC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACtB,QAAAA,EAAS,MAAA,KAAW;AAEtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,aAAa,CAAA;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACzC,QAAA,MAAA,CAAO,IAAI,UAAA,CAAW;AAAA,UACpB,OAAA,EAAS,CAAA,QAAA,EAAW,aAAa,CAAA,iBAAA,EAAoB,OAAO,CAAA,EAAA,CAAA;AAAA,UAC5D,MAAM,WAAA,CAAY,gBAAA;AAAA,UAClB,OAAA,EAAS,EAAE,aAAA,EAAe,SAAA,EAAW,OAAA;AAAQ,SAC9C,CAAC,CAAA;AAAA,MACJ,GAAG,OAAO,CAAA;AAOV,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA,EAAG;AAC3C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,CAAO,IAAI,UAAA,CAAW;AAAA,UACpB,OAAA,EAAS,gBAAA;AAAA,UACT,MAAM,WAAA,CAAY;AAAA,SACnB,CAAC,CAAA;AACF,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,aAAA,EAAe;AAAA,QACtC,OAAA,EAASA,QAAAA;AAAA,QACT,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,GAAA,CAAI,EAAA,IAAM,KAAK,aAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AAClE,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,aAAa,CAAA;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACzC,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,KAAK,eAAA,EAAiB;AACxC,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,MAAA,CAAA,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW;AAAA,QACtB,OAAA,EAAS,gBAAA;AAAA,QACT,MAAM,WAAA,CAAY;AAAA,OACnB,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAGzB,IAAA,IAAA,CAAK,qBAAA,IAAwB;AAC7B,IAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAC7B,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AACF;AAEO,SAAS,aAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EACA,EAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,IAAI,UAAA,EAAW;AAAA,IACf,IAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AACF;;;AChGO,IAAM,qBAAA,GAAsC;AAAA,EACjD,EAAA,EAAI,SAAA;AAAA,EACJ,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,8CAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,IAChD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,IACxD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,IACxD,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,IAC7C,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,IAC9C,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,IAChD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,qBAAA,EAAuB,OAAO,CAAA;AAAE,GAC/D;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,IAC9F;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,oBAAoB,EAAC;AAAA,MACrB,WAAW,EAAC;AAAA,MACZ,YAAY;AAAC;AACf;AAEJ;;;ACdO,SAAS,oBAAoB,KAAA,EAAgC;AAClE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACpC,IAAA,QAAQ,EAAE,MAAA;AAAQ,MAChB,KAAK,WAAA;AACH,QAAA,SAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,UAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA;AAEJ,IAAA,cAAA,IAAkB,EAAE,aAAA,IAAiB,CAAA;AACrC,IAAA,WAAA,IAAe,EAAE,WAAA,IAAe,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,IAAA;AAE1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA,EAAiB,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,SAAA,GAAY,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAAA,IACrE,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAsC;AACrE,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAC7C,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,UAAU,CAAA;AACnE,EAAA,MAAM,eAAA,GAAkB,cACrB,MAAA,CAAO,CAAC,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAC,EAC/E,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAElB,EAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAA,EAAI,CAAC,CAAA;AAE3F,EAAA,OAAO;AAAA,IACL,SAAS,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACtC,kBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,gBAAgB,KAAA,EAA4B;AAC1D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,SAAS,MAAM,EAAA,EAAkB;AAE/B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG;AAE1B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,EAAA,EAAI,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,MAAM,SAAA,EAAW;AACpC,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1KO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,gBAAA,EAAkB,kBAAA;AAAA,EAGT;AAAA,EAGT,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,wBAAA,EAA0B,0BAAA;AAAA,EAGZ;AAAA,EAGd,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,cAAA,EAAgB,gBAAA;AAAA,EASG;AAAA,EAGnB,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,eAAA,EAAiB;AACnB,CAAA;AASO,IAAM,uBAAA,GAAqD;AAAA,EAChE,gBAAA,CAAiB,eAAA;AAAA,EACjB,gBAAA,CAAiB,gBAAA;AAAA,EACjB,gBAAA,CAAiB,QAAA;AAAA,EACjB,gBAAA,CAAiB,wBAAA;AAAA,EACjB,gBAAA,CAAiB,SAAA;AAAA,EACjB,gBAAA,CAAiB,cAAA;AAAA,EACjB,gBAAA,CAAiB,aAAA;AAAA,EACjB,gBAAA,CAAiB;AACnB,CAAA;AA+BO,SAAS,mCACd,UAAA,EACS;AACT,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,MAAM,IAAA,GAA0B,MAAM,OAAA,CAAQ,UAAU,IAAI,UAAA,GAAc,KAAA,CAAM,gBAAgB,EAAC;AACjG,EAAA,OAAO,KAAK,IAAA,CAAK,CAAC,MAAM,uBAAA,CAAwB,QAAA,CAAS,CAAmB,CAAC,CAAA;AAC/E;AAoBO,SAAS,yBACd,UAAA,EACkB;AAClB,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,MAAM,IAAA,GAA0B,MAAM,OAAA,CAAQ,UAAU,IAAI,UAAA,GAAc,KAAA,CAAM,gBAAgB,EAAC;AACjG,EAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IAAO,CAAC,CAAA,KAClB,uBAAA,CAAwB,QAAA,CAAS,CAAmB;AAAA,GACtD;AACF;;;ACzGO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAYxB,WAAA,CACmB,UACT,IAAA,EACR;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACT,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAER,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,kBAAA,IAAsB,GAAA;AACrD,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,IAAoB,GAAA;AACjD,IAAA,IAAA,CAAK,aAAa,0BAAA,CAA2B;AAAA,MAC3C,0BAAA,EAA4B,KAAK,0BAAA,IAA8B;AAAA,KAChE,CAAA;AAAA,EACH;AAAA,EARmB,QAAA;AAAA,EACT,IAAA;AAAA;AAAA,EAZV,OAAgB,yBAAA,GAA4B,GAAA;AAAA;AAAA,EAE5C,OAAgB,mBAAA,GAAsB,KAAA;AAAA;AAAA,EAEtC,OAAgB,mBAAA,GAAsB,KAAA;AAAA,EAErB,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBjB,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,KAAK,cAAA,GAAiB,MAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,eAAe,QAAA,EAAwB;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,QAAA;AAC3B,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,wBAAwB,UAAA,EAAY;AACrE,IAAA,MAAM,KAAA,GAAgD,KAAK,IAAA,CAAK,iBAAA;AAChE,IAAA,MAAM,IAAA,GAA6B,2BAAA,CAA4B,KAAA,EAAO,QAAQ,CAAA;AAC9E,IAAA,QAAA,CAAS,mBAAA,CAAoB,UAAU,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CACJ,QAAA,EACA,GAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,0BAAA,IAA8B,GAAA;AAErD,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAqD;AACzE,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,MAAA,IAAI,GAAA,GAAM,IAAA;AACV,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,IAAI,CAAA;AAGvC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACxF,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAKA,MAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,GAAA,CAAI,KAAA,EAAO,KAAK,WAAW,CAAA;AACpE,MAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,QAAA,MAAM,eAAe,UAAA,CAAW,MAAA,CAC7B,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAA,IAAQ,OAAO,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACnD,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,EAAA;AAAA,UACjB,OAAA,EACE,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA;;AAAA;AAAA,EACjB,YAAY;;AAAA,kHAAA,EAEY,KAAK,IAAI,CAAA,mCAAA,CAAA;AAAA,UAC1D,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAOA,MAAA,MAAM,iBAAA,GAAoB,yBAAyB,IAAI,CAAA;AAUvD,MAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA,EAAG;AACpC,QAAA,MAAM,SAAS,IAAA,CAAK,oBAAA,CAAqB,KAAK,mBAAA,CAAoB,GAAA,CAAI,KAAK,CAAC,CAAA;AAC5E,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAKA,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,GAAA,CAAI,YAAY,CAAA,EAAG;AAC3C,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,WAAW,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAC3E,QAAA,IAAI,IAAI,KAAA,EAAO;AACb,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,GAAA,EAAK,IAAI,MAAM,CAAA;AACvD,UAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,QACxD;AACA,QAAA,IAAI,IAAI,KAAA,EAAO;AAQb,UAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AAE5C,YAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,GAAA,CAAI,KAAA,EAAO,KAAK,WAAW,CAAA;AAC/D,YAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,cAAA,MAAM,eAAe,KAAA,CAAM,MAAA,CACxB,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAA,IAAQ,OAAO,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACnD,KAAK,IAAI,CAAA;AACZ,cAAA,MAAM,MAAA,GAAS;AAAA,gBACb,IAAA,EAAM,aAAA;AAAA,gBACN,aAAa,GAAA,CAAI,EAAA;AAAA,gBACjB,OAAA,EACE,CAAA,6CAAA,EAAgD,IAAA,CAAK,IAAI,CAAA;;AAAA;AAAA,EAClC,YAAY,CAAA,CAAA;AAAA,gBACrC,QAAA,EAAU;AAAA,eACZ;AACA,cAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,cAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,YACxD;AACA,YAAA,GAAA,GAAM,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAOA,MAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AACvC,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAChD,QAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,UAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACtE,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,IAAA,EAAM,aAAA;AAAA,YACN,aAAa,GAAA,CAAI,EAAA;AAAA,YACjB,OAAA,EACE,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA;;AAAA;AAAA,EACjB,YAAY,CAAA,CAAA;AAAA,YACrC,QAAA,EAAU;AAAA,WACZ;AACA,UAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,QACxD;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,QAAA,CAAS,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAM/E,MAAA,IAAI,sBAAsB,QAAA,CAAS,UAAA;AAUnC,MAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,gBAAA;AACzB,MAAA,MAAM,OAAO,MAAA,CAAO,OAAA,SAAgB,IAAA,IAAQ,MAAA,CAAO,sBAAqB,KAAM,IAAA;AAY9E,MAAA,MAAM,iBAAA,GAAoB,SAAS,MAAA,KAAW,MAAA;AAE9C,MAAA,IACE,iBAAA,CAAkB,SAAS,CAAA,IAC3B,mBAAA,KAAwB,UACxB,CAAC,IAAA,IACD,CAAC,iBAAA,EACD;AAEA,QAAA,mBAAA,GAAsB,SAAA;AAAA,MACxB;AAEA,MAAA,IAAI,wBAAwB,MAAA,EAAQ;AAClC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,SAAS,MAAM,CAAA;AACrD,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAEA,MAAA,IAAI,wBAAwB,SAAA,EAAW;AACrC,QAAA,IAAI,IAAA,CAAK,KAAK,cAAA,EAAgB;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAChF,UAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,QAAA,EAAU;AAC3C,YAAA,MAAM,MAAA,GAAS;AAAA,cACb,IAAA,EAAM,aAAA;AAAA,cACN,aAAa,GAAA,CAAI,EAAA;AAAA,cACjB,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,iBAAA,CAAA;AAAA,cAC3B,QAAA,EAAU;AAAA,aACZ;AACA,YAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,YAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,UACxD;AAAA,QAEF,CAAA,MAAO;AACL,UAAA,MAAM,gBAAA,GAAmB,oBAAoB,IAAA,CAAK,IAAA,EAAM,IAAI,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA,IAAK,IAAA,CAAK,IAAA;AAC5F,UAAA,MAAM,OAAA,GAAoC;AAAA,YACxC,IAAA,EAAM,sBAAA;AAAA,YACN,WAAW,GAAA,CAAI,EAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,OAAO,GAAA,CAAI,KAAA;AAAA,YACX;AAAA,WACF;AACA,UAAA,OAAO,EAAE,QAAQ,OAAA,EAAS,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,QACjE;AAAA,MACF;AAIA,MAAA,MAAM,gBAAA,GAAmB,mCAAmC,IAAI,CAAA,GAC3D,KAAK,YAAA,IAAgB,KACtB,EAAC;AAML,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,EAAQ,UAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI;AAAA,QAC5D,aAAa,IAAA,CAAK,IAAA;AAAA,QAClB,iBAAiB,IAAA,CAAK,QAAA;AAAA,QACtB,mBAAmB,IAAA,CAAK,UAAA;AAAA,QACxB,mBAAA,EAAqB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAC3C,IAAA,CAAK,UAAU,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA,GACtC,IAAA;AAAA,QACJ,iCAAA,EAAmC,iBAAiB,MAAA,GAAS;AAAA,OAC9D,CAAA;AACD,MAAA,IAAI;AAKF,QAAA,IAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAC5E,QAAA,MAAA,IAAU,KAAA;AAKV,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,GAAA,CAAI,aAAa,CAAA,EAAG;AAC5C,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,WAAA;AAAA,YACtC,IAAA,CAAK,IAAA;AAAA,YACL,GAAA,CAAI,KAAA;AAAA,YACJ,EAAE,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,GAAG,OAAA,EAAS,CAAC,CAAC,MAAA,CAAO,QAAA,EAAS;AAAA,YAC9D;AAAA,WACF;AACA,UAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,YAAA,MAAM,QAAA,GAAW;;AAAA,EAAO,KAAK,iBAAiB,CAAA,CAAA;AAC9C,YAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,GAAG,MAAA,CAAO,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAG;AAK9D,YAAA,MAAA,GAAS,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,GAAS,OAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,UACnE;AAAA,QACF;AACA,QAAA,IAAA,EAAM,YAAA,CAAa,eAAA,EAAiB,CAAC,CAAC,OAAO,QAAQ,CAAA;AACrD,QAAA,IAAA,EAAM,YAAA;AAAA,UACJ,mBAAA;AAAA,UACA,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,MAAA,CAAO,QAAQ,MAAA,GAAS;AAAA,SAC/D;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,GAAG,CAAA;AACnD,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,EAAO,GAAI,kBAAkB,GAAG,CAAA;AAC7D,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,QAAA,IAAA,CAAK,KAAK,QAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,UAAU,IAAI,CAAA;AAC7D,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,EAAA;AAAA,UACjB,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,YAAY,QAAQ,CAAA,CAAA;AAAA,UAC/C,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AACpD,QAAA,IAAI,GAAA,YAAe,KAAA,EAAO,IAAA,EAAM,WAAA,CAAY,GAAG,CAAA;AAC/C,QAAA,IAAA,EAAM,YAAA,CAAa,iBAAiB,IAAI,CAAA;AACxC,QAAA,IAAA,EAAM,YAAA,CAAa,uBAAuB,QAAQ,CAAA;AAClD,QAAA,IAAA,EAAM,YAAA,CAAa,wBAAwB,SAAS,CAAA;AACpD,QAAA,IAAI,MAAA,EAAQ,IAAA,EAAM,YAAA,CAAa,mBAAA,EAAqB,MAAM,CAAA;AAC1D,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD,CAAA,SAAE;AACA,QAAA,IAAA,EAAM,GAAA,EAAI;AAAA,MACZ;AAAA,IACF,CAAA;AAQA,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAAoD;AACzE,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,OAAO,GAAG,CAAA;AAAA,MACzB,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,GAAG,CAAA;AACnD,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,EAAO,GAAI,kBAAkB,GAAG,CAAA;AAC7D,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,QAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,IAAA;AACnC,QAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAC5B,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,eAAA,CAAgB,QAAA,EAAU,UAAU,IAAI,CAAA;AAC5D,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,EAAA;AAAA,UACjB,OAAA,EAAS,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,uBAAuB,QAAQ,CAAA,CAAA;AAAA,UACzD,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AAMpD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,CAAA,EAAE;AAAA,MACvC;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,MAAM,UAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,eAAA,EAAiB,MAAA,EAAO;AAAA,IAC5C;AAEA,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,OAAA,CAAQ,GAAG,CAAC,CAAC,CAAA;AACrE,MAAA,OAAO,EAAE,OAAA,EAAS,eAAA,EAAiB,MAAA,EAAO;AAAA,IAC5C;AAGA,IAAA,MAAM,cAA8B,EAAC;AACrC,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,WAChC,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,OAAA,CAAQ,GAAG,CAAC,CAAC,CAAA;AAC1E,IAAA,MAAM,aAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,UAAA,CAAW,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACpC;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAC,GAAG,SAAA,EAAW,GAAG,UAAU,CAAA;AAAA,MACrC,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CACJ,IAAA,EACA,GAAA,EACA,KACA,MAAA,EACoD;AACpD,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,cAAA,EAAgB;AAAA,MACrC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,QAAA,EAAU,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,IAAI,KAAK,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,GAAA,CAAI,EAAE,CAAA;AACjF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAC9F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AACpD,IAAA,MAAM,eAAe,MAAM,2BAAA,CAA4B,IAAA,CAAK,IAAA,EAAM,UAAU,MAAM,CAAA;AAKlF,IAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,SAAA,KAAc,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,YAAA,EAAc,MAAM,CAAA;AACnF,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAK,QAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,aAAa,GAAA,CAAI,EAAA;AAAA,QACjB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA;AAAA;AAAA;AAAA,MAIA,OAAO,MAAA,GAAS;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,CACZ,IAAA,EACA,KAAA,EACA,YAAA,EACA,KACA,SAAA,EACkB;AAClB,IAAA,IAAI,aAAa,OAAA,EAAS;AAExB,MAAA,IAAI,YAAA,CAAa,MAAA,YAAkB,KAAA,EAAO,MAAM,YAAA,CAAa,MAAA;AAC7D,MAAA,MAAM,IAAI,MAAM,OAAO,YAAA,CAAa,WAAW,QAAA,GAAW,YAAA,CAAa,SAAS,SAAS,CAAA;AAAA,IAC3F;AACA,IAAA,MAAM,SAAA,GAAY,cAAA;AAAA,MAChB,IAAA,CAAK,aAAa,IAAA,CAAK,kBAAA;AAAA,MACvB,IAAA,CAAK;AAAA,KACP;AACA,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACnD,IAAA,MAAM,WAAW,WAAA,CAAY,GAAA,CAAI,CAAC,YAAA,EAAc,aAAa,CAAC,CAAA;AAE9D,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AAIF,MAAA,MAAA,GACE,OAAO,KAAK,aAAA,KAAkB,UAAA,GAC1B,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,KAAA,EAAO,GAAA,EAAK,UAAU,SAAS,CAAA,GAChE,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,EAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AAGZ,MAAA,IAAI,SAAS,OAAA,EAAS,MAAM,KAAK,cAAA,CAAe,IAAA,EAAM,OAAO,GAAG,CAAA;AAChE,MAAA,MAAM,GAAA;AAAA,IACR;AAKA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAC1C,MAAA,MAAM,QAAA,CAAS,MAAA,YAAkB,KAAA,GAC7B,QAAA,CAAS,MAAA,GACT,IAAI,KAAA,CAAM,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,GAAW,QAAA,CAAS,SAAS,cAAc,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,cAAA,CAAe,IAAA,EAAY,KAAA,EAAgB,GAAA,EAA6B;AACpF,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CACZ,IAAA,EACA,KAAA,EACA,GAAA,EACA,QACA,SAAA,EACkB;AAClB,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,sCAAA,CAAwC,CAAA;AAAA,IAC5E;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,OAAO,GAAA,EAAK,EAAE,QAAQ,CAAA;AAKxD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAE;AAU1C,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAA0B;AAC9C,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,eAAA,EAAiB;AAAA,QACtC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAI,SAAA,IAAa,WAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAmB;AAC5C,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,CAAC,KAAA,IAAS,GAAA,GAAM,kBAAA,GAAqB,cAAa,yBAAA,EAA2B;AACjF,MAAA,kBAAA,GAAqB,GAAA;AAKrB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACpD,QAAA,IAAA,GAAO,GAAG,YAAY;AAAA;AAAA,EAA+B,YAAY,CAAA,CAAA;AAAA,MACnE,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,YAAA;AAAA,MACT;AACA,MAAA,YAAA,GAAe,EAAA;AACf,MAAA,YAAA,CAAa,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAAA,IAC/C,CAAA;AACA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,IAAG,GAAI,MAAM,KAAK,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,UAAA,WAAA,GAAc,EAAA,CAAG,MAAA;AACjB,UAAA,QAAA,GAAW,IAAA;AAEX,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAG,IAAA,KAAS,gBAAA,IAAoB,OAAO,EAAA,CAAG,SAAS,QAAA,EAAU;AAO/D,UAAA,IAAI,CAAC,YAAA,EAAc;AACjB,YAAA,MAAM,SAAA,GAAY,aAAA,CAAa,mBAAA,GAAsB,YAAA,CAAa,MAAA;AAClE,YAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,IAAU,SAAA,EAAW;AAC/B,cAAA,YAAA,IAAgB,EAAA,CAAG,IAAA;AAAA,YACrB,CAAA,MAAO;AACL,cAAA,YAAA,IAAgB,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAC1C,cAAA,YAAA,GAAe,IAAA;AAAA,YACjB;AAAA,UACF;AACA,UAAA,YAAA,IAAgB,EAAA,CAAG,IAAA;AACnB,UAAA,IAAI,YAAA,CAAa,MAAA,GAAS,aAAA,CAAa,mBAAA,EAAqB;AAC1D,YAAA,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,CAAC,aAAA,CAAa,mBAAmB,CAAA;AAAA,UACrE;AACA,UAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,UAAA;AAAA,QACF;AAGA,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,YAAA,CAAa,EAAE,CAAA;AAAA,MACjB;AACA,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB,CAAA,SAAE;AAGA,MAAA,MAAM,IAAA,CAAK,SAAS,MAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,iDAAA,CAAmD,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,KAAmB,OAAA,EAA0C;AACrF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,OAAA,EAAS,SAAS,GAAA,CAAI,IAAI,yCAAyC,OAAA,EAAQ,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACvF,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,KAAmB,GAAA,EAA+B;AAC7E,IAAA,IAAI,OAAA,GACF,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,uMAAA,CAAA;AAQnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,GAAA,GAAM,GAAA;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,mBAAA,EAAiB,GAAA,CAAI,MAAM,CAAA,aAAA,CAAA,GAAkB,GAAA;AACtF,MAAA,OAAA,IACE,CAAA;AAAA,EAE4E,OAAO,CAAA,CAAA;AAAA,IACvF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,KAAmB,MAAA,EAAkC;AACxE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,SAAS,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,UAAA,EAAa,UAAU,QAAQ,CAAA,CAAA;AAAA,MACzD,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,mBAAA,CAAoB,KAAmB,MAAA,EAAkC;AAC/E,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,SAAS,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,oCAAA,EAAuC,UAAU,iBAAiB,CAAA,CAAA;AAAA,MAC5F,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,eAAA,CAAgB,SAAiB,MAAA,EAAwB;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,GAAS,OAAO,UAAA,CAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,EAChE;AAEF;AAEA,SAAS,cAAA,CAAe,WAAmB,YAAA,EAA8B;AACvE,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,SAAA,GAAY,IAAI,SAAA,GAAY,QAAA;AAChF,EAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,IAAK,YAAA,GAAe,IAAI,YAAA,GAAe,QAAA;AACrF,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,aAAA,EAAe,SAAS,CAAC,CAAA;AACvD;AAmBA,SAAS,sBAAsB,KAAA,EAAyB;AACtD,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AACxE,EAAA,MAAM,GAAA,GAAM,KAAA;AAGZ,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,OAAO,KAAK,MAAA,KAAW,CAAA,IAAK,sBAAsB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAU,CAAA;AAC7E;AAQA,SAAS,oBAAoB,KAAA,EAAoC;AAC/D,EAAA,IAAI,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG,OAAO,MAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACpD,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAEA,IAAM,uCAAuC,EAAA,GAAK,IAAA;AAMlD,SAAS,kBAAkB,GAAA,EAAoF;AAE7G,EAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,IAAA,OAAO,EAAE,QAAA,EAAA,OAAA,cAAuC,SAAA,EAAW,KAAA,EAAO,QAAQ,SAAA,EAAU;AAAA,EACtF;AAGA,EAAA,IAAI,GAAA,YAAe,KAAA,IAAS,MAAA,IAAU,GAAA,EAAK;AACzC,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,WAAA;AAAA,MACL,KAAK,YAAA;AAAA,MACL,KAAK,cAAA;AAAA,MACL,KAAK,aAAA;AAAA,MACL,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAA,WAAA,kBAA2C,SAAA,EAAW,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MACpF,KAAK,QAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAA,WAAA,kBAA2C,SAAA,EAAW,KAAA,EAAO,QAAQ,IAAA,EAAK;AAAA,MACrF,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAA,YAAA,mBAA4C,SAAA,EAAW,KAAA,EAAO,QAAQ,IAAA,EAAK;AAAA,MACtF,KAAK,OAAA;AAAA,MACL,KAAK,QAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAA,WAAA,kBAA2C,SAAA,EAAW,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA;AACtF,EACF;AAQA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,IAAA,OAAO,oBAAA,CAAqB,IAAI,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,GAAA,YAAe,KAAA,IAAS,UAAA,IAAc,GAAA,EAAK;AAC7C,IAAA,MAAM,WAAY,GAAA,CAA0C,QAAA;AAC5D,IAAA,MAAM,SAAS,QAAA,EAAU,MAAA;AACzB,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAOA,EAAA,IAAI,eAAe,mBAAA,EAAqB;AACtC,IAAA,OAAO,EAAE,QAAA,EAAA,YAAA,mBAA4C,SAAA,EAAW,KAAA,EAAO,QAAQ,YAAA,EAAa;AAAA,EAC9F;AACA,EAAA,IAAI,eAAe,KAAA,IAAS,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AAC9D,IAAA,OAAO,EAAE,QAAA,EAAA,YAAA,mBAA4C,SAAA,EAAW,KAAA,EAAO,QAAQ,YAAA,EAAa;AAAA,EAC9F;AAGA,EAAA,OAAO;AAAA,IACL,QAAA,EAAA,OAAA;AAAA,IACA,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG;AAAA,GACrF;AACF;AAMA,SAAS,qBAAqB,MAAA,EAAqF;AACjH,EAAA,IAAI,WAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,KAAW,GAAA,IAAO,WAAW,GAAA,EAAK;AACxE,IAAA,OAAO,EAAE,QAAA,EAAA,WAAA,kBAA2C,SAAA,EAAW,MAAM,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG;AAAA,EAChG;AACA,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,IAAA,OAAO,EAAE,QAAA,EAAA,WAAA,kBAA2C,SAAA,EAAW,OAAO,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG;AAAA,EACjG;AACA,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,IAAA,OAAO,EAAE,QAAA,EAAA,YAAA,mBAA4C,SAAA,EAAW,OAAO,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG;AAAA,EAClG;AACA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,EAAE,QAAA,EAAA,YAAA,mBAA4C,SAAA,EAAW,OAAO,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG;AAAA,EAClG;AACA,EAAA,OAAO,EAAE,QAAA,EAAA,OAAA,cAAuC,SAAA,EAAW,OAAO,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG;AAC7F;AAEA,eAAe,2BAAA,CACb,QAAA,EACA,OAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAC/C,EAAA,IAAI,KAAA,IAAS,KAAK,GAAA,CAAI,oCAAA,EAAsC,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG;AAChF,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAWuB,KAAA,CAAA,IAAA,CAAK,gBAAA,EAAiB,EAAG,aAAa,CAAA;AACvD,IAAA,MAASC,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,SAAS,OAAA,CAAQ,mBAAA,EAAqB,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,MAAA;AAC5E,IAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAgBD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,KAAK,IAAI,QAAQ,CAAA,CAAA,EAAIE,UAAAA,EAAY,CAAA,IAAA,CAAM,CAAA;AAC1E,IAAA,MAASD,EAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAC5C,IAAA,OACE,OAAA,GACA;AAAA,mBAAA,EAAwB,KAAK,aAAa,QAAQ,CAAA,kFAAA,CAAA;AAAA,EAEtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;AC30BO,IAAM,oBAAN,MAAwB;AAAA,EACZ,GAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAAwB;AAAA,EAEzD,YAAY,GAAA,EAAc;AACxB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEA,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO,KAAK,GAAA,CAAI,QAAA;AAAA,EAClB;AAAA,EAEA,IAAI,KAAA,GAA6B;AAC/B,IAAA,OAAO,KAAK,GAAA,CAAI,KAAA;AAAA,EAClB;AAAA,EAEA,IAAI,IAAA,GAA0C;AAC5C,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAA,GAAsC;AACpC,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,MAC/B,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,MACzB,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAI,IAAA;AAAK,KAC3B;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AACxB,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACvB,IAAA,OAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,cAAc,OAAA,EAAwB;AAIpC,IAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,UAAA,GAAa,qBAAqB,OAAO,CAAA;AAAA,IACnD;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,IAAI,QAAA,CAAS,MAAA,EAAQ,GAAG,OAAO,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,6BAA6B,KAAA,EAA8B;AACzD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,QAAQ,OAAO,KAAA;AAC1C,IAAA,MAAM,UACJ,OAAO,IAAA,CAAK,YAAY,QAAA,GACpB,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,OAAA,IAAW,KAAK,CAAA,GAC5C,CAAC,GAAG,IAAA,CAAK,SAAS,KAAK,CAAA;AAI7B,IAAA,MAAM,OAAA,GAAmB,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,oBAAA,CAAqB,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,CAAA,EAAE;AACpG,IAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AAGtB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,IAAI,MAAA,GAAS,CAAA,EAAG,OAAA,EAAS,OAAA,EAAS,CAAA;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAgB,QAAA,EAA2B;AAQzC,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,CAAA,CAAE,eAAe,MAAA,EAAW;AAC9B,QAAA,CAAA,CAAE,UAAA,GAAa,qBAAqB,CAAC,CAAA;AAKrC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAC5B,UAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,YAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,aAAA,EAAe;AACrD,cAAA,YAAA,GAAe,IAAA;AACf,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAMA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,QAAA,CAAS,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ;AAChC,MAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AAAA,IACxB;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA;AAAA,IACrB;AAOA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,IAAI,kBAAA,GAAqB,IAAA;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,UAAU,CAAC,GAAG,QAAQ,CAAA,EAAG,CAAA;AAAA,EAClE;AAAA,EAEA,aAAa,KAAA,EAAyB;AAIpC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAC/E,IAAA,MAAM,SAAA,GAAY,OAAA,GAAU,EAAC,GAAI,KAAA;AAEjC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,GAAS,CAAA;AACxB,IAAA,IAAA,CAAK,IAAI,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAO,CAAC,GAAG,SAAS,CAAA,EAAG,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAA,CAAQ,KAAa,KAAA,EAAsB;AACzC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AACrB,IAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,WAAW,GAAA,EAAmB;AAC5B,IAAA,IAAI,EAAE,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAA,EAAO;AAC7B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAI,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AAChD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,QAAA,EAA0C;AACjD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEQ,KAAK,MAAA,EAA2B;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,SAAA,EAAW;AAC9B,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,QAAQ,IAAI,CAAA;AAAA,MAChB,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;ACnIO,IAAM,UAAN,MAAgC;AAAA,EACrC,WAAsB,EAAC;AAAA,EACvB,QAAoB,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAarB,SAAA,uBAAgB,GAAA,EAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAC/B,UAAA,uBAAiB,GAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrC,cAA8D,EAAC;AAAA,EAC/D,kBAAwC,0BAAA,EAA2B;AAAA,EACnE,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAgB,EAAC;AAAA,EACjB,OAAgC,EAAC;AAAA;AAAA,EAEjC,OAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA;AAAA;AAAA,EAGQ,uBAAwE,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjF,kBAAA,GAAqB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrB,iBAAA,GAAwC,MAAA;AAAA,EAExC,YAAY,IAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AAC1C,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAK,uBAAA,IAA2B,KAAA;AAC/D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,SAAA;AAC/B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,eAAA;AACnC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAK,uBAAA,IAA2B,KAAA;AAG/D,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,MAAA,GAAmC,IAAA;AAAA,EAC3C,IAAI,KAAA,GAA2B;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,OAAa,MAAA,GAAS,IAAI,kBAAkB,IAAI,CAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,UAAA,uBAAiB,GAAA,EAAgC;AAAA,EACzD,kBAAkB,EAAA,EAA4C;AAC5D,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,EAAE,CAAA;AACtB,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AAAA,EACxC;AAAA,EACA,MAAM,eAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,CAAC,GAAG,IAAA,CAAK,UAAU,EAAE,OAAA,EAAQ;AAI9C,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,EAAG;AAAA,MACX,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,UAAA,CAAW,OAAA,EAAiB,OAAA,EAAiB,MAAA,GAA2B,MAAA,EAAc;AACpF,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACpC,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,iBAAiB,UAAA,EAAgE;AAC/E,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MAClB,IAAA,EAAM,aAAA;AAAA,MACN,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,MAAM,UAAA,CAAW;AAAA,KAClB,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAiD,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,OAAA,EAA0B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,WAAW,OAAA,EAA0B;AACnC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,cAAc,OAAA,EAAqC;AACjD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,GAAA,EAAqB;AACjC,IAAA,MAAM,QAAA,GAAgBE,KAAA,CAAA,UAAA,CAAW,GAAG,CAAA,GAC3BA,KAAA,CAAA,OAAA,CAAQ,GAAG,CAAA,GACXA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,GAAG,CAAA;AAItC,IAAA,IAAI,CAAC,KAAK,uBAAA,EAAyB;AACjC,MAAA,MAAM,IAAA,GAAYA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAC1C,MAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AACxC,MAAA,IAAI,IAAI,UAAA,CAAW,IAAI,CAAA,IAAUA,KAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,mBAAA,EAAsB,QAAQ,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA;AAElB,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,oBAAA,EAAsB;AAC1C,MAAA,IAAI;AAAE,QAAA,EAAA,CAAG,UAAU,GAAG,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAoB;AAAA,IACvD;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoB,EAAA,EAA0D;AAC5E,IAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,EAAE,CAAA;AACjC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,CAAQ,EAAE,CAAA;AAChD,MAAA,IAAI,OAAO,CAAA,EAAG,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACvD,CAAA;AAAA,EACF;AAAA,EAEA,KAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EACjC;AACF;ACvVO,IAAM,oBAAA,GAAN,MAAM,qBAAA,CAA8C;AAAA,EACxC,KAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAyB;AAAA,EAC1C,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EAC5D,OAAwB,uBAAA,GAA0B,EAAA;AAAA,EAElD,YAAY,IAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA,EAEA,MAAc,sBAAsB,SAAA,EAAyC;AAC3E,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAI3B,IAAA,MAAM,UAAU,aAAA,CAAc,GAAA;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,WAAA,GAAmBC,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA;AAC3D,IAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM5B,KAAAA,GAAO,MAAS6B,EAAA,CAAA,IAAA,CAAK,WAAW,CAAA;AACtC,MAAA,OAAA,GAAU7B,KAAAA,CAAK,OAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AACtC,MAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA;AACvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAChD,IAAA,IAAI,UAAA,IAAc,gBAAgB,OAAA,EAAS;AACzC,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AACtC,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,EAAW,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC5C,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,qBAAA,CAAqB,uBAAA,EAAyB;AAC1E,MAAA,MAAM,SAAS,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AAC7C,MAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAC7B,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,aAAA,CAAc,iBAAiB,SAAS,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,CAAM,CAAA,GAAkB,EAAC,EAAkC;AAG/D,IAAA,MAAM,kBAAkB,IAAA,CAAK,KAAA;AAW7B,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,OAAO,eAAA,CAAgB,YAAA,KAAiB,UAAA,EAAY;AACtD,MAAA,GAAA,GAAM,MAAM,gBAAgB,YAAA,CAAa;AAAA,QACvC,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,eAAe,CAAA,CAAE,aAAA;AAAA,QACjB,OAAO,CAAA,CAAE;AAAA,OACV,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,GAAG,IAAI,GAAI,CAAA;AAC7E,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AACjD,MAAA,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,QAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,OAAO,OAAO,KAAA;AAC7C,QAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,OAAO,OAAO,KAAA;AAC7C,QAAA,IAAI,EAAE,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,UAAU,OAAO,KAAA;AACpD,QAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,KAAA;AAC3C,QAAA,IAAI,EAAE,SAAA,KAAc,MAAA,IAAa,EAAE,UAAA,GAAa,CAAA,CAAE,WAAW,OAAO,KAAA;AACpE,QAAA,IAAI,WAAA,IAAe,CAAC,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,KAAA;AACxE,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AACA,IAAA,MAAM,GAAA,GAA4B,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAChD,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,YAAY,CAAA,CAAE;AAAA,KAChB,CAAE,CAAA;AACF,IAAA,OAAO,EAAE,KAAA,GAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,GAAI,GAAA;AAAA,EAC3C;AAAA,EAEA,OAAO,OAAO,SAAA,EAAgD;AAC5D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACvD,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,MAAA,CAAO,CAAA,EAAuB,SAAA,EAAgC,YAAA,EAA0D;AAC5H,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,GAAA;AACzB,IAAA,MAAM,OAAA,GAAU,aAAa,CAAC,CAAA;AAC9B,IAAA,MAAM,eAAe,CAAA,CAAE,KAAA,GAAQ,IAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA;AAIlD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,GAAM,CAAC,SAAS,CAAA;AAAA,IAClB,CAAA,MAAO;AAGL,MAAA,MAAM,kBAAkB,IAAA,CAAK,KAAA;AAW7B,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,OAAO,eAAA,CAAgB,YAAA,KAAiB,UAAA,EAAY;AACtD,QAAA,QAAA,GAAW,MAAM,gBAAgB,YAAA,CAAa;AAAA,UAC5C,OAAO,YAAA,EAAc,KAAA;AAAA,UACrB,OAAO,YAAA,EAAc,KAAA;AAAA,UACrB,UAAU,YAAA,EAAc,QAAA;AAAA,UACxB,OAAO,YAAA,EAAc,KAAA;AAAA,UACrB,WAAW,YAAA,EAAc,SAAA;AAAA,UACzB,eAAe,YAAA,EAAc,aAAA;AAAA,UAC7B,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAI,CAAA;AACrC,QAAA,MAAM,WAAA,GAAc,YAAA,EAAc,aAAA,EAAe,WAAA,EAAY;AAC7D,QAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AAChC,UAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,YAAA,CAAa,OAAO,OAAO,KAAA;AACpE,UAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,YAAA,CAAa,OAAO,OAAO,KAAA;AACpE,UAAA,IAAI,cAAc,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,YAAA,CAAa,UAAU,OAAO,KAAA;AAC3E,UAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,YAAA,CAAa,OAAO,OAAO,KAAA;AAClE,UAAA,IAAI,cAAc,SAAA,KAAc,MAAA,IAAa,EAAE,UAAA,GAAa,YAAA,CAAa,WAAW,OAAO,KAAA;AAC3F,UAAA,IAAI,WAAA,IAAe,CAAC,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,KAAA;AACxE,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AACA,MAAA,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,OAA2B,EAAC;AAOlC,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,KAAK,KAAK,CAAA;AAC1D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,UAAU,MAAM,SAAA;AAAA,UACpB,EAAA;AAAA,UACA,CAAC,EAAA,KAAO;AACN,YAAA,IAAI,gBAAgB,CAAC,YAAA,CAAa,IAAI,EAAA,CAAG,IAAI,GAAG,OAAO,KAAA;AACvD,YAAA,MAAM,IAAA,GAAO,UAAU,EAAE,CAAA;AACzB,YAAA,IAAI,IAAA,KAAS,MAAM,OAAO,KAAA;AAC1B,YAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,KAAM,IAAA;AAAA,UAC3B,CAAA;AAAA,UACA,EAAE,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,MAAA;AAAO,SAC/B;AACA,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,MAAM,IAAA,GAAO,aAAA,CAAc,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7C,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAC,CAAA;AACvC,UAAA,IAAA,CAAK,IAAA,CAAK;AAAA,YACR,SAAA,EAAW,EAAA;AAAA,YACX,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,IAAA,EAAM,EAAE,KAAA,CAAM,IAAA;AAAA,YACd,SAAS,SAAA,CAAU,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,IAAI,GAAG;AAAA,WAC5C,CAAA;AACD,UAAA,IAAI,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,IAAA;AAAA,QACnC;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAKA,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAA,CAAsB,EAAE,CAAA;AAAA,MAC5C,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AACvC,QAAA,IAAI,gBAAgB,CAAC,YAAA,CAAa,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA,EAAG;AAChD,QAAA,MAAM,IAAA,GAAO,UAAU,EAAE,CAAA;AACzB,QAAA,IAAI,SAAS,IAAA,EAAM;AACnB,QAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,SAAA,EAAW,EAAA;AAAA,UACX,UAAA,EAAY,CAAA;AAAA,UACZ,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,SAAS,SAAA,CAAU,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,IAAI,GAAG;AAAA,SAC5C,CAAA;AACD,QAAA,IAAI,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,IAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,IAAA,EAA6C;AAC3E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACvD,IAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,IAAA;AAC1C,IAAA,MAAM,kBAAA,GAAqB,KAAK,kBAAA,IAAsB,IAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AACzC,MAAA,IACE,CAAC,YAAA,KACA,CAAA,CAAE,IAAA,KAAS,UAAA,IACV,CAAA,CAAE,IAAA,KAAS,aAAA,IACX,CAAA,CAAE,IAAA,KAAS,iBAAA,IACX,CAAA,CAAE,SAAS,eAAA,CAAA,EACb;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IACE,CAAC,kBAAA,KACA,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,EAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,mBAAA,CAAA,EAC7D;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,MAAA,EAAQ,QAAA,EAAS,EAAG,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,MAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,SAAS,SAAA,EAA6C;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF;AAEA,SAAS,aACP,CAAA,EACyD;AACzD,EAAA,MAAM,EAAA,GAAK,EAAE,eAAA,IAAmB,IAAA;AAChC,EAAA,IAAI,EAAE,KAAA,EAAO;AACX,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,GAAM,EAAA;AACzB,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,CAAA,CAAE,KAAA,EAAO,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,KAAK,QAAA,CAAS,KAAA;AACpB,IAAA,OAAO,CAAC,IAAA,KAAS;AACf,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACtB,MAAA,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAS,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,WAAA,KAAgB,CAAA,CAAE,KAAA;AAC9C,EAAA,OAAO,CAAC,IAAA,KAAS;AACf,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,WAAA,EAAY,GAAI,IAAA;AACtC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC9B,IAAA,OAAO,GAAA,KAAQ,KAAK,IAAA,GAAO,EAAE,OAAO,GAAA,EAAK,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,MAAA,EAAO;AAAA,EACpE,CAAA;AACF;AAEA,SAAS,UAAU,CAAA,EAAgC;AACjD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,YAAA;AACH,MAAA,OAAO,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA,IAClC,KAAK,cAAA;AACH,MAAA,OAAO,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AAAA,IAC7C,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,IAC7E,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA,CAAA;AAAA,IACjC,KAAK,eAAA;AAAA,IACL,KAAK,iBAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,IACjC,KAAK,cAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAO,CAAA,CAAE,KAAA;AAAA,IACX,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,CAAA;AAAA,IAC/B,KAAK,iBAAA;AAAA,IACL,KAAK,mBAAA;AACH,MAAA,OAAO,CAAA,CAAE,SAAA;AAAA,IACX;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,OAAA,EAA0C;AACjE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACX,KAAK,UAAA;AACH,QAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,MACvD,KAAK,aAAA;AACH,QAAA,OAAO,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7E;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,IAAM,cAAA,GAAiB,EAAA;AAEvB,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,GAAA,EAAqB;AACnE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,cAAc,CAAA;AAC/C,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,cAAc,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,CAAA,GAAI,QAAA,GAAM,EAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,QAAA,GAAM,EAAA;AACxC,EAAA,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,GAAI,MAAA;AACrE;AAEA,SAAS,cAAA,CAAe,MAAuB,MAAA,EAAgC;AAC7E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,IAAA,CAAK,QAAA,IAAY,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,IAAS,GAAG,CAAA,CAAE,CAAA;AAAA,EACxE;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAC7C,EAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC3D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,YAAA,EAAc;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAa,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAC9B,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACnC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAA,KAAe,UAAA,EAAY;AAC/C,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,QACtC;AACA,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,CAAA,CAAE,IAAI,CAAA,EAAA,CAAI,CAAA;AACzC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,QAAA,KAAA,CAAM,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC1F,QAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,CAAA,CAAE,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA,CAAE,CAAA;AAC1D,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACnD,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,CAAA,CAAE,MAAM,CAAA,QAAA,EAAM,CAAA,CAAE,KAAK,CAAA,OAAA,CAAS,CAAA;AAC9D,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,eAAA,CAAgB,MAAuB,MAAA,EAAgC;AAC9E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,QAAA,EAAM,IAAA,CAAK,QAAA,IAAY,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,IAAS,GAAG,CAAA,gBAAA,EAAc,KAAK,SAAS,CAAA;AAAA,GAC/F;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,EAAA,EAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,YAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,WAAA,CAAa,CAAA;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,WAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,CAAA;AACpE,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,IAAI,CAAA,CAAE,EAAE,gBAAgB,CAAA,CAAE,OAAA,GAAU,aAAa,EAAE,CAAA,CAAA,EACjD,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAU,KAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CACtE,CAAA;AAAA,SACF;AACA,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,SAAA,EAAY,EAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvD,QAAA;AAEA;AACJ,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB","file":"index.js","sourcesContent":["export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' | undefined };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string | undefined;\n content: string;\n is_error?: boolean | undefined;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string | undefined;\n data?: string | undefined;\n url?: string | undefined;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string | undefined;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import type { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n /**\n * ISO-8601 timestamp from the originating SessionEvent.\n * Populated by SessionStore.replay() during session load/resume\n * so consumers (WebUI, TUI, exports) can reconstruct the original\n * conversation timeline instead of seeing every message stamped\n * with \"now\". Absent for in-memory messages created during a live\n * run — those use wall-clock time from the caller.\n */\n ts?: string | undefined;\n /**\n * Pre-computed token estimate for this message, set by\n * ConversationState on append/replace. Used by estimateMessageTokens\n * and estimateRequestTokens to skip the O(n·m) content-block walk\n * on every context-pressure check. Undefined means \"not yet computed\"\n * — the estimator falls back to walking content blocks.\n */\n _estTokens?: number | undefined;\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\n","import type { Context } from '../core/context.js';\n\nexport type Permission = 'auto' | 'confirm' | 'deny';\n\n/**\n * Risk tier for tools in YOLO mode. YOLO auto-approves everything by default,\n * including destructive calls. Use `--confirm-destructive` to re-enable\n * confirmation prompts for destructive operations.\n *\n * - `safe` — read-only, no side effects (read, glob, grep, etc.)\n * - `standard` — non-destructive writes and mutations (write, edit, safe shell commands)\n * - `destructive` — irreversible or broadside effects (recursive deletes, db drops, etc.)\n */\nexport type RiskTier = 'safe' | 'standard' | 'destructive';\n\n/**\n * Icon identifiers for tools — each UI (WebUI/TUI/REPL) maps these to its own icon library.\n * Add the icon directly on each Tool so all UIs consume the same canonical value.\n */\nexport type ToolIconId =\n | 'file' // read, write — document operations\n | 'edit' // edit, patch — modifying files\n | 'search' // grep, search — searching content\n | 'folder' // glob — file discovery\n | 'terminal' // bash, exec — shell commands\n | 'web' // fetch — HTTP requests\n | 'git' // git — version control\n | 'tree' // tree — directory structure\n | 'code' // lint, format, typecheck — code quality\n | 'test' // test — testing\n | 'package' // install, audit, outdated — package management\n | 'document' // document — documentation\n | 'scaffold' // scaffold — project generation\n | 'todo' // todo — task tracking\n | 'plan' // plan — planning\n | 'task' // task — structured work items\n | 'meta' // tool-use, batch-tool-use, tool-search, tool-help — meta tools\n | 'index' // codebase-index, codebase-search, codebase-stats — code indexing\n | 'json' // json — JSON operations\n | 'diff' // diff — comparing changes\n | 'logs' // logs — log viewing\n | 'settings' // set-working-dir — configuration\n | 'fallback'; // unknown tool — fallback icon\n\nexport interface JSONSchema {\n type?: string | undefined;\n properties?: Record<string, JSONSchema>;\n required?: string[] | undefined;\n items?: JSONSchema | undefined;\n enum?: unknown[] | undefined;\n description?: string | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Tool progress event — yielded by `Tool.executeStream` to give the UI\n * something to render while a long-running tool works. The executor\n * publishes each event via EventBus as `tool.progress` so the TUI, logger,\n * and observability layer can consume them uniformly.\n *\n * Keep events small. They are buffered through the EventBus synchronously\n * and rendered on the main thread.\n */\nexport interface ToolProgressEvent {\n /**\n * - `log` — verbose informational message (e.g. \"scanning…\")\n * - `warning` — non-fatal issue (e.g. \"skipped X due to ENOENT\")\n * - `metric` — numeric data (e.g. files scanned so far)\n * - `file_changed` — a tool that mutates the workspace announces a write\n * - `partial_output` — stream of textual output (bash stdout, fetch body)\n */\n type: 'log' | 'warning' | 'metric' | 'file_changed' | 'partial_output';\n text?: string | undefined;\n data?: Record<string, unknown>;\n}\n\n/**\n * Terminal event for `executeStream`. The output must match the tool's\n * declared output type — the executor unwraps `output` and treats it like\n * a normal `execute` return value.\n */\nexport interface ToolFinalEvent<O> {\n type: 'final';\n output: O;\n}\n\nexport type ToolStreamEvent<O = unknown> = ToolProgressEvent | ToolFinalEvent<O>;\n\nexport interface Tool<I = unknown, O = unknown> {\n name: string;\n description: string;\n /**\n * Pre-computed token estimate for this tool's definition (name +\n * description + JSON-serialized inputSchema). Set by ToolRegistry on\n * registration; consumed by estimateToolDefTokens / estimateRequestTokens\n * to skip redundant JSON.stringify on every context-pressure check.\n */\n _estDefTokens?: number | undefined;\n usageHint?: string | undefined;\n /** Optional category for grouping in help lists and system prompts. */\n category?: string | undefined;\n inputSchema: JSONSchema;\n permission: Permission;\n mutating: boolean;\n /**\n * Risk tier for selective YOLO gating. When YOLO is active, clearly\n * destructive calls still emit `confirm` unless the destructive override is\n * set. Defaults to `standard` when omitted — callers should always check\n * `riskTier` after the basic permission decision.\n */\n riskTier?: RiskTier | undefined;\n /**\n * Input-field name that the permission policy should match trust rules\n * against. Without this, the policy falls back to a heuristic\n * (`command` / `path` / `url` / `name`) that can collide across tools —\n * e.g. an HTTP tool whose `path` means \"request path\" would be checked\n * against filesystem-path trust rules. Set explicitly to avoid the\n * cross-tool subject collision.\n *\n * The named field's value must be a string at runtime; non-string values\n * fall back to the heuristic.\n */\n subjectKey?: string | undefined;\n maxOutputBytes?: number | undefined;\n timeoutMs?: number | undefined;\n /**\n * Hint for the TUI spinner — does NOT affect actual timeout enforcement.\n * Use `timeoutMs` for hard limits. Leave undefined when duration varies\n * unpredictably.\n */\n estimatedDurationMs?: number | undefined;\n\n /**\n * Declarative security capabilities granted by this tool.\n *\n * Examples: \"shell.arbitrary\", \"fs.write\", \"fs.write.outside-project\",\n * \"net.outbound\", \"mcp.proxy\", \"subagent.spawn\", \"config.mutate\".\n *\n * These are used by permission policies (especially subagent guards) and\n * future capability-based allowlists. Prefer well-known values over ad-hoc strings.\n *\n * This field is optional for backward compatibility. Tools without it are\n * treated conservatively by guards.\n */\n capabilities?: readonly string[] | undefined;\n /**\n * Icon identifier for this tool — consumed by all UIs (WebUI/TUI/REPL) to\n * render a tool-specific icon instead of a generic fallback.\n * Each UI maps this id to its own icon library.\n */\n icon?: ToolIconId | undefined;\n execute(input: I, ctx: Context, opts: { signal: AbortSignal }): Promise<O>;\n /**\n * Optional cross-field validation hook. Called by the executor AFTER\n * JSON Schema validation passes and AFTER PreToolUse hooks may have\n * rewritten the input, but BEFORE permission checks and execution.\n *\n * Use this for invariants the JSON Schema cannot express — e.g.\n * `old_string !== new_string` in edit, or `end > start` in a range tool.\n * Return an array of validation errors (empty = valid). The executor\n * surfaces them to the model just like schema validation errors, so the\n * model can self-correct without the tool's `execute()` running.\n *\n * P3 #16 (before-release.md): tools that implement cross-field checks\n * inside `execute()` can migrate them here for earlier rejection and\n * consistent error formatting.\n */\n validate?(input: I): string[];\n /**\n * Optional streaming variant. When defined, the executor prefers this\n * over `execute` — yielded events become `tool.progress` EventBus events\n * and the terminal `final` event provides the output. Tools that don't\n * have intermediate state shouldn't implement this; the default `execute`\n * path is more efficient.\n */\n executeStream?(\n input: I,\n ctx: Context,\n opts: { signal: AbortSignal },\n ): AsyncIterable<ToolStreamEvent<O>>;\n /**\n * Optional teardown hook fired by the executor when the tool's run is\n * aborted (signal triggered). Errors thrown here are swallowed so they\n * never mask the originating failure.\n *\n * **When to use `cleanup` vs `ctx.registerAbortHook`:**\n *\n * - Use `cleanup` for resources **owned by the tool author** that are\n * established at execute-time: child processes spawned by the tool,\n * file handles opened by the tool, network connections initiated by\n * the tool. The lifecycle is co-located with the tool definition, so\n * readers see the resource and its teardown in one place.\n *\n * ```ts\n * async execute(input, ctx, opts) {\n * const child = spawn(...);\n * // … tool work …\n * },\n * async cleanup(_input, _ctx) {\n * // best-effort kill of any child still running\n * }\n * ```\n *\n * - Use `ctx.registerAbortHook` for **context-scoped teardown** registered\n * dynamically inside `execute`: when the tool delegates to a library\n * that needs cancellation, or when the resource is created lazily\n * somewhere down the call stack and the natural cleanup point isn't\n * at the tool boundary. The hook fires when the **agent run** ends,\n * not when this specific tool call aborts.\n *\n * ```ts\n * async execute(input, ctx, opts) {\n * const handle = openHelper();\n * ctx.registerAbortHook(() => handle.dispose());\n * // … work …\n * }\n * ```\n *\n * If both are registered for the same resource, `cleanup` fires first\n * (on tool abort) and the abort-hook fires after on the wider run abort.\n * Avoid double-free by gating one on the other's effect, or pick a single\n * teardown channel per resource.\n */\n cleanup?(input: I, ctx: Context): Promise<void>;\n /**\n * Optional custom output serializer. When present, the executor's output\n * serializer calls this INSTEAD of the central `renderToolObject()` switch\n * — the tool owns its own pretty-printing.\n *\n * Return a string representation of the output that the model will see in\n * its tool_result block. The serializer applies the iteration output cap\n * AFTER this runs, so don't worry about truncation.\n *\n * P3 #21 (before-release.md): `renderToolObject()` is a god function with\n * 30+ per-tool branches, far from each tool's definition. New tools that\n * want custom output no longer need to add a branch there — they implement\n * this method instead. Existing branches stay until migrated incrementally.\n */\n serialize?(output: O, input: I): string;\n}\n\nexport interface ToolCallContext {\n tool: Tool;\n input: unknown;\n callId: string;\n ctx: Context;\n signal: AbortSignal;\n}\n\n/**\n * Error categories for tool execution failures.\n * Used by the executor to classify errors and determine retry strategy.\n */\nexport enum ToolErrorCategory {\n TRANSIENT = \"transient\", // ETIMEDOUT, ECONNRESET, network timeout, HTTP 429/503\n NOT_FOUND = \"not_found\", // ENOENT, ENOTDIR, HTTP 404\n PERMISSION = \"permission\", // EACCES, EPERM, HTTP 401/403\n VALIDATION = \"validation\", // schema validation error, HTTP 400\n FATAL = \"fatal\", // unhandled exception, crash, invariant violation\n}\n\n/**\n * Structured tool error information for the LLM and retry logic.\n */\nexport interface ToolErrorInfo {\n readonly category: ToolErrorCategory;\n /** Whether the operation can be retried automatically. */\n readonly retryable: boolean;\n /** User-facing message describing the error. */\n readonly userMessage: string;\n /** Optional technical detail for debugging. */\n readonly detail?: string;\n}\n","/**\n * Sentinel keys provider adapters use to wrap tool-call arguments that could\n * not be parsed into a proper JSON object. Single source of truth — the core\n * tool executor (which DETECTS these markers to surface a friendly error)\n * defines them here, and the providers package (which PRODUCES them when\n * wrapping) imports from `@wrongstack/core`.\n *\n * P3 #14 (before-release.md): the list was duplicated in tool-executor.ts with\n * a \"Keep this list in sync\" comment — a manual rule that will eventually be\n * forgotten. Centralizing it removes the sync burden.\n *\n * Layering note: this lives in core (not providers) because the dependency\n * direction is providers → core, not the reverse. Putting it in providers\n * would force core into a forbidden upward dependency.\n *\n * Current markers:\n * - `__raw` — produced by `parseToolInput` (Anthropic / shared)\n * - `__raw_arguments` — produced by `contentFromOpenAI` (OpenAI / compatible)\n * - `_raw` — produced by the streaming response builder's\n * `safeJsonOrRaw` (legacy fallback)\n */\nexport const MALFORMED_ARG_MARKERS = ['__raw', '__raw_arguments', '_raw'] as const;\n\nexport type MalformedArgMarker = (typeof MALFORMED_ARG_MARKERS)[number];\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n // P3 #20 (before-release.md): on Windows, fs.rename (MoveFileExW) does\n // not preserve Unix permission bits — the chmod above applies to the tmp\n // file, but the rename may reset the destination's mode to the Windows\n // default. Re-apply the mode after rename on win32 so an edited file\n // keeps its executable bit (or any non-default permission). On POSIX,\n // rename preserves metadata so this is a no-op (chmod is idempotent and\n // cheap), but we gate it on win32 to avoid the extra stat+chmod on the\n // common path.\n if (mode !== undefined && process.platform === 'win32') {\n try {\n await fs.chmod(targetPath, mode);\n } catch {\n // Best-effort: a transient EPERM (antivirus lock) should not fail\n // the write — the content is already on disk.\n }\n }\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new Error(`Timed out waiting for file lock: ${targetPath}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","/**\n * TTY detection helpers — the single source of truth for \"is this process\n * running against a real terminal?\". Replaces ad-hoc `process.stdin.isTTY`\n * / `process.stdout.isTTY` checks scattered across the codebase so that:\n *\n * 1. test code can mock a single module instead of stubbing `isTTY` on\n * every ReadStream/WriteStream the test happens to touch;\n * 2. a future TTY-detection source (an env var override, a Windows\n * ConPTY workaround, …) lands in one place;\n * 3. `isInteractive()` encodes the rule the project already used inline\n * (\"both streams are TTYs AND we're not running under CI\") in one\n * testable helper instead of the same 3-condition check in two\n * different files.\n *\n * Scope: detection only. Raw-mode control (`setRawMode`), resize\n * subscriptions, and write-injection belong to a future, larger TTY\n * abstraction; this module is the smallest pull that gives us a\n * testable seam and dedups 20+ call sites.\n */\n\nconst hasStdout = (): boolean => typeof process !== 'undefined' && !!process.stdout;\nconst hasStdin = (): boolean => typeof process !== 'undefined' && !!process.stdin;\n\n/** True when `process.stdout` is attached to a terminal (not a pipe/file). */\nexport function isStdoutTTY(): boolean {\n return hasStdout() && Boolean(process.stdout.isTTY);\n}\n\n/** True when `process.stdin` is attached to a terminal (not a pipe/file). */\nexport function isStdinTTY(): boolean {\n return hasStdin() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * True when the current process is an interactive session: both stdin and\n * stdout are TTYs. Callers that also need a \"not a single-shot invocation\"\n * or \"not under CI\" check should layer that on top — keeping this helper\n * minimal preserves the original inline checks it replaces.\n */\nexport function isInteractive(): boolean {\n return isStdinTTY() && isStdoutTTY();\n}\n\n/** Current terminal size in characters, with a 24×80 fallback for non-TTYs. */\nexport function getTermSize(): { rows: number; cols: number } {\n if (!hasStdout()) return { rows: 24, cols: 80 };\n return {\n rows: process.stdout.rows ?? 24,\n cols: process.stdout.columns ?? 80,\n };\n}\n\n/**\n * Subscribe to terminal resize events. `cb` is called with the new size each\n * time the underlying stream emits `resize`. Returns a cleanup function the\n * caller MUST call on dispose to remove the listener — leaving a stale\n * `resize` listener on a disposed component leaks the closure (and the\n * component itself, transitively) until the process exits.\n *\n * The stream argument defaults to `process.stdout`. Pass an explicit\n * `NodeJS.WriteStream` when the caller already owns one (e.g. a status line\n * that targets an injected `out` for testability). For non-TTY streams no\n * listener is registered and the returned cleanup is a no-op.\n */\nexport function onResize(\n cb: (size: { rows: number; cols: number }) => void,\n stream: NodeJS.WriteStream = process.stdout,\n): () => void {\n if (!stream || typeof stream.on !== 'function') return () => {};\n const handler = (): void => {\n cb({\n rows: stream.rows ?? 24,\n cols: stream.columns ?? 80,\n });\n };\n stream.on('resize', handler);\n return () => {\n stream.off('resize', handler);\n };\n}\n\n/**\n * Toggle raw mode on a TTY stdin stream. Returns `true` when the toggle was\n * applied, `false` when the stream is null, not a TTY, or doesn't expose\n * `setRawMode` (pipes, file descriptors, Windows ConPTY edge cases). Callers\n * that need to restore the previous mode should snapshot `input.isRaw`\n * BEFORE the call and pass the value to a second call to flip back.\n *\n * Use this helper to drop the now-redundant\n * `if (input.isTTY) input.setRawMode(...)` ceremony at every call site.\n */\nexport function setRawMode(input: NodeJS.ReadStream, mode: boolean): boolean {\n if (input?.isTTY !== true) return false;\n if (typeof input.setRawMode !== 'function') return false;\n input.setRawMode(mode);\n return true;\n}\n\n/**\n * Bracket installed by the interactive input reader while a `readline`\n * prompt is on screen. Out-of-band terminal writes — logger WARN/INFO\n * lines, async activity from the Telegram bridge, etc. — go to the same\n * physical terminal as the half-typed prompt but readline has no idea they\n * happened, so it never repaints. The result is the classic corruption the\n * user sees: every async line strands the in-progress draft as a fresh\n * scrollback row (sometimes with its cursor underline).\n *\n * The guard closes that gap. `suspend()` wipes the draft row so the message\n * prints clean; `resume()` repaints the prompt + draft (cursor preserved).\n * When no prompt is active the guard is `null` and writes pass straight\n * through — so agent-turn output (spinner, renderer) is untouched.\n */\nexport interface OutputLineGuard {\n /** Clear the current input row right before an out-of-band write. */\n suspend(): void;\n /** Repaint the prompt + in-progress draft right after the write. */\n resume(): void;\n}\n\nlet activeOutputGuard: OutputLineGuard | null = null;\n\n/**\n * Register (or clear, with `null`) the guard that brackets out-of-band\n * writes. Installed by {@link writeOut}/{@link writeErr} consumers — in\n * practice the CLI's readline input reader — only while a prompt is live.\n * Idempotent; the most recent caller wins.\n */\nexport function setOutputLineGuard(guard: OutputLineGuard | null): void {\n activeOutputGuard = guard;\n}\n\n/**\n * Stream-agnostic write primitive. Returns `false` when the stream is\n * missing or doesn't expose `write` so callers can degrade silently under\n * hostile host environments (closed pipe, mock injects `null`, test\n * replaces the stream with a stub).\n *\n * When an {@link OutputLineGuard} is installed (a readline prompt is on\n * screen) the write is bracketed by `suspend()`/`resume()` so the user's\n * half-typed input survives the interruption instead of being stranded in\n * scrollback. The guard's own redraw uses raw stream writes — never\n * `writeOut`/`writeErr` — so there is no re-entrancy here.\n *\n * **Not exported in the public API.** Exposed only inside `term.ts` for\n * `writeOut` / `writeErr` to share a single implementation. If a caller\n * needs to write to an arbitrary stream, they should call `writeOut` (or\n * `writeErr`) with an explicit `stream` argument — the named functions\n * are the public surface so the \"this is the standard error stream\"\n * intent stays visible at every call site.\n */\nfunction writeTo(\n s: string,\n stream: NodeJS.WriteStream | undefined,\n): boolean {\n if (!stream || typeof stream.write !== 'function') return false;\n const guard = activeOutputGuard;\n if (!guard) {\n stream.write(s);\n return true;\n }\n // A prompt is live — wipe the draft row, emit the message, repaint.\n guard.suspend();\n stream.write(s);\n guard.resume();\n return true;\n}\n\n/**\n * Write `s` to `stream` (defaults to `process.stdout`). Returns `false`\n * when the stream is missing or doesn't expose `write` so callers can\n * degrade silently under hostile host environments (closed pipe, mock\n * injects `null`, test replaces the stream with a stub).\n *\n * Why a helper:\n * 1. **Single seam for output capture in tests** — stub `writeOut` once\n * and assert on what the rest of the codebase intended to print,\n * without spying on `process.stdout.write` (which is brittle and\n * leaks across parallel test files).\n * 2. **Stream swap without grep** — routing the CLI's output to a\n * logger or `out.log` becomes a one-line change at process boot.\n * 3. **Defensive default** — closes the \"what if `process.stdout` is\n * `null`\" gap that currently exists at ~50 call sites that just\n * call `process.stdout.write(s)` and crash on certain Windows\n * redirect invocations.\n *\n * Call-site migration is staged: this commit introduces the helper, a\n * follow-up commit replaces the 50+ `process.stdout.write(...)` sites\n * with `writeOut(...)`. Until that migration lands, both forms coexist\n * and `writeOut` is the preferred form for new code.\n */\nexport function writeOut(\n s: string,\n stream: NodeJS.WriteStream = process.stdout,\n): boolean {\n return writeTo(s, stream);\n}\n\n/**\n * Symmetric partner of `writeOut` for the standard error stream. Same shape,\n * same defensive contract, same single-seam-for-tests story — just defaults to\n * `process.stderr` instead of `process.stdout`.\n *\n * Use this in code paths that emit error/diagnostic/warning text. Keeping\n * these two helpers split (rather than a single `writeTo(s, stream)`) means\n * the call site reads as a clear intent signal: \"I am writing an error\" vs.\n * \"I am writing a result\" — which matters for callers that decide between\n * stdout/stderr routing (e.g. `--quiet` flags, log-level filtering,\n * structured-log rewriters that fork on stream).\n *\n * Stderr writes from the core logger (see `infrastructure/logger.ts`) and from\n * the TUI guard (see `tui/run-tui.ts`) used to call `process.stderr.write`\n * directly. Routing them through this helper lets tests stub the stream at\n * one boundary and lets future logging middleware (e.g. a JSON-line rewriter)\n * swap the destination for the entire process in one place.\n */\nexport function writeErr(\n s: string,\n stream: NodeJS.WriteStream = process.stderr,\n): boolean {\n return writeTo(s, stream);\n}\n","import { isStdoutTTY } from './term.js';\n\nconst isColorTty = (): boolean => {\n if (envFlag(process.env.NO_COLOR)) return false;\n if (envFlag(process.env.FORCE_COLOR)) return true;\n return isStdoutTTY();\n};\n\nfunction envFlag(value: string | undefined): boolean {\n if (value === undefined) return false;\n if (value.trim() === '') return false;\n return !/^(0|false|no|off)$/i.test(value.trim());\n}\n\nconst COLOR = isColorTty();\n\nconst wrap =\n (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '');\n}\n","import * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport type {\n ContextEvidenceState,\n ToolOutputMetadata,\n} from '../types/context-evidence.js';\n\nconst MAX_TOOL_CALLS = 80;\nconst MAX_FACTS = 40;\nconst MAX_ERRORS = 20;\nconst MAX_DIGEST_CHARS = 4_000;\n/** Cap for the per-iteration reference scan — see markAssistantReferencedEvidence. */\nconst RECENT_TOOL_CALL_SCAN_LIMIT = 20;\n/** Cap content fed to file/symbol regex extractors (first N chars). */\nconst EXTRACT_CONTENT_CAP_CHARS = 10_000;\n/** Only scan the last N lines for error patterns — errors surface at the bottom. */\nconst EXTRACT_ERROR_TAIL_LINES = 200;\n\nconst WRITE_TOOLS = new Set(['edit', 'write', 'replace', 'patch']);\nconst READ_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'tree']);\n\nexport function createContextEvidenceState(): ContextEvidenceState {\n return {\n sessionGoals: [],\n implicitFacts: [],\n activeErrors: [],\n toolCalls: [],\n fileGraph: {},\n repeatedReads: [],\n updatedAt: Date.now(),\n };\n}\n\nexport interface RecordToolOutputEvidenceInput {\n toolUseId: string;\n toolName: string;\n input: unknown;\n content: string;\n ok: boolean;\n outputBytes?: number | undefined;\n outputTokens?: number | undefined;\n outputLines?: number | undefined;\n}\n\nexport function recordUserIntentEvidence(ctx: Context, text: string): void {\n const intent = normalizeWhitespace(text).slice(0, 700);\n if (!intent) return;\n const state = ensureEvidence(ctx);\n state.currentIntent = { text: intent, updatedAt: Date.now() };\n if (state.sessionGoals.length === 0 || isGoalish(intent)) {\n pushUniqueBounded(state.sessionGoals, intent, 8);\n }\n state.updatedAt = Date.now();\n}\n\nexport function recordToolOutputEvidence(\n ctx: Context,\n input: RecordToolOutputEvidenceInput,\n): ToolOutputMetadata {\n const state = ensureEvidence(ctx);\n // Cap content for regex extraction. File paths and symbol declarations\n // appear near the top of tool output (import blocks, function definitions),\n // so the first 10KB captures them. Without this cap, matchAll() runs over\n // the full output — e.g. a 50KB file read triggers ~100KB of regex scanning\n // across two patterns in extractSymbols plus the extractFiles pass.\n const scanContent = input.content.length > EXTRACT_CONTENT_CAP_CHARS\n ? input.content.slice(0, EXTRACT_CONTENT_CAP_CHARS)\n : input.content;\n const files = extractFiles(ctx, input.toolName, input.input, scanContent);\n const symbols = extractSymbols(scanContent, input.input);\n const commands = extractCommands(input.toolName, input.input);\n const errors = extractErrors(input.content);\n const summary = summarizeToolOutput(input.toolName, input.input, input.content, {\n files,\n symbols,\n errors,\n ok: input.ok,\n });\n\n const metadata: ToolOutputMetadata = {\n toolUseId: input.toolUseId,\n toolName: input.toolName,\n ok: input.ok,\n inputSummary: summarizeInput(input.input),\n summary,\n files,\n symbols,\n commands,\n errors,\n status: 'seen',\n referenceCount: 0,\n seenAt: Date.now(),\n outputBytes: input.outputBytes,\n outputTokens: input.outputTokens,\n outputLines: input.outputLines,\n };\n\n state.toolCalls.push(metadata);\n if (state.toolCalls.length > MAX_TOOL_CALLS) {\n state.toolCalls.splice(0, state.toolCalls.length - MAX_TOOL_CALLS);\n }\n\n updateFileGraph(state, metadata);\n updateRepeatedReadSignals(state, metadata);\n if (errors.length > 0) {\n for (const err of errors) pushUniqueBounded(state.activeErrors, err, MAX_ERRORS);\n }\n const fact = implicitFactFor(metadata);\n if (fact) pushUniqueBounded(state.implicitFacts, fact, MAX_FACTS);\n state.updatedAt = Date.now();\n return metadata;\n}\n\nexport function markAssistantReferencedEvidence(ctx: Context, text: string): void {\n const state = ensureEvidence(ctx);\n const haystack = text.toLowerCase();\n if (!haystack.trim()) return;\n\n // Only scan the most recent tool calls. The assistant almost always\n // references the files/symbols it just worked on — older entries are\n // rarely re-referenced. Scanning the full list (up to 80 entries) means\n // worst case: 80 × (files + symbols) includes() calls per iteration,\n // each O(responseText.length), which degrades as the conversation grows.\n // The last 20 captures the realistic reference window at ¼ the cost.\n const recent = state.toolCalls.length > RECENT_TOOL_CALL_SCAN_LIMIT\n ? state.toolCalls.slice(-RECENT_TOOL_CALL_SCAN_LIMIT)\n : state.toolCalls;\n for (const tool of recent) {\n if (!metadataReferencedByText(tool, haystack)) continue;\n tool.status = 'referenced';\n tool.referenceCount++;\n tool.referencedAt = Date.now();\n for (const file of tool.files) {\n const node = state.fileGraph[file];\n if (node) node.referenced = true;\n }\n }\n state.updatedAt = Date.now();\n}\n\nexport function buildContextEvidenceDigest(ctx: Context): string {\n const state = ensureEvidence(ctx);\n const lines: string[] = [];\n\n if (state.currentIntent?.text) {\n lines.push(`intent: ${state.currentIntent.text}`);\n }\n\n const goals = state.sessionGoals.slice(-3);\n if (goals.length > 0) {\n lines.push('session_goals:');\n for (const goal of goals) lines.push(`- ${goal}`);\n }\n\n const activeErrors = state.activeErrors.slice(-5);\n if (activeErrors.length > 0) {\n lines.push('active_errors:');\n for (const err of activeErrors) lines.push(`- ${err}`);\n }\n\n const files = Object.values(state.fileGraph)\n .sort((a, b) => (b.writes - a.writes) || (b.reads - a.reads) || a.path.localeCompare(b.path))\n .slice(0, 12);\n if (files.length > 0) {\n lines.push('dependency_graph:');\n for (const file of files) {\n const actions = [\n file.reads > 0 ? `read ${file.reads}x` : '',\n file.writes > 0 ? `write ${file.writes}x` : '',\n ].filter(Boolean).join(', ');\n const refs = file.referenced ? '; referenced by assistant' : '';\n const via = file.lastToolUseId ? `; last via ${file.lastToolUseId}` : '';\n lines.push(`- ${file.path} (${actions || 'seen'}${refs}${via})`);\n }\n }\n\n const referenced = state.toolCalls\n .filter((tool) => tool.status === 'referenced')\n .slice(-10);\n const recentSeen = state.toolCalls\n .filter((tool) => tool.status === 'seen')\n .slice(-5);\n const trail = [...referenced, ...recentSeen];\n if (trail.length > 0) {\n lines.push('tool_trail:');\n for (const tool of trail) {\n const size = tool.outputTokens ? `; ~${tool.outputTokens} tokens` : '';\n const filesText = tool.files.length > 0 ? `; files=${tool.files.slice(0, 4).join(', ')}` : '';\n const symbolsText = tool.symbols.length > 0 ? `; symbols=${tool.symbols.slice(0, 4).join(', ')}` : '';\n lines.push(\n `- ${tool.toolUseId} ${tool.toolName} ${tool.status}: ${tool.summary}${filesText}${symbolsText}${size}`,\n );\n }\n }\n\n const facts = state.implicitFacts.slice(-8);\n if (facts.length > 0) {\n lines.push('implicit_facts:');\n for (const fact of facts) lines.push(`- ${fact}`);\n }\n\n const digest = lines.join('\\n');\n if (digest.length <= MAX_DIGEST_CHARS) return digest;\n return `${digest.slice(0, MAX_DIGEST_CHARS)}... [+${digest.length - MAX_DIGEST_CHARS} chars]`;\n}\n\nexport function repeatedReadPressure(ctx: Context): number {\n return ensureEvidence(ctx).repeatedReads.reduce((max, item) => Math.max(max, item.count), 0);\n}\n\nfunction ensureEvidence(ctx: Context): ContextEvidenceState {\n if (!ctx.contextEvidence) {\n (ctx as never as { contextEvidence: ContextEvidenceState }).contextEvidence =\n createContextEvidenceState();\n }\n return ctx.contextEvidence;\n}\n\nfunction isGoalish(text: string): boolean {\n return /\\b(goal|objective|task|need|want|implement|fix|improve|refactor|add|remove|hedef|amac|istiyorum|gerekiyor|iyilestir|duzelt|ekle|kaldir)\\b/i.test(text);\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\nfunction pushUniqueBounded(list: string[], value: string, max: number): void {\n const normalized = normalizeWhitespace(value);\n if (!normalized) return;\n const existing = list.findIndex((item) => item.toLowerCase() === normalized.toLowerCase());\n if (existing >= 0) list.splice(existing, 1);\n list.push(normalized);\n if (list.length > max) list.splice(0, list.length - max);\n}\n\nfunction extractFiles(\n ctx: Context,\n toolName: string,\n input: unknown,\n content: string,\n): string[] {\n const out = new Set<string>();\n for (const value of inputPathValues(input)) addPath(ctx, out, value);\n\n if (toolName === 'grep' || toolName === 'glob' || toolName === 'bash') {\n const re = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\n for (const match of content.matchAll(re)) addPath(ctx, out, match[0]);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction inputPathValues(input: unknown): string[] {\n const values: string[] = [];\n const visit = (value: unknown, key?: string): void => {\n if (typeof value === 'string') {\n if (key && /^(path|file|files|fromFile|toFile|dir|cwd)$/i.test(key)) values.push(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) visit(item, key);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) visit(v, k);\n };\n visit(input);\n return values;\n}\n\nfunction addPath(ctx: Context, out: Set<string>, raw: string): void {\n const clean = raw.trim().replace(/^[\"'`]+|[\"'`),;:]+$/g, '');\n if (!clean || clean.length > 260) return;\n let normalized = clean.replace(/\\\\/g, '/');\n try {\n const abs = path.isAbsolute(clean) ? path.resolve(clean) : null;\n if (abs) {\n const rel = path.relative(ctx.projectRoot, abs);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n normalized = rel.replace(/\\\\/g, '/');\n }\n }\n } catch {\n // Keep the best-effort normalized string.\n }\n if (normalized.length > 0) out.add(normalized);\n}\n\nfunction extractSymbols(content: string, input: unknown): string[] {\n const out = new Set<string>();\n const patterns = [\n /\\b(?:function|class|interface|type|enum|const|let|var|def|fn|struct)\\s+([A-Za-z_$][\\w$]*)/g,\n /\\b(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/g,\n ];\n for (const re of patterns) {\n for (const match of content.matchAll(re)) {\n if (match[1]) out.add(match[1]);\n if (out.size >= 30) break;\n }\n }\n\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n if (typeof pattern === 'string' && /^[A-Za-z_$][\\w$]*$/.test(pattern)) {\n out.add(pattern);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction extractCommands(toolName: string, input: unknown): string[] {\n if (toolName !== 'bash' && toolName !== 'exec' && toolName !== 'shell') return [];\n if (!input || typeof input !== 'object') return [];\n const command = (input as Record<string, unknown>)['command'];\n if (typeof command !== 'string') return [];\n return [command.slice(0, 220)];\n}\n\nfunction extractErrors(content: string): string[] {\n const allLines = content.split(/\\r?\\n/);\n // Only scan the last N lines — errors and stack traces surface at the\n // bottom of tool output. Scanning all lines means one regex test per line,\n // so a 2000-line file read costs 2000 regex evaluations for no gain since\n // the interesting errors are always at the tail.\n const lines = allLines.length > EXTRACT_ERROR_TAIL_LINES\n ? allLines.slice(-EXTRACT_ERROR_TAIL_LINES)\n : allLines;\n const errors: string[] = [];\n for (const line of lines) {\n if (!/\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm|typeerror|syntaxerror)\\b/i.test(line)) continue;\n errors.push(normalizeWhitespace(line).slice(0, 260));\n if (errors.length >= 5) break;\n }\n return errors;\n}\n\nfunction summarizeInput(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const parts: string[] = [];\n for (const key of ['path', 'file', 'pattern', 'glob', 'command']) {\n const value = obj[key];\n if (typeof value === 'string') parts.push(`${key}=${value.slice(0, 160)}`);\n }\n return parts.length > 0 ? parts.join(', ') : undefined;\n}\n\nfunction summarizeToolOutput(\n toolName: string,\n input: unknown,\n content: string,\n opts: { files: string[]; symbols: string[]; errors: string[]; ok: boolean },\n): string {\n if (!opts.ok && opts.errors.length > 0) return opts.errors[0] ?? `${toolName} failed`;\n if (toolName === 'read' && opts.files[0]) return `read ${opts.files[0]}`;\n if (toolName === 'grep') {\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n return `searched ${typeof pattern === 'string' ? pattern : 'pattern'} (${opts.files.length} file hint(s))`;\n }\n if ((toolName === 'edit' || toolName === 'write') && opts.files[0]) {\n return `${toolName === 'write' ? 'wrote' : 'edited'} ${opts.files[0]}`;\n }\n const firstLine = normalizeWhitespace(content.split(/\\r?\\n/).find((line) => line.trim()) ?? '');\n return firstLine ? firstLine.slice(0, 220) : `${toolName} returned no text`;\n}\n\nfunction updateFileGraph(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n const writes = WRITE_TOOLS.has(metadata.toolName) ? 1 : 0;\n const reads = writes === 0 && (READ_TOOLS.has(metadata.toolName) || metadata.files.length > 0)\n ? 1\n : 0;\n for (const file of metadata.files) {\n const existing = state.fileGraph[file] ?? {\n path: file,\n reads: 0,\n writes: 0,\n tools: [],\n referenced: false,\n };\n existing.reads += reads;\n existing.writes += writes;\n existing.lastToolUseId = metadata.toolUseId;\n pushUniqueBounded(existing.tools, `${metadata.toolName}#${metadata.toolUseId}`, 8);\n state.fileGraph[file] = existing;\n }\n}\n\nfunction updateRepeatedReadSignals(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n if (metadata.toolName !== 'read' || metadata.files.length === 0) {\n state.lastReadPath = undefined;\n return;\n }\n const file = metadata.files[0] as string;\n if (state.lastReadPath === file) {\n const existing = state.repeatedReads.find((item) => item.file === file);\n if (existing) {\n existing.count++;\n existing.lastToolUseId = metadata.toolUseId;\n } else {\n state.repeatedReads.push({ file, count: 2, lastToolUseId: metadata.toolUseId });\n }\n if (state.repeatedReads.length > 10) state.repeatedReads.shift();\n }\n state.lastReadPath = file;\n}\n\nfunction implicitFactFor(metadata: ToolOutputMetadata): string | undefined {\n if (metadata.errors.length > 0) return `${metadata.toolName}#${metadata.toolUseId} exposed error: ${metadata.errors[0]}`;\n if (metadata.toolName === 'read' && metadata.files[0]) {\n const size = metadata.outputLines ? ` (${metadata.outputLines} line(s) returned)` : '';\n return `read ${metadata.files[0]}${size}`;\n }\n if ((metadata.toolName === 'edit' || metadata.toolName === 'write') && metadata.files[0]) {\n return `${metadata.toolName} changed ${metadata.files[0]}`;\n }\n if (metadata.status === 'referenced') return `${metadata.toolName}#${metadata.toolUseId} was referenced`;\n return undefined;\n}\n\nfunction metadataReferencedByText(metadata: ToolOutputMetadata, haystack: string): boolean {\n for (const file of metadata.files) {\n const f = file.toLowerCase();\n const base = path.basename(file).toLowerCase();\n if (f && haystack.includes(f)) return true;\n if (base && haystack.includes(base)) return true;\n }\n for (const symbol of metadata.symbols) {\n if (symbol.length >= 3 && haystack.includes(symbol.toLowerCase())) return true;\n }\n for (const err of metadata.errors) {\n const head = err.slice(0, 80).toLowerCase();\n if (head.length >= 12 && haystack.includes(head)) return true;\n }\n return false;\n}\n","/**\n * Deep merge utility — safely merges nested objects with configurable\n * conflict resolution, array merging, and prototype-pollution guarding.\n *\n * Used by:\n * - config-loader (config layer merging with primitive-array concatenation)\n * - secret-vault (config patching)\n * - json-path (json_merge tool with prefer-base / prefer-patch semantics)\n *\n * @module utils/deep-merge\n */\n\n// ---------------------------------------------------------------------------\n// Prototype-pollution guard — shared set of forbidden __proto__ keys\n// ---------------------------------------------------------------------------\n\nexport const FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** True when every element is a primitive or null (no nested objects/arrays). */\nexport function isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || (typeof v !== 'object' && typeof v !== 'function'));\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepMergeOptions {\n /**\n * Which side wins on collision for scalars and arrays.\n *\n * - `'prefer-patch'` (default): patch value replaces base value.\n * - `'prefer-base'`: base value is kept, patch value is ignored.\n */\n conflictResolution?: 'prefer-base' | 'prefer-patch';\n\n /**\n * How to handle array values.\n *\n * - `'replace'` (default): patch array replaces base array entirely.\n * - `'concat-primitives'`: when both values are primitive arrays,\n * they are concatenated and deduped (via Set). Non-primitive\n * arrays still replace the base wholesale.\n */\n arrayMode?: 'replace' | 'concat-primitives';\n\n /**\n * Skip prototype-pollution keys (`__proto__`, `constructor`, etc.).\n * Enabled by default. Only disable when you control both inputs\n * and the keyset (e.g. when merging trusted JSON schemas).\n */\n protectProto?: boolean;\n\n /**\n * Optional callback fired when a non-primitive (object) array is\n * replaced wholesale (only relevant with `arrayMode: 'concat-primitives'`).\n * Receives the key name, existing array length, and patch array length.\n * Used by config-loader for debug logging.\n */\n onNonPrimitiveArrayReplace?: (\n key: string,\n existingLen: number,\n patchLen: number,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merge `patch` into `base`, returning a new object.\n *\n * - Nested plain objects are merged recursively.\n * - Arrays are handled per `options.arrayMode`.\n * - Scalar collisions are resolved per `options.conflictResolution`.\n * - `null` and non-object values in `patch` replace the base value\n * (unless `conflictResolution` is `'prefer-base'`).\n * - Keys in `base` that are absent from `patch` are preserved.\n * - `FORBIDDEN_PROTO_KEYS` are skipped in the patch (unless\n * `options.protectProto` is set to `false`).\n *\n * The function is generic over `T extends Record<string, unknown>` for\n * callers that pass typed config objects, but the runtime signature\n * also accepts `unknown` inputs (used by the json-path plugin).\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n options?: DeepMergeOptions,\n): T;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options?: DeepMergeOptions,\n): unknown;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options: DeepMergeOptions = {},\n): unknown {\n const {\n conflictResolution = 'prefer-patch',\n arrayMode = 'replace',\n protectProto = true,\n onNonPrimitiveArrayReplace,\n } = options;\n\n // Non-object / null handling — delegate to conflict resolution.\n if (typeof base !== 'object' || base === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n if (typeof patch !== 'object' || patch === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Arrays — handled *before* the object merge so array-of-objects\n // aren't accidentally treated as plain records.\n if (Array.isArray(base) && Array.isArray(patch)) {\n if (\n arrayMode === 'concat-primitives' &&\n isPrimitiveArray(base) &&\n isPrimitiveArray(patch)\n ) {\n return [...new Set([...base, ...patch])];\n }\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // If only one side is an array, treat as scalar collision.\n if (Array.isArray(base) || Array.isArray(patch)) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Plain object merge.\n const baseObj = base as Record<string, unknown>;\n const patchObj = patch as Record<string, unknown>;\n const out: Record<string, unknown> = { ...baseObj };\n\n for (const [k, v] of Object.entries(patchObj)) {\n if (protectProto && FORBIDDEN_PROTO_KEYS.has(k)) continue;\n\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n // Recursive merge for nested plain objects.\n out[k] = deepMerge(existing, v, options);\n } else if (Array.isArray(v) && Array.isArray(existing)) {\n // Delegate to top-level array handling so arrayMode\n // (e.g. 'concat-primitives') applies to nested arrays too.\n // Fire debug hook when a non-primitive array replaces an existing\n // array (for non-primitive arrays, concat-primitives is a no-op and\n // the result is always a wholesale replacement).\n if (onNonPrimitiveArrayReplace && !isPrimitiveArray(v)) {\n onNonPrimitiveArrayReplace(k, existing.length, v.length);\n }\n out[k] = deepMerge(existing, v, options);\n } else if (v !== undefined) {\n // Fire debug hook when a non-primitive (object) array replaces an\n // existing value in concat-primitives mode.\n if (\n onNonPrimitiveArrayReplace &&\n Array.isArray(v) &&\n !isPrimitiveArray(v)\n ) {\n const existingLen = Array.isArray(existing) ? existing.length : 0;\n onNonPrimitiveArrayReplace(k, existingLen, v.length);\n }\n out[k] = v;\n }\n // When v === undefined, leave the existing value untouched\n // (this matches config-loader's behaviour: undefined in patch\n // means \"don't change this key\").\n }\n\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors, 0);\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Maximum nesting depth before the validator stops recursing and reports a\n * \"schema too deep\" error. Deeply nested input (e.g. batch_tool_use with 100\n * nested calls → tool_use → input) can otherwise hit `RangeError: Maximum\n * call stack size exceeded` and crash the tool executor.\n *\n * 64 is generous: real-world tool schemas rarely nest beyond 5-6 levels, and\n * even pathological inputs (deeply recursive JSON) stay well under this.\n * The limit is a safety net against unbounded recursion, not a tight bound.\n */\nconst MAX_SCHEMA_DEPTH = 64;\n\nfunction walk(\n value: unknown,\n schema: JSONSchema,\n path: string,\n errors: ValidationError[],\n depth: number,\n): void {\n // P2 #8 (before-release.md): cap recursion depth to prevent\n // `RangeError: Maximum call stack size exceeded` on deeply nested input.\n // Push a validation error and stop descending — the caller still gets a\n // usable (ok: false) result instead of a crash.\n if (depth > MAX_SCHEMA_DEPTH) {\n errors.push({\n path: path || '<root>',\n message: `schema nesting exceeds maximum depth (${MAX_SCHEMA_DEPTH})`,\n });\n return;\n }\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors, depth + 1);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n walk(value[i], schema.items as JSONSchema, `${path}[${i}]`, errors, depth + 1);\n }\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import { expectDefined } from './expect-defined.js';\nimport type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = expectDefined(messages[i]);\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","const GLOB_METACHARACTERS = /[*?[\\]]/g;\n\nexport function escapeGlobSubject(value: string): string {\n return value.replace(GLOB_METACHARACTERS, (char) => `\\\\${char}`);\n}\n\nexport function normalizePathSubject(value: string): string {\n return escapeGlobSubject(value.replace(/\\\\/g, '/'));\n}\n\nexport function isPathSubjectKey(subjectKey: string): boolean {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n}\n\nexport function subjectForToolInput(\n toolName: string,\n input: unknown,\n subjectKey?: string,\n): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n if (subjectKey) {\n const value = obj[subjectKey];\n if (typeof value === 'string') {\n return isPathSubjectKey(subjectKey) ? normalizePathSubject(value) : escapeGlobSubject(value);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlobSubject(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePathSubject(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlobSubject(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlobSubject(obj.name);\n }\n return undefined;\n}\n","import type { JSONSchema } from '../types/tool.js';\n\nexport interface ToolWireDefinitionLike {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}\n\nexport interface CompactToolDefinitionForWireOptions {\n /** Top-level tool description budget. */\n descriptionMaxChars?: number | undefined;\n /** Per-JSON-Schema `description` annotation budget. */\n schemaDescriptionMaxChars?: number | undefined;\n}\n\nexport interface CompactWireToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nconst TOOL_DESCRIPTION_MAX_CHARS = 640;\nconst SCHEMA_DESCRIPTION_MAX_CHARS = 180;\n\nconst compactCache = new WeakMap<object, CompactWireToolDefinition>();\n\n/**\n * Return the provider-wire version of a tool definition.\n *\n * Tool schemas remain structurally intact: validation keywords, property\n * names, required fields, enum values, and nested shapes are preserved. The\n * only reduction is on human prose annotations (`description`), which are the\n * largest repeated cost in provider tool declarations.\n */\nexport function compactToolDefinitionForWire(\n tool: ToolWireDefinitionLike,\n opts: CompactToolDefinitionForWireOptions = {},\n): CompactWireToolDefinition {\n const useDefaultOptions =\n opts.descriptionMaxChars === undefined && opts.schemaDescriptionMaxChars === undefined;\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n const cached = compactCache.get(tool);\n if (cached) return cached;\n }\n\n const compact: CompactWireToolDefinition = {\n name: tool.name,\n description: compactDescription(\n tool.description ?? '',\n opts.descriptionMaxChars ?? TOOL_DESCRIPTION_MAX_CHARS,\n ),\n inputSchema: compactSchemaDescriptions(\n tool.inputSchema,\n opts.schemaDescriptionMaxChars ?? SCHEMA_DESCRIPTION_MAX_CHARS,\n ),\n };\n\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n compactCache.set(tool, compact);\n }\n return compact;\n}\n\nexport function compactSchemaDescriptions(\n schema: unknown,\n maxDescriptionChars = SCHEMA_DESCRIPTION_MAX_CHARS,\n): Record<string, unknown> {\n const compact = compactSchemaNode(schema, maxDescriptionChars);\n return isRecord(compact) ? compact : { type: 'object', properties: {} };\n}\n\nfunction compactSchemaNode(node: unknown, maxDescriptionChars: number): unknown {\n if (Array.isArray(node)) {\n return node.map((item) => compactSchemaNode(item, maxDescriptionChars));\n }\n if (!isRecord(node)) return node;\n\n const out: JSONSchema = {};\n for (const [key, value] of Object.entries(node)) {\n if (key === 'description' && typeof value === 'string') {\n out[key] = compactDescription(value, maxDescriptionChars);\n } else {\n out[key] = compactSchemaNode(value, maxDescriptionChars);\n }\n }\n return out;\n}\n\nfunction compactDescription(text: string, maxChars: number): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxChars) return normalized;\n if (maxChars <= 20) return normalized.slice(0, maxChars);\n\n const hardLimit = maxChars - 12;\n const boundary = findSemanticBoundary(normalized, hardLimit);\n const head = normalized.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd();\n return `${head} ...`;\n}\n\nfunction findSemanticBoundary(text: string, limit: number): number {\n const punctuation = Math.max(\n text.lastIndexOf('. ', limit),\n text.lastIndexOf('; ', limit),\n text.lastIndexOf(': ', limit),\n );\n if (punctuation >= Math.floor(limit * 0.45)) return punctuation + 1;\n\n const comma = text.lastIndexOf(', ', limit);\n if (comma >= Math.floor(limit * 0.6)) return comma + 1;\n\n const space = text.lastIndexOf(' ', limit);\n return space >= Math.floor(limit * 0.6) ? space : limit;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { Message } from '../types/messages.js';\nimport { compactToolDefinitionForWire } from './tool-wire-compact.js';\n\n/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\ninterface CalState {\n ratio: number; // current calibration multiplier (actual / estimated)\n count: number; // number of samples recorded\n prevEst: number; // estimated tokens from the most recent estimateRequestTokens call\n}\n\n/** EWM α — higher = faster adaptation, more volatile. */\nconst CAL_ALPHA = 0.3;\n\n/**\n * Calibration is keyed so that, in a multi-agent / model-switching process,\n * each (provider, model) tokenizer gets its own ratio instead of all of them\n * collapsing onto one shared number. Callers that don't pass a key use the\n * shared `__global__` bucket — that preserves the original single-session\n * behavior and keeps all existing call sites working unchanged.\n */\nconst CALIBRATION_GLOBAL_KEY = '__global__';\nconst _cals = new Map<string, CalState>();\n\nfunction calState(key: string): CalState {\n let state = _cals.get(key);\n if (!state) {\n state = { ratio: 1.0, count: 0, prevEst: 0 };\n _cals.set(key, state);\n }\n return state;\n}\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\n\n/**\n * Fallback chars/token ratios per model family for providers that don't return\n * usage data. Used when `recordActualUsage` receives zero/negative tokens and\n * we have enough samples to trust the fallback. Keys are lowercase prefixes.\n */\nconst MODEL_FAMILY_RATIO: Record<string, number> = {\n // Anthropic: ~3.8-4.0 chars/token depending on model\n claude: 3.8,\n // OpenAI: ~4.0 chars/token\n 'gpt-4': 4.0,\n 'gpt-3.5': 4.0,\n // Google: ~3.5 chars/token\n gemini: 3.5,\n // DeepSeek: ~3.5 chars/token\n deepseek: 3.5,\n};\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n/** Insertion-order queue for O(1) LRU eviction: shift from front on overcapacity. */\nconst _estimateCacheOrder: string[] = [];\n\nconst ESTIMATE_CACHE_MAX_SIZE = 50_000;\n\nfunction getCachedEstimate(key: string, compute: (key: string) => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest half — O(1) per eviction (array shift + Map.delete) instead\n // of O(n) iteration over all 50 000 keys in the Map.\n while (ESTIMATE_CACHE.size > Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) {\n const oldest = _estimateCacheOrder.shift();\n if (oldest !== undefined) ESTIMATE_CACHE.delete(oldest);\n }\n }\n const estimate = compute(key);\n ESTIMATE_CACHE.set(key, estimate);\n _estimateCacheOrder.push(key);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n // JSON.stringify is called once to form the cache key; RoughTokenEstimate\n // is deferred only on cache miss (compute callback), not wrapped unnecessarily.\n return getCachedEstimate(JSON.stringify(input), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n return getCachedEstimate(JSON.stringify(content), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Compute and cache the token estimate for a single message. This is the\n * canonical per-message estimator — called once by ConversationState on\n * append/replace so the O(n·m) content-block walk happens at mutation time,\n * not on every context-pressure check.\n */\nexport function computeMessageTokens(msg: Message): number {\n if (typeof msg.content === 'string') return estimateTextTokens(msg.content);\n let total = 0;\n for (const b of msg.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n else total += RoughTokenEstimate(JSON.stringify(b));\n }\n return total;\n}\n\n/**\n * Estimate tokens for an array of messages (text + tool I/O), using the shared\n * 3.5 chars/token basis. This is the single canonical message-array estimator —\n * compactors, the context_manager tool, and the `/context` display all route\n * through it so the number a user sees matches the number compaction decides on.\n *\n * When a message carries a pre-computed `_estTokens` field (set by\n * ConversationState on append/replace), it is used directly instead of\n * re-walking the content blocks — turning the O(n·m) scan into an O(n)\n * sum for fully-cached arrays.\n */\nexport function estimateMessageTokens(messages: readonly Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m._estTokens === 'number' && m._estTokens > 0) {\n total += m._estTokens;\n continue;\n }\n total += computeMessageTokens(m);\n }\n return total;\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}): number {\n // Fast path: pre-computed by ToolRegistry at registration time.\n const cached = (tool as { _estDefTokens?: number | undefined })._estDefTokens;\n if (typeof cached === 'number' && cached > 0) return cached;\n\n const compact = compactToolDefinitionForWire(tool);\n return (\n RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(compact.description) +\n RoughTokenEstimate(JSON.stringify(compact.inputSchema))\n );\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n // Fast path: pre-computed per-message token estimate (set by\n // ConversationState on append/replace). Skips the O(m) content-block\n // walk entirely for cached messages.\n const cached = (m as { _estTokens?: number | undefined })._estTokens;\n if (typeof cached === 'number' && cached > 0) {\n messagesTokens += cached;\n continue;\n }\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string | undefined }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (\n typeof b === 'object' &&\n b !== null &&\n (b as { type?: string | undefined }).type === 'text'\n ) {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n calState(calibrationKey).prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to the keyed bucket's\n * `prevEst` for backward compatibility with callers that don't have the\n * pre-flight value. `calibrationKey` selects the per-(provider,model) bucket\n * (defaults to the shared global bucket).\n */\nexport function recordActualUsage(\n actualInputTokens: number,\n estimatedInputTokens?: number,\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): void {\n if (actualInputTokens <= 0) return;\n const cal = calState(calibrationKey);\n const est = estimatedInputTokens ?? cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (cal.count === 0) {\n cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n cal.ratio = CAL_ALPHA * sampleRatio + (1 - CAL_ALPHA) * cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n cal.ratio = Math.min(1.5, Math.max(0.5, cal.ratio));\n cal.count++;\n}\n\n/**\n * Returns the current calibration state for a bucket. Exposed for debugging\n * and tests — not needed by normal callers.\n */\nexport function getCalibrationState(calibrationKey: string = CALIBRATION_GLOBAL_KEY): {\n ratio: number;\n count: number;\n calibrated: boolean;\n} {\n const cal = calState(calibrationKey);\n return {\n ratio: cal.ratio,\n count: cal.count,\n calibrated: cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);\n const cal = calState(calibrationKey);\n\n if (cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n // No calibration samples yet — fall back to model-family ratio if available,\n // otherwise use the uncalibrated estimate (ratio = 1.0).\n const fallbackRatio = getModelFamilyRatio(calibrationKey);\n if (fallbackRatio !== null) {\n return {\n messages: Math.round(result.messages * fallbackRatio),\n systemPrompt: Math.round(result.systemPrompt * fallbackRatio),\n tools: Math.round(result.tools * fallbackRatio),\n total: Math.round(result.total * fallbackRatio),\n };\n }\n\n return result;\n}\n\n/** Look up the fallback chars/token ratio for a calibration key (e.g. \"provider/model\"). */\nfunction getModelFamilyRatio(calibrationKey: string): number | null {\n const lower = calibrationKey.toLowerCase();\n for (const [family, ratio] of Object.entries(MODEL_FAMILY_RATIO)) {\n if (lower.includes(family)) return ratio / 3.5; // MODEL_FAMILY_RATIO is chars/token, we need multiplier\n }\n return null;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites. With no argument it clears\n * every bucket (including the global one); pass a key to reset just that bucket.\n */\nexport function resetCalibration(calibrationKey?: string): void {\n if (calibrationKey === undefined) {\n _cals.clear();\n return;\n }\n _cals.delete(calibrationKey);\n}\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number | undefined;\n estimator?: ((text: string) => number) | undefined;\n}\n\nexport interface ToolOutputSerializeContext {\n toolName?: string | undefined;\n input?: unknown;\n /**\n * Optional reference to the Tool object. When present and the tool defines\n * a `serialize()` method, the serializer delegates to it instead of the\n * central `renderToolObject()` switch (P3 #21).\n */\n tool?: { serialize?: (output: unknown, input: unknown) => string } | undefined;\n}\n\ntype RecordValue = Record<string, unknown>;\n\nconst DEFAULT_LIST_LIMIT = 500;\nconst LOG_ENTRY_LIMIT = 200;\nconst INLINE_LIMIT = 240;\nconst GREP_FILE_LIMIT = 80;\nconst GREP_MATCHES_PER_FILE = 3;\nconst DIFF_INLINE_LINE_LIMIT = 260;\nconst DIFF_HUNK_LIMIT = 8;\nconst DIFF_HUNK_CONTEXT = 14;\n\n// Pre-compiled regex — used in parseGrepContentLine() for every grep match line.\n// Compiling once at module load avoids repeated RegExp construction overhead.\nconst GREP_LINE_RE = /^(.+?):(\\d+):(.*)$/;\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown, context: ToolOutputSerializeContext = {}): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map((item) => serialize(item)).join('\\n');\n // P3 #21 (before-release.md): prefer the tool's own serialize() method\n // when it defines one — lets tools own their output formatting without\n // adding a branch to the central renderToolObject() god function.\n if (context.tool?.serialize) {\n try {\n return context.tool.serialize(value, context.input);\n } catch {\n // Fall through to the central renderer if the tool's serializer\n // throws — never let a formatting error break the tool result.\n }\n }\n if (context.toolName) {\n const compact = renderToolObject(context.toolName, value as RecordValue, context.input);\n if (compact !== undefined) return compact;\n return renderGenericToolObject(context.toolName, value as RecordValue);\n }\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n\nfunction renderToolObject(toolName: string, obj: RecordValue, input: unknown): string | undefined {\n if (toolName === 'read' && typeof obj['text'] === 'string') {\n return joinSections([\n renderHeader(\n `read: ${stringFromInput(input, 'path') ?? stringField(obj, 'path') ?? '<unknown>'}`,\n {\n offset: numberFromInput(input, 'offset'),\n limit: numberFromInput(input, 'limit'),\n total_lines: obj['total_lines'],\n encoding: obj['encoding'],\n truncated: obj['truncated'],\n cached: obj['cached'],\n note: obj['note'],\n },\n ),\n obj['text'],\n ]);\n }\n\n if (toolName === 'grep' && Array.isArray(obj['matches'])) {\n const matches = stringArrayField(obj, 'matches');\n return joinSections([\n renderHeader(`grep: ${stringFromInput(input, 'pattern') ?? '<pattern>'}`, {\n path: stringFromInput(input, 'path'),\n glob: stringFromInput(input, 'glob'),\n mode: stringFromInput(input, 'output_mode'),\n count: obj['count'],\n shown: matches.length,\n truncated: obj['truncated'],\n used: obj['used'],\n }),\n renderGrepMatches(matches, stringFromInput(input, 'output_mode')),\n ]);\n }\n\n if (toolName === 'patch' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader('patch', {\n applied: obj['applied'],\n rejected: obj['rejected'],\n files: files.length,\n dry_run: obj['dry_run'],\n }),\n typeof obj['message'] === 'string' ? `message:\\n${obj['message']}` : undefined,\n files.length > 0 ? `files:\\n${renderStringList(files)}` : undefined,\n ]);\n }\n\n if (toolName === 'glob' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader(\n `${toolName}: ${stringFromInput(input, 'pattern') ?? stringFromInput(input, 'files') ?? stringFromInput(input, 'path') ?? ''}`.trim(),\n {\n path: stringFromInput(input, 'path'),\n files: files.length,\n truncated: obj['truncated'],\n },\n ),\n renderStringList(files, '(no files)'),\n ]);\n }\n\n if (toolName === 'tree' && typeof obj['tree'] === 'string') {\n return joinSections([\n renderHeader(\n `tree: ${stringField(obj, 'path') ?? stringFromInput(input, 'path') ?? '<cwd>'}`,\n {\n total_files: obj['total_files'],\n total_dirs: obj['total_dirs'],\n truncated: obj['truncated'],\n },\n ),\n obj['tree'],\n ]);\n }\n\n if (toolName === 'fetch' && typeof obj['content'] === 'string') {\n return joinSections([\n renderHeader(\n `fetch: ${stringField(obj, 'url') ?? stringFromInput(input, 'url') ?? '<url>'}`,\n {\n status: obj['status'],\n content_type: obj['content_type'],\n },\n ),\n obj['content'],\n ]);\n }\n\n if (toolName === 'replace' && Array.isArray(obj['results'])) {\n const results = obj['results'].filter(isRecord);\n const sections: Array<string | undefined> = [\n renderHeader('replace', {\n files_modified: obj['files_modified'],\n total_replacements: obj['total_replacements'],\n dry_run: obj['dry_run'],\n }),\n ];\n for (const r of results.slice(0, DEFAULT_LIST_LIMIT)) {\n sections.push(\n joinSections([\n renderHeader(`file: ${stringField(r, 'path') ?? '<unknown>'}`, {\n replacements: r['replacements'],\n }),\n typeof r['diff'] === 'string' ? r['diff'] : undefined,\n ]),\n );\n }\n if (results.length > DEFAULT_LIST_LIMIT) {\n sections.push(`[serializer omitted ${results.length - DEFAULT_LIST_LIMIT} result item(s)]`);\n }\n return joinSections(sections);\n }\n\n if (typeof obj['diff'] === 'string') {\n const diff = obj['diff'];\n return joinSections([\n renderHeader(toolName, {\n path: obj['path'],\n replacements: obj['replacements'],\n bytes_written: obj['bytes_written'],\n created: obj['created'],\n note: obj['note'],\n files: Array.isArray(obj['files']) ? obj['files'].length : undefined,\n truncated: obj['truncated'],\n mode: obj['mode'],\n }),\n compactDiff(diff),\n ]);\n }\n\n if (toolName === 'test' && typeof obj['output'] === 'string') {\n return renderTestOutput(obj, input);\n }\n\n if (\n (toolName === 'typecheck' || toolName === 'lint' || toolName === 'format') &&\n typeof obj['output'] === 'string'\n ) {\n return renderVerifierOutput(toolName, obj, input);\n }\n\n if (hasCommandOutputShape(obj)) {\n return renderCommandOutput(toolName, obj, input);\n }\n\n if (toolName === 'json' && typeof obj['formatted'] === 'string') {\n return joinSections([\n renderHeader('json', {\n type: obj['type'],\n keys: Array.isArray(obj['keys']) ? obj['keys'].length : undefined,\n query: stringFromInput(input, 'query'),\n error: obj['error'],\n }),\n obj['formatted'],\n ]);\n }\n\n if (toolName === 'logs' && Array.isArray(obj['entries'])) {\n const entries = obj['entries'].filter(isRecord);\n const lines = entries.slice(0, LOG_ENTRY_LIMIT).map((entry) => {\n const ts = stringField(entry, 'timestamp') ?? '';\n const level = stringField(entry, 'level') ?? 'info';\n const message = stringField(entry, 'message') ?? '';\n const source = stringField(entry, 'source');\n return [ts, level, source, message].filter(Boolean).join(' ');\n });\n if (entries.length > LOG_ENTRY_LIMIT) {\n lines.push(`[serializer omitted ${entries.length - LOG_ENTRY_LIMIT} log entry item(s)]`);\n }\n return joinSections([\n renderHeader(`logs: ${stringField(obj, 'source') ?? '<source>'}`, {\n total: obj['total'],\n shown: Math.min(entries.length, LOG_ENTRY_LIMIT),\n truncated: obj['truncated'],\n stream_mode: obj['stream_mode'],\n }),\n lines.length > 0 ? lines.join('\\n') : '(no log entries)',\n ]);\n }\n\n if (toolName === 'audit' && Array.isArray(obj['vulnerabilities'])) {\n const vulns = obj['vulnerabilities'].filter(isRecord);\n const lines = vulns.slice(0, DEFAULT_LIST_LIMIT).map((v) => {\n const severity = stringField(v, 'severity') ?? 'unknown';\n const pkg = stringField(v, 'package') ?? '<package>';\n const title = stringField(v, 'title') ?? '';\n const url = stringField(v, 'url');\n return [severity, pkg, title, url].filter(Boolean).join(' | ');\n });\n if (vulns.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${vulns.length - DEFAULT_LIST_LIMIT} vulnerability item(s)]`);\n }\n return joinSections([\n renderHeader('audit', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n summary: obj['summary'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n if (toolName === 'outdated' && Array.isArray(obj['packages'])) {\n const packages = obj['packages'].filter(isRecord);\n const lines = packages\n .slice(0, DEFAULT_LIST_LIMIT)\n .map((p) =>\n [\n stringField(p, 'name') ?? '<package>',\n `current=${stringField(p, 'current') ?? 'unknown'}`,\n `wanted=${stringField(p, 'wanted') ?? 'unknown'}`,\n `latest=${stringField(p, 'latest') ?? 'unknown'}`,\n stringField(p, 'type'),\n ]\n .filter(Boolean)\n .join(' | '),\n );\n if (packages.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${packages.length - DEFAULT_LIST_LIMIT} package item(s)]`);\n }\n return joinSections([\n renderHeader('outdated', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n return undefined;\n}\n\nfunction renderTestOutput(obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const failed = numberField(obj, 'failed') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const header = renderHeader(`test: ${stringField(obj, 'runner') ?? 'runner'}`, {\n exit_code: obj['exit_code'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n grep: stringFromInput(input, 'grep'),\n });\n\n if (exitCode === 0 && failed === 0) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n `status=passed`,\n `tests_run=${obj['tests_run'] ?? 0}`,\n `passed=${obj['passed'] ?? 0}`,\n `failed=${obj['failed'] ?? 0}`,\n `duration_ms=${obj['duration_ms'] ?? 0}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no runner output)')}`,\n ]);\n}\n\nfunction renderVerifierOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const errors = numberField(obj, 'errors') ?? 0;\n const warnings = numberField(obj, 'warnings') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const changed = numberField(obj, 'files_changed') ?? 0;\n const header = renderHeader(toolName, {\n exit_code: obj['exit_code'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n fixer: obj['fixer'],\n linter: obj['linter'],\n project: obj['project'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n cwd: stringFromInput(input, 'cwd'),\n });\n\n if (exitCode === 0 && errors === 0 && (toolName !== 'format' || changed === 0)) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=passed',\n `errors=${errors}`,\n `warnings=${warnings}`,\n toolName === 'format' ? `files_changed=${changed}` : undefined,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n if (exitCode === 0 && toolName === 'format') {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=changed',\n `files_changed=${changed}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no verifier output)')}`,\n ]);\n}\n\nfunction renderGrepMatches(matches: string[], mode: string | undefined): string {\n if (matches.length === 0) return '(no matches)';\n if (mode === 'files_with_matches') return renderStringList(matches, '(no files)');\n if (mode === 'count') return renderStringList(matches, '(no counts)');\n\n const groups = new Map<string, string[]>();\n const passthrough: string[] = [];\n for (const match of matches) {\n const parsed = parseGrepContentLine(match);\n if (!parsed) {\n passthrough.push(match);\n continue;\n }\n const list = groups.get(parsed.file) ?? [];\n list.push(`${parsed.line}:${parsed.text}`);\n groups.set(parsed.file, list);\n }\n\n if (groups.size === 0) return renderStringList(matches, '(no matches)');\n\n const sections: string[] = [];\n let fileIndex = 0;\n for (const [file, lines] of groups) {\n fileIndex++;\n if (fileIndex > GREP_FILE_LIMIT) break;\n const shown = lines.slice(0, GREP_MATCHES_PER_FILE);\n sections.push(\n `${file} (${lines.length} match(es), showing ${shown.length})\\n${shown.join('\\n')}`,\n );\n }\n if (groups.size > GREP_FILE_LIMIT) {\n sections.push(`[serializer omitted ${groups.size - GREP_FILE_LIMIT} file group(s)]`);\n }\n if (passthrough.length > 0) {\n sections.push(`ungrouped:\\n${renderStringList(passthrough, '', 50)}`);\n }\n return sections.join('\\n');\n}\n\nfunction parseGrepContentLine(\n line: string,\n): { file: string; line: string; text: string } | undefined {\n const match = GREP_LINE_RE.exec(line);\n if (!match?.[1] || !match[2]) return undefined;\n return { file: match[1], line: match[2], text: match[3] ?? '' };\n}\n\nfunction compactDiff(diff: string): string {\n const lines = diff.split(/\\r?\\n/);\n if (lines.length <= DIFF_INLINE_LINE_LIMIT) return diff;\n\n const fileCount = Math.max(\n new Set(\n lines\n .map(\n (line) => /^diff --git\\s+a\\/(.+?)\\s+b\\//.exec(line)?.[1] ?? /^---\\s+(.+)/.exec(line)?.[1],\n )\n .filter(Boolean),\n ).size,\n 0,\n );\n const hunks = lines.filter((line) => line.startsWith('@@')).length;\n const added = lines.filter((line) => line.startsWith('+') && !line.startsWith('+++')).length;\n const removed = lines.filter((line) => line.startsWith('-') && !line.startsWith('---')).length;\n\n // Collect [start, end] intervals as we scan lines sequentially.\n // Intervals are naturally ordered by line index — no sort needed.\n const intervals: Array<[number, number]> = [];\n let hunkCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.startsWith('diff --git') || line.startsWith('--- ') || line.startsWith('+++ ')) {\n intervals.push([i, i]);\n continue;\n }\n if (!line.startsWith('@@')) continue;\n if (hunkCount >= DIFF_HUNK_LIMIT) continue;\n hunkCount++;\n intervals.push([i, Math.min(lines.length - 1, i + DIFF_HUNK_CONTEXT)]);\n }\n\n if (intervals.length === 0) {\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n added,\n removed,\n lines: lines.length,\n }),\n lines.slice(0, DIFF_INLINE_LINE_LIMIT).join('\\n'),\n `[serializer omitted ${Math.max(0, lines.length - DIFF_INLINE_LINE_LIMIT)} diff line(s)]`,\n ]);\n }\n\n // Merge overlapping / adjacent intervals in a single O(n) pass.\n // Intervals are already in ascending order from the sequential scan.\n const merged: Array<[number, number]> = [intervals[0]!];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1]!;\n const current = intervals[i]!;\n if (current[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], current[1]);\n } else {\n merged.push(current);\n }\n }\n\n // Build excerpt from merged intervals — O(n), no sort.\n const excerpt: string[] = [];\n let prevLine = -1;\n for (const [start, end] of merged) {\n if (start > prevLine + 1) {\n const omitted = prevLine === -1 ? start : start - prevLine - 1;\n excerpt.push(`[serializer omitted ${omitted} diff line(s)]`);\n }\n for (let j = start; j <= end; j++) {\n excerpt.push(lines[j] ?? '');\n }\n prevLine = end;\n }\n\n const trailing = lines.length - prevLine - 1;\n if (trailing > 0) excerpt.push(`[serializer omitted ${trailing} trailing diff line(s)]`);\n\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n shown_hunks: Math.min(hunks, DIFF_HUNK_LIMIT),\n added,\n removed,\n lines: lines.length,\n }),\n excerpt.join('\\n'),\n ]);\n}\n\nfunction compactFailureOutput(output: string): string {\n const lines = output.split(/\\r?\\n/);\n if (lines.length <= 260) return output.trimEnd();\n\n const selected = new Set<number>();\n const marker =\n /\\b(fail|failed|failure|error|exception|assertionerror|expected|received|actual|timeout|stack)\\b/i;\n let markerHits = 0;\n for (let i = 0; i < lines.length; i++) {\n if (!marker.test(lines[i] ?? '')) continue;\n markerHits++;\n for (let j = Math.max(0, i - 4); j <= Math.min(lines.length - 1, i + 10); j++) {\n selected.add(j);\n }\n }\n\n if (markerHits === 0) {\n return lines.slice(-220).join('\\n').trimEnd();\n }\n\n const ordered = [...selected].sort((a, b) => a - b);\n const out: string[] = [];\n let previous = -1;\n for (const index of ordered) {\n if (index > previous + 1) {\n const omitted = previous === -1 ? index : index - previous - 1;\n out.push(`[serializer omitted ${omitted} line(s)]`);\n }\n out.push(lines[index] ?? '');\n previous = index;\n }\n return out.join('\\n').trimEnd();\n}\n\nfunction extractSpoolNote(output: string): string | undefined {\n return output\n .split(/\\r?\\n/)\n .find((line) => line.startsWith('[output truncated') && line.includes('full'));\n}\n\nfunction hasCommandOutputShape(obj: RecordValue): boolean {\n return (\n typeof obj['stdout'] === 'string' ||\n typeof obj['stderr'] === 'string' ||\n typeof obj['output'] === 'string' ||\n typeof obj['exitCode'] === 'number' ||\n typeof obj['exit_code'] === 'number'\n );\n}\n\nfunction renderCommandOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const command = stringField(obj, 'command') ?? stringFromInput(input, 'command');\n const args = stringArrayField(obj, 'args');\n const commandLine = command ? [command, ...args].join(' ') : undefined;\n const output = stringField(obj, 'output');\n const stdout = stringField(obj, 'stdout');\n const stderr = stringField(obj, 'stderr');\n return joinSections([\n renderHeader(commandLine ? `${toolName}: ${commandLine}` : toolName, {\n exit_code: obj['exit_code'] ?? obj['exitCode'],\n timed_out: obj['timed_out'],\n pid: obj['pid'],\n allowed: obj['allowed'],\n truncated: obj['truncated'],\n runner: obj['runner'],\n linter: obj['linter'],\n fixer: obj['fixer'],\n project: obj['project'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n }),\n stringField(obj, 'error') ? `error:\\n${stringField(obj, 'error')}` : undefined,\n output ? `output:\\n${output}` : undefined,\n stdout ? `stdout:\\n${stdout}` : undefined,\n stderr ? `stderr:\\n${stderr}` : undefined,\n ]);\n}\n\nfunction renderGenericToolObject(toolName: string, obj: RecordValue): string {\n const scalars: RecordValue = {};\n const blocks: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n if (isScalar(value)) {\n const inline = String(value);\n if (inline.length <= INLINE_LIMIT && !inline.includes('\\n')) {\n scalars[key] = value;\n } else {\n blocks.push(`${key}:\\n${inline}`);\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === 'string')) {\n blocks.push(`${key}:\\n${renderStringList(value as string[])}`);\n } else {\n blocks.push(`${key}:\\n${renderUnknownList(value)}`);\n }\n continue;\n }\n blocks.push(`${key}: ${clipInline(oneLineJson(value))}`);\n }\n return joinSections([renderHeader(toolName, scalars), ...blocks]);\n}\n\nfunction renderHeader(label: string, fields: RecordValue): string {\n const parts = Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${clipInline(formatInlineValue(value))}`);\n return parts.length > 0 ? `${label} (${parts.join(' ')})` : label;\n}\n\nfunction renderStringList(items: string[], empty = '', limit = DEFAULT_LIST_LIMIT): string {\n if (items.length === 0) return empty;\n const shown = items.slice(0, limit);\n const omitted = items.length - shown.length;\n return [\n ...shown,\n ...(omitted > 0\n ? [`[serializer omitted ${omitted} item(s); narrow the request for more]`]\n : []),\n ].join('\\n');\n}\n\nfunction renderUnknownList(items: unknown[], limit = DEFAULT_LIST_LIMIT): string {\n const shown = items.slice(0, limit).map((item) => clipInline(oneLineJson(item), 1_000));\n const omitted = items.length - shown.length;\n if (omitted > 0)\n shown.push(`[serializer omitted ${omitted} item(s); narrow the request for more]`);\n return shown.join('\\n');\n}\n\nfunction joinSections(sections: Array<string | undefined>): string {\n return sections\n .map((section) => (typeof section === 'string' ? section.trimEnd() : undefined))\n .filter((section): section is string => !!section)\n .join('\\n');\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(formatInlineValue).join(',')}]`;\n if (isScalar(value)) return String(value);\n return oneLineJson(value);\n}\n\nfunction clipInline(value: string, max = INLINE_LIMIT): string {\n const compact = value.replace(/\\s+/g, ' ').trim();\n return compact.length <= max\n ? compact\n : `${compact.slice(0, max - 15)}...(${compact.length} chars)`;\n}\n\nfunction oneLineJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction stringField(obj: RecordValue, key: string): string | undefined {\n const value = obj[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberField(obj: RecordValue, key: string): number | undefined {\n const value = obj[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction stringArrayField(obj: RecordValue, key: string): string[] {\n const value = obj[key];\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction stringFromInput(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberFromInput(input: unknown, key: string): number | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction inputListSummary(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) return value.filter((item) => typeof item === 'string').join(',');\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is RecordValue {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean | null {\n return value === null || ['string', 'number', 'boolean'].includes(typeof value);\n}\n\n/**\n * Render a tool result body for inclusion in the `tool.executed` event.\n * Tool outputs can be large (file dumps, command output); UIs only want a\n * preview line, so cap at ~400 chars with an ellipsis marker.\n */\nexport function truncateForEvent(content: string, max = 400): string {\n if (!content) return '';\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\n}\n\n/**\n * Derive size signals (bytes / tokens / lines) for the chip rendered beside\n * each tool result. Computed once over the FULL `content` BEFORE the\n * 400-char event preview is taken.\n *\n * - bytes: UTF-8 byte length (multi-byte aware).\n * - tokens: standard ~3.5 chars/token heuristic.\n * - lines: read prefixes lines with `<n>→`; for shell/grep/logs we fall\n * back to a newline count. Undefined for tools without a line notion.\n */\nconst READ_LINE_PREFIX_RE = /^\\s*\\d+→/gm;\n\nexport function sizeSignals(\n toolName: string | undefined,\n content: string,\n): { outputBytes: number; outputTokens: number; outputLines: number | undefined } {\n if (!content || content.length === 0) {\n return { outputBytes: 0, outputTokens: 0, outputLines: undefined };\n }\n const outputBytes = Buffer.byteLength(content, 'utf8');\n const outputTokens = Math.max(1, Math.round(outputBytes / 3.5));\n let outputLines: number | undefined;\n if (toolName === 'read') {\n READ_LINE_PREFIX_RE.lastIndex = 0;\n let count = 0;\n while (READ_LINE_PREFIX_RE.exec(content) !== null) count++;\n if (count > 0) outputLines = count;\n } else if (\n toolName === 'bash' ||\n toolName === 'shell' ||\n toolName === 'grep' ||\n toolName === 'logs'\n ) {\n let nl = 0;\n for (let i = 0; i < content.length; i++) if (content.charCodeAt(i) === 10) nl++;\n outputLines = nl + (content.endsWith('\\n') ? 0 : 1);\n }\n return { outputBytes, outputTokens, outputLines };\n}\n","import type {\n ToolResultRenderMode,\n ToolResultRenderModeConfig,\n} from '../types/config.js';\nimport type { Tool } from '../types/tool.js';\n\nexport const DEFAULT_TOOL_RESULT_RENDER_MODE: ToolResultRenderMode = 'extend';\n\n/**\n * Normalize a raw value to a {@link ToolResultRenderMode}. Accepts the\n * canonical strings (`'extend' | 'simple'`) plus a few synonyms so the\n * slash command feels forgiving (`extended`/`full` → `extend`,\n * `short`/`brief` → `simple`). Returns `undefined` for anything else so\n * the caller can reject unknown input without throwing.\n */\nexport function normalizeToolResultRenderMode(value: unknown): ToolResultRenderMode | undefined {\n if (typeof value !== 'string') return undefined;\n const raw = value.trim().toLowerCase();\n if (raw === 'extend' || raw === 'extended' || raw === 'full') return 'extend';\n if (raw === 'simple' || raw === 'short' || raw === 'brief') return 'simple';\n return undefined;\n}\n\n/**\n * Look up the result-render mode for `toolName` from a config map. Falls\n * back to the default `'extend'` when the map is missing the entry.\n */\nexport function resolveToolResultRenderMode(\n modes: ToolResultRenderModeConfig | undefined,\n toolName: string,\n): ToolResultRenderMode {\n return normalizeToolResultRenderMode(modes?.[toolName]) ?? DEFAULT_TOOL_RESULT_RENDER_MODE;\n}\n\n/**\n * Subset of {@link import('../registry/tool-registry.js').ToolRegistry}\n * the result-render-mode setters need. Decouples this module from the\n * concrete registry class so it can be reused by tests and by tools\n * that wrap their own registry.\n */\nexport interface ToolResultRenderModeRegistryLike {\n get(name: string): Tool | undefined;\n setResultRenderMode?(name: string, mode: ToolResultRenderMode): boolean;\n applyResultRenderModes?(\n modes?: ToolResultRenderModeConfig,\n ): { applied: number; missing: string[] };\n getResultRenderMode?(name: string): ToolResultRenderMode;\n}\n\n/**\n * Set a single tool's result-render mode on a registry. Prefers the\n * registry's native accessor (so it can update any internal state, e.g.\n * usage caches); falls back to a no-op so callers stay decoupled from\n * the registry implementation.\n */\nexport function setToolResultRenderMode(\n registry: ToolResultRenderModeRegistryLike,\n name: string,\n mode: ToolResultRenderMode,\n): boolean {\n if (typeof registry.setResultRenderMode === 'function') {\n return registry.setResultRenderMode(name, mode);\n }\n return false;\n}\n\n/**\n * Look up the current result-render mode for a single tool. Returns the\n * registry's view if it has one, otherwise the default. This is what the\n * tool-executor calls on each tool invocation to decide whether the next\n * `writeToolResult` should be `simple` or `extend`.\n */\nexport function getToolResultRenderMode(\n registry: ToolResultRenderModeRegistryLike,\n name: string,\n): ToolResultRenderMode {\n return registry.getResultRenderMode?.(name) ?? DEFAULT_TOOL_RESULT_RENDER_MODE;\n}\n\n/**\n * Bulk-apply a config map (`tools.resultRenderMode`) to a registry.\n * Mirrors {@link import('./tool-description-mode.js').applyToolDescriptionModes}\n * for symmetry with the LLM-side description mode.\n */\nexport function applyToolResultRenderModes(\n registry: ToolResultRenderModeRegistryLike,\n modes?: ToolResultRenderModeConfig,\n): { applied: number; missing: string[] } {\n if (typeof registry.applyResultRenderModes === 'function') {\n return registry.applyResultRenderModes(modes);\n }\n\n const entries = Object.entries(modes ?? {});\n const missing: string[] = [];\n let applied = 0;\n for (const [name, rawMode] of entries) {\n const mode = normalizeToolResultRenderMode(rawMode);\n if (!mode) continue;\n if (setToolResultRenderMode(registry, name, mode)) applied++;\n else missing.push(name);\n }\n return { applied, missing };\n}","import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/design-kits — user-global Design Studio kits. */\n globalDesignKits: string;\n /** ~/.wrongstack/prompts — user-global prompt library. */\n globalPrompts: string;\n /** ~/.wrongstack/instructions — user-global system instruction overrides. */\n globalInstructions: string;\n /** ~/.wrongstack/prompt-usage.json — per-slug insert counts (recent/popular). */\n promptUsage: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/cache/models-overlay.json — cached curated overlay. */\n modelsOverlayCache: string;\n /**\n * Per-project codebase symbol index (SQLite). Lives under the global project\n * dir — NOT inside the repo — so it never clutters the working tree or needs\n * gitignoring. `~/.wrongstack/projects/<hash>/codebase-index`.\n */\n projectCodebaseIndex: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/config.json — per-project settings (safe fields only).\n * This lives inside the project root so it can be gitignored or shared. */\n inProjectConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** <project>/.wrongstack/prompts — committed project prompt library. */\n inProjectPrompts: string;\n /** <project>/.wrongstack/instructions — committed project instruction overrides. */\n inProjectInstructions: string;\n /** <project>/.wrongstack/design-kits — committed project Design Studio kits. */\n inProjectDesignKits: string;\n /** <project>/.wrongstack/worktrees — git worktrees for per-phase isolation (gitignored). */\n inProjectWorktrees: string;\n /** Stable hash for the project root. */\n projectHash: string;\n /** Human-readable project slug: `wrongstack-a1b2c3` instead of `3024e5e6fa58`. */\n projectSlug: string;\n /** ~/.wrongstack/projects/<hash>/goal.json — goal persistence */\n projectGoal: string;\n /** ~/.wrongstack/projects/<hash>/specs — SDD spec files */\n projectSpecs: string;\n /** ~/.wrongstack/projects/<hash>/task-graphs — SDD task graphs */\n projectTaskGraphs: string;\n /** ~/.wrongstack/projects/<hash>/sdd-session.json — SDD session state */\n projectSddSession: string;\n /** ~/.wrongstack/projects/<hash>/plan.json — plan persistence */\n projectPlan: string;\n /** ~/.wrongstack/projects/<hash>/autophase — AutoPhase phase-graph JSON files */\n projectAutophase: string;\n /** ~/.wrongstack/projects/<hash>/sdd-boards — live SDD board snapshots + JSONL event logs */\n projectSddBoards: string;\n /** ~/.wrongstack/sync.json — CloudSync configuration */\n syncConfig: string;\n /** Function to get the status.json path for a project given its hash. */\n projectStatus: (projectHash: string) => string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\n/**\n * Human-readable project directory name: slugified folder name + short hash\n * suffix for uniqueness. e.g. `wrongstack-a1b2c3` instead of `3024e5e6fa58`.\n */\nexport function projectSlug(absRoot: string): string {\n const base = slugify(path.basename(absRoot));\n const hash = createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\n/** Turn a folder name into a filesystem-safe lowercase slug. */\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n // Collapse any run of non-alphanumeric chars into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'project'\n );\n}\n\nexport interface WstackPathOptions {\n userHome?: string | undefined;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string | undefined;\n}\n\n/**\n * The global `~/.wrongstack` root, honoring the `WRONGSTACK_HOME` env\n * override. The override exists so tests (and sandboxed runs) can redirect\n * ALL global state — config, secrets, logs, projects/, mailboxes — away from\n * the real user home. Before it existed, `pnpm test` booted runtimes against\n * the real `~/.wrongstack`: it read the user's real config.json (starting a\n * second live Telegram poller), appended to the real wrongstack.log, and left\n * ~20k orphaned fixture dirs under projects/.\n *\n * Every code path that wants the global dir must come through here (or\n * through `resolveWstackPaths`) instead of `path.join(os.homedir(), '.wrongstack')`.\n */\nexport function wstackGlobalRoot(): string {\n const fromEnv = process.env['WRONGSTACK_HOME'];\n if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);\n return path.join(os.homedir(), '.wrongstack');\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n // Precedence: explicit globalRoot > explicit userHome (callers/tests that\n // pass one expect paths under it) > WRONGSTACK_HOME env > real home dir.\n const globalRoot =\n opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, '.wrongstack') : wstackGlobalRoot());\n const hash = projectHash(opts.projectRoot);\n const slug = projectSlug(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', slug);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n globalDesignKits: path.join(globalRoot, 'design-kits'),\n globalPrompts: path.join(globalRoot, 'prompts'),\n globalInstructions: path.join(globalRoot, 'instructions'),\n promptUsage: path.join(globalRoot, 'prompt-usage.json'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n modelsOverlayCache: path.join(globalRoot, 'cache', 'models-overlay.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectCodebaseIndex: path.join(projectDir, 'codebase-index'),\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectConfig: path.join(opts.projectRoot, '.wrongstack', 'config.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n inProjectPrompts: path.join(opts.projectRoot, '.wrongstack', 'prompts'),\n inProjectInstructions: path.join(opts.projectRoot, '.wrongstack', 'instructions'),\n inProjectDesignKits: path.join(opts.projectRoot, '.wrongstack', 'design-kits'),\n inProjectWorktrees: path.join(opts.projectRoot, '.wrongstack', 'worktrees'),\n projectHash: hash,\n projectSlug: slug,\n projectGoal: path.join(projectDir, 'goal.json'),\n projectSpecs: path.join(projectDir, 'specs'),\n projectTaskGraphs: path.join(projectDir, 'task-graphs'),\n projectSddSession: path.join(projectDir, 'sdd-session.json'),\n projectPlan: path.join(projectDir, 'plan.json'),\n projectAutophase: path.join(projectDir, 'autophase'),\n projectSddBoards: path.join(projectDir, 'sdd-boards'),\n syncConfig: path.join(globalRoot, 'sync.json'),\n projectStatus: (projectHash: string) => path.join(globalRoot, 'projects', projectHash, 'status.json'),\n };\n}\n","import { toErrorMessage } from '../utils/index.js';\n\n/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * SDD (Spec-Driven Development) errors — spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error — thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 → transient, 404 → not_found, 401 → permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error — thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\nimport { truncate } from '../utils/string.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type CacheTtl = '5m' | '1h';\n\n/**\n * Provider-agnostic response-format directive.\n *\n * - `{ type: 'text' }` — free-form text (default).\n * - `{ type: 'json_object' }` — valid JSON without a schema constraint.\n * - `{ type: 'json_schema', jsonSchema: { name, schema, strict? } }` — JSON\n * constrained to the supplied JSON Schema. The `strict` flag is\n * OpenAI-specific; Gemini ignores it in favour of `responseMimeType`.\n *\n * Each provider adapter maps this into its own wire format:\n * OpenAI → `response_format`\n * Gemini → `responseMimeType` + `responseSchema`\n * Anthropic → (not yet supported; uses tools for structured output)\n */\nexport interface JsonSchemaSpec {\n name: string;\n /** OpenAI-specific: enable strict schema adherence. */\n strict?: boolean | undefined;\n /** The JSON Schema object describing the expected shape. */\n schema: Record<string, unknown>;\n /** Optional human-readable description (OpenAI). */\n description?: string | undefined;\n}\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; jsonSchema: JsonSchemaSpec };\n\n/**\n * Safety category threshold pair used by Google Gemini's `safetySettings`.\n *\n * Categories: `HARM_CATEGORY_HARASSMENT`, `HARM_CATEGORY_HATE_SPEECH`,\n * `HARM_CATEGORY_SEXUALLY_EXPLICIT`, `HARM_CATEGORY_DANGEROUS_CONTENT`.\n *\n * Thresholds: `BLOCK_NONE`, `BLOCK_ONLY_HIGH`, `BLOCK_MEDIUM_AND_ABOVE`,\n * `BLOCK_LOW_AND_ABOVE`.\n */\nexport interface SafetySetting {\n category: string;\n threshold: string;\n}\n\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number | undefined;\n /** Back-compat aggregate of all cache-write tokens. Prefer TTL-specific fields when present. */\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nexport interface ReasoningRequest {\n enabled?: boolean | undefined;\n effort?: ReasoningEffort | undefined;\n preserve?: boolean | undefined;\n display?: 'summarized' | 'omitted' | undefined;\n}\n\nexport interface RequestCacheControl {\n ttl?: CacheTtl | undefined;\n}\n\nexport interface ReasoningConfig {\n default: 'enabled' | 'disabled' | 'adaptive' | 'always_on';\n disableSupported: boolean;\n effortSupported: boolean;\n effortLevels: ReasoningEffort[];\n preserveThinking: 'unsupported' | 'optional' | 'always_on';\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n reasoning: boolean;\n maxContext: number;\n /**\n * Maximum output tokens the model can produce in a single response.\n * Used as the default for `Request.maxTokens` when the caller doesn't\n * supply an explicit value — letting subagents run up to the model's\n * native ceiling instead of a fixed 8192 cap. Omit (undefined) to fall\n * back to a conservative default; populate per family in\n * `family-capabilities.ts` once you know the spec.\n */\n maxOutput?: number | undefined;\n cacheControl: 'native' | 'auto' | 'none';\n\n // ── Extended parameter support (optional; family defaults in CAPABILITIES_BY_FAMILY) ──\n\n /** Model accepts `top_k` / `topK` sampling parameter. */\n topK?: boolean | undefined;\n /** Model accepts `frequency_penalty` / `frequencyPenalty` parameter. */\n frequencyPenalty?: boolean | undefined;\n /** Model accepts `presence_penalty` / `presencePenalty` parameter. */\n presencePenalty?: boolean | undefined;\n /** Model accepts `seed` parameter for deterministic generation. */\n seed?: boolean | undefined;\n /**\n * Model accepts JSON Schema / structured-output constraints\n * (OpenAI `response_format.json_schema`, Gemini `responseMimeType`+`responseSchema`).\n * Distinct from `jsonMode` (which is just a system-prompt hint).\n */\n structuredOutput?: boolean | undefined;\n /** Model supports log-probability output (`logprobs`, `top_logprobs`). */\n logprobs?: boolean | undefined;\n /** Model supports audio input/output modality. */\n audio?: boolean | undefined;\n /** Model supports the `n` parameter for multiple completions. */\n multipleCompletions?: boolean | undefined;\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[] | undefined;\n messages: Message[];\n tools?: Tool[] | undefined;\n /**\n * Cap on output tokens for this single response. Optional — when\n * omitted, the provider adapter falls back to its own\n * `capabilities.maxOutput` (which the catalog populates from\n * `ModelsDevModel.limit.output`). If neither is available, the\n * adapter applies a conservative 8192 safety net. Letting this stay\n * undefined at the call site means callers like Chimera can hand the\n * model its native output ceiling without hard-coding a number.\n */\n maxTokens?: number | undefined;\n temperature?: number | undefined;\n topP?: number | undefined;\n topK?: number | undefined;\n frequencyPenalty?: number | undefined;\n presencePenalty?: number | undefined;\n seed?: number | undefined;\n /**\n * End-user identifier for abuse monitoring and per-user rate limiting.\n * - Anthropic → `metadata.user_id`\n * - OpenAI → `user`\n * - Gemini → (not supported)\n */\n user?: string | undefined;\n /**\n * Number of response candidates to generate. Google Gemini supports\n * this via `generationConfig.candidateCount`. OpenAI does not have\n * an equivalent (`n` is conceptually similar but distinct).\n */\n candidateCount?: number | undefined;\n /**\n * Whether to return log probabilities for output tokens.\n * - OpenAI → `logprobs: boolean` (+ `topLogprobs: number`)\n * - Gemini → `generationConfig.logprobs: number` (how many top candidates)\n * Default undefined = no logprobs requested.\n */\n logprobs?: boolean | undefined;\n /**\n * Number of most probable tokens to return log probabilities for\n * (OpenAI `top_logprobs`). Only meaningful when `logprobs` is true.\n * Range: 0-20. Gemini ignores this (uses `logprobs` as the count).\n */\n topLogprobs?: number | undefined;\n stopSequences?: string[] | undefined;\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool' | undefined; name: string };\n reasoning?: ReasoningRequest | undefined;\n cache?: RequestCacheControl | undefined;\n /**\n * Structured-output / response-format directive.\n * When set, the provider adapter maps this to its native response-format\n * parameter (OpenAI `response_format`, Gemini `responseMimeType`, etc.).\n * The model must advertise `capabilities.structuredOutput` for this to be\n * honoured; unsupported models will likely 400 or ignore it.\n */\n responseFormat?: ResponseFormat | undefined;\n /**\n * Safety category thresholds for filtering harmful content.\n * - Gemini → top-level `safetySettings` array with `{ category, threshold }`\n * - OpenAI → not supported (uses server-side moderation)\n * - Anthropic → not supported\n */\n safetySettings?: SafetySetting[] | undefined;\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string | undefined;\n name?: string | undefined;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string | undefined;\n /** Human-readable explanation from the provider. */\n message?: string | undefined;\n /** Provider request id, when present in the body or headers. */\n requestId?: string | undefined;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number | undefined;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string | undefined;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean | undefined;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number | undefined;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody | undefined;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody | undefined; cause?: unknown | undefined } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\n/**\n * Thrown when the provider stream stops delivering data mid-response.\n * This is distinct from a network error (TCP reset, DNS failure) — the\n * connection is established and the response started, but chunks stopped\n * arriving before the stream completed.\n *\n * Status 599 is used as a sentinel to distinguish stream hangs from\n * regular HTTP errors while still flowing through ProviderError-based\n * retry and fallback infrastructure.\n */\nexport class StreamHangError extends ProviderError {\n /** Name of the provider that hung, e.g. \"zai\", \"anthropic\". */\n public readonly hungProviderId: string;\n /** Model that was being called when the hang occurred. */\n public readonly hungModel: string;\n /** How long (ms) we waited for the next chunk before declaring a hang. */\n public readonly hangTimeoutMs: number;\n /** How many bytes were received before the hang. */\n public readonly bytesReceived: number;\n /** Elapsed time (ms) from the start of the stream until the hang. */\n public readonly elapsedMs: number;\n\n constructor(opts: {\n providerId: string;\n model: string;\n hangTimeoutMs: number;\n bytesReceived: number;\n elapsedMs: number;\n cause?: unknown | undefined;\n }) {\n super(\n `Stream hang: ${opts.providerId}/${opts.model} — no data for ${opts.hangTimeoutMs}ms after ${opts.bytesReceived} bytes (${opts.elapsedMs}ms elapsed)`,\n 599,\n true, // always retryable\n opts.providerId,\n {\n body: {\n message: `Stream stalled after ${opts.elapsedMs}ms, ${opts.bytesReceived} bytes received`,\n },\n cause: opts.cause,\n },\n );\n this.name = 'StreamHangError';\n this.hungProviderId = opts.providerId;\n this.hungModel = opts.model;\n this.hangTimeoutMs = opts.hangTimeoutMs;\n this.bytesReceived = opts.bytesReceived;\n this.elapsedMs = opts.elapsedMs;\n }\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","import type { ContextWindowModeId } from './context-window.js';\nimport type { HookEvent, ShellHook } from './hooks.js';\nimport type { WireFamily } from './models-registry.js';\nimport type { CacheTtl, Capabilities, ReasoningEffort } from './provider.js';\nimport type { Permission } from './tool.js';\n\n/**\n * Runtime reasoning controls the user can set per-session/project. Mapped into\n * the provider `Request.reasoning` field by the model-runtime request\n * middleware, gated by the active model's `reasoningConfig` capabilities so\n * unsupported values are omitted (and warned) instead of triggering provider\n * 400s. See `resolveReasoningForRequest()` in packages/core.\n */\nexport interface ModelRuntimeReasoningConfig {\n /**\n * Whether to send explicit reasoning enable/disable.\n * - 'auto' → do not send explicit fields; provider/model default wins\n * - 'on' → send `reasoning.enabled = true`\n * - 'off' → send `reasoning.enabled = false` only when the model supports disable\n */\n mode?: 'auto' | 'on' | 'off' | undefined;\n /** Reasoning effort. Only sent when the model advertises `effortSupported`. */\n effort?: ReasoningEffort | undefined;\n /** Preserve thinking across turns. Only sent when `preserveThinking !== 'unsupported'`. */\n preserve?: boolean | undefined;\n}\n\n/**\n * Runtime prompt-cache controls mapped into `Request.cache`. Currently only the\n * Anthropic TTL toggle (5m vs 1h) is exposed; other providers ignore it.\n */\nexport interface ModelRuntimeCacheConfig {\n ttl?: CacheTtl | undefined;\n}\n\n/**\n * Shared runtime controls applied to every provider request, regardless of host\n * (REPL / TUI / WebUI). The CLI installs a single request-pipeline middleware\n * that reads these and mutates the outgoing `Request`.\n */\nexport interface ModelRuntimeConfig {\n reasoning?: ModelRuntimeReasoningConfig | undefined;\n cache?: ModelRuntimeCacheConfig | undefined;\n /**\n * Generic generation parameters mapped directly onto `Request` fields.\n * Only sent when the active model's `Capabilities` advertise support.\n */\n parameters?: ModelRuntimeParametersConfig | undefined;\n}\n\n/**\n * Generic generation parameters the user can set per-session / per-project.\n * Each field maps to a `Request` field of the same name and is gated by the\n * corresponding `Capabilities` flag so unsupported models don't receive\n * parameters they'd reject.\n */\nexport interface ModelRuntimeParametersConfig {\n /** Top-K sampling (Anthropic, Gemini). Gated by `capabilities.topK`. */\n topK?: number | undefined;\n /** Frequency penalty (OpenAI, Gemini). Gated by `capabilities.frequencyPenalty`. */\n frequencyPenalty?: number | undefined;\n /** Presence penalty (OpenAI, Gemini). Gated by `capabilities.presencePenalty`. */\n presencePenalty?: number | undefined;\n /** Random seed (OpenAI, Gemini). Gated by `capabilities.seed`. */\n seed?: number | undefined;\n /** End-user identifier for abuse monitoring. */\n user?: string | undefined;\n /** Log probabilities (OpenAI, Gemini). Gated by `capabilities.logprobs`. */\n logprobs?: boolean | undefined;\n /** Number of top logprobs to return (OpenAI). Only when `logprobs` is true. */\n topLogprobs?: number | undefined;\n}\n\n/**\n * HQ client connection settings. Same-machine clients can auto-discover the\n * local HQ auth file; remote clients use this config-backed URL/token pair.\n */\nexport interface HqClientConfig {\n /** Enable HQ publishing. Env WRONGSTACK_HQ_ENABLED still overrides at runtime. */\n enabled?: boolean | undefined;\n /** HQ HTTP base URL, e.g. http://host:3499. */\n url?: string | undefined;\n /** Client token for /ws/client. Stored encrypted by SecretVault when persisted. */\n token?: string | undefined;\n /** Optional HQ data dir for same-machine auth.json discovery. */\n dataDir?: string | undefined;\n /** Send raw content previews to HQ instead of redacted previews. */\n rawContent?: boolean | undefined;\n /** Override project display name in HQ. */\n projectAlias?: string | undefined;\n}\n\n/**\n * Token-saving mode tier levels. Controls how aggressively the system prompt\n * is compacted to reduce per-request token consumption.\n *\n * - 'off' — Full prompt, all tools, complete guidance (no reduction)\n * - 'minimal' — TIER1 tools only (~10), stripped guidance (~3-4k tokens saved)\n * - 'light' — Core + memory tools (~14), common patterns, minimal guidance\n * - 'medium' — Most development tools (~24), some guidance (default when `true`)\n * - 'aggressive' — Maximum savings before tools become unusable (~4-5k tokens saved)\n */\nexport type TokenSavingTier = 'off' | 'minimal' | 'light' | 'medium' | 'aggressive';\n\n/**\n * Normalize a TokenSavingTier value, handling backward-compatible boolean inputs.\n * - `true` → 'medium' (existing behavior)\n * - `false` → 'off'\n * - string values are returned as-is after validation\n * - `undefined` → 'off'\n */\nexport function normalizeTokenSavingTier(\n val?: TokenSavingTier | boolean,\n): TokenSavingTier {\n if (val === undefined) return 'off';\n if (typeof val === 'boolean') return val ? 'medium' : 'off';\n const validTiers = new Set<TokenSavingTier>([\n 'off',\n 'minimal',\n 'light',\n 'medium',\n 'aggressive',\n ]);\n return validTiers.has(val) ? val : 'off';\n}\n\nexport const DEFAULT_TUI_THINKING_WORD = 'thinking';\nexport const MAX_TUI_THINKING_WORD_LENGTH = 16;\n\n/**\n * Normalize the configurable statusline word shown while the TUI is working.\n * The value must be a single short word; invalid values fall back to the default.\n */\nexport function normalizeTuiThinkingWord(value: unknown): string {\n if (typeof value !== 'string') return DEFAULT_TUI_THINKING_WORD;\n const word = value.trim();\n if (word.length === 0 || word.length > MAX_TUI_THINKING_WORD_LENGTH) {\n return DEFAULT_TUI_THINKING_WORD;\n }\n if (!/^[\\p{L}\\p{N}_-]+$/u.test(word)) return DEFAULT_TUI_THINKING_WORD;\n return word;\n}\n\nexport interface ContextConfig {\n /** Context-window policy mode. Controls compaction thresholds and preservation depth. */\n mode?: ContextWindowModeId | undefined;\n warnThreshold: number;\n softThreshold: number;\n hardThreshold: number;\n /** Enable automatic compaction when thresholds are crossed (default: true). */\n autoCompact?: boolean | undefined;\n /**\n * Model used for LLM-assisted summarization in IntelligentCompactor.\n * Falls back to the main model when omitted.\n */\n summarizerModel?: string | undefined;\n /**\n * Override the effective context window size (in tokens). Use this when\n * you want the compactor to trigger earlier than the provider's actual\n * maxContext. Defaults to the provider's reported maxContext.\n */\n effectiveMaxContext?: number | undefined;\n maxSessionTokens?: number | undefined;\n maxDailyTokens?: number | undefined;\n preserveK: number;\n eliseThreshold: number;\n /** Compactor strategy: 'hybrid' (default, fast rules), 'intelligent' (LLM summarization), 'selective' (LLM-driven selection). */\n strategy?: 'hybrid' | 'intelligent' | 'selective' | undefined;\n /** Enable LLM-driven selective compaction (default: false for backward compat). */\n llmSelector?: boolean | undefined;\n}\n\n/**\n * Runtime configuration for the process circuit breaker (the one owned by the\n * ProcessRegistry that gates `bash`/`exec`). Toggle via `/settings breaker`.\n *\n * The breaker itself is a low-level primitive (`packages/tools/.../circuit-breaker.ts`)\n * that is on by default; this section controls whether the registry actually\n * participates in it and how it auto-recovers.\n */\nexport interface CircuitBreakerRuntimeConfig {\n /**\n * Enable circuit-breaker protection. When false (the default), the breaker\n * is bypassed — `bash`/`exec` calls always proceed regardless of failure\n * history. When true, the breaker trips on repeated failures / slow calls /\n * bursts and blocks further calls until it recovers.\n */\n enabled?: boolean | undefined;\n /**\n * When the breaker trips, automatically kill all tracked processes AND\n * reset the breaker to closed after this delay (ms). 0 = disabled (manual\n * recovery only via `/kill reset`). Only effective when `enabled` is true.\n * While armed, the statusline shows a live countdown to the kill/reset.\n */\n autoKillResetMs?: number | undefined;\n}\n\n/**\n * Adaptive concurrency controller configuration. When enabled, the controller\n * automatically adjusts `maxConcurrent` based on rate-limit (429) errors:\n * - On 429: halves `maxConcurrent` (floor at 1)\n * - On sustained success (no 429 for `recoveryIntervalMs`): increases `maxConcurrent` by 1\n */\nexport interface AdaptiveConcurrencyConfig {\n /** Enable adaptive concurrency. Default: false (disabled). */\n enabled?: boolean | undefined;\n /**\n * Minimum concurrency floor. The controller never drops below this.\n * Default: 1.\n */\n minConcurrent?: number | undefined;\n /**\n * Maximum concurrency ceiling. The controller never exceeds this.\n * Default: 16 (matches MultiAgentCoordinator default).\n */\n maxConcurrent?: number | undefined;\n /**\n * Multiplicative decrease factor when a 429 is hit.\n * `newConcurrency = floor(currentConcurrency * decreaseFactor)`.\n * Default: 0.5 (halves concurrency).\n */\n decreaseFactor?: number | undefined;\n /**\n * Number of consecutive successful requests before increasing concurrency by 1.\n * Default: 10.\n */\n successThreshold?: number | undefined;\n /**\n * How often (ms) to check for recovery and bump concurrency.\n * Default: 30_000 (30 seconds).\n */\n recoveryIntervalMs?: number | undefined;\n}\n\nexport interface ToolsConfig {\n defaultExecutionStrategy: 'parallel' | 'sequential' | 'smart';\n maxIterations: number;\n iterationTimeoutMs: number;\n sessionTimeoutMs: number;\n perIterationOutputCapBytes: number;\n /**\n * Per-tool prose budget for the tool's top-level description and usage hint.\n * Missing entries default to \"extend\".\n */\n descriptionMode?: ToolDescriptionModeConfig | undefined;\n /**\n * Per-tool on-screen result rendering mode (terminal / WebUI / TUI).\n * Missing entries default to \"extend\". Independent of `descriptionMode`:\n * `/tool <name> result simple` toggles this without touching the\n * LLM-side description length.\n */\n resultRenderMode?: ToolResultRenderModeConfig | undefined;\n /**\n * Tool names to disable. Disabled tools are excluded from the tool registry\n * (`ToolRegistry.list()` / `get()`), so they do NOT appear in the system\n * prompt's \"## Tool usage\" block — reducing per-request token consumption.\n * Override per-session with `/tool enable <name>` or re-enable all via\n * `/tool enable-all`.\n */\n disabledTools?: string[] | undefined;\n /**\n * When true (default), the agent automatically extends its iteration\n * limit by 100 when hit. Set to false to require user confirmation.\n */\n autoExtendLimit?: boolean | undefined;\n /**\n * When true, file tools (read/write/edit/grep/glob/install) are confined to\n * the project root and `set_working_dir` may not leave it. Default: false —\n * tools may access paths outside the project root, still subject to each\n * tool's permission tier (writes/edits prompt for confirmation). Toggle via\n * `/settings` (\"Filesystem access\").\n */\n restrictToProjectRoot?: boolean | undefined;\n /**\n * Per-command policy for the `exec` tool's allowlist. The tool ships a\n * curated default allowlist of dev/build commands; this extends or trims it.\n *\n * SECURITY: `allow` EXPANDS what the agent may execute, so it is honored only\n * from TRUSTED config (`~/.wrongstack/config.json`) — the config loader\n * strips `tools.exec.allow` from the untrusted, repo-committed\n * `<project>/.wrongstack/config.json`. `deny` only ever REMOVES commands, so\n * it is honored from any source.\n */\n exec?: ExecToolConfig | undefined;\n}\n\n/** Allow/deny extension of the `exec` tool's built-in command allowlist. */\nexport interface ExecToolConfig {\n /**\n * Extra command names to add to the allowlist (e.g. `[\"make\", \"dotnet\"]`).\n * Trusted sources only — stripped from in-project repo config.\n */\n allow?: string[] | undefined;\n /**\n * Command names to remove from the allowlist. Honored from any source —\n * removing a command can only narrow what runs, so it is always safe.\n */\n deny?: string[] | undefined;\n}\n\nexport type ToolDescriptionMode = 'extend' | 'simple';\nexport type ToolDescriptionModeConfig = Record<string, ToolDescriptionMode | undefined>;\n\n/**\n * Per-tool on-screen result rendering mode. Independent of\n * {@link ToolDescriptionMode}: `descriptionMode` controls the prose the\n * model sees in the system prompt, `resultRenderMode` controls how the\n * tool's RESULT is printed to the user (terminal / WebUI / TUI).\n *\n * - `simple` — meta only (filename, line count, exit code). Body is hidden\n * by default; the user can still expand on demand where the renderer\n * supports it.\n * - `extend` — full preview, up to 10 lines for read-like tools.\n *\n * The two modes are toggled independently via `/tool <name> desc simple`\n * and `/tool <name> result simple`. The legacy `/tool <name> simple`\n * command sets BOTH at once for backward compatibility.\n */\nexport type ToolResultRenderMode = 'extend' | 'simple';\nexport type ToolResultRenderModeConfig = Record<string, ToolResultRenderMode | undefined>;\n\nexport interface ProviderApiKey {\n /** Short human-readable label (e.g. \"personal\", \"work\", \"rate-limit-backup\"). */\n label: string;\n /**\n * The key itself. The field name contains `apiKey` so the secret-vault\n * walker will encrypt it on write and decrypt it on read.\n */\n apiKey: string;\n /** ISO-8601 timestamp the key was added. */\n createdAt: string;\n /**\n * How this credential was obtained.\n * - `api_key` — manually pasted API key (default)\n * - `oauth` — OAuth 2.0 device-code / authorization-code flow\n * - `session_token` — extracted from browser session (ChatGPT web, etc.)\n */\n authMethod?: 'api_key' | 'oauth' | 'session_token' | undefined;\n /** ISO-8601 expiry. When set, the token manager will refresh before this time. */\n expiresAt?: string | undefined;\n /**\n * OAuth refresh token. Stored encrypted by the secret-vault walker because\n * the field name contains `Token` (case-insensitive match by vault).\n */\n refreshToken?: string | undefined;\n /** Token type as returned by the OAuth endpoint (e.g. \"bearer\"). */\n tokenType?: string | undefined;\n /** OAuth scope string (e.g. \"openai.models.read openai.models.use\"). */\n scope?: string | undefined;\n /**\n * ChatGPT account id, extracted from the OAuth access-token JWT\n * (`https://api.openai.com/auth`.chatgpt_account_id). Sent as the\n * `chatgpt-account-id` header by the `openai-codex` wire family. Cached\n * here for display/diagnostics; the provider re-derives it from the live\n * token at request time so it can never go stale after a refresh.\n */\n accountId?: string | undefined;\n}\n\nexport interface ProviderConfig {\n type: string;\n /**\n * Legacy single-key field. Still honored as a read fallback when `apiKeys`\n * is empty (for configs not yet migrated to multi-key format). After key\n * management operations (`writeKeysBack`), this field is **cleared** to\n * prevent accidental serialization of the plaintext key. Consumers that\n * need the active API key should use `resolveActiveApiKey()` (cli) or\n * resolve from `apiKeys[]` directly — never read `cfg.apiKey` in new code.\n */\n apiKey?: string | undefined;\n /** Multiple keys for the same provider — pick one with `activeKey`. */\n apiKeys?: ProviderApiKey[] | undefined;\n /** Label of the entry in `apiKeys` to use. Defaults to the first one. */\n activeKey?: string | undefined;\n baseUrl?: string | undefined;\n headers?: Record<string, string>;\n model?: string | undefined;\n quirks?: Record<string, unknown>;\n capabilities?: Record<string, unknown>;\n /**\n * Optional wire-family override. When present, the provider can be\n * constructed without consulting the models.dev catalog — useful for\n * self-hosted endpoints, internal proxies, or for working offline.\n */\n family?: WireFamily | undefined;\n /** Custom env var names to probe when `apiKey` is missing. */\n envVars?: string[] | undefined;\n /** Optional list of models the user wants visible for this provider. */\n models?: string[] | undefined;\n /**\n * Provider-relative custom model definitions (maps modelId → definition).\n * Each entry adds/overrides a model for this provider with optional\n * capability overrides. The model id is the key, not a fully qualified id.\n */\n customModels?: Record<string, CustomModelDefinition>;\n /**\n * Per-provider OAuth configuration. When present, `wstack auth login <id>`\n * uses this instead of prompting for a raw API key. Set by the catalog or\n * by the user via `/settings`.\n */\n oauthConfig?: {\n /** OAuth client id registered with the provider. */\n clientId?: string | undefined;\n /** Device authorization endpoint (RFC 8628). */\n deviceCodeEndpoint?: string | undefined;\n /** Token endpoint for code exchange and refresh. */\n tokenEndpoint?: string | undefined;\n /** Authorization server URL shown to the user for opening in browser. */\n authorizationEndpoint?: string | undefined;\n /** Default OAuth scopes to request. */\n scopes?: string[] | undefined;\n } | undefined;\n}\n\n/**\n * One entry in the per-task model matrix. Pins a catalog role, a phase, or\n * the `*` default to a specific model (and, optionally, a specific provider).\n * Resolved at subagent-spawn time so e.g. `security-scanner` can run a\n * different model than `documentation` while the leader stays on its own.\n */\nexport interface ModelMatrixEntry {\n /** Provider registry id (e.g. \"anthropic\", \"minimax\", \"zai\"). When omitted,\n * the leader's provider is used with this entry's model. */\n provider?: string | undefined;\n /** Model id to run for the matched role/phase/default. */\n model?: string | undefined;\n /**\n * Named fallback profile to use for the matched role/phase/default. When\n * `model` is omitted, the first model in the profile becomes the primary and\n * the remaining entries become that subagent's fallback chain.\n */\n fallbackProfile?: string | undefined;\n}\n\nexport interface MCPServerConfig {\n /** Human-readable description shown in `wstack mcp list`. */\n description?: string | undefined;\n name: string;\n transport: 'stdio' | 'sse' | 'streamable-http';\n command?: string | undefined;\n args?: string[] | undefined;\n env?: Record<string, string>;\n url?: string | undefined;\n headers?: Record<string, string>;\n enabled?: boolean | undefined;\n allowedTools?: string[] | undefined;\n permission?: Permission | undefined;\n startupTimeoutMs?: number | undefined;\n requestTimeoutMs?: number | undefined;\n /**\n * Lazy connect: when true, the server process is NOT spawned at boot. Its\n * tools are registered from a cached manifest (discovered on the first ever\n * connect) and the server only spawns when one of its tools is actually\n * called, then auto-sleeps after an idle period. Default (false/undefined) =\n * eager connect at boot.\n */\n lazy?: boolean | undefined;\n}\n\nexport interface LogConfig {\n level: 'error' | 'warn' | 'info' | 'debug' | 'trace';\n file?: string | undefined;\n}\n\nexport interface PluginConfig {\n name: string;\n enabled?: boolean | undefined;\n options?: Record<string, unknown>;\n}\n\n/**\n * Optional subsystems that the CLI can boot without. The core flow\n * (provider + agent loop + bundled tools + session) always works; these\n * just add capabilities. `--no-features` flips all of these off, which\n * is the minimum viable WrongStack: a single provider, a fixed config,\n * no network calls at startup.\n */\nexport interface FeaturesConfig {\n /** Load MCP servers declared in `mcpServers`. */\n mcp: boolean;\n /** Load + initialise npm plugins declared in `plugins`. */\n plugins: boolean;\n /** Register `remember` / `forget` tools backed by memory store. */\n memory: boolean;\n /**\n * Automatically consolidate session learnings into long-term memory\n * after each completed run. The agent extracts key facts, conventions,\n * and decisions via a lightweight LLM call and persists them.\n * Enabled by default when `memory` is on; set to false to opt out.\n */\n memoryConsolidation?: boolean | undefined;\n /** Fetch the models.dev catalog at startup. When false, the provider\n * must declare its `family` explicitly in `providers[<id>]`. */\n modelsRegistry: boolean;\n /** Discover + load skills from disk. */\n skills: boolean;\n /**\n * Enable the prompt library (`/prompt`, `/prompts`, `/prompt-gen`, the WebUI\n * modal and the bundled 168-prompt dataset). Defaults to on; set to false to\n * disable the subsystem entirely (the loader is withheld so every surface\n * reports it unavailable).\n */\n prompts?: boolean | undefined;\n /**\n * Token-saving mode tier. Controls how aggressively the system prompt\n * is compacted to reduce per-request token consumption.\n *\n * - 'off' — Full prompt, all tools, complete guidance\n * - 'minimal' — TIER1 tools only, stripped guidance (~3-4k tokens saved)\n * - 'light' — Core + memory tools, common patterns, minimal guidance\n * - 'medium' — Most development tools, some guidance\n * - 'aggressive' — Maximum savings before tools become unusable (~4-5k tokens)\n *\n * Boolean values are accepted for backward compatibility:\n * - `true` → 'medium'\n * - `false` → 'off'\n *\n * Enable via CLI: `--token-saving-tier <level>` or `--token-saving-mode` (maps to 'medium').\n * Configure via: `features.tokenSavingMode: \"minimal\"` in config.\n */\n tokenSavingMode?: TokenSavingTier | boolean | undefined;\n /**\n * Allow tools to read/write paths outside the project root directory.\n * When true (default), tools can access any path on the filesystem.\n * When false, tools are restricted to the project root directory.\n */\n allowOutsideProjectRoot?: boolean | undefined;\n /**\n * Auto-bootstrap the mailbox HTTP bridge from any WrongStack surface\n * (REPL/TUI/WebUI/eternal). When 'auto' (the default), the first\n * surface to come up for a given project joins or spawns the bridge\n * so external agents can connect without the user running\n * `wstack mailbox serve` themselves. 'off' disables this — operators\n * must start the bridge explicitly (e.g. via the `/mailbox-serve`\n * slash command or the standalone `wstack mailbox serve` subcommand).\n * The per-project lock + token-persistence model means a second\n * surface on the same project joins the first's bridge rather than\n * spawning a duplicate.\n */\n mailboxBridge?: 'auto' | 'off' | undefined;\n}\n\nexport interface AutonomyConfig {\n /** Default autonomy mode at startup. Default: \"off\". */\n defaultMode?: 'off' | 'suggest' | 'auto' | undefined;\n /** ms to wait before auto-proceeding in 'auto' mode. Default: 45000. */\n autoProceedDelayMs?: number | undefined;\n /** Maximum consecutive auto-proceed turns before pausing. 0 = unlimited. Default: 50. */\n autoProceedMaxIterations?: number | undefined;\n /** Template used for YOLO+auto suggestions. Must include {{suggestion}}. */\n autonomyNextPrompt?: string | undefined;\n /** Animate the terminal/window title while the agent is active. Default: true. */\n terminalTitleAnimation?: boolean | undefined;\n /** Persisted YOLO preference mirrored into top-level config.yolo at runtime. Default: false. */\n yolo?: boolean | undefined;\n /** Stream fleet/subagent output into the main TUI chat. Default: true. */\n streamFleet?: boolean | undefined;\n /** Ring terminal bell when an agent run completes. Default: false. */\n chime?: boolean | undefined;\n /** Ask for confirmation before interrupt/exit. Default: true. */\n confirmExit?: boolean | undefined;\n /** Terminal mouse tracking preference. Default: false. */\n mouseMode?: boolean | undefined;\n /** Enable prompt refinement before sending. Default: true. */\n enhance?: boolean | undefined;\n /** Prompt-refinement preview countdown in ms. Default: 60000. */\n enhanceDelayMs?: number | undefined;\n /** Prompt-refinement language mode. Default: \"original\". */\n enhanceLanguage?: 'original' | 'english' | undefined;\n /** TUI statusline density. Default: \"detailed\". */\n statuslineMode?: 'minimum' | 'detailed' | undefined;\n /** Single short word shown in the TUI rainbow working-state chip. Default: \"thinking\". */\n thinkingWord?: string | undefined;\n}\n\n/**\n * Automatic codebase symbol-index maintenance. Keeps the `codebase-search`\n * index (SQLite, `~/.wrongstack/projects/<hash>/codebase-index/index.db`) fresh\n * without the user having to call `codebase-index` by hand.\n */\nexport interface IndexingConfig {\n /** Run a blocking incremental index at session start (with a visible summary). Default: true. */\n onSessionStart: boolean;\n /** Reindex files the agent writes/edits via tools, in the background. Default: true. */\n onEdit: boolean;\n /** Watch the project root for external editor changes and reindex them. Default: true. */\n watchExternal: boolean;\n /** Debounce window (ms) coalescing rapid edits to the same file. Default: 400. */\n debounceMs: number;\n /**\n * Watchdog timeout (ms) for a full index run. A run exceeding this is\n * aborted (so it can never wedge the indexing mutex or freeze the terminal)\n * and counts toward the indexing circuit breaker. Default: 120000.\n */\n indexTimeoutMs?: number | undefined;\n}\n\n/**\n * Saved launch preferences — restored on next boot so the pre-launch prompt\n * can offer a one-line \"Continue with last settings? [Y/n]\" instead of\n * re-asking every question from scratch.\n */\nexport interface LaunchConfig {\n /** Interactive mode: 'tui' (Ink TUI) or 'repl' (readline REPL). */\n mode?: 'tui' | 'repl' | undefined;\n /** Start with Director mode on (fleet manifest + multi-agent orchestration). */\n director?: boolean | undefined;\n /**\n * Launch-time autonomy mode (binary choice from pre-launch prompt).\n * 'off' = stops after each turn; 'auto' = self-driving.\n * Distinct from `AutonomyConfig.defaultMode` which also supports 'suggest'.\n */\n autonomy?: 'off' | 'auto' | undefined;\n}\n\n/**\n * Controls how much detail is persisted to the per-session JSONL log\n * (`~/.wrongstack/projects/<hash>/sessions/<id>.jsonl`).\n */\nexport interface SessionLoggingConfig {\n /**\n * How much detail to write to the persistent session log.\n *\n * - \"minimal\" → Only events required for resume/rewind/recovery\n * - \"standard\" → (default) + high-value lightweight audit events\n * (compaction, tool timing, retries, errors, etc.)\n * - \"full\" → Also persist full request payloads (very large).\n * Consider enabling a separate replay log instead.\n */\n auditLevel?: 'minimal' | 'standard' | 'full' | undefined;\n\n /**\n * Sampling configuration for high-volume events (especially relevant at\n * `auditLevel: \"full\"`).\n */\n sampling?: {\n /** Controls sampling of `tool_progress` events. */\n toolProgress?: {\n /**\n * Sample rate for noisy progress events (`log`, `partial_output`).\n * - 1 = no sampling (every message is logged)\n * - 8 = default (first message + every 8th)\n */\n sampleRate?: number | undefined;\n };\n };\n}\n\nexport type SyncCategory = 'settings' | 'skills' | 'prompts' | 'memory' | 'history';\n\nexport interface SyncConfig {\n enabled: boolean;\n repo: string;\n /** GitHub token (fine-grained PAT). Encrypted at rest via SecretVault. */\n githubToken: string;\n categories: SyncCategory[];\n lastSyncedAt?: string | undefined;\n}\n\n/**\n * Per-model capability overrides the user can define in their config.\n * Used to add models not in the models.dev catalog, or override catalog\n * facts when the real backend differs (e.g. local Ollama models, proxies).\n */\nexport interface CustomModelDefinition {\n /** Provider this model belongs to. Defaults to the owning ProviderConfig. */\n provider?: string | undefined;\n /** Optional display name. */\n name?: string | undefined;\n /** Capability overrides — only specified fields are overlaid. */\n capabilities?: Partial<Capabilities> | undefined;\n /**\n * Max output tokens. If not specified, the provider family default\n * or catalog entry is used.\n */\n maxOutput?: number | undefined;\n}\n\nexport interface Config {\n version: 1;\n provider: string;\n model: string;\n apiKey?: string | undefined;\n baseUrl?: string | undefined;\n /**\n * Maximum number of subagent tasks the fleet coordinator dispatches\n * simultaneously. Extra tasks queue until a slot frees. Default: 4.\n * Overridden by WRONGSTACK_MAX_CONCURRENT env var and --max-concurrent\n * CLI flag. Change at runtime with /fleet concurrency <n>.\n */\n maxConcurrent?: number | undefined;\n providers?: Record<string, ProviderConfig>;\n /**\n * Top-level custom models (maps modelId → definition). Merged with\n * per-provider `customModels` at resolution time. The key is the\n * model id — not a fully qualified name. When the same model id\n * appears in both places, the top-level one wins.\n */\n models?: Record<string, CustomModelDefinition>;\n /**\n * Per-task model matrix. Keys are catalog roles (e.g. \"security-scanner\"),\n * phase names (e.g. \"review\"), or the `*` default. Resolution precedence at\n * subagent spawn: exact role → the role's phase → `*` → leader model. Set via\n * the `/setmodel` slash command; persisted to ~/.wrongstack/config.json.\n */\n modelMatrix?: Record<string, ModelMatrixEntry>;\n /**\n * User-curated model references shown/prioritized by model commands and used\n * by smart fallback derivation. Entries are `model`, `provider/model`, or\n * `provider model`.\n */\n favoriteModels?: string[] | undefined;\n /**\n * When true, auto-derived fallback chains are restricted to `favoriteModels`.\n * Explicit fallback profiles/chains are always honored as written.\n */\n favoriteModelsOnly?: boolean | undefined;\n context: ContextConfig;\n tools: ToolsConfig;\n mcpServers?: Record<string, MCPServerConfig>;\n /**\n * Per-agent ACP invocation overrides, keyed by catalog agent id\n * (`claude-code`, `codex-cli`, `gemini-cli`, …). Lets a user correct an\n * agent's ACP entry command — e.g. point `claude-code` at the right\n * adapter — without a code change. Consumed by `/acp`, `/ensemble`, and\n * `wstack acp`. SECURITY: this is an arbitrary-command exec surface, so it\n * is in the in-project config DENY list — only honoured from the user's\n * `~/.wrongstack/config.json`, never from a repo-committed config.\n */\n acp?: {\n agents?: Record<\n string,\n { command: string; args?: string[]; env?: Record<string, string> }\n >;\n };\n /**\n * Ordered list of fallback model references tried, in order, when the\n * primary model is overloaded (HTTP 429/529/5xx) and its own retries are\n * exhausted. Each entry is a model reference: a bare model id (same\n * provider), `provider/model`, or `provider model`. The primary is always\n * re-tried first at the start of every user turn. See `createFallbackModelExtension`.\n */\n fallbackModels?: string[] | undefined;\n /**\n * Named fallback chains. A profile's first entry can be used as a primary\n * model by `/setmodel`, while the whole ordered list is used for failover.\n */\n fallbackProfiles?: Record<string, string[]> | undefined;\n /**\n * When `true` (the default) and `fallbackModels` is empty, a fallback chain\n * is derived automatically from the other keyed providers/models so 429s\n * recover out of the box. Set `false` to disable the smart default and only\n * use an explicit `fallbackModels` list. Toggle via `/fallback auto on|off`.\n */\n fallbackAuto?: boolean | undefined;\n /**\n * Lifecycle shell hooks, keyed by event. Each command receives the hook\n * `HookInput` JSON on stdin; a JSON `HookOutcome` on stdout (and exit code 2\n * = block) steers the agent. In-process hooks are registered separately via\n * the plugin API. Disabled entirely under `--bare` / `--no-hooks`.\n */\n hooks?: Partial<Record<HookEvent, ShellHook[]>>;\n plugins?: (string | PluginConfig)[] | undefined;\n log: LogConfig;\n features: FeaturesConfig;\n yolo?: boolean | undefined;\n /** When true, show lightweight LLM-predicted next steps after each turn (/next). */\n nextPrediction?: boolean | undefined;\n cwd?: string | undefined;\n /** Autonomy mode configuration (auto-proceed delay, etc.). */\n autonomy?: AutonomyConfig | undefined;\n /** Show rotating launch hints on startup. Default: true. Set to false to suppress. */\n hints?: boolean | undefined;\n /** Raw SSE stream debugging — hex-dump every byte received from providers to stderr. */\n debugStream?: boolean | undefined;\n /**\n * Where settings are persisted. 'global' → ~/.wrongstack/config.json\n * (default). 'project' → <project>/.wrongstack/config.json.\n * When 'project', safe settings are saved per-project.\n */\n configScope?: 'global' | 'project' | undefined;\n /** Automatic codebase symbol-index maintenance (session-start + live updates). */\n indexing?: IndexingConfig | undefined;\n /**\n * Process circuit-breaker protection (gates `bash`/`exec` on repeated\n * failures). Default off — toggle with `/settings breaker on|off`.\n */\n circuitBreaker?: CircuitBreakerRuntimeConfig | undefined;\n /**\n * Adaptive concurrency controller — automatically adjusts `maxConcurrent` based on\n * rate-limit (429) errors. On 429: decreases concurrency. On sustained success:\n * gradually increases concurrency back up. Default off.\n */\n adaptiveConcurrency?: AdaptiveConcurrencyConfig | undefined;\n /** Saved launch preferences — restored on next boot for one-line confirmation. */\n launch?: LaunchConfig | undefined;\n\n /**\n * Session logging & audit configuration.\n * Controls what gets written to the persistent JSONL transcript.\n */\n session?: SessionLoggingConfig | undefined;\n /**\n * Runtime reasoning / cache controls applied to every provider request\n * (REPL/TUI/WebUI). Mapped into `Request.reasoning` and `Request.cache` by a\n * single request-pipeline middleware, gated by the active model's\n * capabilities. See `ModelRuntimeConfig`.\n */\n modelRuntime?: ModelRuntimeConfig | undefined;\n /** HQ client publishing settings, used by CLI/REPL/TUI/WebUI consistently. */\n hq?: HqClientConfig | undefined;\n /**\n * Cloud sync configuration. Stored separately in sync.json to avoid\n * accidentally committing the GitHub token to project configs.\n */\n sync?: SyncConfig | undefined;\n /**\n * Per-plugin namespaced config sections. Each plugin reads its own\n * subtree via `ConfigStore.getExtension(pluginName)`. Plugins should\n * declare a `configSchema` so the loader validates this section\n * automatically before `setup()` runs.\n *\n * Example:\n * extensions: {\n * 'wstack-auth': { tokenUrl: 'https://...', refreshBefore: 300 },\n * 'wstack-metrics': { sink: 'prometheus', port: 9090 },\n * }\n */\n extensions?: Record<string, Record<string, unknown>>;\n}\n\nexport interface ConfigLoader {\n load(opts?: { cliFlags?: Partial<Config> | undefined; cwd?: string | undefined }): Promise<Config>;\n /** Load and decrypt the sync config from ~/.wrongstack/sync.json. */\n loadSyncConfig(): Promise<SyncConfig | null>;\n /** Persist sync config to ~/.wrongstack/sync.json with encrypted token. */\n persistSyncConfig(cfg: SyncConfig): Promise<void>;\n}\n\n/**\n * Subscribable view over Config. Plugins and CLI subsystems use this instead\n * of holding a frozen Config reference, so they can react to runtime updates\n * (e.g. `/model` switching the active provider, secrets rotation, dynamic\n * extension reload).\n *\n * The store enforces immutability — `get()` always returns a frozen object.\n * Updates happen through `update(partial)`, which produces a new Config\n * (structurally cloned, then frozen) and notifies watchers.\n */\nexport interface ConfigStore {\n get(): Readonly<Config>;\n /**\n * Get a typed top-level section. Convenience for consumers that only\n * care about one slice (e.g. `tools` or `context`).\n */\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]>;\n /**\n * Return the extension namespace for `pluginName`, or an empty record\n * when none is configured. The returned object is frozen.\n */\n getExtension(pluginName: string): Readonly<Record<string, unknown>>;\n /**\n * Apply a partial update. Returns the new Config. Watchers are notified\n * synchronously after the update completes. Throws if the result fails\n * any registered invariants (currently: version must stay 1).\n */\n update(partial: Partial<Config>): Readonly<Config>;\n /** Subscribe to changes. Returns an unsubscribe function. */\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void;\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n descriptionMode: Object.freeze({}) as Record<string, 'extend' | 'simple' | undefined>,\n disabledTools: Object.freeze([]) as readonly string[],\n autoExtendLimit: true,\n restrictToProjectRoot: false,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/**\n * Default process circuit-breaker config. Protection is OFF by default — the\n * breaker only gates `bash`/`exec` once the user opts in via `/settings breaker on`.\n * The auto kill/reset delay is only consulted when protection is enabled.\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG = Object.freeze({\n enabled: false,\n autoKillResetMs: 60_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});\n\n/** Default retention window for local session pruning. */\nexport const DEFAULT_SESSION_PRUNE_DAYS = 30;\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v<N>:<base64-iv>:<base64-tag>:<base64-ciphertext>` where `<N>` is the\n * key version used for encryption. Plaintext strings (those that do not match\n * this prefix) are passed through unchanged so that existing configs and\n * env-var-derived values keep working.\n *\n * Key rotation produces a new key and re-encrypts all secrets under it.\n * After rotation, `encrypt()` emits the new version prefix (e.g. `enc:v2:`)\n * and `decrypt()` accepts any version prefix — it uses the current key\n * regardless, since rotation re-encrypts every value atomically.\n *\n * The vault is intentionally NOT designed to defeat a determined local\n * attacker who can read both the config file and the key file — that level\n * of secrecy needs the OS keychain. The goal is to keep keys from being\n * visible in screen shares, accidental log captures, and `cat config.json`\n * over someone's shoulder.\n */\nexport interface SecretVault {\n encrypt(plaintext: string): string;\n decrypt(value: string): string;\n isEncrypted(value: string): boolean;\n /** Current key version. Starts at 1; incremented by `rotateKey()`. */\n readonly keyVersion: number;\n}\n\n/**\n * RotatableSecretVault extends SecretVault with key rotation support.\n * `rotateKey()` generates a fresh key, writes it to disk, and increments\n * the key version. All subsequent `encrypt()` calls use the new version\n * prefix. The caller is responsible for re-encrypting existing config\n * values (see `rotateConfigKeys()`).\n */\nexport interface RotatableSecretVault extends SecretVault {\n rotateKey(): { oldVersion: number; newVersion: number };\n}\n\n/** Legacy v1 prefix — values encrypted before key rotation was introduced. */\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n\n/**\n * Match any versioned encrypted value prefix: `enc:v1:`, `enc:v2:`, etc.\n * Used by `isEncrypted()` and `decrypt()` to handle all versions uniformly.\n */\nexport const ENCRYPTED_PREFIX_PATTERN = /^enc:v(\\d+):/;\n\n/**\n * Return the encrypted prefix for a given key version.\n * @example encryptedPrefixForVersion(1) // 'enc:v1:'\n * @example encryptedPrefixForVersion(2) // 'enc:v2:'\n */\nexport function encryptedPrefixForVersion(version: number): string {\n return `enc:v${version}:`;\n}\n\n/**\n * Parse the key version from an encrypted value string.\n * Returns undefined if the string is not an encrypted value.\n */\nexport function parseEncryptedVersion(value: string): number | undefined {\n const match = value.match(ENCRYPTED_PREFIX_PATTERN);\n return match ? Number.parseInt(match[1]!, 10) : undefined;\n}\n\n/**\n * No-op SecretVault that passes values through unchanged.\n * Used in contexts where encryption is not needed — e.g. reading/writing\n * config sections that contain no secret fields (models, settings, etc.).\n */\nexport const noOpVault: SecretVault = {\n encrypt: (v) => v,\n decrypt: (v) => v,\n isEncrypted: () => false,\n keyVersion: 1,\n};\n","import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Logger } from '../types/logger.js';\nimport type { RotatableSecretVault, SecretVault } from '../types/secret-vault.js';\nimport { ConfigError, ERROR_CODES } from '../types/errors.js';\nimport {\n ENCRYPTED_PREFIX_PATTERN,\n encryptedPrefixForVersion,\n} from '../types/secret-vault.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\nexport interface SecretVaultOptions {\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\n keyFile: string;\n}\n\nconst KEY_BYTES = 32;\nconst IV_BYTES = 12;\nconst TAG_BYTES = 16;\nconst ALGO = 'aes-256-gcm';\n// Desired file mode for the key file on POSIX systems.\nconst KEY_FILE_MODE = 0o600;\n\n/**\n * Key file format v2+: 4-byte magic + 1-byte version + 32-byte key = 37 bytes.\n * The magic header distinguishes versioned key files from legacy 32-byte raw keys.\n */\nconst KEY_FILE_MAGIC = Buffer.from('WSKV', 'ascii');\nconst VERSIONED_KEY_FILE_SIZE = KEY_FILE_MAGIC.length + 1 + KEY_BYTES; // 37 bytes\n\n// ── WS-03: opt-in passphrase-wrapped key file (KEK) ─────────────────────────\n//\n// When WRONGSTACK_VAULT_PASSPHRASE is set, the data key is NOT stored in the\n// clear. Instead the key file holds the data key encrypted (AES-256-GCM) under\n// a key-encryption-key (KEK) derived from the passphrase with scrypt. This adds\n// at-rest protection beyond the file's 0o600 perms: an attacker who copies\n// ~/.wrongstack/.key + config.json off the disk still cannot decrypt without the\n// passphrase. When the env var is unset, behavior is byte-for-byte identical to\n// before (legacy raw / versioned formats) — this is purely additive and opt-in.\n//\n// Wrapped format v3: magic 'WSKW' (4) + keyVersion (1) + salt (16) + iv (12) +\n// tag (16) + ciphertext (32) = 81 bytes.\nconst KEK_MAGIC = Buffer.from('WSKW', 'ascii');\nconst KEK_SALT_BYTES = 16;\nconst WRAPPED_KEY_FILE_SIZE =\n KEK_MAGIC.length + 1 + KEK_SALT_BYTES + IV_BYTES + TAG_BYTES + KEY_BYTES; // 81 bytes\n// scrypt cost parameters. N=2^15 keeps derivation ~50-100ms — strong against\n// offline brute force while imperceptible for a one-time-per-process unlock.\nconst SCRYPT_N = 1 << 15;\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SCRYPT_MAXMEM = 64 * 1024 * 1024; // headroom above N*r*128 so derivation never throws\n\n/** Read the optional vault passphrase from the environment. Empty = unset. */\nfunction getVaultPassphrase(): string | undefined {\n const v = process.env['WRONGSTACK_VAULT_PASSPHRASE'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/** True if `buf` is a passphrase-wrapped (v3) key file. */\nfunction isWrappedKeyFile(buf: Buffer): boolean {\n return buf.length === WRAPPED_KEY_FILE_SIZE && buf.subarray(0, KEK_MAGIC.length).equals(KEK_MAGIC);\n}\n\n/** Derive the 32-byte KEK from a passphrase + salt via scrypt. */\nfunction deriveKEK(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, KEY_BYTES, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n}\n\n/** Serialize a data key into the wrapped (v3) on-disk format under `passphrase`. */\nfunction wrapDataKey(dataKey: Buffer, keyVersion: number, passphrase: string): Buffer {\n const salt = randomBytes(KEK_SALT_BYTES);\n const iv = randomBytes(IV_BYTES);\n const kek = deriveKEK(passphrase, salt);\n const cipher = createCipheriv(ALGO, kek, iv);\n const ct = Buffer.concat([cipher.update(dataKey), cipher.final()]);\n const tag = cipher.getAuthTag();\n const out = Buffer.alloc(WRAPPED_KEY_FILE_SIZE);\n let off = 0;\n KEK_MAGIC.copy(out, off); off += KEK_MAGIC.length;\n out[off] = keyVersion & 0xff; off += 1;\n salt.copy(out, off); off += KEK_SALT_BYTES;\n iv.copy(out, off); off += IV_BYTES;\n tag.copy(out, off); off += TAG_BYTES;\n ct.copy(out, off);\n return out;\n}\n\n/**\n * Parse a wrapped (v3) key file and return the data key + version. Throws a\n * clear ConfigError when the passphrase is missing or wrong (GCM auth failure).\n */\nfunction unwrapDataKey(buf: Buffer, keyFile: string): { key: Buffer; version: number } {\n const passphrase = getVaultPassphrase();\n if (!passphrase) {\n throw new ConfigError({\n message:\n `SecretVault: key file ${keyFile} is passphrase-protected — set the ` +\n `WRONGSTACK_VAULT_PASSPHRASE environment variable to unlock it.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile },\n });\n }\n let off = KEK_MAGIC.length;\n const version = buf[off]!; off += 1;\n const salt = buf.subarray(off, off + KEK_SALT_BYTES); off += KEK_SALT_BYTES;\n const iv = buf.subarray(off, off + IV_BYTES); off += IV_BYTES;\n const tag = buf.subarray(off, off + TAG_BYTES); off += TAG_BYTES;\n const ct = buf.subarray(off, off + KEY_BYTES);\n const kek = deriveKEK(passphrase, salt);\n const decipher = createDecipheriv(ALGO, kek, iv);\n decipher.setAuthTag(tag);\n try {\n const key = Buffer.concat([decipher.update(ct), decipher.final()]);\n return { key: Buffer.from(key), version };\n } catch {\n throw new ConfigError({\n message:\n `SecretVault: failed to unlock key file ${keyFile} — wrong ` +\n `WRONGSTACK_VAULT_PASSPHRASE (key unwrap authentication failed).`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile },\n });\n }\n}\n\n/**\n * Check and warn if the key file has incorrect permissions on POSIX.\n * On Windows this is a no-op (mode bits don't apply).\n */\nfunction checkKeyFilePermissions(keyFile: string): void {\n if (process.platform === 'win32') return; // No mode bits on Windows\n try {\n const stat = fs.statSync(keyFile);\n const actualMode = stat.mode & 0o777;\n if (actualMode !== KEY_FILE_MODE) {\n console.warn(JSON.stringify({\n level: 'warn',\n event: 'vault.key_file_wrong_permissions',\n message: `Key file ${keyFile} has mode ${actualMode.toString(8)} — expected ${KEY_FILE_MODE.toString(8)}. Run: chmod ${KEY_FILE_MODE.toString(8)} ${keyFile}`,\n keyFile,\n expectedMode: KEY_FILE_MODE,\n actualMode,\n timestamp: new Date().toISOString(),\n }));\n }\n } catch {\n // stat can fail for reasons other than the file not existing;\n // if it does, the ENOENT path handles it.\n }\n}\n\n/**\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\n * a fresh one is generated. Decryption of plaintext values is a no-op so\n * legacy configs continue to work.\n *\n * Key file format:\n * - Legacy (v1): exactly 32 raw bytes\n * - Versioned (v2+): 4-byte magic `WSKV` + 1-byte version + 32-byte key (37 bytes)\n *\n * Encrypted value format: `enc:v<N>:<iv>:<tag>:<ciphertext>` where N is the\n * key version. After rotation, encrypt() emits the new version prefix.\n */\nexport class DefaultSecretVault implements RotatableSecretVault {\n private readonly keyFile: string;\n private key?: Buffer | undefined;\n private _keyVersion: number = 1;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n /** Current key version. Starts at 1; incremented by rotateKey(). */\n get keyVersion(): number {\n // Ensure key is loaded so version is accurate\n if (!this.key) this.loadOrCreateKey();\n return this._keyVersion;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && ENCRYPTED_PREFIX_PATTERN.test(value);\n }\n\n encrypt(plaintext: string): string {\n if (this.isEncrypted(plaintext)) return plaintext;\n const key = this.loadOrCreateKey();\n const iv = randomBytes(IV_BYTES);\n const cipher = createCipheriv(ALGO, key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n const prefix = encryptedPrefixForVersion(this._keyVersion);\n return `${prefix}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\n }\n\n decrypt(value: string): string {\n if (!this.isEncrypted(value)) return value;\n // Strip the versioned prefix (enc:v1:, enc:v2:, etc.)\n const prefixMatch = value.match(ENCRYPTED_PREFIX_PATTERN);\n if (!prefixMatch) {\n throw new ConfigError({\n message: 'SecretVault: malformed encrypted value',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { field: 'encrypted_value' },\n });\n }\n const rest = value.slice(prefixMatch[0].length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new ConfigError({\n message: 'SecretVault: malformed encrypted value',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { field: 'encrypted_value' },\n });\n }\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\n const iv = Buffer.from(ivB64, 'base64');\n const tag = Buffer.from(tagB64, 'base64');\n const ct = Buffer.from(ctB64, 'base64');\n if (iv.length !== IV_BYTES) throw new ConfigError({\n message: 'SecretVault: bad IV length',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { expected: IV_BYTES, actual: iv.length },\n });\n if (tag.length !== TAG_BYTES) throw new ConfigError({\n message: 'SecretVault: bad tag length',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { expected: TAG_BYTES, actual: tag.length },\n });\n const key = this.loadOrCreateKey();\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return pt.toString('utf8');\n }\n\n /**\n * Generate a new encryption key, write it to disk, and increment the key version.\n * After rotation, encrypt() emits the new version prefix (e.g. enc:v2:).\n * The caller must re-encrypt existing config values (see rotateConfigKeys()).\n */\n rotateKey(): { oldVersion: number; newVersion: number } {\n const oldVersion = this._keyVersion;\n const newKey = randomBytes(KEY_BYTES);\n const newVersion = oldVersion + 1;\n\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const passphrase = getVaultPassphrase();\n if (passphrase) {\n // Keep the rotated key passphrase-wrapped (v3) so rotation never\n // downgrades a protected key file to plaintext.\n fs.writeFileSync(this.keyFile, wrapDataKey(newKey, newVersion, passphrase), { mode: 0o600 });\n } else {\n // Write versioned key file: WSKV + version byte + key\n const keyFileBuf = Buffer.alloc(VERSIONED_KEY_FILE_SIZE);\n KEY_FILE_MAGIC.copy(keyFileBuf, 0);\n keyFileBuf[KEY_FILE_MAGIC.length] = newVersion;\n newKey.copy(keyFileBuf, KEY_FILE_MAGIC.length + 1);\n fs.writeFileSync(this.keyFile, keyFileBuf, { mode: 0o600 });\n }\n checkKeyFilePermissions(this.keyFile);\n\n this.key = newKey;\n this._keyVersion = newVersion;\n return { oldVersion, newVersion };\n }\n\n /**\n * If WRONGSTACK_VAULT_PASSPHRASE is set but the key on disk is still stored\n * unwrapped (legacy v1 / versioned v2), re-write it in passphrase-wrapped (v3)\n * form. The data key is preserved, so all existing ciphertext keeps\n * decrypting. Best-effort: a write failure leaves the working unwrapped file\n * in place and is not fatal to load.\n */\n private migrateToWrappedIfPassphrase(): void {\n const passphrase = getVaultPassphrase();\n if (!passphrase || !this.key) return;\n try {\n fs.writeFileSync(this.keyFile, wrapDataKey(this.key, this._keyVersion, passphrase), {\n mode: 0o600,\n });\n checkKeyFilePermissions(this.keyFile);\n } catch {\n // Non-fatal: the at-rest upgrade failed, but the loaded key is valid.\n }\n }\n\n private loadOrCreateKey(): Buffer {\n // readFileSync blocks the event loop, but this is a one-time cost per\n // process: the key is cached after the first load and reused for every\n // subsequent encrypt/decrypt. For CLI usage (single run → exit) this is\n // negligible. For server contexts (eternal autonomy, MCP server mode),\n // the first encrypt/decrypt call causes a brief (<1ms) event loop stall.\n // Prefer calling vault.encrypt('') during boot to warm the cache if this\n // is a concern in your deployment.\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n\n // Passphrase-wrapped (v3): unwrap with WRONGSTACK_VAULT_PASSPHRASE.\n // Checked first because its size/magic are distinct from the others.\n if (isWrappedKeyFile(buf)) {\n const { key, version } = unwrapDataKey(buf, this.keyFile);\n this.key = key;\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n\n // Detect key file format:\n if (buf.length === KEY_BYTES) {\n // Legacy v1: raw 32-byte key\n this.key = buf;\n this._keyVersion = 1;\n checkKeyFilePermissions(this.keyFile);\n // Upgrade to passphrase-wrapped at rest if a passphrase is configured.\n this.migrateToWrappedIfPassphrase();\n return this.key;\n }\n\n if (buf.length === VERSIONED_KEY_FILE_SIZE) {\n // Versioned v2+: WSKV magic + version byte + 32-byte key\n const magic = buf.subarray(0, KEY_FILE_MAGIC.length);\n if (!magic.equals(KEY_FILE_MAGIC)) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has invalid magic header`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile },\n });\n }\n const version = buf[KEY_FILE_MAGIC.length]!;\n const key = buf.subarray(KEY_FILE_MAGIC.length + 1);\n if (key.length !== KEY_BYTES) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has wrong key size (${key.length} bytes, expected ${KEY_BYTES})`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: key.length },\n });\n }\n this.key = Buffer.from(key);\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n // Upgrade to passphrase-wrapped at rest if a passphrase is configured.\n this.migrateToWrappedIfPassphrase();\n return this.key;\n }\n\n // Wrong size — neither legacy nor versioned format\n throw new ConfigError({\n message:\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\n `(expected ${KEY_BYTES} for v1 or ${VERSIONED_KEY_FILE_SIZE} for v2+). ` +\n `Remove it manually to generate a new key.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: buf.length },\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n // Create a fresh key. Use sync APIs so the constructor-free getter\n // remains synchronous from the caller's perspective.\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const key = randomBytes(KEY_BYTES);\n // When a passphrase is configured, a brand-new key is written wrapped (v3)\n // from the start; otherwise the legacy raw-32-byte format is preserved.\n const passphrase = getVaultPassphrase();\n const initialBytes = passphrase ? wrapDataKey(key, 1, passphrase) : key;\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\n // to create the key file, only one succeeds and the loser gets EEXIST.\n try {\n fs.writeFileSync(this.keyFile, initialBytes, { mode: 0o600, flag: 'wx' });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // Another process won the race — re-read what they wrote.\n const buf = fs.readFileSync(this.keyFile);\n if (isWrappedKeyFile(buf)) {\n const { key: winnerKey, version } = unwrapDataKey(buf, this.keyFile);\n this.key = winnerKey;\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n if (buf.length === KEY_BYTES) {\n // Legacy v1 format\n this.key = buf;\n this._keyVersion = 1;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n if (buf.length === VERSIONED_KEY_FILE_SIZE) {\n // Versioned format\n const magic = buf.subarray(0, KEY_FILE_MAGIC.length);\n if (!magic.equals(KEY_FILE_MAGIC)) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has invalid magic header`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile },\n });\n }\n const version = buf[KEY_FILE_MAGIC.length]!;\n const winnerKey = buf.subarray(KEY_FILE_MAGIC.length + 1);\n this.key = Buffer.from(winnerKey);\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n throw new ConfigError({\n message:\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\n `(expected ${KEY_BYTES} for v1 or ${VERSIONED_KEY_FILE_SIZE} for v2+). ` +\n `Remove it manually to generate a new key.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: buf.length },\n });\n }\n this.key = key;\n this._keyVersion = 1;\n return key;\n }\n}\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n *\n * @param warn — callback for decryption warnings. Defaults to `console.warn`\n * for backward compatibility; pass `logger.warn` when a structured logger\n * is available (preferred in long-running/server contexts).\n */\nexport function decryptConfigSecrets<T>(\n cfg: T,\n vault: SecretVault,\n opts?: { warn?: (msg: string) => void },\n): T {\n const warn = opts?.warn ?? ((msg: string) => console.warn(msg));\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n warn(\n `[secret-vault] Failed to decrypt \"${key}\": ${err instanceof Error ? err.message : err}`,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(\n cfg: T,\n vault: SecretVault,\n _opts?: { warn?: (msg: string) => void },\n): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n * Use a named field with `isSecret: false` annotation if you must opt out —\n * see `NON_SECRET_OVERRIDES` below.\n */\nconst SECRET_KEY_PATTERN =\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nexport function isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n\n/**\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\n * fields encrypted. Used by the `wstack auth` subcommand.\n */\nexport async function rewriteConfigEncrypted(\n configPath: string,\n vault: SecretVault,\n patch?: Record<string, unknown>,\n): Promise<void> {\n let current: Record<string, unknown> = {};\n try {\n const raw = await fsp.readFile(configPath, 'utf8');\n current = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // start from empty\n }\n const merged = deepMerge(current, patch ?? {});\n const encrypted = encryptConfigSecrets(merged, vault);\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\n // atomicWrite: torn write here would erase every saved encrypted API key.\n await atomicWrite(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n await restrictFilePermissions(configPath);\n}\n\n/**\n * Scan a config file on disk for plaintext secret-bearing fields and\n * rewrite the file with them encrypted in place. Returns a count of how\n * many fields were migrated. Idempotent — calling on a fully-encrypted\n * file is a no-op and writes nothing. Used by the CLI on every boot so\n * users who had plaintext keys before the vault landed are upgraded\n * transparently.\n */\nexport async function migratePlaintextSecrets(\n configPath: string,\n vault: SecretVault,\n logger?: Pick<Logger, 'warn'>,\n): Promise<{ migrated: number; file: string }> {\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n return { migrated: 0, file: configPath };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { migrated: 0, file: configPath };\n }\n const counter = { n: 0 };\n const migrated = walkCount(parsed, vault, counter);\n if (counter.n === 0) return { migrated: 0, file: configPath };\n // atomicWrite: runs on every boot for legacy users — torn write = wipe.\n await atomicWrite(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n await restrictFilePermissions(\n configPath,\n logger ? { warn: (msg) => logger.warn(msg) } : undefined,\n );\n return { migrated: counter.n, file: configPath };\n}\n\n/**\n * Rotate the vault's encryption key and re-encrypt all secret-bearing\n * fields in a config file. This is the atomic key rotation operation:\n *\n * 1. Read the config file\n * 2. Decrypt all encrypted values with the old key\n * 3. Generate a new key (vault.rotateKey())\n * 4. Re-encrypt all values with the new key (new version prefix)\n * 5. Write the config file atomically\n *\n * Returns the number of fields re-encrypted and the version transition.\n * If the config file doesn't exist or has no encrypted fields, returns\n * { rotated: 0 } without modifying the key.\n */\nexport async function rotateConfigKeys(\n configPath: string,\n vault: RotatableSecretVault,\n logger?: Pick<Logger, 'warn' | 'info'>,\n): Promise<{ rotated: number; oldVersion: number; newVersion: number; file: string }> {\n const log = logger?.info ?? (() => {});\n const warn = logger?.warn ?? ((msg: string) => console.warn(msg));\n\n // Read the config file\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n // No config file — just rotate the key without re-encrypting anything\n const { oldVersion, newVersion } = vault.rotateKey();\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — no config file to re-encrypt`);\n return { rotated: 0, oldVersion, newVersion, file: configPath };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n warn(`[secret-vault] Config file ${configPath} is not valid JSON — skipping rotation`);\n return { rotated: 0, oldVersion: vault.keyVersion, newVersion: vault.keyVersion, file: configPath };\n }\n\n // Count encrypted fields and decrypt them\n const counter = { n: 0, failed: [] as string[] };\n const decrypted = walkDecryptCount(parsed, vault, counter);\n\n // Abort BEFORE rotating if any encrypted field could not be decrypted with\n // the current key. Rotation would discard the old key while these fields\n // still hold old-key ciphertext, and walkReencrypt skips already-encrypted\n // values — so they would become permanently undecryptable. Surface the\n // corruption and leave the key intact for the operator to investigate.\n if (counter.failed.length > 0) {\n throw new Error(\n `[secret-vault] Aborting key rotation: ${counter.failed.length} field(s) could not be decrypted ` +\n `with the current key and would be permanently lost on rotation: ${counter.failed.join(', ')}. ` +\n `Restore or remove these fields before rotating.`,\n );\n }\n\n if (counter.n === 0) {\n // No encrypted fields — just rotate the key\n const { oldVersion, newVersion } = vault.rotateKey();\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — no encrypted fields to re-encrypt`);\n return { rotated: 0, oldVersion, newVersion, file: configPath };\n }\n\n // Rotate the key (generates new key, increments version)\n const { oldVersion, newVersion } = vault.rotateKey();\n\n // Re-encrypt all secret fields with the new key\n const reencrypted = walkReencrypt(decrypted, vault);\n\n // Write the config file atomically\n await atomicWrite(configPath, JSON.stringify(reencrypted, null, 2), { mode: 0o600 });\n await restrictFilePermissions(configPath, { warn });\n\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — re-encrypted ${counter.n} field(s)`);\n return { rotated: counter.n, oldVersion, newVersion, file: configPath };\n}\n\n/**\n * Walk a config object, decrypt all encrypted values, and count them.\n * Returns a new object with decrypted values.\n *\n * `counter.failed` collects the key paths of any field that is encrypted but\n * could NOT be decrypted with the current key. These are left as-is (old\n * ciphertext). The caller MUST treat a non-empty `failed` list as a hard stop\n * before rotating: rotation discards the old key, and `walkReencrypt` skips\n * already-encrypted values, so a retained old-key ciphertext would become\n * permanently undecryptable. Surfacing it is strictly safer than entombing it.\n */\nfunction walkDecryptCount<T>(\n node: T,\n vault: SecretVault,\n counter: { n: number; failed: string[] },\n pathPrefix = '',\n): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item, i) =>\n walkDecryptCount(item, vault, counter, `${pathPrefix}[${i}]`),\n ) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n const keyPath = pathPrefix ? `${pathPrefix}.${k}` : k;\n if (typeof v === 'string' && vault.isEncrypted(v)) {\n try {\n out[k] = vault.decrypt(v);\n counter.n++;\n } catch {\n // Decryption failed — record the path and keep the old ciphertext.\n // The caller aborts rotation when counter.failed is non-empty, so\n // the old key is never discarded while this value still depends on it.\n counter.failed.push(keyPath);\n out[k] = v;\n }\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkDecryptCount(v, vault, counter, keyPath);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * Walk a config object and re-encrypt all secret-bearing fields.\n * Unlike encryptConfigSecrets, this encrypts ALL string values that\n * were previously decrypted (they're now plaintext), not just those\n * matching the secret field pattern. This ensures we re-encrypt values\n * that were successfully decrypted in walkDecryptCount.\n */\nfunction walkReencrypt<T>(node: T, vault: SecretVault): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkReencrypt(item, vault)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && v.length > 0 && !vault.isEncrypted(v)) {\n // This was a decrypted secret — re-encrypt it\n out[k] = vault.encrypt(v);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkReencrypt(v, vault);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * Restrict a file to owner-only access. On POSIX this is chmod 0o600.\n * On Windows, chmod is a no-op — we use icacls to remove inherited\n * permissions and grant only the current user. Failures are logged\n * but not thrown so callers are not blocked on unsupported platforms.\n */\nasync function restrictFilePermissions(\n filePath: string,\n opts?: { warn?: (msg: string) => void },\n): Promise<void> {\n const warn = opts?.warn ?? ((msg: string) => console.warn(msg));\n if (process.platform === 'win32') {\n try {\n const { execFile } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execFileAsync = promisify(execFile);\n const user = windowsAccountName();\n if (!user) {\n warn(\n `[secret-vault] Could not determine the current Windows user for ${filePath}; skipping icacls hardening.`,\n );\n return;\n }\n // Remove inherited ACEs, grant full control only to current user.\n await execFileAsync('icacls', [filePath, '/inheritance:r', '/grant:r', `${user}:(F)`]);\n } catch {\n // Best-effort: icacls may not be available in all environments.\n warn(\n `[secret-vault] Could not restrict permissions on ${filePath} — config file may be readable by other users on this system.`,\n );\n }\n } else {\n try {\n await fsp.chmod(filePath, 0o600);\n } catch {\n // Best-effort\n }\n }\n}\n\nfunction windowsAccountName(): string | undefined {\n const username = process.env.USERNAME || process.env.USER;\n if (!username || username.includes('\\0')) return undefined;\n const domain = process.env.USERDOMAIN;\n if (domain && !domain.includes('\\0')) return `${domain}\\\\${username}`;\n return username;\n}\n\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkCount(item, vault, counter)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\n out[k] = vault.encrypt(v);\n counter.n++;\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkCount(v, vault, counter);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/** Keys that, when written into a plain object, can poison the prototype\n * chain. We never want user config to carry these. */\nimport { deepMerge } from '../utils/deep-merge.js';\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { LogLevel, Logger } from '../types/logger.js';\nimport { color } from '../utils/color.js';\nimport { writeErr } from '../utils/term.js';\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nconst COLORS: Record<LogLevel, (s: string) => string> = {\n error: color.red,\n warn: color.yellow,\n info: color.cyan,\n debug: color.gray,\n trace: color.dim,\n};\n\nconst LOG_LEVELS = new Set<LogLevel>(['error', 'warn', 'info', 'debug', 'trace']);\nconst LOG_FORMATS = new Set<string>(['pretty', 'json']);\n\nexport type LogFormat = 'pretty' | 'json';\n\nexport interface DefaultLoggerOptions {\n level?: LogLevel | undefined;\n file?: string | undefined;\n /**\n * @deprecated Use `format: 'json'` instead. Kept for backward compat\n * with existing callers but has no effect on output — the `format`\n * option controls whether stderr receives pretty-printed or JSON lines.\n */\n pretty?: boolean | undefined;\n /** Output format for stderr. `pretty` (colored, human-readable) or `json` (machine-parseable). Defaults to `WRONGSTACK_LOG_FORMAT` env var, falling back to `pretty`. */\n format?: LogFormat | undefined;\n bindings?: Record<string, unknown>;\n /**\n * When false, suppress stderr output entirely — only write to the log\n * file (if configured). Use this in TUI mode so plugin/library log\n * messages don't interleave with Ink's terminal rendering.\n * Default: true (stderr output is enabled).\n */\n stderr?: boolean | undefined;\n /**\n * Rotate the log file once it exceeds this many bytes: the current file is\n * renamed to `<file>.1` (replacing any previous one) and a fresh file\n * starts. Bounds total disk to ~2× this value. Default 10 MB.\n */\n maxFileBytes?: number | undefined;\n}\n\nexport class DefaultLogger implements Logger {\n /** How many file writes between rotation size checks (statSync is not free). */\n private static readonly ROTATE_CHECK_EVERY = 100;\n\n level: LogLevel;\n private file?: string | undefined;\n private bindings: Record<string, unknown>;\n private format: LogFormat;\n private stderr: boolean;\n private maxFileBytes: number;\n private writesSinceRotateCheck = 0;\n /**\n * Serialized async tail for file writes. Every appendFile (and any\n * chained rotation) is awaited through this promise so file I/O\n * never overlaps itself — preserving the per-line ordering the\n * sync version had, but without blocking the caller thread. Any\n * rejection is swallowed (`catch(() => {})`) because logging must\n * never crash the host.\n *\n * Children share the parent's tail: `child.tail === parent.tail`\n * for the lifetime of the chain. Read/write access goes through\n * `_tail` so that, when a child has been wired to a parent, both\n * `enqueueRotate` and `log` always observe the parent's current tail\n * rather than a stale snapshot taken at `child()` time.\n */\n private tail: Promise<void> = Promise.resolve();\n private parent: DefaultLogger | null = null;\n\n /**\n * Resolve the current tail. For the root logger this is the field;\n * for a child logger we always read through the parent so that a\n * child's appends land on the parent's most recent tail, and a\n * parent's `flush()` waits for everything the child chained.\n */\n private get _tail(): Promise<void> {\n return this.parent ? this.parent._tail : this.tail;\n }\n private set _tail(next: Promise<void>) {\n if (this.parent) this.parent.tail = next;\n else this.tail = next;\n }\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? parseLogLevel(process.env.WRONGSTACK_LOG_LEVEL);\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.format = opts.format ?? parseLogFormat(process.env.WRONGSTACK_LOG_FORMAT);\n this.stderr = opts.stderr !== false; // default true\n this.maxFileBytes = opts.maxFileBytes ?? 10 * 1024 * 1024;\n if (this.file) {\n // Chain mkdir onto the file-write tail so the first append can't\n // race a still-pending mkdir (especially under tests that call\n // `flush()` immediately after `info()`). mkdir is best-effort;\n // a rejection only blocks subsequent appends in the chain that\n // observed it via the rejected promise, which would skip the\n // append — that is acceptable because ENOENT/EEXIST/EPERM all\n // either are no-ops or indicate an unrecoverable environment.\n const dir = path.dirname(this.file);\n this._tail = this._tail\n .then(async () => {\n await fsp.mkdir(dir, { recursive: true });\n })\n .catch(() => undefined);\n }\n }\n\n error(msg: string, ctx?: unknown): void {\n this.log('error', msg, ctx);\n }\n warn(msg: string, ctx?: unknown): void {\n this.log('warn', msg, ctx);\n }\n info(msg: string, ctx?: unknown): void {\n this.log('info', msg, ctx);\n }\n debug(msg: string, ctx?: unknown): void {\n this.log('debug', msg, ctx);\n }\n trace(msg: string, ctx?: unknown): void {\n this.log('trace', msg, ctx);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n // Construct without invoking the class constructor (which would mkdir\n // again and create a separate file-write tail). The parent and child\n // must share the same tail so `parent.flush()` waits for child\n // appends too — otherwise a test that flushes the parent after\n // `child.info(...)` would race the child append and observe an empty\n // file. Sharing the tail preserves the order the parent originally\n // had via its serialised file-write queue.\n const child = Object.create(DefaultLogger.prototype) as DefaultLogger;\n child.level = this.level;\n child.file = this.file;\n child.bindings = { ...this.bindings, ...bindings };\n child.format = this.format;\n child.stderr = this.stderr;\n child.maxFileBytes = this.maxFileBytes;\n child.parent = this;\n child.writesSinceRotateCheck = this.writesSinceRotateCheck;\n return child;\n }\n\n /**\n * Wait until all queued file writes (and any pending rotation) have\n * completed. `log()` is fire-and-forget by design — the caller never\n * blocks on disk — so tests, shutdown handlers, and processes that\n * need a deterministic \"everything is on disk now\" guarantee should\n * `await logger.flush()` before reading the file or exiting.\n */\n flush(): Promise<void> {\n return this._tail;\n }\n\n /**\n * Size-based rotation: when the file outgrows `maxFileBytes`, rename it to\n * `<file>.1` (dropping the previous `.1`) so the live file restarts empty.\n * Checked on the first write and every ROTATE_CHECK_EVERY writes after.\n * Best-effort: a rename can fail on Windows while another process holds\n * the file — the next check retries. Multiple processes appending to the\n * same log all run this check; whoever crosses the threshold first wins.\n *\n * Async: the rotation runs on the file-write tail (so its writes don't\n * interleave with the next append), and the caller never blocks on a\n * statSync / renameSync syscall on the hot log path.\n */\n private enqueueRotate(file: string): void {\n if (this.writesSinceRotateCheck++ % DefaultLogger.ROTATE_CHECK_EVERY !== 0) return;\n this._tail = this._tail\n .then(async () => {\n let st;\n try {\n st = await fsp.stat(file);\n } catch {\n return; // file missing — nothing to rotate\n }\n if (st.size < this.maxFileBytes) return;\n try {\n await fsp.rm(`${file}.1`, { force: true });\n await fsp.rename(file, `${file}.1`);\n } catch {\n // file locked, or raced by another process — ignore\n }\n })\n .catch(() => undefined);\n }\n\n private log(level: LogLevel, msg: string, ctx?: unknown): void {\n const r = LEVEL_RANK[level];\n const allowed = LEVEL_RANK[this.level];\n if (r > allowed) return;\n const ts = new Date().toISOString();\n const entry: Record<string, unknown> = { ts, level, msg, ...this.bindings };\n if (ctx !== undefined) {\n entry.ctx = ctx instanceof Error ? { message: ctx.message, stack: ctx.stack } : ctx;\n }\n // Disk: JSON line. Serialized through `_tail` so concurrent log\n // calls preserve per-line order without blocking the caller on\n // sync file I/O. Children route through their parent's tail, so\n // a parent's `flush()` waits for every chained child append.\n if (this.file) {\n this.enqueueRotate(this.file);\n const line = `${JSON.stringify(entry)}\\n`;\n this._tail = this._tail\n .then(() => fsp.appendFile(this.file!, line))\n .catch(() => undefined);\n }\n // Stderr: pretty or json. Suppressed when this.stderr is false (TUI mode)\n // so plugin/library log messages don't interleave with Ink's rendering.\n if (!this.stderr) return;\n if (this.format === 'json') {\n writeErr(`${JSON.stringify(entry)}\\n`);\n } else {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n writeErr(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n writeErr(`${head}\\n`);\n }\n }\n }\n}\n\nfunction parseLogLevel(raw: string | undefined): LogLevel {\n return raw && LOG_LEVELS.has(raw as LogLevel) ? (raw as LogLevel) : 'info';\n}\n\nfunction parseLogFormat(raw: string | undefined): LogFormat {\n return raw && LOG_FORMATS.has(raw) ? (raw as LogFormat) : 'pretty';\n}\n\nfunction formatCtx(ctx: unknown): string {\n if (ctx instanceof Error) return color.dim(ctx.message);\n if (typeof ctx === 'string') return color.dim(ctx);\n try {\n return color.dim(JSON.stringify(ctx));\n } catch {\n return color.dim(String(ctx));\n }\n}\n\n/**\n * A logger that silently discards all messages. Used during boot before\n * the real logger is configured, and in test contexts where logging\n * would be noise.\n */\nexport const noOpLogger: Logger = {\n // 'error' is the quietest level the Logger contract offers; the methods\n // discard everything regardless, this only matters to level checks.\n level: 'error',\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n trace: () => {},\n child: () => noOpLogger,\n};\n","import type { EventBus } from '../kernel/events.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { Usage } from '../types/provider.js';\nimport type { CacheStats, TokenCounter } from '../types/token-counter.js';\n\ninterface PriceEntry {\n input?: number | undefined;\n output?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nconst PRICE_CACHE_MAX_SIZE = 100;\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry | undefined;\n private readonly providerId?: string | undefined;\n private readonly events?: EventBus | undefined;\n private priceCache = new Map<string, PriceEntry>();\n /** Most recently accounted request's tokens. Used for per-request context pressure. */\n private lastInput = 0;\n private lastCacheRead = 0;\n\n constructor(opts: { registry?: ModelsRegistry | undefined; providerId?: string | undefined; events?: EventBus | undefined } = {}) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n }\n\n account(usage: Usage, model?: string): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n this.emitAccounted();\n return;\n }\n\n if (this.registry && this.providerId && model) {\n // Evict oldest entry when cache is full before async lookup.\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0] ?? '');\n }\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n // Token totals are authoritative even when pricing is unresolved.\n // Emit after the lookup settles so live UIs update for unknown models\n // without double-emitting when pricing is resolved.\n this.emitAccounted();\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', { model: model ?? '<unknown>' });\n this.emitAccounted();\n return undefined;\n });\n return;\n }\n\n // No pricing source exists. Still emit token totals so live UIs do not stay\n // at 0 just because cost cannot be estimated.\n this.emitAccounted();\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n const price = priceFromModel(resolved);\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0] ?? '');\n }\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n this.emitAccounted();\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n currentRequestTokens(): { input: number; cacheRead: number } {\n return { input: this.lastInput, cacheRead: this.lastCacheRead };\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n private emitAccounted(): void {\n this.events?.emit('token.accounted', {\n usage: this.total(),\n cost: { input: this.costInput, output: this.costOutput, total: this.costInput + this.costOutput },\n });\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n this.lastInput = 0;\n this.lastCacheRead = 0;\n this.emitAccounted();\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n const hasCacheWriteSplit = usage.cacheWrite5m !== undefined || usage.cacheWrite1h !== undefined;\n const cacheWrite5m = usage.cacheWrite5m ?? (hasCacheWriteSplit ? 0 : usage.cacheWrite);\n const cacheWrite1h = usage.cacheWrite1h ?? 0;\n if (cacheWrite5m && (price.cacheWrite5m ?? price.cacheWrite)) {\n this.costInput += (cacheWrite5m / 1_000_000) * (price.cacheWrite5m ?? price.cacheWrite ?? 0);\n }\n if (cacheWrite1h && (price.cacheWrite1h ?? price.cacheWrite)) {\n this.costInput += (cacheWrite1h / 1_000_000) * (price.cacheWrite1h ?? price.cacheWrite ?? 0);\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n cacheWrite5m: m.cost?.cache_write_5m ?? m.cost?.cache_write,\n cacheWrite1h: m.cost?.cache_write_1h ?? (m.cost?.input !== undefined ? m.cost.input * 2 : undefined),\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","export type MemoryScope = 'project-agents' | 'project-memory' | 'user-memory';\n\n// ── Memory categories ──────────────────────────────────────────────────\n\nexport type MemoryType = 'fact' | 'decision' | 'convention' | 'preference' | 'reference' | 'anti_pattern';\n\nexport const MEMORY_TYPE_LABELS: Record<MemoryType, string> = {\n fact: 'Fact',\n decision: 'Decision',\n convention: 'Convention',\n preference: 'Preference',\n reference: 'Reference',\n anti_pattern: 'Anti-pattern',\n};\n\nexport type MemoryPriority = 'critical' | 'high' | 'medium' | 'low';\n\nexport interface MemoryEntry {\n scope: MemoryScope;\n text: string;\n ts: string;\n /** Category — helps the agent decide whether to inject or ignore. */\n type?: MemoryType | undefined;\n /** Free-form tags for grouping (e.g. [\"build\", \"pnpm\", \"typescript\"]). */\n tags?: string[] | undefined;\n /** Priority — critical entries are always injected; low may be skipped. */\n priority?: MemoryPriority | undefined;\n /** Session or agent that created this entry. */\n source?: string | undefined;\n /** 0.0–1.0 confidence. Low-confidence entries are injected less often. */\n confidence?: number | undefined;\n /** ISO timestamp of last access (read or injection into context). */\n lastAccessed?: string | undefined;\n}\n\n// ── Memory events — emitted by DefaultMemoryStore so plugins can react ──\n\nexport interface MemoryRememberedPayload {\n scope: MemoryScope;\n text: string;\n ts: string;\n type?: MemoryType | undefined;\n tags?: string[] | undefined;\n priority?: MemoryPriority | undefined;\n}\n\nexport interface MemoryForgottenPayload {\n scope: MemoryScope;\n query: string;\n removed: number;\n}\n\nexport interface MemoryClearedPayload {\n /** Scope that was cleared, or undefined when all scopes were cleared. */\n scope?: MemoryScope | undefined;\n}\n\nexport interface MemoryConsolidatedPayload {\n scope: MemoryScope;\n /** Entries removed by deduplication. */\n removed: number;\n}\n\n// ── Relevance scoring ──────────────────────────────────────────────────\n\n/**\n * Context used to score memory relevance for context injection.\n * Passed by the system prompt builder.\n */\nexport interface MemoryRelevanceContext {\n /** Current user message or task description. */\n currentTask: string;\n /** Active skills in this session (e.g. [\"typescript-strict\", \"git-flow\"]). */\n activeSkills?: string[] | undefined;\n /** Active mode (e.g. \"Teach\", \"Brief\", \"Code Reviewer\"). */\n activeMode?: string | undefined;\n /** Available tools — memories referencing relevant tools score higher. */\n toolNames?: string[] | undefined;\n}\n\nexport interface ScoredEntry extends MemoryEntry {\n score: number;\n matchReason: string;\n}\n\n// ── Store interface ────────────────────────────────────────────────────\n\nexport interface MemoryStore {\n readAll(): Promise<string>;\n read(scope: MemoryScope): Promise<string>;\n remember(text: string, scope?: MemoryScope, metadata?: Omit<Partial<MemoryEntry>, 'scope' | 'text' | 'ts'>): Promise<void>;\n forget(query: string, scope?: MemoryScope): Promise<number>;\n consolidate(scope: MemoryScope): Promise<void>;\n clear(scope?: MemoryScope): Promise<void>;\n /** List entries, newest first. */\n list(scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /** Search by content (substring or semantic). */\n search(query: string, scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /** Access the backend for advanced queries. */\n getBackend?(): unknown;\n /** Graph-based related memory traversal. */\n findRelated?(text: string, scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /**\n * Score and rank memories by relevance to the current context.\n * Returns only entries that meet a relevance threshold.\n */\n scoreRelevant?(ctx: MemoryRelevanceContext, scope?: MemoryScope, limit?: number): Promise<ScoredEntry[]>;\n /**\n * Attach a trace ID to this store so that all subsequent `storage.*`\n * events include it for observability correlation. Mutates the store\n * in place and returns the same instance (convenience chaining).\n */\n withTraceId(traceId: string): MemoryStore;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateMessageTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\n/**\n * Instrumentation state for compaction hot-path analysis.\n * Tracks actual vs. nominal iteration counts to detect O(n·m) blowup.\n *\n * Logged as structured events so they can be aggregated from session JSONL\n * and plotted per-message-count to catch regressions before they ship.\n */\ninterface CompactionMetrics {\n /** Total messages in the compaction pass. */\n messageCount: number;\n /** Index where the preserved window starts (from findPreserveStart). */\n preserveStart: number;\n /** Outer-loop iterations in the elision fast-path scan. */\n fastPathIterations: number;\n /**\n * Inner-loop block iterations in the fast-path scan.\n * Ratio fastPathInner / fastPathIterations indicates avg blocks per message.\n */\n fastPathInnerIterations: number;\n /**\n * Outer-loop iterations in the full elision pass.\n * A targeted pass starts at the first oversized old tool block and stops at\n * the preserve boundary, so this should stay well below messageCount when\n * the fast-path hit is late in the old window.\n */\n fullPassIterations: number;\n /**\n * Inner-loop block iterations in the full elision pass.\n * Ratio fullPassInner / fullPassIterations indicates avg blocks per message.\n */\n fullPassInnerIterations: number;\n /** Estimated tokens saved by the elision pass. */\n tokensSaved: number;\n /** Whether the full elision pass made any changes. */\n changed: boolean;\n}\n\n/**\n * Whether compaction instrumentation should be emitted to stdout.\n * Gated behind WRONGSTACK_DEBUG=1 or NODE_ENV=development so the hot path\n * does not pay for JSON.stringify + console.log on every compaction pass\n * in production. Matches the guard at the ratio-guard site (line ~281).\n */\nfunction compactionDebugEnabled(): boolean {\n return process.env['NODE_ENV'] === 'development' || process.env['WRONGSTACK_DEBUG'] === '1';\n}\n\n/** Emit compaction instrumentation as a structured log event (debug-only). */\nfunction emitCompactionMetrics(event: string, metrics: CompactionMetrics): void {\n if (!compactionDebugEnabled()) return;\n console.log(\n JSON.stringify({\n level: 'debug',\n event,\n messageCount: metrics.messageCount,\n preserveStart: metrics.preserveStart,\n fastPathIterations: metrics.fastPathIterations,\n fastPathInnerIterations: metrics.fastPathInnerIterations,\n // Ratios — anything > 2.0 indicates the inner loop is running more than expected\n fastPathInnerPerOuter:\n metrics.fastPathIterations > 0\n ? metrics.fastPathInnerIterations / metrics.fastPathIterations\n : 0,\n fullPassIterations: metrics.fullPassIterations,\n fullPassInnerIterations: metrics.fullPassInnerIterations,\n fullPassInnerPerOuter:\n metrics.fullPassIterations > 0\n ? metrics.fullPassInnerIterations / metrics.fullPassIterations\n : 0,\n tokensSaved: metrics.tokensSaved,\n changed: metrics.changed,\n }),\n );\n}\n\n/**\n * Token estimate for a message array (text + tool I/O). Re-exported from the\n * canonical `token-estimate` helper so compactors and the context-pressure\n * monitor share one number.\n */\nexport const estimateMessages = estimateMessageTokens;\n\n/**\n * Shared, pure compaction primitives.\n *\n * Before this module the three compactors (`HybridCompactor`,\n * `IntelligentCompactor`, `SelectiveCompactor`) each carried their own copies\n * of message-token estimation, tool-result elision, text detection and digest\n * rendering — with subtle divergences (notably Selective lacked the\n * tool_use/tool_result pair preservation, so it could elide the result of a\n * tool call it was supposed to keep). These helpers are the single source of\n * truth. They operate on plain `Message[]` and never touch `Context`/state, so\n * each compactor keeps its own `ctx.state.replaceMessages(...)` plumbing.\n */\n\n/** Does this message carry any non-empty text? */\nexport function hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n}\n\n/**\n * Index where the preserved (recent) window starts. Walks back counting\n * user/assistant messages until `preserveK` are covered, then walks forward to\n * keep any tool_use/tool_result protocol pair intact — so a tool_result whose\n * tool_use is preserved is never elided.\n *\n * Instrumentation: emits `compaction.find_preserve_start.ended` with the\n * repair-loop block count so we can track whether protocol-pair repair is\n * scanning too much content.\n */\nexport function findPreserveStart(messages: readonly Message[], preserveK: number): number {\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // If the preserved window starts on a user tool_result, widen backward to\n // include the immediately preceding assistant tool_use. This keeps provider\n // protocol adjacency intact and avoids orphaned results after compaction.\n let pairRepairIterations = 0;\n let pairRepairInnerIterations = 0;\n while (preserveStart > 0) {\n pairRepairIterations++;\n const first = messages[preserveStart];\n const prev = messages[preserveStart - 1];\n if (!first || !prev || first.role !== 'user' || prev.role !== 'assistant') break;\n if (typeof first.content === 'string' || typeof prev.content === 'string') break;\n const pairCheck = hasMatchingToolPair(first.content, prev.content);\n pairRepairInnerIterations += pairCheck.iterations;\n if (!pairCheck.matched) break;\n preserveStart--;\n }\n\n if (compactionDebugEnabled()) {\n console.log(\n JSON.stringify({\n level: 'debug',\n event: 'compaction.find_preserve_start.ended',\n messageCount: messages.length,\n preserveK,\n preserveStart,\n pairRepairIterations,\n pairRepairInnerIterations,\n pairRepairInnerPerOuter:\n pairRepairIterations > 0 ? pairRepairInnerIterations / pairRepairIterations : 0,\n }),\n );\n }\n\n return preserveStart;\n}\n\nfunction hasMatchingToolPair(\n resultContent: readonly ContentBlock[],\n useContent: readonly ContentBlock[],\n): { matched: boolean; iterations: number } {\n let iterations = 0;\n let firstResultId: string | undefined;\n let resultIds: Set<string> | undefined;\n\n for (const block of resultContent) {\n iterations++;\n if (block.type !== 'tool_result') continue;\n if (firstResultId === undefined) {\n firstResultId = block.tool_use_id;\n } else {\n resultIds ??= new Set([firstResultId]);\n resultIds.add(block.tool_use_id);\n }\n }\n if (firstResultId === undefined) return { matched: false, iterations };\n\n for (const block of useContent) {\n iterations++;\n if (block.type !== 'tool_use') continue;\n if (resultIds ? resultIds.has(block.id) : block.id === firstResultId) {\n return { matched: true, iterations };\n }\n }\n\n return { matched: false, iterations };\n}\n\nexport interface EliseResult {\n /** New message array, or the same reference when nothing changed. */\n messages: Message[];\n /** Estimated tokens reclaimed. */\n saved: number;\n changed: boolean;\n}\n\n/**\n * Elide oversized tool I/O that falls before the preserve window. Pure:\n * returns a fresh array (or the same reference when unchanged). Replaces the\n * duplicate copies that lived in all three compactors.\n */\nexport function eliseOldToolResults(\n messages: readonly Message[],\n opts: { preserveK: number; eliseThreshold: number },\n): EliseResult {\n const preserveStart = findPreserveStart(messages, opts.preserveK);\n\n // ── Fast path: probe for oversized tool I/O ─────────────────────────────\n //\n // Instruments the ratio of actual iterations to message count so we can\n // detect whether the inner block-scan loop is O(n·m) as expected or has\n // regressed to quadratic behaviour.\n let hasOversized = false;\n let firstOversizedIndex = -1;\n let fastPathIterations = 0;\n let fastPathInnerIterations = 0;\n for (let i = 0; i < preserveStart && !hasOversized; i++) {\n fastPathIterations++;\n const msg = messages[i];\n if (!msg || !Array.isArray(msg.content)) continue;\n for (const b of msg.content) {\n fastPathInnerIterations++;\n const oversized =\n (b.type === 'tool_result' && estimateToolResultTokens(b.content) >= opts.eliseThreshold) ||\n (b.type === 'tool_use' && estimateToolInputTokens(b.input) >= opts.eliseThreshold);\n if (oversized) {\n hasOversized = true;\n firstOversizedIndex = i;\n break;\n }\n }\n }\n\n // ── Emit fast-path metrics (covers both fast-path hit and the early-exit) ──\n emitCompactionMetrics(\n hasOversized\n ? 'compaction.elision.fast_path.oversized_found'\n : 'compaction.elision.fast_path.no_oversized',\n {\n messageCount: messages.length,\n preserveStart,\n fastPathIterations,\n fastPathInnerIterations,\n fullPassIterations: 0,\n fullPassInnerIterations: 0,\n tokensSaved: 0,\n changed: false,\n },\n );\n\n if (!hasOversized) return { messages: messages as Message[], saved: 0, changed: false };\n\n // ── Targeted elision pass ────────────────────────────────────────────────\n //\n // The fast path already proved that every message before firstOversizedIndex\n // is below threshold, and preserveStart caps the old window. Only scan that\n // narrowed range, and only clone the message array/content array when an\n // actual replacement is made.\n let saved = 0;\n let changed = false;\n let fullPassIterations = 0;\n let fullPassInnerIterations = 0;\n let next: Message[] | undefined;\n for (let i = firstOversizedIndex; i < preserveStart; i++) {\n fullPassIterations++;\n const msg = messages[i];\n if (!msg || !Array.isArray(msg.content)) continue;\n const original = msg.content;\n let newContent: ContentBlock[] | undefined;\n for (let idx = 0; idx < original.length; idx++) {\n fullPassInnerIterations++;\n const b = original[idx];\n if (!b) continue;\n if (b.type === 'tool_use') {\n const tokens = estimateToolInputTokens(b.input);\n if (tokens < opts.eliseThreshold) continue;\n const elidedInput = summarizeToolUseInputElision(b, tokens);\n saved += Math.max(0, tokens - estimateToolInputTokens(elidedInput));\n newContent ??= original.slice();\n newContent[idx] = { ...b, input: elidedInput };\n continue;\n }\n\n if (b.type !== 'tool_result') continue;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < opts.eliseThreshold) continue;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: summarizeToolResultElision(b, tokens),\n is_error: b.is_error,\n };\n newContent ??= original.slice();\n newContent[idx] = elided;\n }\n if (newContent) {\n next ??= messages.slice() as Message[];\n next[i] = { ...msg, content: newContent };\n changed = true;\n }\n\n // ── Ratio guard: defensive assertion + conditional early-break ─────────\n //\n // Defensive assertion (threshold 10): fires in dev/debug if the inner loop\n // is running more than 10x what we'd expect per message. This catches\n // pathological regressions where a single message has hundreds of blocks.\n if (compactionDebugEnabled()) {\n const ratio = fullPassInnerIterations / fullPassIterations;\n\n if (ratio > 10) {\n // Defensive assertion: never expected in practice\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'compaction.elision.regression',\n message: `fullPassInnerPerOuter=${ratio.toFixed(2)} exceeds threshold 10 — possible O(n·m) regression`,\n messageCount: messages.length,\n fullPassIterations,\n fullPassInnerIterations,\n }),\n );\n }\n }\n }\n\n emitCompactionMetrics('compaction.elision.full_pass.ended', {\n messageCount: messages.length,\n preserveStart,\n fastPathIterations,\n fastPathInnerIterations,\n fullPassIterations,\n fullPassInnerIterations,\n tokensSaved: saved,\n changed,\n });\n\n return { messages: changed && next ? next : (messages as Message[]), saved, changed };\n}\n\nfunction summarizeToolUseInputElision(\n block: ToolUseBlock,\n tokens: number,\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(block.input ?? {})) {\n fields[key] = summarizeToolUseInputValue(value);\n }\n\n return {\n __elided_tool_input: `~${tokens} tokens; original arguments are in the session log`,\n tool: block.name,\n fields,\n };\n}\n\nfunction summarizeToolUseInputValue(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const oneLine = value.replace(/\\s+/g, ' ').trim();\n return oneLine.length <= 160 ? oneLine : `${oneLine.slice(0, 120)}...(${oneLine.length} chars)`;\n }\n if (Array.isArray(value)) {\n return `[array:${value.length}]`;\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n return `[object:${keys.slice(0, 8).join(',')}${keys.length > 8 ? ',...' : ''}]`;\n }\n return String(value);\n}\n\nfunction summarizeToolResultElision(block: ToolResultBlock, tokens: number): string {\n const parts = [`elided: ~${tokens} tokens`];\n if (block.name) parts.push(`tool=${block.name}`);\n const files = extractPathHints(block.content).slice(0, 5);\n if (files.length > 0) parts.push(`files=${files.join(', ')}`);\n const error = firstErrorLine(block.content);\n if (error) parts.push(`error=${error}`);\n return `[${parts.join('; ')}]`;\n}\n\nfunction extractPathHints(content: unknown): string[] {\n const text = typeof content === 'string' ? content : JSON.stringify(content);\n const out = new Set<string>();\n const re = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\n for (const match of text.matchAll(re)) {\n const clean = match[0]?.replace(/\\\\/g, '/').replace(/^[\"'`]+|[\"'`),;:]+$/g, '');\n if (clean && clean.length <= 220) out.add(clean);\n if (out.size >= 5) break;\n }\n return [...out];\n}\n\nfunction firstErrorLine(content: unknown): string | undefined {\n const text = typeof content === 'string' ? content : JSON.stringify(content);\n for (const line of text.split(/\\r?\\n/)) {\n if (\n !/\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm)\\b/i.test(\n line,\n )\n )\n continue;\n const trimmed = line.replace(/\\s+/g, ' ').trim();\n if (trimmed) return trimmed.slice(0, 180);\n }\n return undefined;\n}\n\n/**\n * Lossless textual digest of a message range. Every text block is kept verbatim\n * (across all roles, so prior `system` digests fold forward and nothing\n * accumulates as loss). `tool_use` / `tool_result` blocks are counted and\n * replaced with a marker rather than serialized — their payload is already\n * persisted in the session log. Empty/tool-only messages are skipped.\n */\nexport function buildLosslessDigest(messages: readonly Message[]): string {\n const lines: string[] = [];\n for (const m of messages) {\n let text: string;\n let omitted = 0;\n if (typeof m.content === 'string') {\n text = m.content;\n } else {\n const parts: string[] = [];\n for (const b of m.content) {\n if (isTextBlock(b)) parts.push(b.text);\n else if (b.type === 'tool_use' || b.type === 'tool_result') omitted++;\n }\n text = parts.join(' ');\n }\n if (text.trim().length === 0 && omitted === 0) continue;\n const marker = omitted > 0 ? ` [${omitted} tool call(s) omitted — see session log]` : '';\n lines.push(`[${m.role}]: ${text}${marker}`);\n }\n return lines.join('\\n');\n}\n\n// ── Content-aware scoring ─────────────────────────────────────────────────\n\n/** Importance score for a message — drives retention vs. summarization. */\nexport type ContentScore = 0 | 1 | 2 | 3 | 4 | 5;\n// 5 = critical (error, correction, decision) — keep verbatim\n// 3 = medium (normal exchange, successful tool) — keep first sentence\n// 1 = low (large tool result, grep output) — one-line summary\n// 0 = noise (repeated failure pattern) — collapse to count\n\n/**\n * Extract the plain text from a message (ignoring tool blocks).\n * Returns empty string if no text content exists.\n */\nexport function extractText(m: Message): string {\n if (typeof m.content === 'string') return m.content;\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n}\n\n/** Check if a message contains a tool_use block. */\nexport function hasToolUse(m: Message): boolean {\n if (typeof m.content === 'string') return false;\n return m.content.some((b) => b.type === 'tool_use');\n}\n\n/** Check if a message contains a tool_result block over the given char threshold. */\nexport function hasLargeToolResult(m: Message, threshold = 3000): boolean {\n if (typeof m.content === 'string') return false;\n return m.content.some(\n (b) =>\n b.type === 'tool_result' &&\n (b as ToolResultBlock).content &&\n (typeof (b as ToolResultBlock).content === 'string'\n ? (b as ToolResultBlock).content.length\n : JSON.stringify((b as ToolResultBlock).content).length) > threshold,\n );\n}\n\n/**\n * Score a message by content importance.\n *\n * CRITICAL (5): user corrections, explicit \"no/wrong/stop\", error messages,\n * architecture decisions, security findings.\n * MEDIUM (3): normal exchanges, successful tool calls, file reads, edits.\n * LOW (1): large tool results (>3K chars), grep/file-list outputs, boilerplate.\n * NOISE (0): repeated identical failures (same tool, same error, 5th+ occurrence\n * within the range), pure tool I/O with no text.\n */\nexport function scoreMessage(\n m: Message,\n context?: { failureCounts?: Map<string, number> },\n): ContentScore {\n const text = extractText(m).toLowerCase();\n\n // ── Noise detection: pure tool I/O with no text ─────────────────────\n if (text.trim().length === 0 && (hasToolUse(m) || typeof m.content !== 'string')) {\n const hasResult =\n typeof m.content !== 'string' && m.content.some((b) => b.type === 'tool_result');\n if (hasToolUse(m) || hasResult) return 0;\n }\n\n // ── Repeated failure detection ─────────────────────────────────────\n if (context?.failureCounts && m.role === 'user' && hasToolUse(m) === false) {\n // Check if this is a tool_result that matches a failure pattern\n const isFailure = /error|fail|exception|timeout|enonet|eacces|eperm|enoent|abort/i.test(text);\n if (isFailure) {\n // Build a key from the error type\n const errKey =\n /(error|fail|exception|timeout|enonet|eacces|eperm|enoent|abort)/i\n .exec(text)?.[0]\n ?.toLowerCase() ?? 'error';\n const count = (context.failureCounts.get(errKey) ?? 0) + 1;\n context.failureCounts.set(errKey, count);\n if (count >= 5) return 0; // 5th+ identical failure → noise\n if (count >= 3) return 1; // 3rd-4th → low priority\n }\n }\n\n // ── Critical: user corrections / stop signals ──────────────────────\n if (m.role === 'user') {\n if (\n /\\b(wrong|no\\b|stop\\b|don'?t\\b|actually|fix that|undo|revert|forget|ignore|skip)\\b/i.test(\n text,\n )\n ) {\n return 5;\n }\n }\n\n // ── Critical: error / exception messages ───────────────────────────\n if (\n /\\b(error|exception|fatal|critical|crash|panic|abort|segfault|core dump|undefined is not|null pointer|typeerror|referenceerror|syntaxerror)\\b/i.test(\n text,\n )\n ) {\n return 5;\n }\n\n // ── Critical: security findings ────────────────────────────────────\n if (\n /\\b(security|vulnerability|injection|xss|csrf|secret|apikey|api.key|hardcoded|leak|exploit|cve)\\b/i.test(\n text,\n )\n ) {\n return 5;\n }\n\n // ── Critical: architecture / design decisions ──────────────────────\n if (\n m.role === 'assistant' &&\n /\\b(architecture|design|approach|strategy|pattern|refactor|migrate|restructure|decision|trade.?off)\\b/i.test(\n text,\n )\n ) {\n return 5;\n }\n\n // ── Low: large tool results ────────────────────────────────────────\n if (hasLargeToolResult(m)) return 1;\n\n // ── Low: grep / list / tree outputs ────────────────────────────────\n if (\n m.role === 'user' &&\n !hasToolUse(m) &&\n /\\b(files_with_matches|count|found \\d+ match|directory tree|\\.\\.\\. and \\d+ more)\\b/i.test(text)\n ) {\n return 1;\n }\n\n // ── Default: medium ────────────────────────────────────────────────\n return 3;\n}\n\n/**\n * Build a content-aware digest of messages.\n *\n * Unlike `buildLosslessDigest` which preserves all text equally, this uses\n * `scoreMessage` to apply tiered treatment:\n * - Score 5 (critical): verbatim text\n * - Score 3 (medium): first sentence only\n * - Score 1 (low): one-line summary\n * - Score 0 (noise): collapsed to count marker\n */\nexport function buildSmartDigest(messages: readonly Message[]): string {\n const lines: string[] = [];\n const failureCounts = new Map<string, number>();\n let noiseCount = 0;\n\n for (const m of messages) {\n const score = scoreMessage(m, { failureCounts });\n const text = extractText(m);\n const toolCount = countToolBlocks(m);\n\n if (score === 0) {\n noiseCount++;\n continue;\n }\n\n const marker = toolCount > 0 ? ` [${toolCount} tool call(s)]` : '';\n let display: string;\n\n switch (score) {\n case 5: // Critical — keep verbatim\n display = text.trim();\n break;\n case 3: // Medium — first sentence\n display = firstSentence(text);\n break;\n case 1: // Low — one-line summary\n display = oneLineSummary(m, text);\n break;\n default:\n display = firstSentence(text);\n }\n\n if (display.length === 0 && toolCount === 0) continue;\n lines.push(`[${m.role}]: ${display}${marker}`);\n }\n\n if (noiseCount > 0) {\n lines.push(\n `[system]: ${noiseCount} low-importance turn(s) collapsed (repeated failures / pure tool I/O)`,\n );\n }\n\n return lines.join('\\n');\n}\n\nfunction countToolBlocks(m: Message): number {\n if (typeof m.content === 'string') return 0;\n return m.content.filter((b) => b.type === 'tool_use' || b.type === 'tool_result').length;\n}\n\nfunction firstSentence(text: string): string {\n const trimmed = text.trim();\n if (trimmed.length === 0) return '';\n const dot = trimmed.indexOf('. ');\n if (dot === -1) return trimmed.length > 150 ? `${trimmed.slice(0, 147)}…` : trimmed;\n const sentence = trimmed.slice(0, dot + 1);\n return sentence.length > 150 ? `${sentence.slice(0, 147)}…` : sentence;\n}\n\nfunction oneLineSummary(m: Message, text: string): string {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n // Pure tool result with no text\n if (typeof m.content !== 'string') {\n const results = m.content.filter((b) => b.type === 'tool_result');\n if (results.length > 0) {\n return `[${results.length} tool result(s) — see session log]`;\n }\n }\n return '[no text content]';\n }\n // Truncate to one line (~100 chars)\n const firstLine = trimmed.split('\\n')[0] ?? '';\n return firstLine.length > 100 ? `${firstLine.slice(0, 97)}…` : firstLine;\n}\n\n/**\n * Nearest safe cut boundary in [from, to]: the start of the exchange of the\n * closest user-with-text message. Returns -1 when no such boundary exists.\n */\nexport function findSafeBoundary(messages: readonly Message[], from: number, to: number): number {\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n return findExchangeStart(messages, i);\n }\n }\n return -1;\n}\n\n/**\n * Walk backwards from a user message to find where its logical exchange began\n * (just after the last assistant message that made no tool calls).\n */\nexport function findExchangeStart(messages: readonly Message[], userIndex: number): number {\n for (let i = userIndex - 1; i >= 0; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'assistant') {\n const hasToolUse = Array.isArray(m.content)\n ? m.content.some((b) => b.type === 'tool_use')\n : false;\n if (!hasToolUse) return i + 1;\n } else if (m.role === 'user') {\n return i;\n }\n }\n return 0;\n}\n","import type { Context } from '../core/context.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport { estimateRequestTokens } from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\nimport { buildContextEvidenceDigest } from '../utils/context-evidence.js';\nimport {\n buildLosslessDigest,\n buildSmartDigest,\n eliseOldToolResults,\n estimateMessages,\n hasTextContent,\n} from './compaction-core.js';\n\nexport interface CompactorOptions {\n preserveK?: number | undefined;\n eliseThreshold?: number | undefined;\n /**\n * Enable content-aware digest mode. When true, `collapseAncientTurns` uses\n * `buildSmartDigest` which scores messages by importance: critical content\n * (errors, corrections, decisions) is kept verbatim; normal exchanges get\n * first-sentence summaries; large tool outputs and repeated failures are\n * aggressively compressed. Defaults to false (lossless digest).\n */\n smart?: boolean | undefined;\n /**\n * @deprecated Ignored. Token estimation is centralized in\n * `compaction-core`/`token-estimate` so all compactors and the context-pressure\n * monitor agree on one number. Kept only for backward-compatible call sites.\n */\n estimator?: (((text: string) => number)) | undefined;\n}\n\n/**\n * Default tools config values shared across CLI and WebUI.\n * Import this instead of hardcoding to avoid cross-surface inconsistencies.\n * These mirror the values in BEHAVIOR_DEFAULTS (config-loader.ts).\n *\n * @deprecated Import from '../types/default-config.js' instead.\n * This re-export exists for backward compatibility.\n */\nexport { DEFAULT_TOOLS_CONFIG, DEFAULT_CONTEXT_CONFIG, DEFAULT_AUTONOMY_CONFIG } from '../types/default-config.js';\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly smart: boolean;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.smart = opts.smart ?? false;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean | undefined } = {}): Promise<CompactReport> {\n const beforeTokens = estimateMessages(ctx.messages);\n const beforeFull = this.estimateFullRequest(ctx);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision (shared core handles tool_use/tool_result pair preservation).\n const elide = eliseOldToolResults(ctx.messages, { preserveK, eliseThreshold });\n if (elide.changed) ctx.state.replaceMessages(elide.messages);\n if (elide.saved > 0) reductions.push({ phase: 'elision', saved: elide.saved });\n\n // Phase 2: lossless collapse of ancient turns into a single digest.\n // Preserves ALL textual content (instructions, decisions, conclusions);\n // only raw tool I/O is dropped (it remains in the session log). No sub-LLM call.\n let collapsedDigest: string | undefined;\n let evidenceDigest: string | undefined;\n if (opts.aggressive) {\n const phase2 = this.collapseAncientTurns(ctx, preserveK);\n if (phase2.saved > 0) reductions.push({ phase: 'summary', saved: phase2.saved });\n collapsedDigest = phase2.digest;\n evidenceDigest = phase2.evidenceDigest;\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = estimateMessages(ctx.messages);\n const afterFull = this.estimateFullRequest(ctx);\n const quality = checkCompactionQuality(ctx, {\n collapsedDigest,\n evidenceDigest,\n reduced: beforeTokens > afterTokens || beforeFull > afterFull,\n });\n return {\n before: beforeTokens,\n after: afterTokens,\n fullRequestTokensBefore: beforeFull,\n fullRequestTokensAfter: afterFull,\n reductions,\n collapsedDigest,\n evidenceDigest,\n quality,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n /**\n * Estimate the full API request token count: messages + systemPrompt + toolDefs.\n * This is the accurate figure for context-window pressure monitoring.\n */\n private estimateFullRequest(ctx: Context): number {\n return estimateRequestTokens(ctx.messages, ctx.systemPrompt, ctx.tools ?? []).total;\n }\n\n /**\n * Lossless rule-based collapse of ancient turns into a single digest message.\n *\n * Preserves ALL textual content of the collapsed range — user instructions,\n * assistant decisions/conclusions, and any prior digests (chained forward so\n * the digest stays lossless across repeated compactions). Only `tool_use` /\n * `tool_result` protocol blocks are dropped and replaced with a count marker;\n * their full payload already lives in the session log. No sub-LLM call.\n *\n * Returns the token savings and the digest text (for audit logging).\n */\n private collapseAncientTurns(\n ctx: Context,\n preserveK = this.preserveK,\n ): { saved: number; digest?: string | undefined; evidenceDigest?: string | undefined } {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - preserveK * 2);\n if (cutTarget <= 0) return { saved: 0 };\n\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget.\n let boundary = -1;\n for (let i = cutTarget; i < messages.length; i++) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n if (boundary <= 0) return { saved: 0 };\n\n const removed = messages.slice(0, boundary);\n const removedTokens = estimateMessages(removed);\n\n const historyDigest =\n this.smart\n ? buildSmartDigest(removed) ||\n `${removed.length} earlier turns (no textual content; tool I/O omitted; see session log)`\n : buildLosslessDigest(removed) ||\n `${removed.length} earlier turns (no textual content; tool I/O omitted; see session log)`;\n\n const evidenceDigest = buildContextEvidenceDigest(ctx);\n const digest = evidenceDigest\n ? `[context_state]\\n${evidenceDigest}\\n\\n[prior_history]\\n${historyDigest}`\n : historyDigest;\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_digest: ${digest}]`,\n };\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n return {\n saved: Math.max(0, removedTokens - estimateMessages([summaryMsg])),\n digest,\n evidenceDigest: evidenceDigest || undefined,\n };\n }\n}\n\nfunction checkCompactionQuality(\n ctx: Context,\n opts: {\n collapsedDigest?: string | undefined;\n evidenceDigest?: string | undefined;\n reduced: boolean;\n },\n): CompactReport['quality'] {\n const evidence = ctx.contextEvidence;\n const digest = `${opts.collapsedDigest ?? ''}\\n${opts.evidenceDigest ?? ''}`;\n const hasIntent = Boolean(evidence?.currentIntent?.text || /\\b(intent|goal|session_goals)\\b/i.test(digest));\n const hasPathTrail = Boolean(\n Object.keys(evidence?.fileGraph ?? {}).length > 0 ||\n (evidence?.toolCalls.length ?? 0) > 0 ||\n /\\b(dependency_graph|tool_trail|files=)\\b/i.test(digest),\n );\n const issues: string[] = [];\n if (opts.reduced && !hasIntent) issues.push('missing intent anchor');\n if (opts.reduced && !hasPathTrail) issues.push('missing tool/path trail');\n return {\n ok: issues.length === 0,\n hasIntent,\n hasPathTrail,\n issues,\n };\n}\n\nfunction readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n // Use AGENTS.md, not the bare .wrongstack directory. A bare .wrongstack/\n // directory can be the global config directory (~/.wrongstack), which is\n // NOT a project marker. Only .wrongstack/AGENTS.md signals a real\n // WrongStack project.\n '.wrongstack/AGENTS.md',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n const home = path.resolve(os.homedir());\n const startPath = path.resolve(start);\n while (dir !== root) {\n // Don't walk past the user home directory. Home often has stray\n // markers (.git for dotfile tracking, package.json from global\n // tooling) that are unrelated to the actual working directory.\n // When cwd IS home we still check markers there — this guard\n // only fires during the upward walk from a subdirectory.\n if (dir === home && dir !== startPath) {\n break;\n }\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return startPath;\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath) ? path.basename(absPath) : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string | undefined; projectRoot?: string | undefined }).fullPath = absPath;\n (err as Error & { fullPath?: string | undefined; projectRoot?: string | undefined }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","/**\n * Shared regex patterns used across execution and security-scanner.\n * Centralized here to avoid duplication and keep patterns in sync.\n */\n\n/** Matches Node.js ECONN* errors and fetch failure messages. */\nexport const NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { Config } from '../types/config.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor | undefined;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens|exceeds the context window|context window/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor | undefined;\n modelsRegistry?: ModelsRegistry | undefined;\n getConfig?: (() => Config) | undefined;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !isContextOverflowError(err)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const visibleModels = opts?.getConfig?.().providers?.[providerId]?.models;\n const candidates = provider.models.filter((m) => {\n if (visibleModels !== undefined && !visibleModels.includes(m.id)) return false;\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image'))\n return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nfunction isContextOverflowError(err: ProviderError): boolean {\n return CONTEXT_OVERFLOW_RE.test([\n err.message,\n err.body?.message,\n err.body?.type,\n err.body?.raw,\n ].filter(Boolean).join('\\n'));\n}\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n // AbortError can be thrown in both browser (DOMException) and Node (Error).\n // Guard with typeof check so Node builds don't reference the browser-only DOMException.\n if (\n typeof DOMException !== 'undefined' &&\n err instanceof DOMException &&\n err.name === 'AbortError'\n ) {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || isContextOverflowError(err)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}\n","import { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status === 599) return 5; // stream hang — transient, worth retrying aggressively\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","/**\n * Prompt library types — the canonical home for the prompt data model and the\n * loader/registry contracts. Has no internal dependencies so both `storage/`\n * (the writable store) and `execution/` (the layered loader) can import it\n * without creating a cycle.\n */\n\n/** Provenance of a prompt — which layer it came from. */\nexport type PromptSource = 'builtin' | 'user' | 'project' | 'synced';\n\n/**\n * The fourteen first-party categories shipped with the builtin dataset, plus\n * the `uncategorized` sentinel used when migrating legacy v1 entries. Builtin\n * prompts MUST use one of these (enforced by the dataset schema test); user and\n * project prompts may use any free-form string.\n */\nexport const BUILTIN_PROMPT_CATEGORIES = [\n 'coding',\n 'debugging',\n 'refactoring',\n 'testing',\n 'code-review',\n 'architecture',\n 'devops',\n 'documentation',\n 'data-analysis',\n 'writing',\n 'research',\n 'product',\n 'agentic-workflows',\n 'meta-prompting',\n 'uncategorized',\n] as const;\n\nexport type BuiltinPromptCategory = (typeof BUILTIN_PROMPT_CATEGORIES)[number];\n\n/**\n * Human-readable labels for the builtin categories (for UI chips / pickers).\n */\nexport const PROMPT_CATEGORY_LABELS: Record<BuiltinPromptCategory, string> = {\n coding: 'Coding',\n debugging: 'Debugging',\n refactoring: 'Refactoring',\n testing: 'Testing',\n 'code-review': 'Code Review',\n architecture: 'Architecture',\n devops: 'DevOps',\n documentation: 'Documentation',\n 'data-analysis': 'Data Analysis',\n writing: 'Writing',\n research: 'Research',\n product: 'Product',\n 'agentic-workflows': 'Agentic Workflows',\n 'meta-prompting': 'Meta-Prompting',\n uncategorized: 'Uncategorized',\n};\n\n/**\n * A prompt's category. Typed as a free-form string because user/project prompts\n * may invent their own; the builtin dataset is constrained to\n * {@link BUILTIN_PROMPT_CATEGORIES} by its schema.\n */\nexport type PromptCategory = BuiltinPromptCategory | (string & {});\n\nexport function isBuiltinCategory(value: string): value is BuiltinPromptCategory {\n return (BUILTIN_PROMPT_CATEGORIES as readonly string[]).includes(value);\n}\n\n/** A `{{name}}` placeholder declared by a prompt. */\nexport interface PromptVariable {\n /** Placeholder name as it appears between `{{ }}` (case-sensitive). */\n name: string;\n description?: string | undefined;\n default?: string | undefined;\n required?: boolean | undefined;\n /**\n * Closed set of allowed values. When present, surfaces render a dropdown\n * instead of a free text field and a supplied value outside the set is\n * reported as invalid by {@link renderPrompt}.\n */\n enum?: string[] | undefined;\n /**\n * UI hint: the value is expected to span multiple lines (pasted code, a\n * diff, a long passage). Surfaces render a textarea instead of a one-line\n * input. Has no effect on rendering — purely presentational.\n */\n multiline?: boolean | undefined;\n}\n\n/**\n * A reusable prompt. v2 schema. Legacy v1 entries (only `id/title/content/tags/\n * createdAt/updatedAt`) are upgraded lazily on read by `migratePromptEntry`.\n */\nexport interface PromptEntry {\n /** Stable unique handle (ULID for new entries; legacy short hex tolerated). */\n id: string;\n /** kebab-case stable key — the dedup key across layers and registry key. */\n slug: string;\n title: string;\n /** One-line summary shown in lists/pickers. */\n description: string;\n content: string;\n category: PromptCategory;\n /** Secondary facets (free-form). */\n tags: string[];\n source: PromptSource;\n favorite: boolean;\n /** `{{placeholder}}` variables this prompt expects, if any. */\n variables?: PromptVariable[] | undefined;\n author?: string | undefined;\n version?: string | undefined;\n license?: string | undefined;\n /** sha256 of `content` — set for builtin/synced entries for integrity. */\n checksum?: string | undefined;\n /** When a builtin was copy-on-written into the user layer, its origin slug. */\n forkedFrom?: string | undefined;\n createdAt: string;\n updatedAt: string;\n}\n\n/** One category with its prompt count, for picker chips. */\nexport interface PromptCategoryCount {\n id: PromptCategory;\n label: string;\n count: number;\n}\n\nexport interface PromptSearchOptions {\n category?: PromptCategory | undefined;\n /** Max results (default: unbounded). */\n limit?: number | undefined;\n}\n\n/**\n * Read-side contract over the three prompt layers (project > user > builtin),\n * merged and de-duplicated by slug. Mirrors `SkillLoader` in shape.\n */\nexport interface PromptLoader {\n /** All prompts across layers, project/user shadowing builtin by slug. */\n list(): Promise<PromptEntry[]>;\n /** Resolve by slug first, then by id. */\n find(slugOrId: string): Promise<PromptEntry | undefined>;\n /** Ranked search over title/description/content/tags, optional category filter. */\n search(query: string, opts?: PromptSearchOptions): Promise<PromptEntry[]>;\n /** Category counts across all layers, for UI chips. */\n categories(): Promise<PromptCategoryCount[]>;\n /**\n * Persist into the writable (user, or project when `scope:'project'`) layer.\n * Throws if the resolved target is the read-only builtin layer.\n */\n save(entry: PromptEntry, opts?: { scope?: 'user' | 'project' }): Promise<void>;\n /** Delete from a writable layer. Returns false if not found / builtin. */\n delete(slugOrId: string): Promise<boolean>;\n /**\n * Mark/unmark a prompt as favorite. Favoriting a builtin copies it down into\n * the user layer (copy-on-write, `source:'user'`, `forkedFrom:<slug>`).\n */\n setFavorite(slugOrId: string, favorite: boolean): Promise<PromptEntry | undefined>;\n /** Clear the internal cache so the next read re-scans disk. */\n invalidateCache(): void;\n}\n\n/**\n * The packed builtin index (also the shape a remote registry manifest mirrors\n * — see `types/prompt-registry.ts`).\n */\nexport interface PromptManifest {\n datasetVersion: number;\n generatedAt: string;\n count: number;\n categories: PromptCategoryCount[];\n prompts: PromptManifestRef[];\n}\n\nexport interface PromptManifestRef {\n id: string;\n slug: string;\n title: string;\n description: string;\n category: PromptCategory;\n tags: string[];\n checksum: string;\n /** Relative path of the per-prompt file within the dataset. */\n file: string;\n}\n","/**\n * Prompt registry / sync types — the contract for a remote prompt hub\n * (e.g. prompts.wrongstack.com) and the local installed-prompts manifest.\n *\n * The manifest shape intentionally mirrors the bundled dataset's\n * `data/prompts/index.json` (see `PromptManifest` in `types/prompt.ts`): the\n * builtin dataset IS a local registry, so builtin and synced prompts can flow\n * through one validation + diff path. This file defines the format and the\n * structural validator; the actual fetch/download is a deliberately small stub\n * (see `prompts/prompt-installer.ts`) — \"groundwork now, sync later\".\n */\nimport type { PromptCategory } from './prompt.js';\n\nexport interface PromptRegistryRef {\n id: string;\n slug: string;\n title: string;\n description: string;\n category: PromptCategory;\n tags: string[];\n /** sha256 of the prompt content — drives the update diff. */\n checksum: string;\n version?: string | undefined;\n license?: string | undefined;\n /** Optional direct URL to the full prompt JSON. */\n url?: string | undefined;\n}\n\nexport interface PromptRegistryManifest {\n registryVersion: 1;\n /** Where this manifest came from (hub URL or `owner/repo`). */\n source: string;\n generatedAt: string;\n prompts: PromptRegistryRef[];\n}\n\n/** One entry recorded in `~/.wrongstack/installed-prompts.json`. */\nexport interface InstalledPromptEntry {\n slug: string;\n /** The registry/source this prompt was pulled from. */\n source: string;\n /** The ref pinned at install (tag/branch/commit or manifest version). */\n ref: string;\n checksum: string;\n /** True once the prompt body has actually been written locally. */\n synced: boolean;\n installedAt: string;\n}\n\nexport interface PromptManifestData {\n version: 1;\n entries: InstalledPromptEntry[];\n}\n\n/** Result of validating an untrusted manifest. */\nexport type ManifestValidation =\n | { ok: true; manifest: PromptRegistryManifest }\n | { ok: false; errors: string[] };\n\nconst SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CHECKSUM_RE = /^[a-f0-9]{64}$/;\nconst MAX_STR = 4096;\n\n/**\n * Structurally validate an untrusted registry manifest. Treats the manifest as\n * DATA, not instructions: enforces slug charset, checksum format, and field\n * lengths so a malicious hub can't smuggle oversized or malformed entries into\n * the local store. Does NOT fetch prompt bodies.\n */\nexport function validateRegistryManifest(raw: unknown): ManifestValidation {\n const errors: string[] = [];\n if (!raw || typeof raw !== 'object') return { ok: false, errors: ['manifest is not an object'] };\n const m = raw as Record<string, unknown>;\n\n if (m['registryVersion'] !== 1) errors.push('registryVersion must be 1');\n if (typeof m['source'] !== 'string' || !m['source'])\n errors.push('source must be a non-empty string');\n if (typeof m['generatedAt'] !== 'string') errors.push('generatedAt must be a string');\n if (!Array.isArray(m['prompts'])) {\n errors.push('prompts must be an array');\n return { ok: false, errors };\n }\n\n const seen = new Set<string>();\n const refs: PromptRegistryRef[] = [];\n (m['prompts'] as unknown[]).forEach((p, i) => {\n if (!p || typeof p !== 'object') {\n errors.push(`prompts[${i}] is not an object`);\n return;\n }\n const r = p as Record<string, unknown>;\n const slug = r['slug'];\n if (typeof slug !== 'string' || !SLUG_RE.test(slug)) {\n errors.push(`prompts[${i}].slug invalid (must be kebab-case)`);\n return;\n }\n if (seen.has(slug)) {\n errors.push(`prompts[${i}].slug \"${slug}\" duplicated`);\n return;\n }\n seen.add(slug);\n if (typeof r['checksum'] !== 'string' || !CHECKSUM_RE.test(r['checksum'])) {\n errors.push(`prompts[${i}].checksum must be a 64-char sha256 hex`);\n return;\n }\n for (const field of ['id', 'title', 'description', 'category'] as const) {\n const v = r[field];\n if (typeof v !== 'string' || v.length === 0 || v.length > MAX_STR) {\n errors.push(`prompts[${i}].${field} must be a non-empty string under ${MAX_STR} chars`);\n return;\n }\n }\n const tags = Array.isArray(r['tags'])\n ? (r['tags'].filter((t) => typeof t === 'string') as string[])\n : [];\n refs.push({\n id: r['id'] as string,\n slug,\n title: r['title'] as string,\n description: r['description'] as string,\n category: r['category'] as string,\n tags,\n checksum: r['checksum'] as string,\n version: typeof r['version'] === 'string' ? r['version'] : undefined,\n license: typeof r['license'] === 'string' ? r['license'] : undefined,\n url: typeof r['url'] === 'string' ? r['url'] : undefined,\n });\n });\n\n if (errors.length > 0) return { ok: false, errors };\n return {\n ok: true,\n manifest: {\n registryVersion: 1,\n source: m['source'] as string,\n generatedAt: m['generatedAt'] as string,\n prompts: refs,\n },\n };\n}\n\nexport interface RegistryDiff {\n /** Slugs present in the manifest but not locally. */\n added: PromptRegistryRef[];\n /** Slugs present locally but whose checksum differs in the manifest. */\n updated: PromptRegistryRef[];\n /** Slugs present locally and identical in the manifest. */\n unchanged: PromptRegistryRef[];\n}\n\n/**\n * Compute what a pull WOULD change, by slug+checksum, against the prompts the\n * caller already has. Pure — no I/O, no writes.\n */\nexport function diffRegistry(\n local: { slug: string; checksum?: string | undefined }[],\n manifest: PromptRegistryManifest,\n): RegistryDiff {\n const localBySlug = new Map(local.map((e) => [e.slug, e.checksum]));\n const diff: RegistryDiff = { added: [], updated: [], unchanged: [] };\n for (const ref of manifest.prompts) {\n if (!localBySlug.has(ref.slug)) diff.added.push(ref);\n else if (localBySlug.get(ref.slug) !== ref.checksum) diff.updated.push(ref);\n else diff.unchanged.push(ref);\n }\n return diff;\n}\n","/**\n * Design Studio — curated frontend/mobile UI design kits.\n *\n * A \"design kit\" is a self-contained, selectable design direction (an aesthetic\n * + concrete design tokens + per-stack implementation guidance) that the model\n * commits to BEFORE writing UI code. Kits are surfaced progressively: a compact\n * menu is injected when frontend work is detected, and the heavy kit body is\n * only loaded once the model (or user) picks one — keeping per-turn tokens low.\n *\n * This mirrors the skills subsystem (`types/skill.ts` + `execution/skill-loader.ts`)\n * but adds the per-stack body selection and a token snapshot for visual pickers.\n */\n\n/** Target implementation stacks a kit can speak to. */\nexport const DESIGN_STACKS = ['web', 'react-native', 'flutter', 'swiftui', 'compose'] as const;\n\nexport type DesignStack = (typeof DESIGN_STACKS)[number];\n\nexport function isDesignStack(v: string): v is DesignStack {\n return (DESIGN_STACKS as readonly string[]).includes(v);\n}\n\nexport interface DesignKitManifest {\n id: string;\n name: string;\n /** One-line vibe shown in the menu, e.g. \"Restrained, Linear-style minimalism\". */\n aesthetic: string;\n /** Free-form tags for filtering. */\n tags: string[];\n /** Stacks this kit provides guidance for. */\n stacks: DesignStack[];\n /** Whether the kit ships light + dark themes (almost always true). */\n themes: string[];\n /** \"Best for…\" one-liner used in menu + pickers. */\n bestFor: string;\n version?: string | undefined;\n path: string;\n source: 'project' | 'user' | 'bundled';\n}\n\n/** A single theme's concrete token values (OKLCH strings, font names, etc.). */\nexport interface DesignTokenSet {\n [token: string]: string;\n}\n\n/** Parsed `tokens.json` — light + dark token snapshots used by visual pickers. */\nexport interface DesignKitTokens {\n light?: DesignTokenSet | undefined;\n dark?: DesignTokenSet | undefined;\n}\n\n/** Compact menu entry rendered into the request when frontend work is detected. */\nexport interface DesignKitEntry {\n id: string;\n name: string;\n aesthetic: string;\n bestFor: string;\n stacks: DesignStack[];\n source: DesignKitManifest['source'];\n}\n\n/**\n * Live Design Studio state stashed on `ctx.meta.designStudio`. Set by the\n * detection middleware (user intent + frontend file writes); read by the\n * request middleware that injects the menu / active-kit reminder.\n */\nexport interface DesignStudioState {\n /** True once frontend/UI work has been detected this session. */\n active: boolean;\n /** Detected target stack, if any. */\n stack?: DesignStack | undefined;\n /** What triggered activation (for transparency / debugging). */\n signals: string[];\n /** Kit id the model/user committed to, if any. */\n activeKit?: string | undefined;\n /**\n * User color/token overrides applied over the active kit's tokens. Keys are\n * token names (`primary`) applied to both themes, or theme-scoped\n * (`light.bg`/`dark.bg`). See `applyTokenOverrides`.\n */\n overrides?: Record<string, string> | undefined;\n}\n\nexport interface DesignKitLoader {\n list(): Promise<DesignKitManifest[]>;\n /** Structured entries for the compact menu. */\n listEntries(): Promise<DesignKitEntry[]>;\n find(id: string): Promise<DesignKitManifest | undefined>;\n /** Compact, model-facing menu of every available kit. */\n menuText(): Promise<string>;\n /**\n * Full kit body for a given stack. Strips frontmatter and, when `stack` is\n * provided, narrows stack-specific sections to that stack.\n */\n readBody(id: string, stack?: DesignStack | undefined): Promise<string>;\n /** Parsed `tokens.json` for a kit (light/dark snapshots), if present. */\n readTokens(id: string): Promise<DesignKitTokens | undefined>;\n /** The mandatory cross-cutting baseline (responsive / a11y / theming / motion). */\n foundationsText(stack?: DesignStack | undefined): Promise<string>;\n invalidateCache(): void;\n}\n","import type { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n {\n type: 'anthropic_key',\n regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g,\n },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n {\n type: 'stripe_key',\n regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g,\n },\n {\n type: 'telegram_bot_token',\n // Telegram tokens are of the form bot<digits>:<alphanum> in URL paths\n regex: /\\/bot\\d+:[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g,\n },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex:\n /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex:\n /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n // AI/ML provider keys — modern LLM services with well-known prefixes\n {\n type: 'huggingface_token',\n // HuggingFace tokens: hf_ followed by 34 alphanumeric chars\n regex: /(?<![A-Za-z0-9])hf_[A-Za-z0-9]{34}(?![A-Za-z0-9])/g,\n },\n {\n type: 'replicate_token',\n // Replicate tokens: r8_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])r8_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'perplexity_key',\n // Perplexity API keys: pplx- followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])pplx-[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'groq_key',\n // Groq API keys: gsk_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])gsk_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'bearer_token',\n // Anchored with alternation instead of negative lookahead — avoids V8\n // backtracking risk on adversarial input. Bounded at 512 chars.\n // Min 12 chars: some OAuth providers issue shorter-lived tokens (< 20\n // chars). A 12-char base64 string has ~71 bits of entropy — above the\n // threshold where random strings are unlikely to produce false matches.\n regex: /(?:^|[^A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{12,512}=*(?:$|[^A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Anchored with alternation instead of lookbehind to avoid backtracking.\n // Value bounded at 512 chars.\n regex: /(?:^|\\s)([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,512})['\"]?(?:\\s|$)/g,\n },\n];\n\n/**\n * `high_entropy_env` is the one pattern that needs special replacement logic\n * (it preserves the key name), so it runs in its own pass. Every other pattern\n * is folded into a single combined regex. Derive the split by type rather than\n * by hard-coded indices so adding/removing a pattern can't silently drop one.\n */\nconst SIMPLE_PATTERNS = PATTERNS.filter((p) => p.type !== 'high_entropy_env');\n\n/**\n * Combined single-pass regex for all simple patterns. Each alternative is a\n * capturing group so the callback can determine which original pattern fired\n * (only one group is non-undefined at match time). Order matches SIMPLE_PATTERNS\n * (longer/more-specific prefixes first). Relies on each simple pattern source\n * containing no internal capturing groups — only `(?:...)` and lookarounds.\n */\nconst COMBINED_REGEX = new RegExp(SIMPLE_PATTERNS.map((p) => `(${p.regex.source})`).join('|'), 'g');\n\n/** Separate pattern for high_entropy_env (different replacement logic). */\nconst HIGH_ENTROPY_REGEX = PATTERNS.find((p) => p.type === 'high_entropy_env')!.regex;\n\n/**\n * Replacements for the combined patterns, parallel to SIMPLE_PATTERNS. The\n * combined-regex callback indexes into this with the matched group's position.\n */\nconst COMBINED_REPLACEMENTS = SIMPLE_PATTERNS.map((p) => `[REDACTED:${p.type}]`);\n\n/**\n * Per-chunk cap. Splits long inputs into 64 KB chunks to keep scrub() memory\n * bounded. Real scrub() inputs (LLM responses, tool outputs) are typically\n * much smaller; this cap handles edge cases without impacting normal usage.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\n/**\n * Quick pre-scan: check if the text contains any substring that MUST be\n * present for a credential pattern to match. If none are found, the text\n * is guaranteed clean — skip all regex passes (2 total: 16-pattern combined + high_entropy_env).\n *\n * Each anchor is the shortest unique substring from the corresponding pattern.\n * V8's `String.includes()` is hand-tuned C++ — O(n) with near-zero overhead\n * for typical tool-output lengths (100–5000 chars). A single combined regex\n * via `text.search()` is consistently slower for this many alternatives.\n */\nfunction hasCredentialAnchors(text: string): boolean {\n return (\n text.includes('-----BEGIN') || // Private keys (most unique → cheap reject)\n text.includes('sk-') || // Anthropic + OpenAI keys\n text.includes('sk_') || // Stripe live/test keys\n text.includes('ghp_') || // GitHub PAT v1\n text.includes('github_pat_') || // GitHub PAT v2\n text.includes('eyJ') || // JWT\n text.includes('AKIA') || // AWS access key\n text.includes('AIza') || // GCP service key\n text.includes('xox') || // Slack token (xoxa/xoxb/xoxp/xoxo/xoxs)\n text.includes('Bearer ') || // Bearer token (space suffix reduces false positives)\n text.includes('/bot') || // Telegram bot token (URL path pattern)\n text.includes('hf_') || // HuggingFace token\n text.includes('r8_') || // Replicate token\n text.includes('pplx-') || // Perplexity API key\n text.includes('gsk_') || // Groq API key\n text.includes('_KEY=') || // High-entropy env vars: API_KEY=, SECRET_KEY=, ...\n text.includes('_TOKEN=') || // ACCESS_TOKEN=, AUTH_TOKEN=, ...\n text.includes('_SECRET=') || // API_SECRET=, CLIENT_SECRET=, ...\n text.includes('_PASSWORD=') || // DB_PASSWORD=, ROOT_PASSWORD=, ...\n text.includes('mongodb://') ||\n text.includes('mongodb+srv://') ||\n text.includes('postgres://') ||\n text.includes('postgresql://') ||\n text.includes('mysql://') ||\n text.includes('redis://')\n );\n}\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\n\n // Fast path: if no credential anchor substrings exist in the text,\n // none of the 17 regex patterns can match. Skip all regex work.\n // This covers the vast majority of tool outputs (~95% of calls on\n // typical sessions are file paths, status messages, diffs, etc.).\n if (!hasCredentialAnchors(text)) return text;\n\n // For oversize inputs, scrub in fixed chunks. We split on newlines\n // where possible so secrets that span a few hundred bytes still get\n // matched within a single chunk; only inputs above ~64 KB risk a\n // boundary cutting a secret in half, and those are uncommon.\n if (text.length <= SCRUB_CHUNK_BYTES) {\n return this.scrubOne(text);\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n let end = Math.min(i + SCRUB_CHUNK_BYTES, text.length);\n // Try to break on a newline near the boundary so we don't cut secrets.\n if (end < text.length) {\n const nl = text.lastIndexOf('\\n', end);\n if (nl > i + SCRUB_CHUNK_BYTES / 2) end = nl + 1;\n }\n out.push(this.scrubOne(text.slice(i, end)));\n i = end;\n }\n return out.join('');\n }\n\n private scrubOne(text: string): string {\n // Redundant guard: if we reached scrubOne via the chunked path, the\n // chunk may have been small enough to anchor-skip independently.\n if (!hasCredentialAnchors(text)) return text;\n\n // Pass 1: combined single-pass regex for all simple patterns. Each\n // alternative is a capturing group; only the group that matched is\n // non-undefined. The trailing offset/string args replace() appends are\n // always defined, so the matched group (which precedes them) is found first.\n let out = text.replace(\n COMBINED_REGEX,\n (match, ...groups) => {\n // groups[i] corresponds to SIMPLE_PATTERNS[i]; find which one fired.\n const idx = groups.findIndex((g) => g !== undefined);\n if (idx < 0) return match;\n const replacement = COMBINED_REPLACEMENTS[idx];\n return replacement !== undefined ? replacement : match;\n },\n );\n\n // Pass 2: high_entropy_env needs special handling — preserve the key name.\n out = out.replace(HIGH_ENTROPY_REGEX, (_match, group1, _group2) => {\n return `${group1}=[REDACTED:high_entropy_env]`;\n });\n\n return out;\n }\n\n /**\n * Recursively scrub every string value in an object/array graph. Secrets can\n * appear under any key — a URL query param, an `authorization` header, an\n * arbitrarily-named nested field — so we don't gate recursion on key names.\n * The per-string `scrub()` fast-path (anchor pre-scan) keeps this cheap: any\n * value without a credential anchor returns immediately without regex work.\n */\n scrubObject<T>(obj: T): T {\n const seen = new WeakSet();\n const visit = (v: unknown): unknown => {\n if (typeof v === 'string') return this.scrub(v);\n if (v === null || typeof v !== 'object') return v;\n if (seen.has(v as object)) return v;\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(visit);\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n out[k] = visit(val);\n }\n return out;\n };\n return visit(obj) as T;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { toErrorMessage } from '../utils/error.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\n/** Env var to override the models.dev base URL (e.g. for self-hosted mirrors). */\nconst ENV_URL_KEY = 'WRONGSTACK_MODELS_DEV_URL';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\nconst DEFAULT_REFRESH_TIMEOUT_MS = 15_000;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string | undefined;\n ttlSeconds?: number | undefined;\n fetchImpl?: typeof fetch | undefined;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload | undefined;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number | undefined;\n /**\n * Timeout in milliseconds for the models.dev network fetch. When exceeded,\n * the fetch is aborted and cache/stale fallback is used instead.\n * Defaults to 15 seconds. Set to `0` to disable (infinite wait).\n */\n refreshTimeoutMs?: number | undefined;\n /**\n * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload | undefined;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string | undefined;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string | undefined;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string | undefined;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload | undefined;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: ModelsDevPayload | undefined;\n private fetchedAt?: Date | undefined;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload | undefined;\n private readonly maxStaleAgeMs: number;\n private readonly refreshTimeoutMs: number;\n private readonly overlay?: ModelsDevPayload | undefined;\n private readonly overlayUrl?: string | undefined;\n private readonly overlayFile?: string | undefined;\n private readonly overlayCacheFile?: string | undefined;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? process.env[ENV_URL_KEY] ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n this.refreshTimeoutMs = opts.refreshTimeoutMs ?? DEFAULT_REFRESH_TIMEOUT_MS;\n this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean | undefined } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n const ageSeconds = Math.floor((Date.now() - this.fetchedAt.getTime()) / 1000);\n // eslint-disable-next-line no-console -- user-visible operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${toErrorMessage(err)}); ` +\n `using stale cache from ${formatAge(ageSeconds)} ago. Run \\`wstack models refresh\\` to retry.`,\n );\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n toErrorMessage(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const controller = new AbortController();\n /* v8 ignore next -- timing: the abort callback only fires if the real fetch exceeds the timeout */\n const timeout = setTimeout(() => controller.abort(), this.refreshTimeoutMs);\n try {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) {\n throw new Error(`ModelsRegistry: HTTP ${res.status} fetching ${this.url}`);\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(`ModelsRegistry: fetch timed out after ${this.refreshTimeoutMs}ms`);\n }\n throw err;\n }\n }\n\n /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n /* v8 ignore next -- unreachable: load() caches `payload` and short-circuits before re-calling loadOverlay non-forced */\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (hasEntries(this.overlay)) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (hasEntries(fetched)) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean | undefined }): Promise<\n ModelsDevPayload | undefined\n > {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n /* v8 ignore next -- best-effort: overlay-cache write failure is intentionally ignored */\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n const ageSeconds = Math.floor((Date.now() - new Date(cached.fetchedAt).getTime()) / 1000);\n // eslint-disable-next-line no-console -- operator-visible warning\n console.warn(\n `ModelsRegistry: overlay unavailable; using stale overlay from ${formatAge(ageSeconds)} ago.`,\n );\n return cached.payload;\n }\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? model.reasoningConfig !== undefined,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n reasoningConfig: model.reasoningConfig,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n\n/** Render a seconds-duration as a human-friendly \"Xh Ym\" or \"Xd\" string. */\nfunction formatAge(seconds: number): string {\n if (seconds < 60) return '<1m';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n if (seconds < 86400) {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\n }\n return `${Math.floor(seconds / 86400)}d`;\n}\n\nfunction hasEntries(payload: ModelsDevPayload | undefined): payload is ModelsDevPayload {\n return payload !== undefined && Object.keys(payload).length > 0;\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function modePrompt(id: string): string {\n for (const dir of modePromptDirCandidates()) {\n try {\n return readFileSync(path.join(dir, `${id}.md`), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nfunction modePromptDirCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../../instructions/modes'),\n path.resolve(here, '../instructions/modes'),\n path.resolve(here, 'instructions/modes'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","import { modePrompt } from './mode-prompts.js';\nexport interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[] | undefined;\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[] | undefined;\n /**\n * Skill names that are particularly relevant to this mode. The system\n * prompt builder appends a \"Suggested skills\" note so the model knows\n * which domain knowledge to leverage first. Skill must exist in the\n * loaded skill set to appear.\n */\n suggestedSkills?: string[] | undefined;\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string | undefined;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: modePrompt('code-reviewer'),\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n suggestedSkills: ['bug-hunter', 'security-scanner', 'typescript-strict', 'testing'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: modePrompt('code-auditor'),\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n suggestedSkills: ['security-scanner', 'bug-hunter', 'audit-log'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: modePrompt('architect'),\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n suggestedSkills: ['api-design', 'refactor-planner', 'node-modern', 'docker-deploy'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: modePrompt('debugger'),\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n suggestedSkills: ['bug-hunter', 'audit-log', 'observability'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: modePrompt('tester'),\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n suggestedSkills: ['testing', 'bug-hunter', 'typescript-strict'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: modePrompt('devops'),\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n suggestedSkills: ['docker-deploy', 'observability', 'security-scanner'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: modePrompt('refactorer'),\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n suggestedSkills: ['refactor-planner', 'typescript-strict', 'node-modern', 'testing'],\n },\n {\n id: 'ui-design',\n name: 'UI Design',\n description: 'Design-first frontend & mobile UI work (Design Studio)',\n prompt: modePrompt('ui-design'),\n tags: ['ui', 'frontend', 'mobile', 'design'],\n toolPreferences: ['design', 'write', 'edit', 'read', 'scaffold'],\n suggestedSkills: ['react-modern'],\n },\n {\n id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: modePrompt('brief'),\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n suggestedSkills: [],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: modePrompt('teach'),\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n suggestedSkills: ['prompt-engineering', 'skill-creator', 'node-modern', 'typescript-strict'],\n },\n {\n id: 'research-web',\n name: 'Research Web',\n description: 'Current-data research — search web, verify, inject findings into context',\n prompt: modePrompt('research-web'),\n tags: ['research', 'web', 'current-data', 'up-to-date'],\n toolPreferences: ['web_search', 'web_fetch', 'search', 'fetch', 'context_manager'],\n suggestedSkills: ['research-web', 'tech-stack', 'node-modern', 'security-scanner', 'react-modern'],\n },\n];\n","import { expectDefined } from '../utils/expect-defined.js';\nexport type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string | undefined;\n warnThreshold?: number | undefined;\n softThreshold?: number | undefined;\n hardThreshold?: number | undefined;\n preserveK?: number | undefined;\n eliseThreshold?: number | undefined;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null | undefined,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? expectDefined(getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID));\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)?.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { AgentError, ERROR_CODES } from '../types/errors.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n /** Stores the transport unsubscribe function so it can be called on stop(). */\n private _transportUnsubscribe?: ((() => void)) | undefined;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this._transportUnsubscribe = this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new AgentError({\n message: 'Bridge is stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n });\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Guard against concurrent calls reusing the same id. Without this check,\n // a second .set() would silently overwrite the first record — the original\n // caller's timer fires, deletes the entry, and resolves its promise, but\n // the second caller now has no entry to resolve when its timer fires.\n // Throwing here surfaces the caller bug rather than letting it hang.\n if (this.inflightGuards.has(correlationId)) {\n throw new AgentError({\n message: `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { correlationId },\n });\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new AgentError({\n message: `Request ${correlationId} timed out after ${timeout}ms`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { correlationId, timeoutMs: timeout },\n }));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n // Reject if stop() was called after the initial check and cleared\n // the guard — this prevents a request from being enqueued after\n // stop() has already released the lock on pendingRequests.\n if (!this.inflightGuards.has(correlationId)) {\n clearTimeout(timer);\n reject(new AgentError({\n message: 'Bridge stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n }));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new AgentError({\n message: 'Bridge stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n }));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n // Call the transport unsubscribe to clean up the subscription handler.\n // This prevents memory leaks when bridges are created and destroyed frequently.\n this._transportUnsubscribe?.();\n this._transportUnsubscribe = undefined;\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string | undefined,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType =\n | 'overview'\n | 'requirements'\n | 'architecture'\n | 'api'\n | 'data'\n | 'security'\n | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[] | undefined;\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[] | undefined;\n implements?: string[] | undefined;\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean | undefined;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[] | undefined;\n dependencies?: string[] | undefined;\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n {\n type: 'non-functional',\n priority: 'medium',\n acceptanceCriteria: [],\n blockedBy: [],\n implements: [],\n },\n ],\n};\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string | undefined;\r\n estimateHours?: number | undefined;\r\n actualHours?: number | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n parentId?: string | undefined;\r\n children?: string[] | undefined;\r\n createdAt: number;\r\n updatedAt: number;\r\n startedAt?: number | undefined; // set when status → in_progress\r\n completedAt?: number | undefined;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number | undefined;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[] | undefined;\r\n priority?: TaskPriority[] | undefined;\r\n type?: TaskType[] | undefined;\r\n assignee?: string[] | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0;\r\n let pending = 0;\r\n let inProgress = 0;\r\n let blocked = 0;\r\n let failed = 0;\r\n let review = 0;\r\n let estimatedHours = 0;\r\n let actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed':\r\n completed++;\r\n break;\r\n case 'pending':\r\n pending++;\r\n break;\r\n case 'in_progress':\r\n inProgress++;\r\n break;\r\n case 'blocked':\r\n blocked++;\r\n break;\r\n case 'failed':\r\n failed++;\r\n break;\r\n case 'review':\r\n review++;\r\n break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\n * Well-known tool capabilities used for authorization decisions.\n *\n * These are the preferred values for `Tool.capabilities`.\n * New capabilities should be added here with clear documentation.\n *\n * Philosophy (2026-06+):\n * - Prefer capabilities over exact tool name matching.\n * - Subagent guards and future policies should primarily key off capabilities.\n * - Name-based denylists are legacy and will be phased down.\n */\nexport const ToolCapabilities = {\n /** Can execute arbitrary commands in the user's shell (the `bash` tool). */\n SHELL_ARBITRARY: 'shell.arbitrary',\n\n /** Can execute a restricted set of commands (the `exec` tool). */\n SHELL_RESTRICTED: 'shell.restricted',\n\n /** Can read files inside the project (and possibly outside via symlinks if not guarded). */\n FS_READ: 'fs.read',\n\n /** Can write / modify / delete files inside the project. */\n FS_WRITE: 'fs.write',\n\n /** Can write files outside the current project root (very high risk). */\n FS_WRITE_OUTSIDE_PROJECT: 'fs.write.outside-project',\n\n /** Can perform outbound network requests. */\n NET_OUTBOUND: 'net.outbound',\n\n /** Proxies tools from external MCP servers (unknown capability). */\n MCP_PROXY: 'mcp.proxy',\n\n /** Can spawn or manage subagents / multi-agent tasks. */\n SUBAGENT_SPAWN: 'subagent.spawn',\n\n /** Can inspect fleet/subagent coordination state without mutating it. */\n COORDINATION_FLEET_READ: 'coordination.fleet.read',\n\n /** Can read or write inter-agent mailbox messages. */\n COORDINATION_MAIL: 'coordination.mail',\n\n /** Can schedule, inspect, or cancel in-session cron jobs. */\n COORDINATION_CRON: 'coordination.cron',\n\n /** Can mutate global or session configuration / trust state. */\n CONFIG_MUTATE: 'config.mutate',\n\n /** Can install packages or run package managers with side effects. */\n PACKAGE_INSTALL: 'package.install',\n} as const;\n\nexport type ToolCapability = (typeof ToolCapabilities)[keyof typeof ToolCapabilities];\n\n/**\n * Set of capabilities that are considered dangerous for subagents by default.\n * Subagents should not receive these capabilities unless the leader explicitly\n * allows the specific tool at spawn time.\n */\nexport const DANGEROUS_FOR_SUBAGENTS: readonly ToolCapability[] = [\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.SHELL_RESTRICTED,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.FS_WRITE_OUTSIDE_PROJECT,\n ToolCapabilities.MCP_PROXY,\n ToolCapabilities.SUBAGENT_SPAWN,\n ToolCapabilities.CONFIG_MUTATE,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Wide capability allowlist for subagents that the user has authorized to act\n * with full developer power (the CLI fleet host applies this to any subagent\n * that isn't given an explicit, narrower grant). It covers everything needed to\n * do real work end-to-end — read, write/edit inside the project, outbound\n * network, and shell/build/install — so a delegated coding or build agent runs\n * the same toolchain the leader would, without per-tool confirmation it cannot\n * answer.\n *\n * Deliberately EXCLUDED (require an explicit per-spawn `allowedCapabilities`\n * grant, because they escape the task's blast radius rather than perform it):\n * - `fs.write.outside-project` — writing outside the repo (e.g. ~/.ssh).\n * - `mcp.proxy` — third-party MCP tools (also hard-blocked by name).\n * - `subagent.spawn` — recursive delegation (the baseline prompt forbids it).\n * - `config.mutate` — rewriting trust/config is privilege escalation, not work.\n */\nexport const WIDE_SUBAGENT_CAPABILITIES: readonly ToolCapability[] = [\n ToolCapabilities.FS_READ,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.NET_OUTBOUND,\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.SHELL_RESTRICTED,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Check if a tool (or its capabilities array) includes any dangerous capability\n * for subagent execution.\n */\nexport function hasDangerousCapabilityForSubagents(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n): boolean {\n if (!toolOrCaps) return false;\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.some((c) => DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability));\n}\n\n/**\n * Check if a tool declares a specific capability (or any of the provided ones).\n */\nexport function hasCapability(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n capability: ToolCapability | ToolCapability[],\n): boolean {\n if (!toolOrCaps) return false;\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n const toCheck = Array.isArray(capability) ? capability : [capability];\n return toCheck.some((c) => caps.includes(c));\n}\n\n/**\n * Returns the intersection of a tool's capabilities with the dangerous set.\n * Useful for logging and audit trails.\n */\nexport function getDangerousCapabilities(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n): ToolCapability[] {\n if (!toolOrCaps) return [];\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.filter((c): c is ToolCapability =>\n DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability),\n );\n}\n","import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport {\n getDangerousCapabilities,\n hasDangerousCapabilityForSubagents,\n} from '../security/capabilities.js';\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Tool, ToolProgressEvent, ToolErrorCategory } from '../types/tool.js';\nimport { ToolErrorCategory as ToolErrorCategoryEnum } from '../types/tool.js';\nimport type {\n ToolBatchResult,\n ToolConfirmPendingResult,\n ToolExecutionOutput,\n ToolExecutorOptions,\n ToolExecutorStrategy,\n} from '../types/tool-executor.js';\nimport { toErrorMessage } from '../utils/error.js';\nimport { expectDefined } from '../utils/expect-defined.js';\nimport { validateAgainstSchema } from '../utils/json-schema-validate.js';\nimport { subjectForToolInput } from '../utils/tool-subject.js';\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\nimport { wstackGlobalRoot } from '../utils/wstack-paths.js';\nimport { FetchError, ToolValidationError } from '../types/errors.js';\nimport { MALFORMED_ARG_MARKERS } from '../types/tool-markers.js';\nimport type { ToolResultRenderMode } from '../types/config.js';\nimport { resolveToolResultRenderMode } from '../utils/tool-result-render-mode.js';\nimport type { ToolResultRenderModeConfig } from '../types/config.js';\nexport class ToolExecutor {\n /** Minimum gap between coalesced `partial_output` tool.progress emits. */\n static readonly PROGRESS_EMIT_INTERVAL_MS = 100;\n /** Max chars of accumulated stream text carried per coalesced emit (tail). */\n static readonly PROGRESS_TAIL_CHARS = 16_384;\n /** Max chars of the head (beginning of output) kept alongside the tail. */\n static readonly PROGRESS_HEAD_CHARS = 16_384;\n\n private readonly serializer;\n private readonly iterationTimeoutMs: number;\n private readonly maxToolTimeoutMs: number;\n\n constructor(\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\n private opts: ToolExecutorOptions,\n ) {\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.maxToolTimeoutMs = opts.maxToolTimeoutMs ?? 300_000;\n this.serializer = createToolOutputSerializer({\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\n });\n }\n\n /**\n * Clear the interactive confirm awaiter so the executor returns\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\n * the CLI to switch from inline prompts (REPL) to event-driven\n * confirmation (TUI) at runtime.\n */\n clearConfirmAwaiter(): void {\n this.opts.confirmAwaiter = undefined;\n }\n\n /**\n * Push the tool's per-tool result-render mode into the renderer as the\n * next-result render mode. The config key is `tools.resultRenderMode[name]`\n * — independent of the LLM-side `descriptionMode` so the two can be\n * toggled separately (`/tool read desc simple` vs `/tool read result\n * simple`). Defaults to `extend` when no entry is set.\n *\n * The hint is one-shot: the renderer consumes it on the next\n * `writeToolResult` call so an unset follow-up doesn't inherit a\n * previous tool's mode. Safe no-op when the renderer doesn't implement\n * `setResultRenderMode` (e.g. headless/test renderers).\n */\n private hintRenderMode(toolName: string): void {\n const renderer = this.opts.renderer;\n if (!renderer || typeof renderer.setResultRenderMode !== 'function') return;\n const modes: ToolResultRenderModeConfig | undefined = this.opts.resultRenderModes;\n const mode: ToolResultRenderMode = resolveToolResultRenderMode(modes, toolName);\n renderer.setResultRenderMode(toolName, mode);\n }\n\n /**\n * Execute a batch of tool uses using the configured strategy.\n * Returns the execution results and the remaining output budget.\n */\n async executeBatch(\n toolUses: ToolUseBlock[],\n ctx: Context,\n strategy: ToolExecutorStrategy,\n ): Promise<ToolBatchResult> {\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\n\n const runOne = async (use0: ToolUseBlock): Promise<ToolExecutionOutput> => {\n const start = Date.now();\n // `use` is rebindable because a PreToolUse hook may rewrite its input.\n let use = use0;\n const tool = this.registry.get(use.name);\n\n // Fast path: unknown tool\n if (!tool) {\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Strong guarantee: Validate input against the tool's declared JSON Schema\n // *before* permission checks or execution. This is a hard gate — bad calls\n // are rejected early with actionable feedback so the model can self-correct.\n const validation = validateAgainstSchema(use.input, tool.inputSchema);\n if (!validation.ok) {\n const errorDetails = validation.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}\\n\\n` +\n `Please call the tool again with arguments that match its inputSchema. ` +\n `You can use the \"tool-help\" tool with name=\"${tool.name}\" to see the exact expected schema.`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Capability safety net at the executor level (defense in depth).\n // Tools declaring dangerous capabilities are subject to stricter\n // permission enforcement in the post-policy block below (line ~150+).\n // In non-YOLO contexts, an `auto` permission is elevated to `confirm`\n // for dangerous-capability tools, reducing prompt-injection blast radius.\n const toolDangerousCaps = getDangerousCapabilities(tool);\n\n // Provider boundary: the model's tool arguments arrive as a raw JSON\n // string accumulated over streamed deltas. When that string is not a\n // valid JSON object (truncated, scalar, or mangled by a proxy/local\n // model), the parsers wrap it under a sentinel key instead of silently\n // producing `{}`. Executing the tool with such input yields a cryptic\n // \"<field> is required\" error that the model can't act on. Detect the\n // sentinel here and feed back an actionable message so the model\n // resends well-formed arguments.\n if (hasMalformedArguments(use.input)) {\n const result = this.malformedInputResult(use, extractMalformedRaw(use.input));\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // PreToolUse hooks: may block the call outright or rewrite its input.\n // Runs before the permission check so a hook can veto a tool that the\n // trust policy would otherwise auto-allow.\n if (this.opts.hookRunner?.has('PreToolUse')) {\n const pre = await this.opts.hookRunner.preToolUse(tool.name, use.input, ctx);\n if (pre.block) {\n const result = this.blockedByHookResult(use, pre.reason);\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n if (pre.input) {\n // P3 #19 (before-release.md): skip the re-validation when the hook\n // passed the input through unchanged. Most hooks either block or\n // return the original input verbatim — re-validating the same shape\n // the executor already validated above is wasted work. Use\n // node:util's isDeepStrictEqual for a structural, order-sensitive\n // comparison (tool inputs are plain JSON, so reference identity is\n // not enough — a hook may clone before returning).\n if (!isDeepStrictEqual(pre.input, use.input)) {\n // A hook rewrote the arguments — re-validate before trusting them.\n const reval = validateAgainstSchema(pre.input, tool.inputSchema);\n if (!reval.ok) {\n const errorDetails = reval.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `A PreToolUse hook rewrote the arguments for \"${tool.name}\" into an invalid shape.\\n\\n` +\n `Validation errors:\\n${errorDetails}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n use = { ...use, input: pre.input };\n }\n }\n }\n\n // P3 #16 (before-release.md): cross-field validation. Called after\n // schema validation and PreToolUse hooks (which may have rewritten\n // the input) but before permission checks and execution. Lets tools\n // express invariants the JSON Schema cannot (e.g. old_string !==\n // new_string) and get them rejected with the same error formatting.\n if (typeof tool.validate === 'function') {\n const crossFieldErrors = tool.validate(use.input);\n if (crossFieldErrors.length > 0) {\n const errorDetails = crossFieldErrors.map((e) => ` - ${e}`).join('\\n');\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n }\n\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\n\n // Post-permission dangerous capability enforcement (B-side guarantee).\n // Even after the permission policy has spoken, we apply an extra conservative\n // rule for tools that declare high-risk capabilities (shell arbitrary, write outside\n // project, mcp proxy, etc.). This reduces the blast radius of prompt injection.\n let effectivePermission = decision.permission;\n\n // YOLO is the user's explicit fast-path for normal project work, so it\n // waives the post-policy dangerous-capability net only after the permission\n // policy has already returned `auto`. Destructive-gated calls still arrive\n // here as `confirm` unless the destructive YOLO override is active. Outside\n // YOLO, a trust-file auto-allow for a shell tool still gets a confirm, so a\n // single trusted pattern can't silently widen into arbitrary shell.\n // Detected via optional methods so policies without them (AutoApprove,\n // test mocks) keep the stricter default.\n const policy = this.opts.permissionPolicy;\n const yolo = policy.getYolo?.() === true || policy.getYoloDestructive?.() === true;\n\n // An `auto` decision sourced from `'yolo'` is authoritative: it comes\n // either from the leader's explicit YOLO mode or from a subagent's\n // `AutoApprovePermissionPolicy`, which already enforces a capability\n // allowlist (and now requires every dangerous capability to be granted\n // explicitly). In both cases the allowlist IS the blast-radius control,\n // so the conservative downgrade below would be redundant — and for a\n // non-interactive subagent (no confirmAwaiter) it would turn a granted\n // write into a `confirm` that can never be answered. Trust-file `auto`\n // (source 'trust') is NOT waived: a single trusted pattern must not\n // silently widen into arbitrary dangerous-capability execution.\n const authoritativeAuto = decision.source === 'yolo';\n\n if (\n toolDangerousCaps.length > 0 &&\n effectivePermission === 'auto' &&\n !yolo &&\n !authoritativeAuto\n ) {\n // Outside yolo we force at least 'confirm' for dangerous-capability tools.\n effectivePermission = 'confirm';\n }\n\n if (effectivePermission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (effectivePermission === 'confirm') {\n if (this.opts.confirmAwaiter) {\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\n if (choice !== 'yes' && choice !== 'always') {\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" denied by user.`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n // fall through to execute\n } else {\n const suggestedPattern = subjectForToolInput(tool.name, use.input, tool.subjectKey) ?? tool.name;\n const pending: ToolConfirmPendingResult = {\n type: 'tool_confirm_pending',\n toolUseId: use.id,\n toolName: tool.name,\n input: use.input,\n suggestedPattern,\n };\n return { result: pending, tool, durationMs: Date.now() - start };\n }\n }\n\n // effectivePermission === 'auto' (after all safety layers)\n // Capability audit for observability.\n const toolCapsForAudit = hasDangerousCapabilityForSubagents(tool)\n ? (tool.capabilities ?? [])\n : [];\n\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\n // adapter or other Tracer is bound — zero overhead by default.\n // Skip JSON.stringify for the common case (no dangerous capabilities)\n // to avoid per-call serialization of a static empty array.\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\n 'tool.name': tool.name,\n 'tool.mutating': tool.mutating,\n 'tool.permission': tool.permission,\n 'tool.capabilities': toolCapsForAudit.length > 0\n ? JSON.stringify(tool.capabilities ?? [])\n : '[]',\n 'tool.has_dangerous_capabilities': toolCapsForAudit.length > 0,\n });\n try {\n // H2: executeTool returns the rendered block plus the exact byte\n // count it spent against the iteration output cap. The cap was\n // enforced inside `enforceCap`, so the spend is known without\n // any second `Buffer.byteLength` walk.\n let { block: result, bytes } = await this.executeTool(tool, use, ctx, budget);\n budget -= bytes;\n // PostToolUse hooks: observe the result and optionally append\n // context (e.g. a linter note) that the model sees alongside the\n // tool output. Append the post-hook bytes to the budget spend\n // without re-walking the full result content.\n if (this.opts.hookRunner?.has('PostToolUse')) {\n const post = await this.opts.hookRunner.postToolUse(\n tool.name,\n use.input,\n { content: String(result.content), isError: !!result.is_error },\n ctx,\n );\n if (post.additionalContext) {\n const appended = `\\n\\n${post.additionalContext}`;\n result = { ...result, content: `${result.content}${appended}` };\n // Only the appended bytes are new — the pre-hook portion was\n // already counted by enforceCap. Walking just the appended\n // tail is `O(additionalContext.length)`, never `O(content)`.\n // Floor at 0 to match `decrementBudget`'s pre-fix clamp.\n budget = Math.max(0, budget - Buffer.byteLength(appended, 'utf8'));\n }\n }\n span?.setAttribute('tool.is_error', !!result.is_error);\n span?.setAttribute(\n 'tool.output_bytes',\n typeof result.content === 'string' ? result.content.length : 0,\n );\n return { result, tool, durationMs: Date.now() - start };\n } catch (err) {\n const msg = toErrorMessage(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\n const { category, retryable, detail } = classifyToolError(err);\n this.hintRenderMode(tool.name);\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" threw: ${scrubbed}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n if (err instanceof Error) span?.recordError(err);\n span?.setAttribute('tool.is_error', true);\n span?.setAttribute('tool.error_category', category);\n span?.setAttribute('tool.error_retryable', retryable);\n if (detail) span?.setAttribute('tool.error_detail', detail);\n return { result, tool, durationMs: Date.now() - start };\n } finally {\n span?.end();\n }\n };\n\n // Run a single tool but never let an exception propagate to the\n // gather() below — `runOne` is already try/catch-wrapped for the\n // execution phase, but the *pre*-execution paths (permission policy,\n // confirmAwaiter) are unguarded and an unexpected throw there would\n // collapse Promise.all and lose every sibling's output. Wrap each\n // call so a per-tool failure becomes a per-tool error result.\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\n try {\n return await runOne(use);\n } catch (err) {\n const msg = toErrorMessage(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\n const { category, retryable, detail } = classifyToolError(err);\n const tool = this.registry.get(use.name);\n const toolName = tool?.name ?? use.name;\n this.hintRenderMode(toolName);\n this.opts.renderer?.writeToolResult(toolName, scrubbed, true);\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" execution failed: ${scrubbed}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n // Classification result is stored in the result for future retry logic;\n // span attributes are set in runOne's catch block (this err bubbles from there).\n void category;\n void retryable;\n void detail;\n return { result, tool, durationMs: 0 };\n }\n };\n\n if (strategy === 'sequential') {\n const outputs: ToolExecutionOutput[] = [];\n for (const use of toolUses) {\n if (use) outputs.push(await safeRun(use));\n }\n return { outputs, remainingBudget: budget };\n }\n\n if (strategy === 'parallel') {\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\n return { outputs, remainingBudget: budget };\n }\n\n // smart: non-mutating in parallel, then mutating sequentially\n const nonMutating: ToolUseBlock[] = [];\n const mutating: ToolUseBlock[] = [];\n for (const use of toolUses) {\n if (!use) continue;\n const tool = this.registry.get(use.name);\n if (tool?.mutating) mutating.push(use);\n else nonMutating.push(use);\n }\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\n const secondPass: ToolExecutionOutput[] = [];\n for (const use of mutating) {\n secondPass.push(await safeRun(use));\n }\n return {\n outputs: [...firstPass, ...secondPass],\n remainingBudget: budget,\n };\n }\n\n /**\n * Execute a single tool with timeout, permission check, and output capping.\n * Emits `tool.started` via the injected EventBus (if any) right before\n * invoking the tool — closes the observability gap between \"model decided\n * to call a tool\" and \"tool.executed\".\n */\n async executeTool(\n tool: Tool,\n use: ToolUseBlock,\n ctx: Context,\n budget: number,\n ): Promise<{ block: ToolResultBlock; bytes: number }> {\n this.opts.events?.emit('tool.started', {\n name: tool.name,\n id: use.id,\n input: use.input,\n });\n this.opts.renderer?.writeToolCall(tool.name, use.input);\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\n const text = this.serializer.serialize(output, { toolName: tool.name, input: use.input, tool });\n const scrubbed = this.opts.secretScrubber.scrub(text);\n const withArtifact = await maybePersistLargeToolOutput(tool.name, scrubbed, budget);\n // enforceCap already walks the text to compute bytes for the budget\n // cap. Carry the residual budget back as `bytes` so the caller can\n // deduct the spend without a second `Buffer.byteLength` walk — and\n // never falls back to `JSON.stringify` on a structured value.\n const { text: capped, newBudget } = this.serializer.enforceCap(withArtifact, budget);\n this.hintRenderMode(tool.name);\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\n return {\n block: {\n type: 'tool_result',\n tool_use_id: use.id,\n name: tool.name,\n content: capped,\n is_error: false,\n },\n // `budget - newBudget` is the exact byte count enforceCap spent\n // (capped at `budget` so a truncated output shows as `budget`\n // consumed, matching the pre-fix `decrementBudget` semantics).\n bytes: budget - newBudget,\n };\n }\n\n private async runWithTimeout(\n tool: Tool,\n input: unknown,\n parentSignal: AbortSignal,\n ctx: Context,\n toolUseId?: string | undefined,\n ): Promise<unknown> {\n if (parentSignal.aborted) {\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\n }\n const timeoutMs = clampTimeoutMs(\n tool.timeoutMs ?? this.iterationTimeoutMs,\n this.maxToolTimeoutMs,\n );\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n const combined = AbortSignal.any([parentSignal, timeoutSignal]);\n\n let output: unknown;\n try {\n // Streaming variant takes precedence — yields progress events, then\n // a final 'final' event with the typed output. Tools that don't\n // implement executeStream fall through to the standard execute path.\n output =\n typeof tool.executeStream === 'function'\n ? await this.runStreamedTool(tool, input, ctx, combined, toolUseId)\n : await tool.execute(input, ctx, { signal: combined });\n } catch (err) {\n // If aborted, run cleanup before re-throwing so the tool can release\n // resources (child processes, file handles, network connections).\n if (combined.aborted) await this.runToolCleanup(tool, input, ctx);\n throw err;\n }\n // The tool returned without throwing, but the signal may have aborted (e.g.\n // a timeout fired) while a tool that ignores the abort signal kept running.\n // Treat that as an abort: clean up and surface the abort to the caller so a\n // late, stale result is never returned as success.\n if (combined.aborted) {\n await this.runToolCleanup(tool, input, ctx);\n throw combined.reason instanceof Error\n ? combined.reason\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'tool timeout');\n }\n return output;\n }\n\n /** Best-effort tool cleanup; never let it mask the original error. */\n private async runToolCleanup(tool: Tool, input: unknown, ctx: Context): Promise<void> {\n if (typeof tool.cleanup !== 'function') return;\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow — never let cleanup mask the original error */\n }\n }\n\n private async runStreamedTool(\n tool: Tool,\n input: unknown,\n ctx: Context,\n signal: AbortSignal,\n toolUseId: string | undefined,\n ): Promise<unknown> {\n let finalOutput: unknown;\n let sawFinal = false;\n if (!tool.executeStream) {\n throw new Error(`Tool \"${tool.name}\" does not support streaming execution`);\n }\n const stream = tool.executeStream(input, ctx, { signal });\n // Manual iteration so we can explicitly close the async iterator after\n // receiving the final event, ensuring any cleanup in the tool's generator\n // finally block runs regardless of whether the engine calls return() on\n // break of a for-await-of loop.\n const iter = stream[Symbol.asyncIterator]();\n // Coalesce `partial_output` progress into at most one EventBus emit per\n // PROGRESS_EMIT_INTERVAL_MS, carrying the most recent PROGRESS_TAIL_CHARS\n // of accumulated text PLUS the first PROGRESS_HEAD_CHARS (the head).\n // P3 #22 (before-release.md): without the head, an important error\n // message at the beginning of a long output (e.g. `pnpm build`) was\n // gone by the time the user saw the live tail. Now both the head and\n // tail survive — when the output exceeds the combined buffer, the flush\n // emits \"head...\\n[...truncated...]\\n...tail\" so subscribers see both\n // ends.\n let progressTail = '';\n let progressHead = '';\n let headComplete = false;\n let lastProgressEmitAt = 0;\n const emitProgress = (ev: ToolProgressEvent) => {\n this.opts.events?.emit('tool.progress', {\n name: tool.name,\n id: toolUseId ?? '<unknown>',\n event: ev,\n });\n };\n const flushProgressTail = (force: boolean) => {\n if (progressTail.length === 0) return;\n const now = Date.now();\n if (!force && now - lastProgressEmitAt < ToolExecutor.PROGRESS_EMIT_INTERVAL_MS) return;\n lastProgressEmitAt = now;\n // On the final force-flush, if we have a head AND tail (output was\n // truncated in the middle), emit both with a truncation marker. On\n // normal coalesced flushes, just emit the tail — matching the\n // pre-P3-#22 per-event behavior.\n let text: string;\n if (force && headComplete && progressTail.length > 0) {\n text = `${progressHead}\\n[...output truncated...]\\n${progressTail}`;\n } else {\n text = progressTail;\n }\n progressTail = '';\n emitProgress({ type: 'partial_output', text });\n };\n try {\n while (true) {\n const { done, value: ev } = await iter.next();\n if (done) break;\n if (ev.type === 'final') {\n finalOutput = ev.output;\n sawFinal = true;\n // Result is locked — stop consuming further events.\n break;\n }\n if (ev.type === 'partial_output' && typeof ev.text === 'string') {\n // P3 #22: accumulate the head (first PROGRESS_HEAD_CHARS) for the\n // final force-flush, while the tail follows the original per-event\n // coalescing behavior. This preserves backward compatibility with\n // tests that expect each partial_output to emit independently,\n // while ensuring long outputs retain their beginning in the final\n // flush.\n if (!headComplete) {\n const remaining = ToolExecutor.PROGRESS_HEAD_CHARS - progressHead.length;\n if (ev.text.length <= remaining) {\n progressHead += ev.text;\n } else {\n progressHead += ev.text.slice(0, remaining);\n headComplete = true;\n }\n }\n progressTail += ev.text;\n if (progressTail.length > ToolExecutor.PROGRESS_TAIL_CHARS) {\n progressTail = progressTail.slice(-ToolExecutor.PROGRESS_TAIL_CHARS);\n }\n flushProgressTail(false);\n continue;\n }\n // Non-partial events (log/warning/metric/file_changed) are low-volume;\n // flush buffered text first so subscribers see events in stream order.\n flushProgressTail(true);\n emitProgress(ev);\n }\n flushProgressTail(true);\n } finally {\n // Always close the iterator so the tool's generator finally block\n // runs even if we broke early on a final event or errored.\n await iter.return?.(undefined);\n }\n if (!sawFinal) {\n throw new Error(`tool \"${tool.name}\" executeStream completed without a 'final' event`);\n }\n return finalOutput;\n }\n\n private unknownToolResult(use: ToolUseBlock, listFns: () => string[]): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\n is_error: true,\n };\n }\n\n private malformedInputResult(use: ToolUseBlock, raw?: string): ToolResultBlock {\n let content =\n `Tool \"${use.name}\" received arguments that were not a valid JSON object, so they ` +\n `could not be parsed. Re-issue the call with the arguments encoded as a single ` +\n `well-formed JSON object matching the tool's input schema.`;\n // Echo the raw payload back so the model can see *what* it produced and\n // self-correct. Without this the model is blind to its own mistake and\n // tends to resend the identical malformed call in a loop. Common causes:\n // unescaped newlines/quotes/backslashes inside a string field, or the\n // arguments being truncated mid-stream.\n if (raw) {\n const max = 800;\n const excerpt =\n raw.length > max ? `${raw.slice(0, max)}… (truncated, ${raw.length} chars total)` : raw;\n content +=\n ` Common cause: a string field (e.g. code in old_string/new_string) ` +\n `contains literal newlines, quotes, or backslashes that must be JSON-escaped, ` +\n `or the payload was cut off mid-stream. The raw arguments received were:\\n${excerpt}`;\n }\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content,\n is_error: true,\n };\n }\n\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\n is_error: true,\n };\n }\n\n private blockedByHookResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" was blocked by a PreToolUse hook: ${reason ?? 'no reason given'}`,\n is_error: true,\n };\n }\n\n /**\n * Subtract a string-content result's UTF-8 byte length from the\n * iteration output budget. Used for synthesized results (unknown tool,\n * validation error, blocked, threw) where the content is a small\n * string built in the executor. The success path no longer goes\n * through here — `executeTool` carries the exact byte count it spent\n * in its return value, derived from `enforceCap`'s `newBudget`.\n *\n * Floors the result at 0 to match the pre-fix `decrementBudget`\n * semantics (over-budget spends don't underflow the running total).\n */\n private budgetForString(content: string, budget: number): number {\n return Math.max(0, budget - Buffer.byteLength(content, 'utf8'));\n }\n\n}\n\nfunction clampTimeoutMs(timeoutMs: number, maxTimeoutMs: number): number {\n const fallback = 300_000;\n const finiteTimeout = Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : fallback;\n const finiteMax = Number.isFinite(maxTimeoutMs) && maxTimeoutMs > 0 ? maxTimeoutMs : fallback;\n return Math.max(1, Math.min(finiteTimeout, finiteMax));\n}\n\n/**\n * Sentinel keys the provider adapters use to wrap tool arguments that could\n * not be parsed into a proper JSON object. `parseToolInput` (Anthropic /\n * shared) uses `__raw`, `contentFromOpenAI` uses `__raw_arguments`, and the\n * streaming response builder's `safeJsonOrRaw` uses `_raw`.\n *\n * P3 #14 (before-release.md): centralized in `types/tool-markers.ts` so the\n * providers package (which produces these markers) and this executor (which\n * detects them) share a single source of truth. The old \"Keep this list in\n * sync\" comment is gone.\n *\n * NOTE: `parseToolInput` and `safeJsonOrRaw` now attempt JSON repair\n * (auto-closing braces and strings) before wrapping — so a truncated blob\n * like `{\"old_string\": \"line1\\nline2` gets repaired first. The sentinel is\n * only used when repair also fails.\n */\n\nfunction hasMalformedArguments(input: unknown): boolean {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const obj = input as Record<string, unknown>;\n // The sentinel is the *only* key when wrapping occurred — a real tool call\n // that legitimately uses a key named e.g. `_raw` will carry other keys too.\n const keys = Object.keys(obj);\n return keys.length === 1 && MALFORMED_ARG_MARKERS.includes(keys[0] as never);\n}\n\n/**\n * Pull the original (unparseable) payload back out of a sentinel-wrapped input\n * so the executor can echo it to the model. The wrapped value is usually the\n * raw argument string, but a scalar/array that parsed cleanly is wrapped too —\n * stringify those. Returns undefined if nothing usable is present.\n */\nfunction extractMalformedRaw(input: unknown): string | undefined {\n if (!hasMalformedArguments(input)) return undefined;\n const obj = input as Record<string, unknown>;\n const value = obj[expectDefined(Object.keys(obj)[0])];\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nconst TOOL_OUTPUT_ARTIFACT_THRESHOLD_BYTES = 64 * 1024;\n\n/**\n * Classify a tool execution error into a structured ToolErrorCategory.\n * Used for observability (span attributes) and retry strategy decisions.\n */\nfunction classifyToolError(err: unknown): { category: ToolErrorCategory; retryable: boolean; detail?: string } {\n // AbortError — user cancellation, never retry\n if (err instanceof Error && err.name === 'AbortError') {\n return { category: ToolErrorCategoryEnum.FATAL, retryable: false, detail: 'aborted' };\n }\n\n // Node.js ErrnoException with system error codes\n if (err instanceof Error && 'code' in err) {\n const code = (err as NodeJS.ErrnoException).code;\n switch (code) {\n case 'ETIMEDOUT':\n case 'ECONNRESET':\n case 'ECONNREFUSED':\n case 'ENETUNREACH':\n case 'EHOSTUNREACH':\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: code };\n case 'ENOENT':\n case 'ENOTDIR':\n return { category: ToolErrorCategoryEnum.NOT_FOUND, retryable: false, detail: code };\n case 'EACCES':\n case 'EPERM':\n return { category: ToolErrorCategoryEnum.PERMISSION, retryable: false, detail: code };\n case 'EBUSY':\n case 'EMFILE':\n case 'ENFILE':\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: code };\n }\n }\n\n // HTTP response errors (fetch failed with non-OK status).\n // P3 #18 (before-release.md): prefer the structured FetchError subclass\n // (instanceof is reliable) over the duck-typing `'response' in err` check,\n // which catches any Error with a `response` property — custom errors,\n // proxies, mocks. The duck-typing arm stays as a fallback for code that\n // still throws bare Error objects with an ad-hoc `response` field.\n if (err instanceof FetchError) {\n return httpStatusToCategory(err.status);\n }\n if (err instanceof Error && 'response' in err) {\n const response = (err as { response: { status?: number } }).response;\n const status = response?.status;\n if (status !== undefined) {\n return httpStatusToCategory(status);\n }\n }\n\n // Validation errors. Prefer the structured ValidationError subclass\n // (P2 #6) — instanceof is locale-independent and cannot misclassify an\n // unrelated error whose message happens to contain \"validation\". The\n // legacy string-match arm stays as a fallback for tools that still throw\n // bare Error('...validation...') and have not yet migrated.\n if (err instanceof ToolValidationError) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: 'validation' };\n }\n if (err instanceof Error && err.message.includes('validation')) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: 'validation' };\n }\n\n // Default: fatal/unclassified\n return {\n category: ToolErrorCategoryEnum.FATAL,\n retryable: false,\n detail: err instanceof Error ? err.message.slice(0, 100) : String(err).slice(0, 100),\n };\n}\n\n/**\n * Map an HTTP status code to a ToolErrorCategory. Shared by the FetchError\n * and duck-typed-response paths in classifyToolError.\n */\nfunction httpStatusToCategory(status: number): { category: ToolErrorCategory; retryable: boolean; detail: string } {\n if (status === 429 || status === 503 || status === 502 || status === 504) {\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: `HTTP ${status}` };\n }\n if (status === 404 || status === 410) {\n return { category: ToolErrorCategoryEnum.NOT_FOUND, retryable: false, detail: `HTTP ${status}` };\n }\n if (status === 401 || status === 403) {\n return { category: ToolErrorCategoryEnum.PERMISSION, retryable: false, detail: `HTTP ${status}` };\n }\n if (status === 400) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: `HTTP ${status}` };\n }\n return { category: ToolErrorCategoryEnum.FATAL, retryable: false, detail: `HTTP ${status}` };\n}\n\nasync function maybePersistLargeToolOutput(\n toolName: string,\n content: string,\n budget: number,\n): Promise<string> {\n const bytes = Buffer.byteLength(content, 'utf8');\n if (bytes <= Math.min(TOOL_OUTPUT_ARTIFACT_THRESHOLD_BYTES, Math.max(0, budget))) {\n return content;\n }\n\n try {\n const dir = path.join(wstackGlobalRoot(), 'tool-output');\n await fs.mkdir(dir, { recursive: true });\n const safeTool = toolName.replace(/[^a-zA-Z0-9._-]+/g, '_').slice(0, 40) || 'tool';\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filePath = path.join(dir, `${stamp}-${safeTool}-${randomUUID()}.log`);\n await fs.writeFile(filePath, content, 'utf8');\n return (\n content +\n `\\n[full tool output: ${bytes} bytes at ${filePath}; read/grep that file selectively instead of re-running or requesting more output]`\n );\n } catch {\n return content;\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport { computeMessageTokens } from '../utils/token-estimate.js';\nimport type { Context, TodoItem } from './context.js';\n\n/**\n * Observable wrapper for mutable conversation state. Production code should\n * mutate messages, todos, and meta through this API so subscribers see a\n * deterministic change stream. The underlying Context arrays are still\n * exposed for read compatibility and legacy tests.\n *\n * L1-A invariant: direct mutations of `ctx.messages` / `ctx.todos` bypass\n * the observer layer. Prefer `ctx.state.appendMessage()` etc. to keep\n * subscribers in sync. The compatibility arrays exist so existing code\n * that reads `ctx.messages` directly still works — they are NOT safe for\n * external writes.\n */\nexport type StateChange =\n | { kind: 'message_appended'; message: Message }\n | { kind: 'messages_replaced'; messages: readonly Message[] }\n | { kind: 'message_updated'; index: number; message: Message }\n | { kind: 'todos_replaced'; todos: readonly TodoItem[] }\n | { kind: 'meta_set'; key: string; value: unknown }\n | { kind: 'meta_deleted'; key: string }\n | { kind: 'meta_cleared' };\n\nexport type StateChangeHandler = (change: StateChange, state: ConversationState) => void;\n\nexport interface ReadonlyConversationState {\n readonly messages: readonly Message[];\n readonly todos: readonly TodoItem[];\n readonly meta: Readonly<Record<string, unknown>>;\n}\n\nexport class ConversationState {\n private readonly ctx: Context;\n private readonly listeners = new Set<StateChangeHandler>();\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n\n get messages(): readonly Message[] {\n return this.ctx.messages;\n }\n\n get todos(): readonly TodoItem[] {\n return this.ctx.todos;\n }\n\n get meta(): Readonly<Record<string, unknown>> {\n return this.ctx.meta;\n }\n\n /**\n * Cheap immutable snapshot. Useful for tests and for compaction passes\n * that need a stable view across an async boundary.\n *\n * Uses shallow-freeze instead of deep-freeze: only the wrapper object\n * and the three content arrays are frozen. Individual message/todo\n * objects are NOT recursively frozen — they are reconstructed via\n * spread copies and are immutable by convention. This cuts the freeze\n * count from O(n·m·d) (n=messages, m=content blocks, d=depth) to O(1).\n */\n snapshot(): ReadonlyConversationState {\n const snap = {\n messages: [...this.ctx.messages],\n todos: [...this.ctx.todos],\n meta: { ...this.ctx.meta },\n };\n Object.freeze(snap.messages);\n Object.freeze(snap.todos);\n Object.freeze(snap.meta);\n return Object.freeze(snap) as ReadonlyConversationState;\n }\n\n appendMessage(message: Message): void {\n // Pre-compute token estimate once at mutation time so every downstream\n // estimateMessageTokens / estimateRequestTokens call is an O(1) sum\n // instead of re-walking the content blocks on every invocation.\n if (message._estTokens === undefined) {\n message._estTokens = computeMessageTokens(message);\n }\n this.ctx.messages.splice(this.ctx.messages.length, 0, message);\n this.emit({ kind: 'message_appended', message });\n }\n\n /**\n * Append a content block to the trailing user message's content array.\n * Mutates only that one message (a single indexed assignment) — avoids\n * the O(n) array copy + token-cache re-walk that `replaceMessages()`\n * would do for a single-message edit. Used by the agent loop to fold\n * btw-notes / queued-mailbox blocks into the conversation.\n *\n * The block is folded only into a *user* message (preserves\n * user/assistant alternation between tool batches). Returns false when\n * there is no trailing user message to fold into — callers should\n * `appendMessage({ role: 'user', content: [block] })` instead.\n */\n appendBlockToLastUserMessage(block: ContentBlock): boolean {\n const arr = this.ctx.messages;\n const last = arr[arr.length - 1];\n if (!last || last.role !== 'user') return false;\n const content: ContentBlock[] =\n typeof last.content === 'string'\n ? [{ type: 'text', text: last.content }, block]\n : [...last.content, block];\n // Replace only the trailing message object — O(1), no full-array copy.\n // Recompute the token estimate for the one changed message; everything\n // else in the array is untouched and its cache stays valid.\n const updated: Message = { ...last, content, _estTokens: computeMessageTokens({ ...last, content }) };\n arr[arr.length - 1] = updated;\n // Text/informational blocks never carry tool_use/tool_result, so\n // toolAdjacencyDirty is unaffected — no need to set it here.\n this.emit({ kind: 'message_updated', index: arr.length - 1, message: updated });\n return true;\n }\n\n replaceMessages(messages: Message[]): void {\n // M1 (combined with the existing _estTokens loop): single pass over the\n // replacement messages that handles per-message token estimation AND\n // tool-block detection for the adjacency-dirty flag. The previous\n // implementation did a separate `messages.some(m => m.content.some(...))`\n // walk — a second O(n·m) pass that the first loop can absorb with a\n // tiny amount of extra state. For 200 messages with a 5-block average\n // this halves the work done here.\n let hasToolBlock = false;\n for (const m of messages) {\n if (m._estTokens === undefined) {\n m._estTokens = computeMessageTokens(m);\n // Scan for tool blocks only while already walking content to compute\n // tokens — avoids a separate O(n·m) pass over already-cached messages.\n // The `!hasToolBlock` guard on the outer loop skips messages after the\n // first tool block is found, so worst case is one full content scan.\n if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'tool_use' || b.type === 'tool_result') {\n hasToolBlock = true;\n break;\n }\n }\n }\n }\n }\n // In-place replacement without array spread to avoid a temporary\n // allocation of 200+ elements on large compaction rewrites.\n // When messages.length > arr.length, JavaScript auto-extends the array\n // on indexed assignment (arr[i] = val where i >= arr.length sets\n // arr.length = i + 1 per ECMAScript §9.4.2.1).\n const arr = this.ctx.messages;\n if (messages.length < arr.length) {\n arr.length = messages.length;\n }\n for (let i = 0; i < messages.length; i++) {\n arr[i] = messages[i]!;\n }\n\n // Mark adjacency dirty when the replacement contains tool-use\n // blocks — the next request pipeline must re-check adjacency.\n // Without this, replaceMessages() can silently skip repair when\n // it introduces or modifies tool_use/tool_result pairs (e.g. test\n // setup, agent-loop content rewrite).\n if (hasToolBlock) {\n this.ctx.toolAdjacencyDirty = true;\n }\n\n this.emit({ kind: 'messages_replaced', messages: [...messages] });\n }\n\n replaceTodos(todos: TodoItem[]): void {\n // Auto-clear: when every item is completed and the list is non-empty,\n // the board has served its purpose. Treat it as a clear signal so the\n // user doesn't have to manually `/todos clear` after each task.\n const allDone = todos.length > 0 && todos.every((t) => t.status === 'completed');\n const effective = allDone ? [] : todos;\n\n this.ctx.todos.length = 0;\n this.ctx.todos.splice(0, 0, ...effective);\n this.emit({ kind: 'todos_replaced', todos: [...effective] });\n }\n\n setMeta(key: string, value: unknown): void {\n this.ctx.meta[key] = value;\n this.emit({ kind: 'meta_set', key, value });\n }\n\n deleteMeta(key: string): void {\n if (!(key in this.ctx.meta)) return;\n delete this.ctx.meta[key];\n this.emit({ kind: 'meta_deleted', key });\n }\n\n clearMeta(): void {\n const keys = Object.keys(this.ctx.meta);\n if (keys.length === 0) return;\n for (const key of keys) delete this.ctx.meta[key];\n this.emit({ kind: 'meta_cleared' });\n }\n\n /**\n * Subscribe to mutations that go through this wrapper. Direct mutations of\n * the compatibility arrays are intentionally not observed.\n */\n onChange(listener: StateChangeHandler): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private emit(change: StateChange): void {\n for (const h of this.listeners) {\n try {\n h(change, this);\n } catch {\n // Listeners are observational only; one bad subscriber must not\n // prevent state mutation or block sibling listeners.\n }\n }\n }\n}\n\n/**\n * Convenience constructor. The wrapper holds a reference, not a copy.\n */\nexport function wrapAsState(ctx: Context): ConversationState {\n return new ConversationState(ctx);\n}\n","import * as path from 'node:path';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Usage } from '../types/provider.js';\nimport type { SessionWriter } from '../types/session.js';\nimport type { ContextEvidenceState } from '../types/context-evidence.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { Tool } from '../types/tool.js';\nimport { createContextEvidenceState } from '../utils/context-evidence.js';\nimport { ConversationState } from './conversation-state.js';\nimport type { RunEnv } from './run-env.js';\n\nexport interface TodoItem {\n id: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm?: string | undefined;\n /** When promoted from a plan item, stores the plan item's id. */\n promotedFromPlan?: string | undefined;\n /** When promoted from a task, stores the task's id. */\n promotedFromTask?: string | undefined;\n}\n\nexport interface RunOptions {\n signal?: AbortSignal | undefined;\n model?: string | undefined;\n executionStrategy?: 'parallel' | 'sequential' | 'smart' | undefined;\n maxIterations?: number | undefined;\n /**\n * Enable autonomous continue for this specific run. When true, the agent\n * loop re-runs on `[continue]`/`[next step]`/`[proceed]` markers or\n * `continue_to_next_iteration()` tool calls instead of returning.\n * Overrides `AgentInit.autonomousContinue` for this call only.\n */\n autonomousContinue?: boolean | undefined;\n}\n\nexport interface ContextInit {\n systemPrompt: TextBlock[];\n provider: Provider;\n session: SessionWriter;\n signal: AbortSignal;\n tokenCounter: TokenCounter;\n cwd: string;\n projectRoot: string;\n /** Mutable working directory. Defaults to `cwd`. Must stay within `projectRoot`. */\n workingDir?: string | undefined;\n /**\n * When false, file tools and `setWorkingDir()` are confined to `projectRoot`.\n * Defaults to `false` (restrictive) when omitted so directly-constructed\n * contexts (tests, embedded callers) keep the safe behavior; the runtime\n * passes the config-derived value (default `true` — permissive) explicitly.\n */\n allowOutsideProjectRoot?: boolean | undefined;\n model: string;\n tools?: Tool[] | undefined;\n /** Agent id performing this run (e.g. 'leader', 'executor', 'tech-stack'). */\n agentId?: string | undefined;\n /** Human-readable agent name. */\n agentName?: string | undefined;\n /**\n * Session-level trace ID for correlating storage events with agent\n * iterations in observability pipelines. Stored on the SessionWriter\n * so that storage operations can emit it in `storage.*` events.\n * When set, the Context constructor propagates it to\n * `session.traceId` automatically.\n */\n traceId?: string | undefined;\n}\n\n/**\n * L1-A: `Context` is the live agent-run object. Its read-only environment\n * shape is exposed by the `RunEnv` interface (every field below the\n * conversation state) and its mutable shape by `ConversationState` (the\n * `state` accessor). New code should declare the narrower type at its\n * parameter — pass `ctx` for it. Existing tools that accept `Context`\n * still work because `Context` structurally satisfies both.\n *\n * The single source of truth for the project directory is `projectRoot`.\n * All tools (read/write/bash/exec) resolve paths relative to this.\n * Sessions, config, memory, and logs are also stored under this root.\n *\n * There IS a mutable `workingDir` (separate from `projectRoot`) that can be\n * changed at runtime via `setWorkingDir()`. It starts as `cwd` and allows\n * the agent and user to navigate within the project without spawning a new\n * process. All changes must stay inside `projectRoot`.\n */\nexport class Context implements RunEnv {\n messages: Message[] = [];\n todos: TodoItem[] = [];\n /**\n * Files whose content the **user / model has explicitly seen** via the\n * `read` tool (or an edit's auto-read, which surfaces the content to the\n * model). This is the set the permission policy's write-smart-bypass\n * (step 7) checks — writing a file the model has already read is treated\n * as \"no new content to approve\". It must NEVER contain files only touched\n * by `edit`/`write`, otherwise the model could repeatedly overwrite a file\n * whose content the user never saw (P1 #1, before-release.md).\n *\n * Tool-driven mutations record via `writtenFiles` + `recordRead(..., 'write')`\n * so mtime tracking still works without widening the bypass.\n */\n readFiles = new Set<string>();\n /**\n * Files written by `edit`/`write` in this session. Tracked for observability\n * and to keep `readFiles` (the permission-bypass source of truth) clean.\n * `recordRead(path, mtime, 'write')` adds here instead of `readFiles`.\n */\n writtenFiles = new Set<string>();\n fileMtimes = new Map<string, number>();\n /**\n * Structured side-effect records accumulated during the current run\n * (P2 #5). Populated by `recordSideEffect()` — read by /diag for an\n * in-memory audit trail without parsing the JSONL file. Cleared by\n * `clearFileTracking()` alongside read/written-file tracking.\n */\n sideEffects: import('../types/side-effect.js').SideEffect[] = [];\n contextEvidence: ContextEvidenceState = createContextEvidenceState();\n systemPrompt: TextBlock[];\n provider: Provider;\n session: SessionWriter;\n signal: AbortSignal;\n tokenCounter: TokenCounter;\n cwd: string;\n projectRoot: string;\n /** Mutable working directory — starts as `cwd`. Change via `setWorkingDir()`. */\n workingDir: string;\n /**\n * When true, file tools (via `_util.ts`) and `setWorkingDir()` reject paths\n * outside `projectRoot`. When false, those boundary checks are bypassed so\n * tools may reach paths outside the project (still gated by permission\n * tiers). Mutable so `/settings` can toggle it live on the running session.\n */\n allowOutsideProjectRoot: boolean;\n model: string;\n tools: Tool[] = [];\n meta: Record<string, unknown> = {};\n /** Agent id performing this run (e.g. 'leader', 'executor'). */\n agentId: string;\n /** Human-readable agent name. */\n agentName: string;\n /**\n * Session-level trace ID for correlating storage events with agent\n * iterations. Stored here and also propagated to `session.traceId`\n * so storage operations can include it in `storage.*` events.\n */\n traceId: string | undefined;\n\n /** Callbacks fired when `setWorkingDir()` changes the working directory. */\n private _onWorkingDirChanged: Array<(newDir: string, oldDir: string) => void> = [];\n\n /**\n * Set to true when the conversation gains new tool_use or tool_result\n * blocks — the only time repairToolUseAdjacency() can find new issues.\n * buildAndRunRequestPipeline() checks this flag to skip an O(n) scan\n * on iterations where no tool content was added (pure text responses).\n */\n toolAdjacencyDirty = false;\n\n /**\n * H1: pre-computed total-request token estimate from the most recent\n * `estimateRequestTokens()` call in the agent loop's pre-flight step.\n * The middleware that decides when to compact, the `emitContextPct`\n * helper that drives the live context-fill bar, and the pre-flight\n * itself all need this number; previously each one walked the same\n * messages/system/tools arrays independently. Stashing it here lets\n * the three call sites share a single compute per iteration.\n *\n * The value is the **uncalibrated** total. Callers that want the\n * calibrated number apply the per-(provider,model) ratio themselves.\n */\n lastRequestTokens: number | undefined = undefined;\n\n constructor(init: ContextInit) {\n this.systemPrompt = init.systemPrompt;\n this.provider = init.provider;\n this.session = init.session;\n this.signal = init.signal;\n this.tokenCounter = init.tokenCounter;\n this.cwd = init.cwd;\n this.projectRoot = init.projectRoot;\n this.workingDir = init.workingDir ?? init.cwd;\n this.allowOutsideProjectRoot = init.allowOutsideProjectRoot ?? false;\n this.model = init.model;\n this.tools = init.tools ?? [];\n this.agentId = init.agentId ?? 'unknown';\n this.agentName = init.agentName ?? 'Unknown Agent';\n this.traceId = init.traceId;\n this.allowOutsideProjectRoot = init.allowOutsideProjectRoot ?? false;\n // Propagate traceId to the SessionWriter so storage operations\n // can read it without needing a direct handle on the Context.\n this.session.traceId = init.traceId;\n }\n\n /**\n * Observable wrapper over the mutable conversation state. Lazy so\n * subsystems that don't subscribe pay nothing. Mutations made directly\n * on `ctx.messages` / `ctx.todos` are still visible through this\n * wrapper's read API (it holds a reference, not a copy) but only\n * mutations that go through `state.appendMessage()` etc. fire\n * `onChange`. New code should prefer the wrapper API.\n */\n private _state: ConversationState | null = null;\n get state(): ConversationState {\n if (!this._state) this._state = new ConversationState(this);\n return this._state;\n }\n\n /**\n * Register a teardown hook tied to the current run's abort signal.\n * Hooks registered before a run starts are stored and fired when the\n * next run ends; there is no immediate fire when no run is active.\n *\n * **Scope:** these hooks fire on the **whole agent run's** abort, not on\n * an individual tool call. For per-tool teardown of resources owned by\n * the tool author (child processes, handles), prefer `Tool.cleanup` —\n * see its JSDoc for the full rule.\n */\n private abortHooks = new Set<() => void | Promise<void>>();\n registerAbortHook(fn: () => void | Promise<void>): () => void {\n this.abortHooks.add(fn);\n return () => this.abortHooks.delete(fn);\n }\n async drainAbortHooks(): Promise<void> {\n const snapshot = [...this.abortHooks].reverse();\n // Clear before running so new hooks registered during iteration\n // fire on the next abort cycle (not the current one — hook chains\n // are intentionally not supported).\n this.abortHooks.clear();\n for (const fn of snapshot) {\n try {\n await fn();\n } catch {\n // hooks must be best-effort; swallow so siblings still fire\n }\n }\n }\n\n /**\n * Record that a file's content was seen / mtime was observed.\n *\n * `source` controls which tracking set is populated — and therefore whether\n * the permission policy's write-smart-bypass (step 7) will auto-approve a\n * subsequent `write` to this path:\n *\n * - `'user'` (default): the model/user saw the content (via `read`, or an\n * edit's auto-read that surfaced it). Adds to `readFiles` → bypass applies.\n * - `'write'`: a tool wrote the file (`edit`/`write`) and is recording the\n * new mtime so subsequent edits detect external modification. Adds to\n * `writtenFiles` only — the bypass does NOT apply, because the user never\n * approved the new content (P1 #1, before-release.md).\n *\n * `fileMtimes` is updated in both cases so mtime-based staleness checks work.\n */\n recordRead(absPath: string, mtimeMs: number, source: 'user' | 'write' = 'user'): void {\n this.fileMtimes.set(absPath, mtimeMs);\n if (source === 'write') {\n this.writtenFiles.add(absPath);\n } else {\n this.readFiles.add(absPath);\n }\n }\n\n /** Clear accumulated file-read metadata after compaction or at boundaries\n * where stale read history could cause tools to skip legitimate re-reads.\n * The agent re-populates this naturally on the next file access. */\n clearFileTracking(): void {\n this.readFiles.clear();\n this.writtenFiles.clear();\n this.fileMtimes.clear();\n this.sideEffects = [];\n }\n\n /**\n * Record a structured side effect for the audit trail (P2 #5).\n * Called by tools that perform non-filesystem mutations (bash, install,\n * fetch) so /diag and session replay can show what the agent did beyond\n * file edits.\n *\n * Unlike recordFileChange(), this does NOT support undo — it is purely\n * for observability and audit. The event is appended to the session\n * JSONL fire-and-forget; errors are swallowed so recording never blocks\n * tool execution.\n */\n recordSideEffect(sideEffect: import('../types/side-effect.js').SideEffect): void {\n this.sideEffects.push(sideEffect);\n this.session.append({\n type: 'side_effect',\n ts: sideEffect.ts,\n toolUseId: sideEffect.toolUseId,\n toolName: sideEffect.toolName,\n input: sideEffect.input,\n outcome: sideEffect.outcome,\n risk: sideEffect.risk,\n }).catch(() => { /* best-effort — never block tool execution */ });\n }\n\n /**\n * True if the model/user has explicitly seen this file's content via `read`\n * (or an edit auto-read). Tool-only writes (`source: 'write'`) do NOT count\n * — this is the source of truth for the permission policy's write bypass.\n */\n hasRead(absPath: string): boolean {\n return this.readFiles.has(absPath);\n }\n\n /** True if `edit`/`write` wrote this file in the current session. */\n hasWritten(absPath: string): boolean {\n return this.writtenFiles.has(absPath);\n }\n\n lastReadMtime(absPath: string): number | undefined {\n return this.fileMtimes.get(absPath);\n }\n\n /**\n * Change the working directory for path resolution. Resolves relative paths\n * against `projectRoot` and validates the result is within the project root.\n * Fires all registered `onWorkingDirChanged` callbacks.\n * Returns the resolved absolute path.\n */\n setWorkingDir(dir: string): string {\n const resolved = path.isAbsolute(dir)\n ? path.resolve(dir)\n : path.resolve(this.projectRoot, dir);\n\n // Validate containment within projectRoot — unless filesystem access is\n // unrestricted, in which case the working dir may leave the project root.\n if (!this.allowOutsideProjectRoot) {\n const root = path.resolve(this.projectRoot);\n const rel = path.relative(root, resolved);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(\n `Working directory \"${resolved}\" is outside project root \"${root}\"`,\n );\n }\n }\n\n const old = this.workingDir;\n this.workingDir = resolved;\n // Fire callbacks (catch errors so one bad listener doesn't break others)\n for (const cb of this._onWorkingDirChanged) {\n try { cb(resolved, old); } catch { /* best-effort */ }\n }\n return resolved;\n }\n\n /**\n * Register a callback that fires when the working directory changes.\n * Returns an unsubscribe function. Callbacks are fired synchronously\n * inside `setWorkingDir()` — errors in callbacks are swallowed so one\n * bad listener doesn't prevent others from executing.\n */\n onWorkingDirChanged(cb: (newDir: string, oldDir: string) => void): () => void {\n this._onWorkingDirChanged.push(cb);\n return () => {\n const idx = this._onWorkingDirChanged.indexOf(cb);\n if (idx >= 0) this._onWorkingDirChanged.splice(idx, 1);\n };\n }\n\n usage(): Usage {\n return this.tokenCounter.total();\n }\n}\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { expectDefined } from '../utils/expect-defined.js';\r\nimport type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\nimport type { SessionData, SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\r\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n private readonly eventCache = new Map<string, SessionData>();\r\n private readonly eventCacheMtimes = new Map<string, number>();\r\n private static readonly EVENT_CACHE_MAX_ENTRIES = 32;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n private async loadCachedSessionData(sessionId: string): Promise<SessionData> {\r\n const storeWithPath = this.store as SessionStore & {\r\n dir?: string | undefined;\r\n clearLoadCache?: ((sessionId?: string | undefined) => void) | undefined;\r\n };\r\n const rootDir = storeWithPath.dir;\r\n if (!rootDir) {\r\n return await this.store.load(sessionId);\r\n }\r\n const sessionPath = path.join(rootDir, `${sessionId}.jsonl`);\r\n let mtimeMs: number | null = null;\r\n try {\r\n const stat = await fs.stat(sessionPath);\r\n mtimeMs = stat.mtimeMs;\r\n } catch {\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n return await this.store.load(sessionId);\r\n }\r\n\r\n const cachedMtime = this.eventCacheMtimes.get(sessionId);\r\n const cachedData = this.eventCache.get(sessionId);\r\n if (cachedData && cachedMtime === mtimeMs) {\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n this.eventCache.set(sessionId, cachedData);\r\n this.eventCacheMtimes.set(sessionId, mtimeMs);\r\n return cachedData;\r\n }\r\n\r\n const data = await this.store.load(sessionId);\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n this.eventCache.set(sessionId, data);\r\n this.eventCacheMtimes.set(sessionId, mtimeMs);\r\n while (this.eventCache.size > DefaultSessionReader.EVENT_CACHE_MAX_ENTRIES) {\r\n const oldest = this.eventCache.keys().next().value;\r\n if (oldest === undefined) break;\r\n this.eventCache.delete(oldest);\r\n this.eventCacheMtimes.delete(oldest);\r\n }\r\n\r\n if (data.metadata.endedAt) {\r\n storeWithPath.clearLoadCache?.(sessionId);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n // Prefer the store's filtered list when available — it pushes the\r\n // filter into the cached index instead of fetching 1000 + linear scan.\r\n const storeWithFilter = this.store as SessionStore & {\r\n listFiltered?: ((criteria: {\r\n since?: string | undefined;\r\n until?: string | undefined;\r\n provider?: string | undefined;\r\n model?: string | undefined;\r\n minTokens?: number | undefined;\r\n titleContains?: string | undefined;\r\n limit?: number | undefined;\r\n }) => Promise<import('../types/session.js').SessionSummary[]>) | undefined;\r\n };\r\n let raw: import('../types/session.js').SessionSummary[];\r\n if (typeof storeWithFilter.listFiltered === 'function') {\r\n raw = await storeWithFilter.listFiltered({\r\n since: q.since,\r\n until: q.until,\r\n provider: q.provider,\r\n model: q.model,\r\n minTokens: q.minTokens,\r\n titleContains: q.titleContains,\r\n limit: q.limit,\r\n });\r\n } else {\r\n const fetched = await this.store.list(q.limit ? Math.max(q.limit, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n raw = fetched.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n }\r\n const out: SessionSummaryLite[] = raw.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string | undefined, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE scanning events — avoids touching the JSONL\r\n // for sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n // Prefer the store's filtered list when available — avoids fetching\r\n // 1000 sessions and linear-filtering in-process.\r\n const storeWithFilter = this.store as SessionStore & {\r\n listFiltered?: ((criteria: {\r\n since?: string | undefined;\r\n until?: string | undefined;\r\n provider?: string | undefined;\r\n model?: string | undefined;\r\n minTokens?: number | undefined;\r\n titleContains?: string | undefined;\r\n limit?: number | undefined;\r\n }) => Promise<import('../types/session.js').SessionSummary[]>) | undefined;\r\n };\r\n let sessions: import('../types/session.js').SessionSummary[];\r\n if (typeof storeWithFilter.listFiltered === 'function') {\r\n sessions = await storeWithFilter.listFiltered({\r\n since: sessionQuery?.since,\r\n until: sessionQuery?.until,\r\n provider: sessionQuery?.provider,\r\n model: sessionQuery?.model,\r\n minTokens: sessionQuery?.minTokens,\r\n titleContains: sessionQuery?.titleContains,\r\n limit: 1000,\r\n });\r\n } else {\r\n sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n sessions = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n }\r\n ids = sessions.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n\r\n // Fast path: when the underlying store supports streaming search,\r\n // walk each session's JSONL line-by-line and bail out the moment we\r\n // hit `limit`. This avoids reading + parsing the entire file (which\r\n // `load()` does) and never reuses `_loadCache`, so concurrent\r\n // analytics queries don't churn the writer-side cache.\r\n const streaming = this.store.searchEvents?.bind(this.store);\r\n if (streaming) {\r\n for (const id of ids) {\r\n const matched = await streaming(\r\n id,\r\n (ev) => {\r\n if (allowedTypes && !allowedTypes.has(ev.type)) return false;\r\n const text = eventText(ev);\r\n if (text === null) return false;\r\n return matcher(text) !== null;\r\n },\r\n { limit: limit - hits.length },\r\n );\r\n for (const m of matched) {\r\n const text = expectDefined(eventText(m.event));\r\n const hit = expectDefined(matcher(text));\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: m.eventIndex,\r\n ts: m.ts,\r\n type: m.event.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n // Fallback: stores that don't implement streaming. Loads the full\r\n // event stream per session — necessary for in-memory or non-file\r\n // stores that don't expose a streaming surface.\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.loadCachedSessionData(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = expectDefined(data.events[i]);\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/blocks.ts","../../src/types/messages.ts","../../src/types/tool.ts","../../src/types/tool-markers.ts","../../src/utils/atomic-write.ts","../../src/utils/term.ts","../../src/utils/color.ts","../../src/utils/context-evidence.ts","../../src/utils/deep-merge.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/json-schema-validate.ts","../../src/utils/merge-models-payload.ts","../../src/utils/message-invariants.ts","../../src/utils/regex-guard.ts","../../src/utils/session-scoped-path.ts","../../src/utils/string.ts","../../src/utils/tool-subject.ts","../../src/utils/tool-wire-compact.ts","../../src/utils/token-estimate.ts","../../src/utils/tool-output-serializer.ts","../../src/utils/tool-result-render-mode.ts","../../src/utils/wstack-paths.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/types/config.ts","../../src/types/default-config.ts","../../src/types/secret-vault.ts","../../src/security/secret-vault.ts","../../src/infrastructure/logger.ts","../../src/infrastructure/token-counter.ts","../../src/types/memory.ts","../../src/execution/compaction-core.ts","../../src/execution/compactor.ts","../../src/infrastructure/path-resolver.ts","../../src/execution/regex-patterns.ts","../../src/execution/error-handler.ts","../../src/execution/retry-policy.ts","../../src/types/prompt.ts","../../src/types/prompt-registry.ts","../../src/types/design-kit.ts","../../src/security/secret-scrubber.ts","../../src/models/models-registry.ts","../../src/types/mode-prompts.ts","../../src/types/mode.ts","../../src/types/context-window.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/types/spec.ts","../../src/types/task-graph.ts","../../src/security/capabilities.ts","../../src/execution/tool-executor.ts","../../src/core/conversation-state.ts","../../src/core/context.ts","../../src/storage/session-reader.ts"],"names":["ToolErrorCategory","path","stat","resolve","open","path3","isRecord","path4","randomBytes","path5","key","walk","fsp","oldVersion","newVersion","path6","fsp2","tokens","hasToolUse","os2","fs3","path8","fs4","readFileSync","path9","statSync","handlers","path10","fs5","randomUUID","path11","fs6"],"mappings":"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","file":"index.js","sourcesContent":["export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' | undefined };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string | undefined;\n content: string;\n is_error?: boolean | undefined;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string | undefined;\n data?: string | undefined;\n url?: string | undefined;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string | undefined;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import type { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n /**\n * ISO-8601 timestamp from the originating SessionEvent.\n * Populated by SessionStore.replay() during session load/resume\n * so consumers (WebUI, TUI, exports) can reconstruct the original\n * conversation timeline instead of seeing every message stamped\n * with \"now\". Absent for in-memory messages created during a live\n * run — those use wall-clock time from the caller.\n */\n ts?: string | undefined;\n /**\n * Pre-computed token estimate for this message, set by\n * ConversationState on append/replace. Used by estimateMessageTokens\n * and estimateRequestTokens to skip the O(n·m) content-block walk\n * on every context-pressure check. Undefined means \"not yet computed\"\n * — the estimator falls back to walking content blocks.\n */\n _estTokens?: number | undefined;\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\n","import type { Context } from '../core/context.js';\n\nexport type Permission = 'auto' | 'confirm' | 'deny';\n\n/**\n * Risk tier for tools in YOLO mode. YOLO auto-approves everything by default,\n * including destructive calls. Use `--confirm-destructive` to re-enable\n * confirmation prompts for destructive operations.\n *\n * - `safe` — read-only, no side effects (read, glob, grep, etc.)\n * - `standard` — non-destructive writes and mutations (write, edit, safe shell commands)\n * - `destructive` — irreversible or broadside effects (recursive deletes, db drops, etc.)\n */\nexport type RiskTier = 'safe' | 'standard' | 'destructive';\n\n/**\n * Icon identifiers for tools — each UI (WebUI/TUI/REPL) maps these to its own icon library.\n * Add the icon directly on each Tool so all UIs consume the same canonical value.\n */\nexport type ToolIconId =\n | 'file' // read, write — document operations\n | 'edit' // edit, patch — modifying files\n | 'search' // grep, search — searching content\n | 'folder' // glob — file discovery\n | 'terminal' // bash, exec — shell commands\n | 'web' // fetch — HTTP requests\n | 'git' // git — version control\n | 'tree' // tree — directory structure\n | 'code' // lint, format, typecheck — code quality\n | 'test' // test — testing\n | 'package' // install, audit, outdated — package management\n | 'document' // document — documentation\n | 'scaffold' // scaffold — project generation\n | 'todo' // todo — task tracking\n | 'plan' // plan — planning\n | 'task' // task — structured work items\n | 'meta' // tool-use, batch-tool-use, tool-search, tool-help — meta tools\n | 'index' // codebase-index, codebase-search, codebase-stats — code indexing\n | 'json' // json — JSON operations\n | 'diff' // diff — comparing changes\n | 'logs' // logs — log viewing\n | 'settings' // set-working-dir — configuration\n | 'fallback'; // unknown tool — fallback icon\n\nexport interface JSONSchema {\n type?: string | undefined;\n properties?: Record<string, JSONSchema>;\n required?: string[] | undefined;\n items?: JSONSchema | undefined;\n enum?: unknown[] | undefined;\n description?: string | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Tool progress event — yielded by `Tool.executeStream` to give the UI\n * something to render while a long-running tool works. The executor\n * publishes each event via EventBus as `tool.progress` so the TUI, logger,\n * and observability layer can consume them uniformly.\n *\n * Keep events small. They are buffered through the EventBus synchronously\n * and rendered on the main thread.\n */\nexport interface ToolProgressEvent {\n /**\n * - `log` — verbose informational message (e.g. \"scanning…\")\n * - `warning` — non-fatal issue (e.g. \"skipped X due to ENOENT\")\n * - `metric` — numeric data (e.g. files scanned so far)\n * - `file_changed` — a tool that mutates the workspace announces a write\n * - `partial_output` — stream of textual output (bash stdout, fetch body)\n */\n type: 'log' | 'warning' | 'metric' | 'file_changed' | 'partial_output';\n text?: string | undefined;\n data?: Record<string, unknown>;\n}\n\n/**\n * Terminal event for `executeStream`. The output must match the tool's\n * declared output type — the executor unwraps `output` and treats it like\n * a normal `execute` return value.\n */\nexport interface ToolFinalEvent<O> {\n type: 'final';\n output: O;\n}\n\nexport type ToolStreamEvent<O = unknown> = ToolProgressEvent | ToolFinalEvent<O>;\n\nexport interface Tool<I = unknown, O = unknown> {\n name: string;\n description: string;\n /**\n * Pre-computed token estimate for this tool's definition (name +\n * description + JSON-serialized inputSchema). Set by ToolRegistry on\n * registration; consumed by estimateToolDefTokens / estimateRequestTokens\n * to skip redundant JSON.stringify on every context-pressure check.\n */\n _estDefTokens?: number | undefined;\n usageHint?: string | undefined;\n /** Optional category for grouping in help lists and system prompts. */\n category?: string | undefined;\n inputSchema: JSONSchema;\n permission: Permission;\n mutating: boolean;\n /**\n * Risk tier for selective YOLO gating. When YOLO is active, clearly\n * destructive calls still emit `confirm` unless the destructive override is\n * set. Defaults to `standard` when omitted — callers should always check\n * `riskTier` after the basic permission decision.\n */\n riskTier?: RiskTier | undefined;\n /**\n * Input-field name that the permission policy should match trust rules\n * against. Without this, the policy falls back to a heuristic\n * (`command` / `path` / `url` / `name`) that can collide across tools —\n * e.g. an HTTP tool whose `path` means \"request path\" would be checked\n * against filesystem-path trust rules. Set explicitly to avoid the\n * cross-tool subject collision.\n *\n * The named field's value must be a string at runtime; non-string values\n * fall back to the heuristic.\n */\n subjectKey?: string | undefined;\n maxOutputBytes?: number | undefined;\n timeoutMs?: number | undefined;\n /**\n * Hint for the TUI spinner — does NOT affect actual timeout enforcement.\n * Use `timeoutMs` for hard limits. Leave undefined when duration varies\n * unpredictably.\n */\n estimatedDurationMs?: number | undefined;\n\n /**\n * Declarative security capabilities granted by this tool.\n *\n * Examples: \"shell.arbitrary\", \"fs.write\", \"fs.write.outside-project\",\n * \"net.outbound\", \"mcp.proxy\", \"subagent.spawn\", \"config.mutate\".\n *\n * These are used by permission policies (especially subagent guards) and\n * future capability-based allowlists. Prefer well-known values over ad-hoc strings.\n *\n * This field is optional for backward compatibility. Tools without it are\n * treated conservatively by guards.\n */\n capabilities?: readonly string[] | undefined;\n /**\n * Icon identifier for this tool — consumed by all UIs (WebUI/TUI/REPL) to\n * render a tool-specific icon instead of a generic fallback.\n * Each UI maps this id to its own icon library.\n */\n icon?: ToolIconId | undefined;\n execute(input: I, ctx: Context, opts: { signal: AbortSignal }): Promise<O>;\n /**\n * Optional cross-field validation hook. Called by the executor AFTER\n * JSON Schema validation passes and AFTER PreToolUse hooks may have\n * rewritten the input, but BEFORE permission checks and execution.\n *\n * Use this for invariants the JSON Schema cannot express — e.g.\n * `old_string !== new_string` in edit, or `end > start` in a range tool.\n * Return an array of validation errors (empty = valid). The executor\n * surfaces them to the model just like schema validation errors, so the\n * model can self-correct without the tool's `execute()` running.\n *\n * P3 #16 (before-release.md): tools that implement cross-field checks\n * inside `execute()` can migrate them here for earlier rejection and\n * consistent error formatting.\n */\n validate?(input: I): string[];\n /**\n * Optional streaming variant. When defined, the executor prefers this\n * over `execute` — yielded events become `tool.progress` EventBus events\n * and the terminal `final` event provides the output. Tools that don't\n * have intermediate state shouldn't implement this; the default `execute`\n * path is more efficient.\n */\n executeStream?(\n input: I,\n ctx: Context,\n opts: { signal: AbortSignal },\n ): AsyncIterable<ToolStreamEvent<O>>;\n /**\n * Optional teardown hook fired by the executor when the tool's run is\n * aborted (signal triggered). Errors thrown here are swallowed so they\n * never mask the originating failure.\n *\n * **When to use `cleanup` vs `ctx.registerAbortHook`:**\n *\n * - Use `cleanup` for resources **owned by the tool author** that are\n * established at execute-time: child processes spawned by the tool,\n * file handles opened by the tool, network connections initiated by\n * the tool. The lifecycle is co-located with the tool definition, so\n * readers see the resource and its teardown in one place.\n *\n * ```ts\n * async execute(input, ctx, opts) {\n * const child = spawn(...);\n * // … tool work …\n * },\n * async cleanup(_input, _ctx) {\n * // best-effort kill of any child still running\n * }\n * ```\n *\n * - Use `ctx.registerAbortHook` for **context-scoped teardown** registered\n * dynamically inside `execute`: when the tool delegates to a library\n * that needs cancellation, or when the resource is created lazily\n * somewhere down the call stack and the natural cleanup point isn't\n * at the tool boundary. The hook fires when the **agent run** ends,\n * not when this specific tool call aborts.\n *\n * ```ts\n * async execute(input, ctx, opts) {\n * const handle = openHelper();\n * ctx.registerAbortHook(() => handle.dispose());\n * // … work …\n * }\n * ```\n *\n * If both are registered for the same resource, `cleanup` fires first\n * (on tool abort) and the abort-hook fires after on the wider run abort.\n * Avoid double-free by gating one on the other's effect, or pick a single\n * teardown channel per resource.\n */\n cleanup?(input: I, ctx: Context): Promise<void>;\n /**\n * Optional custom output serializer. When present, the executor's output\n * serializer calls this INSTEAD of the central `renderToolObject()` switch\n * — the tool owns its own pretty-printing.\n *\n * Return a string representation of the output that the model will see in\n * its tool_result block. The serializer applies the iteration output cap\n * AFTER this runs, so don't worry about truncation.\n *\n * P3 #21 (before-release.md): `renderToolObject()` is a god function with\n * 30+ per-tool branches, far from each tool's definition. New tools that\n * want custom output no longer need to add a branch there — they implement\n * this method instead. Existing branches stay until migrated incrementally.\n */\n serialize?(output: O, input: I): string;\n}\n\nexport interface ToolCallContext {\n tool: Tool;\n input: unknown;\n callId: string;\n ctx: Context;\n signal: AbortSignal;\n}\n\n/**\n * Error categories for tool execution failures.\n * Used by the executor to classify errors and determine retry strategy.\n */\nexport enum ToolErrorCategory {\n TRANSIENT = \"transient\", // ETIMEDOUT, ECONNRESET, network timeout, HTTP 429/503\n NOT_FOUND = \"not_found\", // ENOENT, ENOTDIR, HTTP 404\n PERMISSION = \"permission\", // EACCES, EPERM, HTTP 401/403\n VALIDATION = \"validation\", // schema validation error, HTTP 400\n FATAL = \"fatal\", // unhandled exception, crash, invariant violation\n}\n\n/**\n * Structured tool error information for the LLM and retry logic.\n */\nexport interface ToolErrorInfo {\n readonly category: ToolErrorCategory;\n /** Whether the operation can be retried automatically. */\n readonly retryable: boolean;\n /** User-facing message describing the error. */\n readonly userMessage: string;\n /** Optional technical detail for debugging. */\n readonly detail?: string;\n}\n","/**\n * Sentinel keys provider adapters use to wrap tool-call arguments that could\n * not be parsed into a proper JSON object. Single source of truth — the core\n * tool executor (which DETECTS these markers to surface a friendly error)\n * defines them here, and the providers package (which PRODUCES them when\n * wrapping) imports from `@wrongstack/core`.\n *\n * P3 #14 (before-release.md): the list was duplicated in tool-executor.ts with\n * a \"Keep this list in sync\" comment — a manual rule that will eventually be\n * forgotten. Centralizing it removes the sync burden.\n *\n * Layering note: this lives in core (not providers) because the dependency\n * direction is providers → core, not the reverse. Putting it in providers\n * would force core into a forbidden upward dependency.\n *\n * Current markers:\n * - `__raw` — produced by `parseToolInput` (Anthropic / shared)\n * - `__raw_arguments` — produced by `contentFromOpenAI` (OpenAI / compatible)\n * - `_raw` — produced by the streaming response builder's\n * `safeJsonOrRaw` (legacy fallback)\n */\nexport const MALFORMED_ARG_MARKERS = ['__raw', '__raw_arguments', '_raw'] as const;\n\nexport type MalformedArgMarker = (typeof MALFORMED_ARG_MARKERS)[number];\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { FsError } from '../types/errors.js';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n // P3 #20 (before-release.md): on Windows, fs.rename (MoveFileExW) does\n // not preserve Unix permission bits — the chmod above applies to the tmp\n // file, but the rename may reset the destination's mode to the Windows\n // default. Re-apply the mode after rename on win32 so an edited file\n // keeps its executable bit (or any non-default permission). On POSIX,\n // rename preserves metadata so this is a no-op (chmod is idempotent and\n // cheap), but we gate it on win32 to avoid the extra stat+chmod on the\n // common path.\n if (mode !== undefined && process.platform === 'win32') {\n try {\n await fs.chmod(targetPath, mode);\n } catch {\n // Best-effort: a transient EPERM (antivirus lock) should not fail\n // the write — the content is already on disk.\n }\n }\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new FsError({\n message: `Timed out waiting for file lock: ${targetPath}`,\n code: 'FS_ATOMIC_WRITE_FAILED',\n path: targetPath,\n context: { timeoutMs },\n });\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","/**\n * TTY detection helpers — the single source of truth for \"is this process\n * running against a real terminal?\". Replaces ad-hoc `process.stdin.isTTY`\n * / `process.stdout.isTTY` checks scattered across the codebase so that:\n *\n * 1. test code can mock a single module instead of stubbing `isTTY` on\n * every ReadStream/WriteStream the test happens to touch;\n * 2. a future TTY-detection source (an env var override, a Windows\n * ConPTY workaround, …) lands in one place;\n * 3. `isInteractive()` encodes the rule the project already used inline\n * (\"both streams are TTYs AND we're not running under CI\") in one\n * testable helper instead of the same 3-condition check in two\n * different files.\n *\n * Scope: detection only. Raw-mode control (`setRawMode`), resize\n * subscriptions, and write-injection belong to a future, larger TTY\n * abstraction; this module is the smallest pull that gives us a\n * testable seam and dedups 20+ call sites.\n */\n\nconst hasStdout = (): boolean => typeof process !== 'undefined' && !!process.stdout;\nconst hasStdin = (): boolean => typeof process !== 'undefined' && !!process.stdin;\n\n/** True when `process.stdout` is attached to a terminal (not a pipe/file). */\nexport function isStdoutTTY(): boolean {\n return hasStdout() && Boolean(process.stdout.isTTY);\n}\n\n/** True when `process.stdin` is attached to a terminal (not a pipe/file). */\nexport function isStdinTTY(): boolean {\n return hasStdin() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * True when the current process is an interactive session: both stdin and\n * stdout are TTYs. Callers that also need a \"not a single-shot invocation\"\n * or \"not under CI\" check should layer that on top — keeping this helper\n * minimal preserves the original inline checks it replaces.\n */\nexport function isInteractive(): boolean {\n return isStdinTTY() && isStdoutTTY();\n}\n\n/** Current terminal size in characters, with a 24×80 fallback for non-TTYs. */\nexport function getTermSize(): { rows: number; cols: number } {\n if (!hasStdout()) return { rows: 24, cols: 80 };\n return {\n rows: process.stdout.rows ?? 24,\n cols: process.stdout.columns ?? 80,\n };\n}\n\n/**\n * Subscribe to terminal resize events. `cb` is called with the new size each\n * time the underlying stream emits `resize`. Returns a cleanup function the\n * caller MUST call on dispose to remove the listener — leaving a stale\n * `resize` listener on a disposed component leaks the closure (and the\n * component itself, transitively) until the process exits.\n *\n * The stream argument defaults to `process.stdout`. Pass an explicit\n * `NodeJS.WriteStream` when the caller already owns one (e.g. a status line\n * that targets an injected `out` for testability). For non-TTY streams no\n * listener is registered and the returned cleanup is a no-op.\n */\nexport function onResize(\n cb: (size: { rows: number; cols: number }) => void,\n stream: NodeJS.WriteStream = process.stdout,\n): () => void {\n if (!stream || typeof stream.on !== 'function') return () => {};\n const handler = (): void => {\n cb({\n rows: stream.rows ?? 24,\n cols: stream.columns ?? 80,\n });\n };\n stream.on('resize', handler);\n return () => {\n stream.off('resize', handler);\n };\n}\n\n/**\n * Toggle raw mode on a TTY stdin stream. Returns `true` when the toggle was\n * applied, `false` when the stream is null, not a TTY, or doesn't expose\n * `setRawMode` (pipes, file descriptors, Windows ConPTY edge cases). Callers\n * that need to restore the previous mode should snapshot `input.isRaw`\n * BEFORE the call and pass the value to a second call to flip back.\n *\n * Use this helper to drop the now-redundant\n * `if (input.isTTY) input.setRawMode(...)` ceremony at every call site.\n */\nexport function setRawMode(input: NodeJS.ReadStream, mode: boolean): boolean {\n if (input?.isTTY !== true) return false;\n if (typeof input.setRawMode !== 'function') return false;\n input.setRawMode(mode);\n return true;\n}\n\n/**\n * Bracket installed by the interactive input reader while a `readline`\n * prompt is on screen. Out-of-band terminal writes — logger WARN/INFO\n * lines, async activity from the Telegram bridge, etc. — go to the same\n * physical terminal as the half-typed prompt but readline has no idea they\n * happened, so it never repaints. The result is the classic corruption the\n * user sees: every async line strands the in-progress draft as a fresh\n * scrollback row (sometimes with its cursor underline).\n *\n * The guard closes that gap. `suspend()` wipes the draft row so the message\n * prints clean; `resume()` repaints the prompt + draft (cursor preserved).\n * When no prompt is active the guard is `null` and writes pass straight\n * through — so agent-turn output (spinner, renderer) is untouched.\n */\nexport interface OutputLineGuard {\n /** Clear the current input row right before an out-of-band write. */\n suspend(): void;\n /** Repaint the prompt + in-progress draft right after the write. */\n resume(): void;\n}\n\nlet activeOutputGuard: OutputLineGuard | null = null;\n\n/**\n * Register (or clear, with `null`) the guard that brackets out-of-band\n * writes. Installed by {@link writeOut}/{@link writeErr} consumers — in\n * practice the CLI's readline input reader — only while a prompt is live.\n * Idempotent; the most recent caller wins.\n */\nexport function setOutputLineGuard(guard: OutputLineGuard | null): void {\n activeOutputGuard = guard;\n}\n\n/**\n * Stream-agnostic write primitive. Returns `false` when the stream is\n * missing or doesn't expose `write` so callers can degrade silently under\n * hostile host environments (closed pipe, mock injects `null`, test\n * replaces the stream with a stub).\n *\n * When an {@link OutputLineGuard} is installed (a readline prompt is on\n * screen) the write is bracketed by `suspend()`/`resume()` so the user's\n * half-typed input survives the interruption instead of being stranded in\n * scrollback. The guard's own redraw uses raw stream writes — never\n * `writeOut`/`writeErr` — so there is no re-entrancy here.\n *\n * **Not exported in the public API.** Exposed only inside `term.ts` for\n * `writeOut` / `writeErr` to share a single implementation. If a caller\n * needs to write to an arbitrary stream, they should call `writeOut` (or\n * `writeErr`) with an explicit `stream` argument — the named functions\n * are the public surface so the \"this is the standard error stream\"\n * intent stays visible at every call site.\n */\nfunction writeTo(\n s: string,\n stream: NodeJS.WriteStream | undefined,\n): boolean {\n if (!stream || typeof stream.write !== 'function') return false;\n const guard = activeOutputGuard;\n if (!guard) {\n stream.write(s);\n return true;\n }\n // A prompt is live — wipe the draft row, emit the message, repaint.\n guard.suspend();\n stream.write(s);\n guard.resume();\n return true;\n}\n\n/**\n * Write `s` to `stream` (defaults to `process.stdout`). Returns `false`\n * when the stream is missing or doesn't expose `write` so callers can\n * degrade silently under hostile host environments (closed pipe, mock\n * injects `null`, test replaces the stream with a stub).\n *\n * Why a helper:\n * 1. **Single seam for output capture in tests** — stub `writeOut` once\n * and assert on what the rest of the codebase intended to print,\n * without spying on `process.stdout.write` (which is brittle and\n * leaks across parallel test files).\n * 2. **Stream swap without grep** — routing the CLI's output to a\n * logger or `out.log` becomes a one-line change at process boot.\n * 3. **Defensive default** — closes the \"what if `process.stdout` is\n * `null`\" gap that currently exists at ~50 call sites that just\n * call `process.stdout.write(s)` and crash on certain Windows\n * redirect invocations.\n *\n * Call-site migration is staged: this commit introduces the helper, a\n * follow-up commit replaces the 50+ `process.stdout.write(...)` sites\n * with `writeOut(...)`. Until that migration lands, both forms coexist\n * and `writeOut` is the preferred form for new code.\n */\nexport function writeOut(\n s: string,\n stream: NodeJS.WriteStream = process.stdout,\n): boolean {\n return writeTo(s, stream);\n}\n\n/**\n * Symmetric partner of `writeOut` for the standard error stream. Same shape,\n * same defensive contract, same single-seam-for-tests story — just defaults to\n * `process.stderr` instead of `process.stdout`.\n *\n * Use this in code paths that emit error/diagnostic/warning text. Keeping\n * these two helpers split (rather than a single `writeTo(s, stream)`) means\n * the call site reads as a clear intent signal: \"I am writing an error\" vs.\n * \"I am writing a result\" — which matters for callers that decide between\n * stdout/stderr routing (e.g. `--quiet` flags, log-level filtering,\n * structured-log rewriters that fork on stream).\n *\n * Stderr writes from the core logger (see `infrastructure/logger.ts`) and from\n * the TUI guard (see `tui/run-tui.ts`) used to call `process.stderr.write`\n * directly. Routing them through this helper lets tests stub the stream at\n * one boundary and lets future logging middleware (e.g. a JSON-line rewriter)\n * swap the destination for the entire process in one place.\n */\nexport function writeErr(\n s: string,\n stream: NodeJS.WriteStream = process.stderr,\n): boolean {\n return writeTo(s, stream);\n}\n","import { isStdoutTTY } from './term.js';\n\nconst isColorTty = (): boolean => {\n if (envFlag(process.env.NO_COLOR)) return false;\n if (envFlag(process.env.FORCE_COLOR)) return true;\n return isStdoutTTY();\n};\n\nfunction envFlag(value: string | undefined): boolean {\n if (value === undefined) return false;\n if (value.trim() === '') return false;\n return !/^(0|false|no|off)$/i.test(value.trim());\n}\n\nconst COLOR = isColorTty();\n\nconst wrap =\n (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '');\n}\n","import * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport type {\n ContextEvidenceState,\n ToolOutputMetadata,\n} from '../types/context-evidence.js';\n\nconst MAX_TOOL_CALLS = 80;\nconst MAX_FACTS = 40;\nconst MAX_ERRORS = 20;\nconst MAX_DIGEST_CHARS = 4_000;\n/** Cap for the per-iteration reference scan — see markAssistantReferencedEvidence. */\nconst RECENT_TOOL_CALL_SCAN_LIMIT = 20;\n/** Cap content fed to file/symbol regex extractors (first N chars). */\nconst EXTRACT_CONTENT_CAP_CHARS = 10_000;\n/** Only scan the last N lines for error patterns — errors surface at the bottom. */\nconst EXTRACT_ERROR_TAIL_LINES = 200;\n\nconst WRITE_TOOLS = new Set(['edit', 'write', 'replace', 'patch']);\nconst READ_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'tree']);\n\nexport function createContextEvidenceState(): ContextEvidenceState {\n return {\n sessionGoals: [],\n implicitFacts: [],\n activeErrors: [],\n toolCalls: [],\n fileGraph: {},\n repeatedReads: [],\n updatedAt: Date.now(),\n };\n}\n\nexport interface RecordToolOutputEvidenceInput {\n toolUseId: string;\n toolName: string;\n input: unknown;\n content: string;\n ok: boolean;\n outputBytes?: number | undefined;\n outputTokens?: number | undefined;\n outputLines?: number | undefined;\n}\n\nexport function recordUserIntentEvidence(ctx: Context, text: string): void {\n const intent = normalizeWhitespace(text).slice(0, 700);\n if (!intent) return;\n const state = ensureEvidence(ctx);\n state.currentIntent = { text: intent, updatedAt: Date.now() };\n if (state.sessionGoals.length === 0 || isGoalish(intent)) {\n pushUniqueBounded(state.sessionGoals, intent, 8);\n }\n state.updatedAt = Date.now();\n}\n\nexport function recordToolOutputEvidence(\n ctx: Context,\n input: RecordToolOutputEvidenceInput,\n): ToolOutputMetadata {\n const state = ensureEvidence(ctx);\n // Cap content for regex extraction. File paths and symbol declarations\n // appear near the top of tool output (import blocks, function definitions),\n // so the first 10KB captures them. Without this cap, matchAll() runs over\n // the full output — e.g. a 50KB file read triggers ~100KB of regex scanning\n // across two patterns in extractSymbols plus the extractFiles pass.\n const scanContent = input.content.length > EXTRACT_CONTENT_CAP_CHARS\n ? input.content.slice(0, EXTRACT_CONTENT_CAP_CHARS)\n : input.content;\n const files = extractFiles(ctx, input.toolName, input.input, scanContent);\n const symbols = extractSymbols(scanContent, input.input);\n const commands = extractCommands(input.toolName, input.input);\n const errors = extractErrors(input.content);\n const summary = summarizeToolOutput(input.toolName, input.input, input.content, {\n files,\n symbols,\n errors,\n ok: input.ok,\n });\n\n const metadata: ToolOutputMetadata = {\n toolUseId: input.toolUseId,\n toolName: input.toolName,\n ok: input.ok,\n inputSummary: summarizeInput(input.input),\n summary,\n files,\n symbols,\n commands,\n errors,\n status: 'seen',\n referenceCount: 0,\n seenAt: Date.now(),\n outputBytes: input.outputBytes,\n outputTokens: input.outputTokens,\n outputLines: input.outputLines,\n };\n\n state.toolCalls.push(metadata);\n if (state.toolCalls.length > MAX_TOOL_CALLS) {\n state.toolCalls.splice(0, state.toolCalls.length - MAX_TOOL_CALLS);\n }\n\n updateFileGraph(state, metadata);\n updateRepeatedReadSignals(state, metadata);\n if (errors.length > 0) {\n for (const err of errors) pushUniqueBounded(state.activeErrors, err, MAX_ERRORS);\n }\n const fact = implicitFactFor(metadata);\n if (fact) pushUniqueBounded(state.implicitFacts, fact, MAX_FACTS);\n state.updatedAt = Date.now();\n return metadata;\n}\n\nexport function markAssistantReferencedEvidence(ctx: Context, text: string): void {\n const state = ensureEvidence(ctx);\n const haystack = text.toLowerCase();\n if (!haystack.trim()) return;\n\n // Only scan the most recent tool calls. The assistant almost always\n // references the files/symbols it just worked on — older entries are\n // rarely re-referenced. Scanning the full list (up to 80 entries) means\n // worst case: 80 × (files + symbols) includes() calls per iteration,\n // each O(responseText.length), which degrades as the conversation grows.\n // The last 20 captures the realistic reference window at ¼ the cost.\n const recent = state.toolCalls.length > RECENT_TOOL_CALL_SCAN_LIMIT\n ? state.toolCalls.slice(-RECENT_TOOL_CALL_SCAN_LIMIT)\n : state.toolCalls;\n for (const tool of recent) {\n if (!metadataReferencedByText(tool, haystack)) continue;\n tool.status = 'referenced';\n tool.referenceCount++;\n tool.referencedAt = Date.now();\n for (const file of tool.files) {\n const node = state.fileGraph[file];\n if (node) node.referenced = true;\n }\n }\n state.updatedAt = Date.now();\n}\n\nexport function buildContextEvidenceDigest(ctx: Context): string {\n const state = ensureEvidence(ctx);\n const lines: string[] = [];\n\n if (state.currentIntent?.text) {\n lines.push(`intent: ${state.currentIntent.text}`);\n }\n\n const goals = state.sessionGoals.slice(-3);\n if (goals.length > 0) {\n lines.push('session_goals:');\n for (const goal of goals) lines.push(`- ${goal}`);\n }\n\n const activeErrors = state.activeErrors.slice(-5);\n if (activeErrors.length > 0) {\n lines.push('active_errors:');\n for (const err of activeErrors) lines.push(`- ${err}`);\n }\n\n const files = Object.values(state.fileGraph)\n .sort((a, b) => (b.writes - a.writes) || (b.reads - a.reads) || a.path.localeCompare(b.path))\n .slice(0, 12);\n if (files.length > 0) {\n lines.push('dependency_graph:');\n for (const file of files) {\n const actions = [\n file.reads > 0 ? `read ${file.reads}x` : '',\n file.writes > 0 ? `write ${file.writes}x` : '',\n ].filter(Boolean).join(', ');\n const refs = file.referenced ? '; referenced by assistant' : '';\n const via = file.lastToolUseId ? `; last via ${file.lastToolUseId}` : '';\n lines.push(`- ${file.path} (${actions || 'seen'}${refs}${via})`);\n }\n }\n\n const referenced = state.toolCalls\n .filter((tool) => tool.status === 'referenced')\n .slice(-10);\n const recentSeen = state.toolCalls\n .filter((tool) => tool.status === 'seen')\n .slice(-5);\n const trail = [...referenced, ...recentSeen];\n if (trail.length > 0) {\n lines.push('tool_trail:');\n for (const tool of trail) {\n const size = tool.outputTokens ? `; ~${tool.outputTokens} tokens` : '';\n const filesText = tool.files.length > 0 ? `; files=${tool.files.slice(0, 4).join(', ')}` : '';\n const symbolsText = tool.symbols.length > 0 ? `; symbols=${tool.symbols.slice(0, 4).join(', ')}` : '';\n lines.push(\n `- ${tool.toolUseId} ${tool.toolName} ${tool.status}: ${tool.summary}${filesText}${symbolsText}${size}`,\n );\n }\n }\n\n const facts = state.implicitFacts.slice(-8);\n if (facts.length > 0) {\n lines.push('implicit_facts:');\n for (const fact of facts) lines.push(`- ${fact}`);\n }\n\n const digest = lines.join('\\n');\n if (digest.length <= MAX_DIGEST_CHARS) return digest;\n return `${digest.slice(0, MAX_DIGEST_CHARS)}... [+${digest.length - MAX_DIGEST_CHARS} chars]`;\n}\n\nexport function repeatedReadPressure(ctx: Context): number {\n return ensureEvidence(ctx).repeatedReads.reduce((max, item) => Math.max(max, item.count), 0);\n}\n\nfunction ensureEvidence(ctx: Context): ContextEvidenceState {\n if (!ctx.contextEvidence) {\n (ctx as never as { contextEvidence: ContextEvidenceState }).contextEvidence =\n createContextEvidenceState();\n }\n return ctx.contextEvidence;\n}\n\nfunction isGoalish(text: string): boolean {\n return /\\b(goal|objective|task|need|want|implement|fix|improve|refactor|add|remove|hedef|amac|istiyorum|gerekiyor|iyilestir|duzelt|ekle|kaldir)\\b/i.test(text);\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\nfunction pushUniqueBounded(list: string[], value: string, max: number): void {\n const normalized = normalizeWhitespace(value);\n if (!normalized) return;\n const existing = list.findIndex((item) => item.toLowerCase() === normalized.toLowerCase());\n if (existing >= 0) list.splice(existing, 1);\n list.push(normalized);\n if (list.length > max) list.splice(0, list.length - max);\n}\n\nfunction extractFiles(\n ctx: Context,\n toolName: string,\n input: unknown,\n content: string,\n): string[] {\n const out = new Set<string>();\n for (const value of inputPathValues(input)) addPath(ctx, out, value);\n\n if (toolName === 'grep' || toolName === 'glob' || toolName === 'bash') {\n const re = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\n for (const match of content.matchAll(re)) addPath(ctx, out, match[0]);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction inputPathValues(input: unknown): string[] {\n const values: string[] = [];\n const visit = (value: unknown, key?: string): void => {\n if (typeof value === 'string') {\n if (key && /^(path|file|files|fromFile|toFile|dir|cwd)$/i.test(key)) values.push(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) visit(item, key);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) visit(v, k);\n };\n visit(input);\n return values;\n}\n\nfunction addPath(ctx: Context, out: Set<string>, raw: string): void {\n const clean = raw.trim().replace(/^[\"'`]+|[\"'`),;:]+$/g, '');\n if (!clean || clean.length > 260) return;\n let normalized = clean.replace(/\\\\/g, '/');\n try {\n const abs = path.isAbsolute(clean) ? path.resolve(clean) : null;\n if (abs) {\n const rel = path.relative(ctx.projectRoot, abs);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n normalized = rel.replace(/\\\\/g, '/');\n }\n }\n } catch {\n // Keep the best-effort normalized string.\n }\n if (normalized.length > 0) out.add(normalized);\n}\n\nfunction extractSymbols(content: string, input: unknown): string[] {\n const out = new Set<string>();\n const patterns = [\n /\\b(?:function|class|interface|type|enum|const|let|var|def|fn|struct)\\s+([A-Za-z_$][\\w$]*)/g,\n /\\b(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/g,\n ];\n for (const re of patterns) {\n for (const match of content.matchAll(re)) {\n if (match[1]) out.add(match[1]);\n if (out.size >= 30) break;\n }\n }\n\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n if (typeof pattern === 'string' && /^[A-Za-z_$][\\w$]*$/.test(pattern)) {\n out.add(pattern);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction extractCommands(toolName: string, input: unknown): string[] {\n if (toolName !== 'bash' && toolName !== 'exec' && toolName !== 'shell') return [];\n if (!input || typeof input !== 'object') return [];\n const command = (input as Record<string, unknown>)['command'];\n if (typeof command !== 'string') return [];\n return [command.slice(0, 220)];\n}\n\nfunction extractErrors(content: string): string[] {\n const allLines = content.split(/\\r?\\n/);\n // Only scan the last N lines — errors and stack traces surface at the\n // bottom of tool output. Scanning all lines means one regex test per line,\n // so a 2000-line file read costs 2000 regex evaluations for no gain since\n // the interesting errors are always at the tail.\n const lines = allLines.length > EXTRACT_ERROR_TAIL_LINES\n ? allLines.slice(-EXTRACT_ERROR_TAIL_LINES)\n : allLines;\n const errors: string[] = [];\n for (const line of lines) {\n if (!/\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm|typeerror|syntaxerror)\\b/i.test(line)) continue;\n errors.push(normalizeWhitespace(line).slice(0, 260));\n if (errors.length >= 5) break;\n }\n return errors;\n}\n\nfunction summarizeInput(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const parts: string[] = [];\n for (const key of ['path', 'file', 'pattern', 'glob', 'command']) {\n const value = obj[key];\n if (typeof value === 'string') parts.push(`${key}=${value.slice(0, 160)}`);\n }\n return parts.length > 0 ? parts.join(', ') : undefined;\n}\n\nfunction summarizeToolOutput(\n toolName: string,\n input: unknown,\n content: string,\n opts: { files: string[]; symbols: string[]; errors: string[]; ok: boolean },\n): string {\n if (!opts.ok && opts.errors.length > 0) return opts.errors[0] ?? `${toolName} failed`;\n if (toolName === 'read' && opts.files[0]) return `read ${opts.files[0]}`;\n if (toolName === 'grep') {\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n return `searched ${typeof pattern === 'string' ? pattern : 'pattern'} (${opts.files.length} file hint(s))`;\n }\n if ((toolName === 'edit' || toolName === 'write') && opts.files[0]) {\n return `${toolName === 'write' ? 'wrote' : 'edited'} ${opts.files[0]}`;\n }\n const firstLine = normalizeWhitespace(content.split(/\\r?\\n/).find((line) => line.trim()) ?? '');\n return firstLine ? firstLine.slice(0, 220) : `${toolName} returned no text`;\n}\n\nfunction updateFileGraph(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n const writes = WRITE_TOOLS.has(metadata.toolName) ? 1 : 0;\n const reads = writes === 0 && (READ_TOOLS.has(metadata.toolName) || metadata.files.length > 0)\n ? 1\n : 0;\n for (const file of metadata.files) {\n const existing = state.fileGraph[file] ?? {\n path: file,\n reads: 0,\n writes: 0,\n tools: [],\n referenced: false,\n };\n existing.reads += reads;\n existing.writes += writes;\n existing.lastToolUseId = metadata.toolUseId;\n pushUniqueBounded(existing.tools, `${metadata.toolName}#${metadata.toolUseId}`, 8);\n state.fileGraph[file] = existing;\n }\n}\n\nfunction updateRepeatedReadSignals(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n if (metadata.toolName !== 'read' || metadata.files.length === 0) {\n state.lastReadPath = undefined;\n return;\n }\n const file = metadata.files[0] as string;\n if (state.lastReadPath === file) {\n const existing = state.repeatedReads.find((item) => item.file === file);\n if (existing) {\n existing.count++;\n existing.lastToolUseId = metadata.toolUseId;\n } else {\n state.repeatedReads.push({ file, count: 2, lastToolUseId: metadata.toolUseId });\n }\n if (state.repeatedReads.length > 10) state.repeatedReads.shift();\n }\n state.lastReadPath = file;\n}\n\nfunction implicitFactFor(metadata: ToolOutputMetadata): string | undefined {\n if (metadata.errors.length > 0) return `${metadata.toolName}#${metadata.toolUseId} exposed error: ${metadata.errors[0]}`;\n if (metadata.toolName === 'read' && metadata.files[0]) {\n const size = metadata.outputLines ? ` (${metadata.outputLines} line(s) returned)` : '';\n return `read ${metadata.files[0]}${size}`;\n }\n if ((metadata.toolName === 'edit' || metadata.toolName === 'write') && metadata.files[0]) {\n return `${metadata.toolName} changed ${metadata.files[0]}`;\n }\n if (metadata.status === 'referenced') return `${metadata.toolName}#${metadata.toolUseId} was referenced`;\n return undefined;\n}\n\nfunction metadataReferencedByText(metadata: ToolOutputMetadata, haystack: string): boolean {\n for (const file of metadata.files) {\n const f = file.toLowerCase();\n const base = path.basename(file).toLowerCase();\n if (f && haystack.includes(f)) return true;\n if (base && haystack.includes(base)) return true;\n }\n for (const symbol of metadata.symbols) {\n if (symbol.length >= 3 && haystack.includes(symbol.toLowerCase())) return true;\n }\n for (const err of metadata.errors) {\n const head = err.slice(0, 80).toLowerCase();\n if (head.length >= 12 && haystack.includes(head)) return true;\n }\n return false;\n}\n","/**\n * Deep merge utility — safely merges nested objects with configurable\n * conflict resolution, array merging, and prototype-pollution guarding.\n *\n * Used by:\n * - config-loader (config layer merging with primitive-array concatenation)\n * - secret-vault (config patching)\n * - json-path (json_merge tool with prefer-base / prefer-patch semantics)\n *\n * @module utils/deep-merge\n */\n\n// ---------------------------------------------------------------------------\n// Prototype-pollution guard — shared set of forbidden __proto__ keys\n// ---------------------------------------------------------------------------\n\nexport const FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** True when every element is a primitive or null (no nested objects/arrays). */\nexport function isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || (typeof v !== 'object' && typeof v !== 'function'));\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepMergeOptions {\n /**\n * Which side wins on collision for scalars and arrays.\n *\n * - `'prefer-patch'` (default): patch value replaces base value.\n * - `'prefer-base'`: base value is kept, patch value is ignored.\n */\n conflictResolution?: 'prefer-base' | 'prefer-patch';\n\n /**\n * How to handle array values.\n *\n * - `'replace'` (default): patch array replaces base array entirely.\n * - `'concat-primitives'`: when both values are primitive arrays,\n * they are concatenated and deduped (via Set). Non-primitive\n * arrays still replace the base wholesale.\n */\n arrayMode?: 'replace' | 'concat-primitives';\n\n /**\n * Skip prototype-pollution keys (`__proto__`, `constructor`, etc.).\n * Enabled by default. Only disable when you control both inputs\n * and the keyset (e.g. when merging trusted JSON schemas).\n */\n protectProto?: boolean;\n\n /**\n * Optional callback fired when a non-primitive (object) array is\n * replaced wholesale (only relevant with `arrayMode: 'concat-primitives'`).\n * Receives the key name, existing array length, and patch array length.\n * Used by config-loader for debug logging.\n */\n onNonPrimitiveArrayReplace?: (\n key: string,\n existingLen: number,\n patchLen: number,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merge `patch` into `base`, returning a new object.\n *\n * - Nested plain objects are merged recursively.\n * - Arrays are handled per `options.arrayMode`.\n * - Scalar collisions are resolved per `options.conflictResolution`.\n * - `null` and non-object values in `patch` replace the base value\n * (unless `conflictResolution` is `'prefer-base'`).\n * - Keys in `base` that are absent from `patch` are preserved.\n * - `FORBIDDEN_PROTO_KEYS` are skipped in the patch (unless\n * `options.protectProto` is set to `false`).\n *\n * The function is generic over `T extends Record<string, unknown>` for\n * callers that pass typed config objects, but the runtime signature\n * also accepts `unknown` inputs (used by the json-path plugin).\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n options?: DeepMergeOptions,\n): T;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options?: DeepMergeOptions,\n): unknown;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options: DeepMergeOptions = {},\n): unknown {\n const {\n conflictResolution = 'prefer-patch',\n arrayMode = 'replace',\n protectProto = true,\n onNonPrimitiveArrayReplace,\n } = options;\n\n // Non-object / null handling — delegate to conflict resolution.\n if (typeof base !== 'object' || base === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n if (typeof patch !== 'object' || patch === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Arrays — handled *before* the object merge so array-of-objects\n // aren't accidentally treated as plain records.\n if (Array.isArray(base) && Array.isArray(patch)) {\n if (\n arrayMode === 'concat-primitives' &&\n isPrimitiveArray(base) &&\n isPrimitiveArray(patch)\n ) {\n return [...new Set([...base, ...patch])];\n }\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // If only one side is an array, treat as scalar collision.\n if (Array.isArray(base) || Array.isArray(patch)) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Plain object merge.\n const baseObj = base as Record<string, unknown>;\n const patchObj = patch as Record<string, unknown>;\n const out: Record<string, unknown> = { ...baseObj };\n\n for (const [k, v] of Object.entries(patchObj)) {\n if (protectProto && FORBIDDEN_PROTO_KEYS.has(k)) continue;\n\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n // Recursive merge for nested plain objects.\n out[k] = deepMerge(existing, v, options);\n } else if (Array.isArray(v) && Array.isArray(existing)) {\n // Delegate to top-level array handling so arrayMode\n // (e.g. 'concat-primitives') applies to nested arrays too.\n // Fire debug hook when a non-primitive array replaces an existing\n // array (for non-primitive arrays, concat-primitives is a no-op and\n // the result is always a wholesale replacement).\n if (onNonPrimitiveArrayReplace && !isPrimitiveArray(v)) {\n onNonPrimitiveArrayReplace(k, existing.length, v.length);\n }\n out[k] = deepMerge(existing, v, options);\n } else if (v !== undefined) {\n // Fire debug hook when a non-primitive (object) array replaces an\n // existing value in concat-primitives mode.\n if (\n onNonPrimitiveArrayReplace &&\n Array.isArray(v) &&\n !isPrimitiveArray(v)\n ) {\n const existingLen = Array.isArray(existing) ? existing.length : 0;\n onNonPrimitiveArrayReplace(k, existingLen, v.length);\n }\n out[k] = v;\n }\n // When v === undefined, leave the existing value untouched\n // (this matches config-loader's behaviour: undefined in patch\n // means \"don't change this key\").\n }\n\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors, 0);\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Maximum nesting depth before the validator stops recursing and reports a\n * \"schema too deep\" error. Deeply nested input (e.g. batch_tool_use with 100\n * nested calls → tool_use → input) can otherwise hit `RangeError: Maximum\n * call stack size exceeded` and crash the tool executor.\n *\n * 64 is generous: real-world tool schemas rarely nest beyond 5-6 levels, and\n * even pathological inputs (deeply recursive JSON) stay well under this.\n * The limit is a safety net against unbounded recursion, not a tight bound.\n */\nconst MAX_SCHEMA_DEPTH = 64;\n\nfunction walk(\n value: unknown,\n schema: JSONSchema,\n path: string,\n errors: ValidationError[],\n depth: number,\n): void {\n // P2 #8 (before-release.md): cap recursion depth to prevent\n // `RangeError: Maximum call stack size exceeded` on deeply nested input.\n // Push a validation error and stop descending — the caller still gets a\n // usable (ok: false) result instead of a crash.\n if (depth > MAX_SCHEMA_DEPTH) {\n errors.push({\n path: path || '<root>',\n message: `schema nesting exceeds maximum depth (${MAX_SCHEMA_DEPTH})`,\n });\n return;\n }\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors, depth + 1);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n walk(value[i], schema.items as JSONSchema, `${path}[${i}]`, errors, depth + 1);\n }\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import { expectDefined } from './expect-defined.js';\nimport type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = expectDefined(messages[i]);\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import * as path from 'node:path';\nimport { ERROR_CODES, FsError } from '../types/errors.js';\n\n/**\n * Resolve `<dir>/<sessionId><suffix>` for per-session sidecar files\n * (annotations, audit chain, replay log, the session JSONL itself).\n *\n * Modern session ids are date-sharded (\"2026-06-11/sess_<ULID>\"),\n * so a forward slash is a legitimate shard separator — NOT traversal.\n * Escape attempts are blocked two ways: an explicit ban on `..` and\n * backslashes, plus a resolved-path containment check that rejects any\n * id whose resolved target leaves `dir`. Character bans alone are how\n * several stores ended up throwing on every modern session id.\n */\nexport function sessionScopedPath(dir: string, sessionId: string, suffix: string): string {\n if (!sessionId || sessionId.includes('\\\\') || sessionId.includes('..')) {\n throw invalid(sessionId);\n }\n const resolved = path.resolve(dir, `${sessionId}${suffix}`);\n const rel = path.relative(path.resolve(dir), resolved);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw invalid(sessionId);\n }\n return resolved;\n}\n\nfunction invalid(sessionId: string): FsError {\n return new FsError({\n message: `Invalid sessionId: ${sessionId}`,\n code: ERROR_CODES.FS_DELETE_FAILED,\n path: sessionId,\n context: { reason: 'path_traversal' },\n });\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","const GLOB_METACHARACTERS = /[*?[\\]]/g;\n\nexport function escapeGlobSubject(value: string): string {\n return value.replace(GLOB_METACHARACTERS, (char) => `\\\\${char}`);\n}\n\nexport function normalizePathSubject(value: string): string {\n return escapeGlobSubject(value.replace(/\\\\/g, '/'));\n}\n\nexport function isPathSubjectKey(subjectKey: string): boolean {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n}\n\nexport function subjectForToolInput(\n toolName: string,\n input: unknown,\n subjectKey?: string,\n): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n if (subjectKey) {\n const value = obj[subjectKey];\n if (typeof value === 'string') {\n return isPathSubjectKey(subjectKey) ? normalizePathSubject(value) : escapeGlobSubject(value);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlobSubject(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePathSubject(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlobSubject(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlobSubject(obj.name);\n }\n return undefined;\n}\n","import type { JSONSchema } from '../types/tool.js';\n\nexport interface ToolWireDefinitionLike {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}\n\nexport interface CompactToolDefinitionForWireOptions {\n /** Top-level tool description budget. */\n descriptionMaxChars?: number | undefined;\n /** Per-JSON-Schema `description` annotation budget. */\n schemaDescriptionMaxChars?: number | undefined;\n}\n\nexport interface CompactWireToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nconst TOOL_DESCRIPTION_MAX_CHARS = 640;\nconst SCHEMA_DESCRIPTION_MAX_CHARS = 180;\n\nconst compactCache = new WeakMap<object, CompactWireToolDefinition>();\n\n/**\n * Return the provider-wire version of a tool definition.\n *\n * Tool schemas remain structurally intact: validation keywords, property\n * names, required fields, enum values, and nested shapes are preserved. The\n * only reduction is on human prose annotations (`description`), which are the\n * largest repeated cost in provider tool declarations.\n */\nexport function compactToolDefinitionForWire(\n tool: ToolWireDefinitionLike,\n opts: CompactToolDefinitionForWireOptions = {},\n): CompactWireToolDefinition {\n const useDefaultOptions =\n opts.descriptionMaxChars === undefined && opts.schemaDescriptionMaxChars === undefined;\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n const cached = compactCache.get(tool);\n if (cached) return cached;\n }\n\n const compact: CompactWireToolDefinition = {\n name: tool.name,\n description: compactDescription(\n tool.description ?? '',\n opts.descriptionMaxChars ?? TOOL_DESCRIPTION_MAX_CHARS,\n ),\n inputSchema: compactSchemaDescriptions(\n tool.inputSchema,\n opts.schemaDescriptionMaxChars ?? SCHEMA_DESCRIPTION_MAX_CHARS,\n ),\n };\n\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n compactCache.set(tool, compact);\n }\n return compact;\n}\n\nexport function compactSchemaDescriptions(\n schema: unknown,\n maxDescriptionChars = SCHEMA_DESCRIPTION_MAX_CHARS,\n): Record<string, unknown> {\n const compact = compactSchemaNode(schema, maxDescriptionChars);\n return isRecord(compact) ? compact : { type: 'object', properties: {} };\n}\n\nfunction compactSchemaNode(node: unknown, maxDescriptionChars: number): unknown {\n if (Array.isArray(node)) {\n return node.map((item) => compactSchemaNode(item, maxDescriptionChars));\n }\n if (!isRecord(node)) return node;\n\n const out: JSONSchema = {};\n for (const [key, value] of Object.entries(node)) {\n if (key === 'description' && typeof value === 'string') {\n out[key] = compactDescription(value, maxDescriptionChars);\n } else {\n out[key] = compactSchemaNode(value, maxDescriptionChars);\n }\n }\n return out;\n}\n\nfunction compactDescription(text: string, maxChars: number): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxChars) return normalized;\n if (maxChars <= 20) return normalized.slice(0, maxChars);\n\n const hardLimit = maxChars - 12;\n const boundary = findSemanticBoundary(normalized, hardLimit);\n const head = normalized.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd();\n return `${head} ...`;\n}\n\nfunction findSemanticBoundary(text: string, limit: number): number {\n const punctuation = Math.max(\n text.lastIndexOf('. ', limit),\n text.lastIndexOf('; ', limit),\n text.lastIndexOf(': ', limit),\n );\n if (punctuation >= Math.floor(limit * 0.45)) return punctuation + 1;\n\n const comma = text.lastIndexOf(', ', limit);\n if (comma >= Math.floor(limit * 0.6)) return comma + 1;\n\n const space = text.lastIndexOf(' ', limit);\n return space >= Math.floor(limit * 0.6) ? space : limit;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { Message } from '../types/messages.js';\nimport { compactToolDefinitionForWire } from './tool-wire-compact.js';\n\n/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\ninterface CalState {\n ratio: number; // current calibration multiplier (actual / estimated)\n count: number; // number of samples recorded\n prevEst: number; // estimated tokens from the most recent estimateRequestTokens call\n}\n\n/** EWM α — higher = faster adaptation, more volatile. */\nconst CAL_ALPHA = 0.3;\n\n/**\n * Calibration is keyed so that, in a multi-agent / model-switching process,\n * each (provider, model) tokenizer gets its own ratio instead of all of them\n * collapsing onto one shared number. Callers that don't pass a key use the\n * shared `__global__` bucket — that preserves the original single-session\n * behavior and keeps all existing call sites working unchanged.\n */\nconst CALIBRATION_GLOBAL_KEY = '__global__';\nconst _cals = new Map<string, CalState>();\n\nfunction calState(key: string): CalState {\n let state = _cals.get(key);\n if (!state) {\n state = { ratio: 1.0, count: 0, prevEst: 0 };\n _cals.set(key, state);\n }\n return state;\n}\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\n\n/**\n * Fallback chars/token ratios per model family for providers that don't return\n * usage data. Used when `recordActualUsage` receives zero/negative tokens and\n * we have enough samples to trust the fallback. Keys are lowercase prefixes.\n */\nconst MODEL_FAMILY_RATIO: Record<string, number> = {\n // Anthropic: ~3.8-4.0 chars/token depending on model\n claude: 3.8,\n // OpenAI: ~4.0 chars/token\n 'gpt-4': 4.0,\n 'gpt-3.5': 4.0,\n // Google: ~3.5 chars/token\n gemini: 3.5,\n // DeepSeek: ~3.5 chars/token\n deepseek: 3.5,\n};\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n/** Insertion-order queue for O(1) LRU eviction: shift from front on overcapacity. */\nconst _estimateCacheOrder: string[] = [];\n\nconst ESTIMATE_CACHE_MAX_SIZE = 50_000;\n\nfunction getCachedEstimate(key: string, compute: (key: string) => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest half — O(1) per eviction (array shift + Map.delete) instead\n // of O(n) iteration over all 50 000 keys in the Map.\n while (ESTIMATE_CACHE.size > Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) {\n const oldest = _estimateCacheOrder.shift();\n if (oldest !== undefined) ESTIMATE_CACHE.delete(oldest);\n }\n }\n const estimate = compute(key);\n ESTIMATE_CACHE.set(key, estimate);\n _estimateCacheOrder.push(key);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n // JSON.stringify is called once to form the cache key; RoughTokenEstimate\n // is deferred only on cache miss (compute callback), not wrapped unnecessarily.\n return getCachedEstimate(JSON.stringify(input), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n return getCachedEstimate(JSON.stringify(content), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Compute and cache the token estimate for a single message. This is the\n * canonical per-message estimator — called once by ConversationState on\n * append/replace so the O(n·m) content-block walk happens at mutation time,\n * not on every context-pressure check.\n */\nexport function computeMessageTokens(msg: Message): number {\n if (typeof msg.content === 'string') return estimateTextTokens(msg.content);\n let total = 0;\n for (const b of msg.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n else total += RoughTokenEstimate(JSON.stringify(b));\n }\n return total;\n}\n\n/**\n * Estimate tokens for an array of messages (text + tool I/O), using the shared\n * 3.5 chars/token basis. This is the single canonical message-array estimator —\n * compactors, the context_manager tool, and the `/context` display all route\n * through it so the number a user sees matches the number compaction decides on.\n *\n * When a message carries a pre-computed `_estTokens` field (set by\n * ConversationState on append/replace), it is used directly instead of\n * re-walking the content blocks — turning the O(n·m) scan into an O(n)\n * sum for fully-cached arrays.\n */\nexport function estimateMessageTokens(messages: readonly Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m._estTokens === 'number' && m._estTokens > 0) {\n total += m._estTokens;\n continue;\n }\n total += computeMessageTokens(m);\n }\n return total;\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}): number {\n // Fast path: pre-computed by ToolRegistry at registration time.\n const cached = (tool as { _estDefTokens?: number | undefined })._estDefTokens;\n if (typeof cached === 'number' && cached > 0) return cached;\n\n const compact = compactToolDefinitionForWire(tool);\n return (\n RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(compact.description) +\n RoughTokenEstimate(JSON.stringify(compact.inputSchema))\n );\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n // Fast path: pre-computed per-message token estimate (set by\n // ConversationState on append/replace). Skips the O(m) content-block\n // walk entirely for cached messages.\n const cached = (m as { _estTokens?: number | undefined })._estTokens;\n if (typeof cached === 'number' && cached > 0) {\n messagesTokens += cached;\n continue;\n }\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string | undefined }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (\n typeof b === 'object' &&\n b !== null &&\n (b as { type?: string | undefined }).type === 'text'\n ) {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n calState(calibrationKey).prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to the keyed bucket's\n * `prevEst` for backward compatibility with callers that don't have the\n * pre-flight value. `calibrationKey` selects the per-(provider,model) bucket\n * (defaults to the shared global bucket).\n */\nexport function recordActualUsage(\n actualInputTokens: number,\n estimatedInputTokens?: number,\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): void {\n if (actualInputTokens <= 0) return;\n const cal = calState(calibrationKey);\n const est = estimatedInputTokens ?? cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (cal.count === 0) {\n cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n cal.ratio = CAL_ALPHA * sampleRatio + (1 - CAL_ALPHA) * cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n cal.ratio = Math.min(1.5, Math.max(0.5, cal.ratio));\n cal.count++;\n}\n\n/**\n * Returns the current calibration state for a bucket. Exposed for debugging\n * and tests — not needed by normal callers.\n */\nexport function getCalibrationState(calibrationKey: string = CALIBRATION_GLOBAL_KEY): {\n ratio: number;\n count: number;\n calibrated: boolean;\n} {\n const cal = calState(calibrationKey);\n return {\n ratio: cal.ratio,\n count: cal.count,\n calibrated: cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);\n const cal = calState(calibrationKey);\n\n if (cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n // No calibration samples yet — fall back to model-family ratio if available,\n // otherwise use the uncalibrated estimate (ratio = 1.0).\n const fallbackRatio = getModelFamilyRatio(calibrationKey);\n if (fallbackRatio !== null) {\n return {\n messages: Math.round(result.messages * fallbackRatio),\n systemPrompt: Math.round(result.systemPrompt * fallbackRatio),\n tools: Math.round(result.tools * fallbackRatio),\n total: Math.round(result.total * fallbackRatio),\n };\n }\n\n return result;\n}\n\n/** Look up the fallback chars/token ratio for a calibration key (e.g. \"provider/model\"). */\nfunction getModelFamilyRatio(calibrationKey: string): number | null {\n const lower = calibrationKey.toLowerCase();\n for (const [family, ratio] of Object.entries(MODEL_FAMILY_RATIO)) {\n if (lower.includes(family)) return ratio / 3.5; // MODEL_FAMILY_RATIO is chars/token, we need multiplier\n }\n return null;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites. With no argument it clears\n * every bucket (including the global one); pass a key to reset just that bucket.\n */\nexport function resetCalibration(calibrationKey?: string): void {\n if (calibrationKey === undefined) {\n _cals.clear();\n return;\n }\n _cals.delete(calibrationKey);\n}\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number | undefined;\n estimator?: ((text: string) => number) | undefined;\n}\n\nexport interface ToolOutputSerializeContext {\n toolName?: string | undefined;\n input?: unknown;\n /**\n * Optional reference to the Tool object. When present and the tool defines\n * a `serialize()` method, the serializer delegates to it instead of the\n * central `renderToolObject()` switch (P3 #21).\n */\n tool?: { serialize?: (output: unknown, input: unknown) => string } | undefined;\n}\n\ntype RecordValue = Record<string, unknown>;\n\nconst DEFAULT_LIST_LIMIT = 500;\nconst LOG_ENTRY_LIMIT = 200;\nconst INLINE_LIMIT = 240;\nconst GREP_FILE_LIMIT = 80;\nconst GREP_MATCHES_PER_FILE = 3;\nconst DIFF_INLINE_LINE_LIMIT = 260;\nconst DIFF_HUNK_LIMIT = 8;\nconst DIFF_HUNK_CONTEXT = 14;\n\n// Pre-compiled regex — used in parseGrepContentLine() for every grep match line.\n// Compiling once at module load avoids repeated RegExp construction overhead.\nconst GREP_LINE_RE = /^(.+?):(\\d+):(.*)$/;\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown, context: ToolOutputSerializeContext = {}): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map((item) => serialize(item)).join('\\n');\n // P3 #21 (before-release.md): prefer the tool's own serialize() method\n // when it defines one — lets tools own their output formatting without\n // adding a branch to the central renderToolObject() god function.\n if (context.tool?.serialize) {\n try {\n return context.tool.serialize(value, context.input);\n } catch {\n // Fall through to the central renderer if the tool's serializer\n // throws — never let a formatting error break the tool result.\n }\n }\n if (context.toolName) {\n const compact = renderToolObject(context.toolName, value as RecordValue, context.input);\n if (compact !== undefined) return compact;\n return renderGenericToolObject(context.toolName, value as RecordValue);\n }\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n\nfunction renderToolObject(toolName: string, obj: RecordValue, input: unknown): string | undefined {\n if (toolName === 'read' && typeof obj['text'] === 'string') {\n return joinSections([\n renderHeader(\n `read: ${stringFromInput(input, 'path') ?? stringField(obj, 'path') ?? '<unknown>'}`,\n {\n offset: numberFromInput(input, 'offset'),\n limit: numberFromInput(input, 'limit'),\n total_lines: obj['total_lines'],\n encoding: obj['encoding'],\n truncated: obj['truncated'],\n cached: obj['cached'],\n note: obj['note'],\n },\n ),\n obj['text'],\n ]);\n }\n\n if (toolName === 'grep' && Array.isArray(obj['matches'])) {\n const matches = stringArrayField(obj, 'matches');\n return joinSections([\n renderHeader(`grep: ${stringFromInput(input, 'pattern') ?? '<pattern>'}`, {\n path: stringFromInput(input, 'path'),\n glob: stringFromInput(input, 'glob'),\n mode: stringFromInput(input, 'output_mode'),\n count: obj['count'],\n shown: matches.length,\n truncated: obj['truncated'],\n used: obj['used'],\n }),\n renderGrepMatches(matches, stringFromInput(input, 'output_mode')),\n ]);\n }\n\n if (toolName === 'patch' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader('patch', {\n applied: obj['applied'],\n rejected: obj['rejected'],\n files: files.length,\n dry_run: obj['dry_run'],\n }),\n typeof obj['message'] === 'string' ? `message:\\n${obj['message']}` : undefined,\n files.length > 0 ? `files:\\n${renderStringList(files)}` : undefined,\n ]);\n }\n\n if (toolName === 'glob' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader(\n `${toolName}: ${stringFromInput(input, 'pattern') ?? stringFromInput(input, 'files') ?? stringFromInput(input, 'path') ?? ''}`.trim(),\n {\n path: stringFromInput(input, 'path'),\n files: files.length,\n truncated: obj['truncated'],\n },\n ),\n renderStringList(files, '(no files)'),\n ]);\n }\n\n if (toolName === 'tree' && typeof obj['tree'] === 'string') {\n return joinSections([\n renderHeader(\n `tree: ${stringField(obj, 'path') ?? stringFromInput(input, 'path') ?? '<cwd>'}`,\n {\n total_files: obj['total_files'],\n total_dirs: obj['total_dirs'],\n truncated: obj['truncated'],\n },\n ),\n obj['tree'],\n ]);\n }\n\n if (toolName === 'fetch' && typeof obj['content'] === 'string') {\n return joinSections([\n renderHeader(\n `fetch: ${stringField(obj, 'url') ?? stringFromInput(input, 'url') ?? '<url>'}`,\n {\n status: obj['status'],\n content_type: obj['content_type'],\n },\n ),\n obj['content'],\n ]);\n }\n\n if (toolName === 'replace' && Array.isArray(obj['results'])) {\n const results = obj['results'].filter(isRecord);\n const sections: Array<string | undefined> = [\n renderHeader('replace', {\n files_modified: obj['files_modified'],\n total_replacements: obj['total_replacements'],\n dry_run: obj['dry_run'],\n }),\n ];\n for (const r of results.slice(0, DEFAULT_LIST_LIMIT)) {\n sections.push(\n joinSections([\n renderHeader(`file: ${stringField(r, 'path') ?? '<unknown>'}`, {\n replacements: r['replacements'],\n }),\n typeof r['diff'] === 'string' ? r['diff'] : undefined,\n ]),\n );\n }\n if (results.length > DEFAULT_LIST_LIMIT) {\n sections.push(`[serializer omitted ${results.length - DEFAULT_LIST_LIMIT} result item(s)]`);\n }\n return joinSections(sections);\n }\n\n if (typeof obj['diff'] === 'string') {\n const diff = obj['diff'];\n return joinSections([\n renderHeader(toolName, {\n path: obj['path'],\n replacements: obj['replacements'],\n bytes_written: obj['bytes_written'],\n created: obj['created'],\n note: obj['note'],\n files: Array.isArray(obj['files']) ? obj['files'].length : undefined,\n truncated: obj['truncated'],\n mode: obj['mode'],\n }),\n compactDiff(diff),\n ]);\n }\n\n if (toolName === 'test' && typeof obj['output'] === 'string') {\n return renderTestOutput(obj, input);\n }\n\n if (\n (toolName === 'typecheck' || toolName === 'lint' || toolName === 'format') &&\n typeof obj['output'] === 'string'\n ) {\n return renderVerifierOutput(toolName, obj, input);\n }\n\n if (hasCommandOutputShape(obj)) {\n return renderCommandOutput(toolName, obj, input);\n }\n\n if (toolName === 'json' && typeof obj['formatted'] === 'string') {\n return joinSections([\n renderHeader('json', {\n type: obj['type'],\n keys: Array.isArray(obj['keys']) ? obj['keys'].length : undefined,\n query: stringFromInput(input, 'query'),\n error: obj['error'],\n }),\n obj['formatted'],\n ]);\n }\n\n if (toolName === 'logs' && Array.isArray(obj['entries'])) {\n const entries = obj['entries'].filter(isRecord);\n const lines = entries.slice(0, LOG_ENTRY_LIMIT).map((entry) => {\n const ts = stringField(entry, 'timestamp') ?? '';\n const level = stringField(entry, 'level') ?? 'info';\n const message = stringField(entry, 'message') ?? '';\n const source = stringField(entry, 'source');\n return [ts, level, source, message].filter(Boolean).join(' ');\n });\n if (entries.length > LOG_ENTRY_LIMIT) {\n lines.push(`[serializer omitted ${entries.length - LOG_ENTRY_LIMIT} log entry item(s)]`);\n }\n return joinSections([\n renderHeader(`logs: ${stringField(obj, 'source') ?? '<source>'}`, {\n total: obj['total'],\n shown: Math.min(entries.length, LOG_ENTRY_LIMIT),\n truncated: obj['truncated'],\n stream_mode: obj['stream_mode'],\n }),\n lines.length > 0 ? lines.join('\\n') : '(no log entries)',\n ]);\n }\n\n if (toolName === 'audit' && Array.isArray(obj['vulnerabilities'])) {\n const vulns = obj['vulnerabilities'].filter(isRecord);\n const lines = vulns.slice(0, DEFAULT_LIST_LIMIT).map((v) => {\n const severity = stringField(v, 'severity') ?? 'unknown';\n const pkg = stringField(v, 'package') ?? '<package>';\n const title = stringField(v, 'title') ?? '';\n const url = stringField(v, 'url');\n return [severity, pkg, title, url].filter(Boolean).join(' | ');\n });\n if (vulns.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${vulns.length - DEFAULT_LIST_LIMIT} vulnerability item(s)]`);\n }\n return joinSections([\n renderHeader('audit', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n summary: obj['summary'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n if (toolName === 'outdated' && Array.isArray(obj['packages'])) {\n const packages = obj['packages'].filter(isRecord);\n const lines = packages\n .slice(0, DEFAULT_LIST_LIMIT)\n .map((p) =>\n [\n stringField(p, 'name') ?? '<package>',\n `current=${stringField(p, 'current') ?? 'unknown'}`,\n `wanted=${stringField(p, 'wanted') ?? 'unknown'}`,\n `latest=${stringField(p, 'latest') ?? 'unknown'}`,\n stringField(p, 'type'),\n ]\n .filter(Boolean)\n .join(' | '),\n );\n if (packages.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${packages.length - DEFAULT_LIST_LIMIT} package item(s)]`);\n }\n return joinSections([\n renderHeader('outdated', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n return undefined;\n}\n\nfunction renderTestOutput(obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const failed = numberField(obj, 'failed') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const header = renderHeader(`test: ${stringField(obj, 'runner') ?? 'runner'}`, {\n exit_code: obj['exit_code'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n grep: stringFromInput(input, 'grep'),\n });\n\n if (exitCode === 0 && failed === 0) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n `status=passed`,\n `tests_run=${obj['tests_run'] ?? 0}`,\n `passed=${obj['passed'] ?? 0}`,\n `failed=${obj['failed'] ?? 0}`,\n `duration_ms=${obj['duration_ms'] ?? 0}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no runner output)')}`,\n ]);\n}\n\nfunction renderVerifierOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const errors = numberField(obj, 'errors') ?? 0;\n const warnings = numberField(obj, 'warnings') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const changed = numberField(obj, 'files_changed') ?? 0;\n const header = renderHeader(toolName, {\n exit_code: obj['exit_code'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n fixer: obj['fixer'],\n linter: obj['linter'],\n project: obj['project'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n cwd: stringFromInput(input, 'cwd'),\n });\n\n if (exitCode === 0 && errors === 0 && (toolName !== 'format' || changed === 0)) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=passed',\n `errors=${errors}`,\n `warnings=${warnings}`,\n toolName === 'format' ? `files_changed=${changed}` : undefined,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n if (exitCode === 0 && toolName === 'format') {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=changed',\n `files_changed=${changed}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no verifier output)')}`,\n ]);\n}\n\nfunction renderGrepMatches(matches: string[], mode: string | undefined): string {\n if (matches.length === 0) return '(no matches)';\n if (mode === 'files_with_matches') return renderStringList(matches, '(no files)');\n if (mode === 'count') return renderStringList(matches, '(no counts)');\n\n const groups = new Map<string, string[]>();\n const passthrough: string[] = [];\n for (const match of matches) {\n const parsed = parseGrepContentLine(match);\n if (!parsed) {\n passthrough.push(match);\n continue;\n }\n const list = groups.get(parsed.file) ?? [];\n list.push(`${parsed.line}:${parsed.text}`);\n groups.set(parsed.file, list);\n }\n\n if (groups.size === 0) return renderStringList(matches, '(no matches)');\n\n const sections: string[] = [];\n let fileIndex = 0;\n for (const [file, lines] of groups) {\n fileIndex++;\n if (fileIndex > GREP_FILE_LIMIT) break;\n const shown = lines.slice(0, GREP_MATCHES_PER_FILE);\n sections.push(\n `${file} (${lines.length} match(es), showing ${shown.length})\\n${shown.join('\\n')}`,\n );\n }\n if (groups.size > GREP_FILE_LIMIT) {\n sections.push(`[serializer omitted ${groups.size - GREP_FILE_LIMIT} file group(s)]`);\n }\n if (passthrough.length > 0) {\n sections.push(`ungrouped:\\n${renderStringList(passthrough, '', 50)}`);\n }\n return sections.join('\\n');\n}\n\nfunction parseGrepContentLine(\n line: string,\n): { file: string; line: string; text: string } | undefined {\n const match = GREP_LINE_RE.exec(line);\n if (!match?.[1] || !match[2]) return undefined;\n return { file: match[1], line: match[2], text: match[3] ?? '' };\n}\n\nfunction compactDiff(diff: string): string {\n const lines = diff.split(/\\r?\\n/);\n if (lines.length <= DIFF_INLINE_LINE_LIMIT) return diff;\n\n const fileCount = Math.max(\n new Set(\n lines\n .map(\n (line) => /^diff --git\\s+a\\/(.+?)\\s+b\\//.exec(line)?.[1] ?? /^---\\s+(.+)/.exec(line)?.[1],\n )\n .filter(Boolean),\n ).size,\n 0,\n );\n const hunks = lines.filter((line) => line.startsWith('@@')).length;\n const added = lines.filter((line) => line.startsWith('+') && !line.startsWith('+++')).length;\n const removed = lines.filter((line) => line.startsWith('-') && !line.startsWith('---')).length;\n\n // Collect [start, end] intervals as we scan lines sequentially.\n // Intervals are naturally ordered by line index — no sort needed.\n const intervals: Array<[number, number]> = [];\n let hunkCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.startsWith('diff --git') || line.startsWith('--- ') || line.startsWith('+++ ')) {\n intervals.push([i, i]);\n continue;\n }\n if (!line.startsWith('@@')) continue;\n if (hunkCount >= DIFF_HUNK_LIMIT) continue;\n hunkCount++;\n intervals.push([i, Math.min(lines.length - 1, i + DIFF_HUNK_CONTEXT)]);\n }\n\n if (intervals.length === 0) {\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n added,\n removed,\n lines: lines.length,\n }),\n lines.slice(0, DIFF_INLINE_LINE_LIMIT).join('\\n'),\n `[serializer omitted ${Math.max(0, lines.length - DIFF_INLINE_LINE_LIMIT)} diff line(s)]`,\n ]);\n }\n\n // Merge overlapping / adjacent intervals in a single O(n) pass.\n // Intervals are already in ascending order from the sequential scan.\n const merged: Array<[number, number]> = [intervals[0]!];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1]!;\n const current = intervals[i]!;\n if (current[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], current[1]);\n } else {\n merged.push(current);\n }\n }\n\n // Build excerpt from merged intervals — O(n), no sort.\n const excerpt: string[] = [];\n let prevLine = -1;\n for (const [start, end] of merged) {\n if (start > prevLine + 1) {\n const omitted = prevLine === -1 ? start : start - prevLine - 1;\n excerpt.push(`[serializer omitted ${omitted} diff line(s)]`);\n }\n for (let j = start; j <= end; j++) {\n excerpt.push(lines[j] ?? '');\n }\n prevLine = end;\n }\n\n const trailing = lines.length - prevLine - 1;\n if (trailing > 0) excerpt.push(`[serializer omitted ${trailing} trailing diff line(s)]`);\n\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n shown_hunks: Math.min(hunks, DIFF_HUNK_LIMIT),\n added,\n removed,\n lines: lines.length,\n }),\n excerpt.join('\\n'),\n ]);\n}\n\nfunction compactFailureOutput(output: string): string {\n const lines = output.split(/\\r?\\n/);\n if (lines.length <= 260) return output.trimEnd();\n\n const selected = new Set<number>();\n const marker =\n /\\b(fail|failed|failure|error|exception|assertionerror|expected|received|actual|timeout|stack)\\b/i;\n let markerHits = 0;\n for (let i = 0; i < lines.length; i++) {\n if (!marker.test(lines[i] ?? '')) continue;\n markerHits++;\n for (let j = Math.max(0, i - 4); j <= Math.min(lines.length - 1, i + 10); j++) {\n selected.add(j);\n }\n }\n\n if (markerHits === 0) {\n return lines.slice(-220).join('\\n').trimEnd();\n }\n\n const ordered = [...selected].sort((a, b) => a - b);\n const out: string[] = [];\n let previous = -1;\n for (const index of ordered) {\n if (index > previous + 1) {\n const omitted = previous === -1 ? index : index - previous - 1;\n out.push(`[serializer omitted ${omitted} line(s)]`);\n }\n out.push(lines[index] ?? '');\n previous = index;\n }\n return out.join('\\n').trimEnd();\n}\n\nfunction extractSpoolNote(output: string): string | undefined {\n return output\n .split(/\\r?\\n/)\n .find((line) => line.startsWith('[output truncated') && line.includes('full'));\n}\n\nfunction hasCommandOutputShape(obj: RecordValue): boolean {\n return (\n typeof obj['stdout'] === 'string' ||\n typeof obj['stderr'] === 'string' ||\n typeof obj['output'] === 'string' ||\n typeof obj['exitCode'] === 'number' ||\n typeof obj['exit_code'] === 'number'\n );\n}\n\nfunction renderCommandOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const command = stringField(obj, 'command') ?? stringFromInput(input, 'command');\n const args = stringArrayField(obj, 'args');\n const commandLine = command ? [command, ...args].join(' ') : undefined;\n const output = stringField(obj, 'output');\n const stdout = stringField(obj, 'stdout');\n const stderr = stringField(obj, 'stderr');\n return joinSections([\n renderHeader(commandLine ? `${toolName}: ${commandLine}` : toolName, {\n exit_code: obj['exit_code'] ?? obj['exitCode'],\n timed_out: obj['timed_out'],\n pid: obj['pid'],\n allowed: obj['allowed'],\n truncated: obj['truncated'],\n runner: obj['runner'],\n linter: obj['linter'],\n fixer: obj['fixer'],\n project: obj['project'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n }),\n stringField(obj, 'error') ? `error:\\n${stringField(obj, 'error')}` : undefined,\n output ? `output:\\n${output}` : undefined,\n stdout ? `stdout:\\n${stdout}` : undefined,\n stderr ? `stderr:\\n${stderr}` : undefined,\n ]);\n}\n\nfunction renderGenericToolObject(toolName: string, obj: RecordValue): string {\n const scalars: RecordValue = {};\n const blocks: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n if (isScalar(value)) {\n const inline = String(value);\n if (inline.length <= INLINE_LIMIT && !inline.includes('\\n')) {\n scalars[key] = value;\n } else {\n blocks.push(`${key}:\\n${inline}`);\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === 'string')) {\n blocks.push(`${key}:\\n${renderStringList(value as string[])}`);\n } else {\n blocks.push(`${key}:\\n${renderUnknownList(value)}`);\n }\n continue;\n }\n blocks.push(`${key}: ${clipInline(oneLineJson(value))}`);\n }\n return joinSections([renderHeader(toolName, scalars), ...blocks]);\n}\n\nfunction renderHeader(label: string, fields: RecordValue): string {\n const parts = Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${clipInline(formatInlineValue(value))}`);\n return parts.length > 0 ? `${label} (${parts.join(' ')})` : label;\n}\n\nfunction renderStringList(items: string[], empty = '', limit = DEFAULT_LIST_LIMIT): string {\n if (items.length === 0) return empty;\n const shown = items.slice(0, limit);\n const omitted = items.length - shown.length;\n return [\n ...shown,\n ...(omitted > 0\n ? [`[serializer omitted ${omitted} item(s); narrow the request for more]`]\n : []),\n ].join('\\n');\n}\n\nfunction renderUnknownList(items: unknown[], limit = DEFAULT_LIST_LIMIT): string {\n const shown = items.slice(0, limit).map((item) => clipInline(oneLineJson(item), 1_000));\n const omitted = items.length - shown.length;\n if (omitted > 0)\n shown.push(`[serializer omitted ${omitted} item(s); narrow the request for more]`);\n return shown.join('\\n');\n}\n\nfunction joinSections(sections: Array<string | undefined>): string {\n return sections\n .map((section) => (typeof section === 'string' ? section.trimEnd() : undefined))\n .filter((section): section is string => !!section)\n .join('\\n');\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(formatInlineValue).join(',')}]`;\n if (isScalar(value)) return String(value);\n return oneLineJson(value);\n}\n\nfunction clipInline(value: string, max = INLINE_LIMIT): string {\n const compact = value.replace(/\\s+/g, ' ').trim();\n return compact.length <= max\n ? compact\n : `${compact.slice(0, max - 15)}...(${compact.length} chars)`;\n}\n\nfunction oneLineJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction stringField(obj: RecordValue, key: string): string | undefined {\n const value = obj[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberField(obj: RecordValue, key: string): number | undefined {\n const value = obj[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction stringArrayField(obj: RecordValue, key: string): string[] {\n const value = obj[key];\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction stringFromInput(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberFromInput(input: unknown, key: string): number | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction inputListSummary(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) return value.filter((item) => typeof item === 'string').join(',');\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is RecordValue {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean | null {\n return value === null || ['string', 'number', 'boolean'].includes(typeof value);\n}\n\n/**\n * Render a tool result body for inclusion in the `tool.executed` event.\n * Tool outputs can be large (file dumps, command output); UIs only want a\n * preview line, so cap at ~400 chars with an ellipsis marker.\n */\nexport function truncateForEvent(content: string, max = 400): string {\n if (!content) return '';\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\n}\n\n/**\n * Derive size signals (bytes / tokens / lines) for the chip rendered beside\n * each tool result. Computed once over the FULL `content` BEFORE the\n * 400-char event preview is taken.\n *\n * - bytes: UTF-8 byte length (multi-byte aware).\n * - tokens: standard ~3.5 chars/token heuristic.\n * - lines: read prefixes lines with `<n>→`; for shell/grep/logs we fall\n * back to a newline count. Undefined for tools without a line notion.\n */\nconst READ_LINE_PREFIX_RE = /^\\s*\\d+→/gm;\n\nexport function sizeSignals(\n toolName: string | undefined,\n content: string,\n): { outputBytes: number; outputTokens: number; outputLines: number | undefined } {\n if (!content || content.length === 0) {\n return { outputBytes: 0, outputTokens: 0, outputLines: undefined };\n }\n const outputBytes = Buffer.byteLength(content, 'utf8');\n const outputTokens = Math.max(1, Math.round(outputBytes / 3.5));\n let outputLines: number | undefined;\n if (toolName === 'read') {\n READ_LINE_PREFIX_RE.lastIndex = 0;\n let count = 0;\n while (READ_LINE_PREFIX_RE.exec(content) !== null) count++;\n if (count > 0) outputLines = count;\n } else if (\n toolName === 'bash' ||\n toolName === 'shell' ||\n toolName === 'grep' ||\n toolName === 'logs'\n ) {\n let nl = 0;\n for (let i = 0; i < content.length; i++) if (content.charCodeAt(i) === 10) nl++;\n outputLines = nl + (content.endsWith('\\n') ? 0 : 1);\n }\n return { outputBytes, outputTokens, outputLines };\n}\n","import type {\n ToolResultRenderMode,\n ToolResultRenderModeConfig,\n} from '../types/config.js';\nimport type { Tool } from '../types/tool.js';\n\nexport const DEFAULT_TOOL_RESULT_RENDER_MODE: ToolResultRenderMode = 'extend';\n\n/**\n * Normalize a raw value to a {@link ToolResultRenderMode}. Accepts the\n * canonical strings (`'extend' | 'simple'`) plus a few synonyms so the\n * slash command feels forgiving (`extended`/`full` → `extend`,\n * `short`/`brief` → `simple`). Returns `undefined` for anything else so\n * the caller can reject unknown input without throwing.\n */\nexport function normalizeToolResultRenderMode(value: unknown): ToolResultRenderMode | undefined {\n if (typeof value !== 'string') return undefined;\n const raw = value.trim().toLowerCase();\n if (raw === 'extend' || raw === 'extended' || raw === 'full') return 'extend';\n if (raw === 'simple' || raw === 'short' || raw === 'brief') return 'simple';\n return undefined;\n}\n\n/**\n * Look up the result-render mode for `toolName` from a config map. Falls\n * back to the default `'extend'` when the map is missing the entry.\n */\nexport function resolveToolResultRenderMode(\n modes: ToolResultRenderModeConfig | undefined,\n toolName: string,\n): ToolResultRenderMode {\n return normalizeToolResultRenderMode(modes?.[toolName]) ?? DEFAULT_TOOL_RESULT_RENDER_MODE;\n}\n\n/**\n * Subset of {@link import('../registry/tool-registry.js').ToolRegistry}\n * the result-render-mode setters need. Decouples this module from the\n * concrete registry class so it can be reused by tests and by tools\n * that wrap their own registry.\n */\nexport interface ToolResultRenderModeRegistryLike {\n get(name: string): Tool | undefined;\n setResultRenderMode?(name: string, mode: ToolResultRenderMode): boolean;\n applyResultRenderModes?(\n modes?: ToolResultRenderModeConfig,\n ): { applied: number; missing: string[] };\n getResultRenderMode?(name: string): ToolResultRenderMode;\n}\n\n/**\n * Set a single tool's result-render mode on a registry. Prefers the\n * registry's native accessor (so it can update any internal state, e.g.\n * usage caches); falls back to a no-op so callers stay decoupled from\n * the registry implementation.\n */\nexport function setToolResultRenderMode(\n registry: ToolResultRenderModeRegistryLike,\n name: string,\n mode: ToolResultRenderMode,\n): boolean {\n if (typeof registry.setResultRenderMode === 'function') {\n return registry.setResultRenderMode(name, mode);\n }\n return false;\n}\n\n/**\n * Look up the current result-render mode for a single tool. Returns the\n * registry's view if it has one, otherwise the default. This is what the\n * tool-executor calls on each tool invocation to decide whether the next\n * `writeToolResult` should be `simple` or `extend`.\n */\nexport function getToolResultRenderMode(\n registry: ToolResultRenderModeRegistryLike,\n name: string,\n): ToolResultRenderMode {\n return registry.getResultRenderMode?.(name) ?? DEFAULT_TOOL_RESULT_RENDER_MODE;\n}\n\n/**\n * Bulk-apply a config map (`tools.resultRenderMode`) to a registry.\n * Mirrors {@link import('./tool-description-mode.js').applyToolDescriptionModes}\n * for symmetry with the LLM-side description mode.\n */\nexport function applyToolResultRenderModes(\n registry: ToolResultRenderModeRegistryLike,\n modes?: ToolResultRenderModeConfig,\n): { applied: number; missing: string[] } {\n if (typeof registry.applyResultRenderModes === 'function') {\n return registry.applyResultRenderModes(modes);\n }\n\n const entries = Object.entries(modes ?? {});\n const missing: string[] = [];\n let applied = 0;\n for (const [name, rawMode] of entries) {\n const mode = normalizeToolResultRenderMode(rawMode);\n if (!mode) continue;\n if (setToolResultRenderMode(registry, name, mode)) applied++;\n else missing.push(name);\n }\n return { applied, missing };\n}","import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/design-kits — user-global Design Studio kits. */\n globalDesignKits: string;\n /** ~/.wrongstack/prompts — user-global prompt library. */\n globalPrompts: string;\n /** ~/.wrongstack/instructions — user-global system instruction overrides. */\n globalInstructions: string;\n /** ~/.wrongstack/prompt-usage.json — per-slug insert counts (recent/popular). */\n promptUsage: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/cache/models-overlay.json — cached curated overlay. */\n modelsOverlayCache: string;\n /**\n * Per-project codebase symbol index (SQLite). Lives under the global project\n * dir — NOT inside the repo — so it never clutters the working tree or needs\n * gitignoring. `~/.wrongstack/projects/<hash>/codebase-index`.\n */\n projectCodebaseIndex: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/config.json — per-project settings (safe fields only).\n * This lives inside the project root so it can be gitignored or shared. */\n inProjectConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** <project>/.wrongstack/prompts — committed project prompt library. */\n inProjectPrompts: string;\n /** <project>/.wrongstack/instructions — committed project instruction overrides. */\n inProjectInstructions: string;\n /** <project>/.wrongstack/design-kits — committed project Design Studio kits. */\n inProjectDesignKits: string;\n /** <project>/.wrongstack/worktrees — git worktrees for per-phase isolation (gitignored). */\n inProjectWorktrees: string;\n /** Stable hash for the project root. */\n projectHash: string;\n /** Human-readable project slug: `wrongstack-a1b2c3` instead of `3024e5e6fa58`. */\n projectSlug: string;\n /** ~/.wrongstack/projects/<hash>/goal.json — goal persistence */\n projectGoal: string;\n /** ~/.wrongstack/projects/<hash>/specs — SDD spec files */\n projectSpecs: string;\n /** ~/.wrongstack/projects/<hash>/task-graphs — SDD task graphs */\n projectTaskGraphs: string;\n /** ~/.wrongstack/projects/<hash>/sdd-session.json — SDD session state */\n projectSddSession: string;\n /** ~/.wrongstack/projects/<hash>/plan.json — plan persistence */\n projectPlan: string;\n /** ~/.wrongstack/projects/<hash>/autophase — AutoPhase phase-graph JSON files */\n projectAutophase: string;\n /** ~/.wrongstack/projects/<hash>/sdd-boards — live SDD board snapshots + JSONL event logs */\n projectSddBoards: string;\n /** ~/.wrongstack/sync.json — CloudSync configuration */\n syncConfig: string;\n /** Function to get the status.json path for a project given its hash. */\n projectStatus: (projectHash: string) => string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\n/**\n * Human-readable project directory name: slugified folder name + short hash\n * suffix for uniqueness. e.g. `wrongstack-a1b2c3` instead of `3024e5e6fa58`.\n */\nexport function projectSlug(absRoot: string): string {\n const base = slugify(path.basename(absRoot));\n const hash = createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\n/** Turn a folder name into a filesystem-safe lowercase slug. */\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n // Collapse any run of non-alphanumeric chars into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'project'\n );\n}\n\nexport interface WstackPathOptions {\n userHome?: string | undefined;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string | undefined;\n}\n\n/**\n * The global `~/.wrongstack` root, honoring the `WRONGSTACK_HOME` env\n * override. The override exists so tests (and sandboxed runs) can redirect\n * ALL global state — config, secrets, logs, projects/, mailboxes — away from\n * the real user home. Before it existed, `pnpm test` booted runtimes against\n * the real `~/.wrongstack`: it read the user's real config.json (starting a\n * second live Telegram poller), appended to the real wrongstack.log, and left\n * ~20k orphaned fixture dirs under projects/.\n *\n * Every code path that wants the global dir must come through here (or\n * through `resolveWstackPaths`) instead of `path.join(os.homedir(), '.wrongstack')`.\n */\nexport function wstackGlobalRoot(): string {\n const fromEnv = process.env['WRONGSTACK_HOME'];\n if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);\n return path.join(os.homedir(), '.wrongstack');\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n // Precedence: explicit globalRoot > explicit userHome (callers/tests that\n // pass one expect paths under it) > WRONGSTACK_HOME env > real home dir.\n const globalRoot =\n opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, '.wrongstack') : wstackGlobalRoot());\n const hash = projectHash(opts.projectRoot);\n const slug = projectSlug(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', slug);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n globalDesignKits: path.join(globalRoot, 'design-kits'),\n globalPrompts: path.join(globalRoot, 'prompts'),\n globalInstructions: path.join(globalRoot, 'instructions'),\n promptUsage: path.join(globalRoot, 'prompt-usage.json'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n modelsOverlayCache: path.join(globalRoot, 'cache', 'models-overlay.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectCodebaseIndex: path.join(projectDir, 'codebase-index'),\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectConfig: path.join(opts.projectRoot, '.wrongstack', 'config.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n inProjectPrompts: path.join(opts.projectRoot, '.wrongstack', 'prompts'),\n inProjectInstructions: path.join(opts.projectRoot, '.wrongstack', 'instructions'),\n inProjectDesignKits: path.join(opts.projectRoot, '.wrongstack', 'design-kits'),\n inProjectWorktrees: path.join(opts.projectRoot, '.wrongstack', 'worktrees'),\n projectHash: hash,\n projectSlug: slug,\n projectGoal: path.join(projectDir, 'goal.json'),\n projectSpecs: path.join(projectDir, 'specs'),\n projectTaskGraphs: path.join(projectDir, 'task-graphs'),\n projectSddSession: path.join(projectDir, 'sdd-session.json'),\n projectPlan: path.join(projectDir, 'plan.json'),\n projectAutophase: path.join(projectDir, 'autophase'),\n projectSddBoards: path.join(projectDir, 'sdd-boards'),\n syncConfig: path.join(globalRoot, 'sync.json'),\n projectStatus: (projectHash: string) => path.join(globalRoot, 'projects', projectHash, 'status.json'),\n };\n}\n","import { toErrorMessage } from '../utils/index.js';\n\n/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n PARSE_FAILED: 'PARSE_FAILED',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * SDD (Spec-Driven Development) errors — spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error — thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 → transient, 404 → not_found, 401 → permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error — thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n/**\n * Response / payload parse error — thrown when an upstream HTTP response,\n * file, or data structure is well-formed at the transport layer (HTTP 200,\n * valid JSON) but is missing required fields or has an unexpected shape.\n *\n * Distinct from `ConfigError(CONFIG_PARSE_FAILED)` (which is specifically\n * for config-file parsing) and `FetchError` (which covers HTTP non-OK\n * responses). `ParseError` fills the gap: the request succeeded but the\n * response body couldn't be interpreted.\n *\n * Common sites: OAuth token responses missing `access_token`, device-code\n * responses missing `device_code`, registry responses with unexpected\n * schemas.\n */\nexport class ParseError extends WrongStackError {\n readonly source?: string | undefined;\n\n constructor(opts: {\n message: string;\n /**\n * What was being parsed — e.g. `'oauth-token-response'`,\n * `'device-code-response'`. Lets consumers distinguish parse failures\n * from different upstream APIs without parsing the message.\n */\n source?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.PARSE_FAILED,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { source: opts.source, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ParseError';\n this.source = opts.source;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isParseError(err: unknown): err is ParseError {\n return err instanceof ParseError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\nimport { truncate } from '../utils/string.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type CacheTtl = '5m' | '1h';\n\n/**\n * Provider-agnostic response-format directive.\n *\n * - `{ type: 'text' }` — free-form text (default).\n * - `{ type: 'json_object' }` — valid JSON without a schema constraint.\n * - `{ type: 'json_schema', jsonSchema: { name, schema, strict? } }` — JSON\n * constrained to the supplied JSON Schema. The `strict` flag is\n * OpenAI-specific; Gemini ignores it in favour of `responseMimeType`.\n *\n * Each provider adapter maps this into its own wire format:\n * OpenAI → `response_format`\n * Gemini → `responseMimeType` + `responseSchema`\n * Anthropic → (not yet supported; uses tools for structured output)\n */\nexport interface JsonSchemaSpec {\n name: string;\n /** OpenAI-specific: enable strict schema adherence. */\n strict?: boolean | undefined;\n /** The JSON Schema object describing the expected shape. */\n schema: Record<string, unknown>;\n /** Optional human-readable description (OpenAI). */\n description?: string | undefined;\n}\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; jsonSchema: JsonSchemaSpec };\n\n/**\n * Safety category threshold pair used by Google Gemini's `safetySettings`.\n *\n * Categories: `HARM_CATEGORY_HARASSMENT`, `HARM_CATEGORY_HATE_SPEECH`,\n * `HARM_CATEGORY_SEXUALLY_EXPLICIT`, `HARM_CATEGORY_DANGEROUS_CONTENT`.\n *\n * Thresholds: `BLOCK_NONE`, `BLOCK_ONLY_HIGH`, `BLOCK_MEDIUM_AND_ABOVE`,\n * `BLOCK_LOW_AND_ABOVE`.\n */\nexport interface SafetySetting {\n category: string;\n threshold: string;\n}\n\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number | undefined;\n /** Back-compat aggregate of all cache-write tokens. Prefer TTL-specific fields when present. */\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nexport interface ReasoningRequest {\n enabled?: boolean | undefined;\n effort?: ReasoningEffort | undefined;\n preserve?: boolean | undefined;\n display?: 'summarized' | 'omitted' | undefined;\n}\n\nexport interface RequestCacheControl {\n ttl?: CacheTtl | undefined;\n}\n\nexport interface ReasoningConfig {\n default: 'enabled' | 'disabled' | 'adaptive' | 'always_on';\n disableSupported: boolean;\n effortSupported: boolean;\n effortLevels: ReasoningEffort[];\n preserveThinking: 'unsupported' | 'optional' | 'always_on';\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n reasoning: boolean;\n maxContext: number;\n /**\n * Maximum output tokens the model can produce in a single response.\n * Used as the default for `Request.maxTokens` when the caller doesn't\n * supply an explicit value — letting subagents run up to the model's\n * native ceiling instead of a fixed 8192 cap. Omit (undefined) to fall\n * back to a conservative default; populate per family in\n * `family-capabilities.ts` once you know the spec.\n */\n maxOutput?: number | undefined;\n cacheControl: 'native' | 'auto' | 'none';\n\n // ── Extended parameter support (optional; family defaults in CAPABILITIES_BY_FAMILY) ──\n\n /** Model accepts `top_k` / `topK` sampling parameter. */\n topK?: boolean | undefined;\n /** Model accepts `frequency_penalty` / `frequencyPenalty` parameter. */\n frequencyPenalty?: boolean | undefined;\n /** Model accepts `presence_penalty` / `presencePenalty` parameter. */\n presencePenalty?: boolean | undefined;\n /** Model accepts `seed` parameter for deterministic generation. */\n seed?: boolean | undefined;\n /**\n * Model accepts JSON Schema / structured-output constraints\n * (OpenAI `response_format.json_schema`, Gemini `responseMimeType`+`responseSchema`).\n * Distinct from `jsonMode` (which is just a system-prompt hint).\n */\n structuredOutput?: boolean | undefined;\n /** Model supports log-probability output (`logprobs`, `top_logprobs`). */\n logprobs?: boolean | undefined;\n /** Model supports audio input/output modality. */\n audio?: boolean | undefined;\n /** Model supports the `n` parameter for multiple completions. */\n multipleCompletions?: boolean | undefined;\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[] | undefined;\n messages: Message[];\n tools?: Tool[] | undefined;\n /**\n * Cap on output tokens for this single response. Optional — when\n * omitted, the provider adapter falls back to its own\n * `capabilities.maxOutput` (which the catalog populates from\n * `ModelsDevModel.limit.output`). If neither is available, the\n * adapter applies a conservative 8192 safety net. Letting this stay\n * undefined at the call site means callers like Chimera can hand the\n * model its native output ceiling without hard-coding a number.\n */\n maxTokens?: number | undefined;\n temperature?: number | undefined;\n topP?: number | undefined;\n topK?: number | undefined;\n frequencyPenalty?: number | undefined;\n presencePenalty?: number | undefined;\n seed?: number | undefined;\n /**\n * End-user identifier for abuse monitoring and per-user rate limiting.\n * - Anthropic → `metadata.user_id`\n * - OpenAI → `user`\n * - Gemini → (not supported)\n */\n user?: string | undefined;\n /**\n * Number of response candidates to generate. Google Gemini supports\n * this via `generationConfig.candidateCount`. OpenAI does not have\n * an equivalent (`n` is conceptually similar but distinct).\n */\n candidateCount?: number | undefined;\n /**\n * Whether to return log probabilities for output tokens.\n * - OpenAI → `logprobs: boolean` (+ `topLogprobs: number`)\n * - Gemini → `generationConfig.logprobs: number` (how many top candidates)\n * Default undefined = no logprobs requested.\n */\n logprobs?: boolean | undefined;\n /**\n * Number of most probable tokens to return log probabilities for\n * (OpenAI `top_logprobs`). Only meaningful when `logprobs` is true.\n * Range: 0-20. Gemini ignores this (uses `logprobs` as the count).\n */\n topLogprobs?: number | undefined;\n stopSequences?: string[] | undefined;\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool' | undefined; name: string };\n reasoning?: ReasoningRequest | undefined;\n cache?: RequestCacheControl | undefined;\n /**\n * Structured-output / response-format directive.\n * When set, the provider adapter maps this to its native response-format\n * parameter (OpenAI `response_format`, Gemini `responseMimeType`, etc.).\n * The model must advertise `capabilities.structuredOutput` for this to be\n * honoured; unsupported models will likely 400 or ignore it.\n */\n responseFormat?: ResponseFormat | undefined;\n /**\n * Safety category thresholds for filtering harmful content.\n * - Gemini → top-level `safetySettings` array with `{ category, threshold }`\n * - OpenAI → not supported (uses server-side moderation)\n * - Anthropic → not supported\n */\n safetySettings?: SafetySetting[] | undefined;\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string | undefined;\n name?: string | undefined;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string | undefined;\n /** Human-readable explanation from the provider. */\n message?: string | undefined;\n /** Provider request id, when present in the body or headers. */\n requestId?: string | undefined;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number | undefined;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string | undefined;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean | undefined;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number | undefined;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody | undefined;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody | undefined; cause?: unknown | undefined } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\n/**\n * Thrown when the provider stream stops delivering data mid-response.\n * This is distinct from a network error (TCP reset, DNS failure) — the\n * connection is established and the response started, but chunks stopped\n * arriving before the stream completed.\n *\n * Status 599 is used as a sentinel to distinguish stream hangs from\n * regular HTTP errors while still flowing through ProviderError-based\n * retry and fallback infrastructure.\n */\nexport class StreamHangError extends ProviderError {\n /** Name of the provider that hung, e.g. \"zai\", \"anthropic\". */\n public readonly hungProviderId: string;\n /** Model that was being called when the hang occurred. */\n public readonly hungModel: string;\n /** How long (ms) we waited for the next chunk before declaring a hang. */\n public readonly hangTimeoutMs: number;\n /** How many bytes were received before the hang. */\n public readonly bytesReceived: number;\n /** Elapsed time (ms) from the start of the stream until the hang. */\n public readonly elapsedMs: number;\n\n constructor(opts: {\n providerId: string;\n model: string;\n hangTimeoutMs: number;\n bytesReceived: number;\n elapsedMs: number;\n cause?: unknown | undefined;\n }) {\n super(\n `Stream hang: ${opts.providerId}/${opts.model} — no data for ${opts.hangTimeoutMs}ms after ${opts.bytesReceived} bytes (${opts.elapsedMs}ms elapsed)`,\n 599,\n true, // always retryable\n opts.providerId,\n {\n body: {\n message: `Stream stalled after ${opts.elapsedMs}ms, ${opts.bytesReceived} bytes received`,\n },\n cause: opts.cause,\n },\n );\n this.name = 'StreamHangError';\n this.hungProviderId = opts.providerId;\n this.hungModel = opts.model;\n this.hangTimeoutMs = opts.hangTimeoutMs;\n this.bytesReceived = opts.bytesReceived;\n this.elapsedMs = opts.elapsedMs;\n }\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","import type { ContextWindowModeId } from './context-window.js';\nimport type { HookEvent, ShellHook } from './hooks.js';\nimport type { WireFamily } from './models-registry.js';\nimport type { CacheTtl, Capabilities, ReasoningEffort } from './provider.js';\nimport type { Permission } from './tool.js';\n\n/**\n * Runtime reasoning controls the user can set per-session/project. Mapped into\n * the provider `Request.reasoning` field by the model-runtime request\n * middleware, gated by the active model's `reasoningConfig` capabilities so\n * unsupported values are omitted (and warned) instead of triggering provider\n * 400s. See `resolveReasoningForRequest()` in packages/core.\n */\nexport interface ModelRuntimeReasoningConfig {\n /**\n * Whether to send explicit reasoning enable/disable.\n * - 'auto' → do not send explicit fields; provider/model default wins\n * - 'on' → send `reasoning.enabled = true`\n * - 'off' → send `reasoning.enabled = false` only when the model supports disable\n */\n mode?: 'auto' | 'on' | 'off' | undefined;\n /** Reasoning effort. Only sent when the model advertises `effortSupported`. */\n effort?: ReasoningEffort | undefined;\n /** Preserve thinking across turns. Only sent when `preserveThinking !== 'unsupported'`. */\n preserve?: boolean | undefined;\n}\n\n/**\n * Runtime prompt-cache controls mapped into `Request.cache`. Currently only the\n * Anthropic TTL toggle (5m vs 1h) is exposed; other providers ignore it.\n */\nexport interface ModelRuntimeCacheConfig {\n ttl?: CacheTtl | undefined;\n}\n\n/**\n * Shared runtime controls applied to every provider request, regardless of host\n * (REPL / TUI / WebUI). The CLI installs a single request-pipeline middleware\n * that reads these and mutates the outgoing `Request`.\n */\nexport interface ModelRuntimeConfig {\n reasoning?: ModelRuntimeReasoningConfig | undefined;\n cache?: ModelRuntimeCacheConfig | undefined;\n /**\n * Generic generation parameters mapped directly onto `Request` fields.\n * Only sent when the active model's `Capabilities` advertise support.\n */\n parameters?: ModelRuntimeParametersConfig | undefined;\n}\n\n/**\n * Generic generation parameters the user can set per-session / per-project.\n * Each field maps to a `Request` field of the same name and is gated by the\n * corresponding `Capabilities` flag so unsupported models don't receive\n * parameters they'd reject.\n */\nexport interface ModelRuntimeParametersConfig {\n /** Top-K sampling (Anthropic, Gemini). Gated by `capabilities.topK`. */\n topK?: number | undefined;\n /** Frequency penalty (OpenAI, Gemini). Gated by `capabilities.frequencyPenalty`. */\n frequencyPenalty?: number | undefined;\n /** Presence penalty (OpenAI, Gemini). Gated by `capabilities.presencePenalty`. */\n presencePenalty?: number | undefined;\n /** Random seed (OpenAI, Gemini). Gated by `capabilities.seed`. */\n seed?: number | undefined;\n /** End-user identifier for abuse monitoring. */\n user?: string | undefined;\n /** Log probabilities (OpenAI, Gemini). Gated by `capabilities.logprobs`. */\n logprobs?: boolean | undefined;\n /** Number of top logprobs to return (OpenAI). Only when `logprobs` is true. */\n topLogprobs?: number | undefined;\n}\n\n/**\n * HQ client connection settings. Same-machine clients can auto-discover the\n * local HQ auth file; remote clients use this config-backed URL/token pair.\n */\nexport interface HqClientConfig {\n /** Enable HQ publishing. Env WRONGSTACK_HQ_ENABLED still overrides at runtime. */\n enabled?: boolean | undefined;\n /** HQ HTTP base URL, e.g. http://host:3499. */\n url?: string | undefined;\n /** Client token for /ws/client. Stored encrypted by SecretVault when persisted. */\n token?: string | undefined;\n /** Optional HQ data dir for same-machine auth.json discovery. */\n dataDir?: string | undefined;\n /** Send raw content previews to HQ instead of redacted previews. */\n rawContent?: boolean | undefined;\n /** Override project display name in HQ. */\n projectAlias?: string | undefined;\n}\n\n/**\n * Token-saving mode tier levels. Controls how aggressively the system prompt\n * is compacted to reduce per-request token consumption.\n *\n * - 'off' — Full prompt, all tools, complete guidance (no reduction)\n * - 'minimal' — TIER1 tools only (~10), stripped guidance (~3-4k tokens saved)\n * - 'light' — Core + memory tools (~14), common patterns, minimal guidance\n * - 'medium' — Most development tools (~24), some guidance (default when `true`)\n * - 'aggressive' — Maximum savings before tools become unusable (~4-5k tokens saved)\n */\nexport type TokenSavingTier = 'off' | 'minimal' | 'light' | 'medium' | 'aggressive';\n\n/**\n * Normalize a TokenSavingTier value, handling backward-compatible boolean inputs.\n * - `true` → 'medium' (existing behavior)\n * - `false` → 'off'\n * - string values are returned as-is after validation\n * - `undefined` → 'off'\n */\nexport function normalizeTokenSavingTier(\n val?: TokenSavingTier | boolean,\n): TokenSavingTier {\n if (val === undefined) return 'off';\n if (typeof val === 'boolean') return val ? 'medium' : 'off';\n const validTiers = new Set<TokenSavingTier>([\n 'off',\n 'minimal',\n 'light',\n 'medium',\n 'aggressive',\n ]);\n return validTiers.has(val) ? val : 'off';\n}\n\nexport const DEFAULT_TUI_THINKING_WORD = 'thinking';\nexport const MAX_TUI_THINKING_WORD_LENGTH = 16;\n\n/**\n * Normalize the configurable statusline word shown while the TUI is working.\n * The value must be a single short word; invalid values fall back to the default.\n */\nexport function normalizeTuiThinkingWord(value: unknown): string {\n if (typeof value !== 'string') return DEFAULT_TUI_THINKING_WORD;\n const word = value.trim();\n if (word.length === 0 || word.length > MAX_TUI_THINKING_WORD_LENGTH) {\n return DEFAULT_TUI_THINKING_WORD;\n }\n if (!/^[\\p{L}\\p{N}_-]+$/u.test(word)) return DEFAULT_TUI_THINKING_WORD;\n return word;\n}\n\nexport interface ContextConfig {\n /** Context-window policy mode. Controls compaction thresholds and preservation depth. */\n mode?: ContextWindowModeId | undefined;\n warnThreshold: number;\n softThreshold: number;\n hardThreshold: number;\n /** Enable automatic compaction when thresholds are crossed (default: true). */\n autoCompact?: boolean | undefined;\n /**\n * Model used for LLM-assisted summarization in IntelligentCompactor.\n * Falls back to the main model when omitted.\n */\n summarizerModel?: string | undefined;\n /**\n * Override the effective context window size (in tokens). Use this when\n * you want the compactor to trigger earlier than the provider's actual\n * maxContext. Defaults to the provider's reported maxContext.\n */\n effectiveMaxContext?: number | undefined;\n maxSessionTokens?: number | undefined;\n maxDailyTokens?: number | undefined;\n preserveK: number;\n eliseThreshold: number;\n /** Compactor strategy: 'hybrid' (default, fast rules), 'intelligent' (LLM summarization), 'selective' (LLM-driven selection). */\n strategy?: 'hybrid' | 'intelligent' | 'selective' | undefined;\n /** Enable LLM-driven selective compaction (default: false for backward compat). */\n llmSelector?: boolean | undefined;\n}\n\n/**\n * Runtime configuration for the process circuit breaker (the one owned by the\n * ProcessRegistry that gates `bash`/`exec`). Toggle via `/settings breaker`.\n *\n * The breaker itself is a low-level primitive (`packages/tools/.../circuit-breaker.ts`)\n * that is on by default; this section controls whether the registry actually\n * participates in it and how it auto-recovers.\n */\nexport interface CircuitBreakerRuntimeConfig {\n /**\n * Enable circuit-breaker protection. When false (the default), the breaker\n * is bypassed — `bash`/`exec` calls always proceed regardless of failure\n * history. When true, the breaker trips on repeated failures / slow calls /\n * bursts and blocks further calls until it recovers.\n */\n enabled?: boolean | undefined;\n /**\n * When the breaker trips, automatically kill all tracked processes AND\n * reset the breaker to closed after this delay (ms). 0 = disabled (manual\n * recovery only via `/kill reset`). Only effective when `enabled` is true.\n * While armed, the statusline shows a live countdown to the kill/reset.\n */\n autoKillResetMs?: number | undefined;\n}\n\n/**\n * Adaptive concurrency controller configuration. When enabled, the controller\n * automatically adjusts `maxConcurrent` based on rate-limit (429) errors:\n * - On 429: halves `maxConcurrent` (floor at 1)\n * - On sustained success (no 429 for `recoveryIntervalMs`): increases `maxConcurrent` by 1\n */\nexport interface AdaptiveConcurrencyConfig {\n /** Enable adaptive concurrency. Default: false (disabled). */\n enabled?: boolean | undefined;\n /**\n * Minimum concurrency floor. The controller never drops below this.\n * Default: 1.\n */\n minConcurrent?: number | undefined;\n /**\n * Maximum concurrency ceiling. The controller never exceeds this.\n * Default: 16 (matches MultiAgentCoordinator default).\n */\n maxConcurrent?: number | undefined;\n /**\n * Multiplicative decrease factor when a 429 is hit.\n * `newConcurrency = floor(currentConcurrency * decreaseFactor)`.\n * Default: 0.5 (halves concurrency).\n */\n decreaseFactor?: number | undefined;\n /**\n * Number of consecutive successful requests before increasing concurrency by 1.\n * Default: 10.\n */\n successThreshold?: number | undefined;\n /**\n * How often (ms) to check for recovery and bump concurrency.\n * Default: 30_000 (30 seconds).\n */\n recoveryIntervalMs?: number | undefined;\n}\n\nexport interface ToolsConfig {\n defaultExecutionStrategy: 'parallel' | 'sequential' | 'smart';\n maxIterations: number;\n iterationTimeoutMs: number;\n sessionTimeoutMs: number;\n perIterationOutputCapBytes: number;\n /**\n * Per-tool prose budget for the tool's top-level description and usage hint.\n * Missing entries default to \"extend\".\n */\n descriptionMode?: ToolDescriptionModeConfig | undefined;\n /**\n * Per-tool on-screen result rendering mode (terminal / WebUI / TUI).\n * Missing entries default to \"extend\". Independent of `descriptionMode`:\n * `/tool <name> result simple` toggles this without touching the\n * LLM-side description length.\n */\n resultRenderMode?: ToolResultRenderModeConfig | undefined;\n /**\n * Tool names to disable. Disabled tools are excluded from the tool registry\n * (`ToolRegistry.list()` / `get()`), so they do NOT appear in the system\n * prompt's \"## Tool usage\" block — reducing per-request token consumption.\n * Override per-session with `/tool enable <name>` or re-enable all via\n * `/tool enable-all`.\n */\n disabledTools?: string[] | undefined;\n /**\n * When true (default), the agent automatically extends its iteration\n * limit by 100 when hit. Set to false to require user confirmation.\n */\n autoExtendLimit?: boolean | undefined;\n /**\n * When true, file tools (read/write/edit/grep/glob/install) are confined to\n * the project root and `set_working_dir` may not leave it. Default: false —\n * tools may access paths outside the project root, still subject to each\n * tool's permission tier (writes/edits prompt for confirmation). Toggle via\n * `/settings` (\"Filesystem access\").\n */\n restrictToProjectRoot?: boolean | undefined;\n /**\n * Per-command policy for the `exec` tool's allowlist. The tool ships a\n * curated default allowlist of dev/build commands; this extends or trims it.\n *\n * SECURITY: `allow` EXPANDS what the agent may execute, so it is honored only\n * from TRUSTED config (`~/.wrongstack/config.json`) — the config loader\n * strips `tools.exec.allow` from the untrusted, repo-committed\n * `<project>/.wrongstack/config.json`. `deny` only ever REMOVES commands, so\n * it is honored from any source.\n */\n exec?: ExecToolConfig | undefined;\n}\n\n/** Allow/deny extension of the `exec` tool's built-in command allowlist. */\nexport interface ExecToolConfig {\n /**\n * Extra command names to add to the allowlist (e.g. `[\"make\", \"dotnet\"]`).\n * Trusted sources only — stripped from in-project repo config.\n */\n allow?: string[] | undefined;\n /**\n * Command names to remove from the allowlist. Honored from any source —\n * removing a command can only narrow what runs, so it is always safe.\n */\n deny?: string[] | undefined;\n}\n\nexport type ToolDescriptionMode = 'extend' | 'simple';\nexport type ToolDescriptionModeConfig = Record<string, ToolDescriptionMode | undefined>;\n\n/**\n * Per-tool on-screen result rendering mode. Independent of\n * {@link ToolDescriptionMode}: `descriptionMode` controls the prose the\n * model sees in the system prompt, `resultRenderMode` controls how the\n * tool's RESULT is printed to the user (terminal / WebUI / TUI).\n *\n * - `simple` — meta only (filename, line count, exit code). Body is hidden\n * by default; the user can still expand on demand where the renderer\n * supports it.\n * - `extend` — full preview, up to 10 lines for read-like tools.\n *\n * The two modes are toggled independently via `/tool <name> desc simple`\n * and `/tool <name> result simple`. The legacy `/tool <name> simple`\n * command sets BOTH at once for backward compatibility.\n */\nexport type ToolResultRenderMode = 'extend' | 'simple';\nexport type ToolResultRenderModeConfig = Record<string, ToolResultRenderMode | undefined>;\n\nexport interface ProviderApiKey {\n /** Short human-readable label (e.g. \"personal\", \"work\", \"rate-limit-backup\"). */\n label: string;\n /**\n * The key itself. The field name contains `apiKey` so the secret-vault\n * walker will encrypt it on write and decrypt it on read.\n */\n apiKey: string;\n /** ISO-8601 timestamp the key was added. */\n createdAt: string;\n /**\n * How this credential was obtained.\n * - `api_key` — manually pasted API key (default)\n * - `oauth` — OAuth 2.0 device-code / authorization-code flow\n * - `session_token` — extracted from browser session (ChatGPT web, etc.)\n */\n authMethod?: 'api_key' | 'oauth' | 'session_token' | undefined;\n /** ISO-8601 expiry. When set, the token manager will refresh before this time. */\n expiresAt?: string | undefined;\n /**\n * OAuth refresh token. Stored encrypted by the secret-vault walker because\n * the field name contains `Token` (case-insensitive match by vault).\n */\n refreshToken?: string | undefined;\n /** Token type as returned by the OAuth endpoint (e.g. \"bearer\"). */\n tokenType?: string | undefined;\n /** OAuth scope string (e.g. \"openai.models.read openai.models.use\"). */\n scope?: string | undefined;\n /**\n * ChatGPT account id, extracted from the OAuth access-token JWT\n * (`https://api.openai.com/auth`.chatgpt_account_id). Sent as the\n * `chatgpt-account-id` header by the `openai-codex` wire family. Cached\n * here for display/diagnostics; the provider re-derives it from the live\n * token at request time so it can never go stale after a refresh.\n */\n accountId?: string | undefined;\n}\n\nexport interface ProviderConfig {\n type: string;\n /**\n * Legacy single-key field. Still honored as a read fallback when `apiKeys`\n * is empty (for configs not yet migrated to multi-key format). After key\n * management operations (`writeKeysBack`), this field is **cleared** to\n * prevent accidental serialization of the plaintext key. Consumers that\n * need the active API key should use `resolveActiveApiKey()` (cli) or\n * resolve from `apiKeys[]` directly — never read `cfg.apiKey` in new code.\n */\n apiKey?: string | undefined;\n /** Multiple keys for the same provider — pick one with `activeKey`. */\n apiKeys?: ProviderApiKey[] | undefined;\n /** Label of the entry in `apiKeys` to use. Defaults to the first one. */\n activeKey?: string | undefined;\n baseUrl?: string | undefined;\n headers?: Record<string, string>;\n model?: string | undefined;\n quirks?: Record<string, unknown>;\n capabilities?: Record<string, unknown>;\n /**\n * Optional wire-family override. When present, the provider can be\n * constructed without consulting the models.dev catalog — useful for\n * self-hosted endpoints, internal proxies, or for working offline.\n */\n family?: WireFamily | undefined;\n /** Custom env var names to probe when `apiKey` is missing. */\n envVars?: string[] | undefined;\n /** Optional list of models the user wants visible for this provider. */\n models?: string[] | undefined;\n /**\n * Fetch this provider's model list + per-model capabilities from its\n * `{baseUrl}/models` endpoint at startup and inject them into the catalog.\n * For openai-compatible gateways/proxies (omniroute, LiteLLM, vLLM, …) that\n * expose rich metadata there. Defaults on for presets that set it (omniroute).\n * Discovery is best-effort: a down server or missing key is a no-op.\n */\n autoDiscoverModels?: boolean | undefined;\n /**\n * Provider-relative custom model definitions (maps modelId → definition).\n * Each entry adds/overrides a model for this provider with optional\n * capability overrides. The model id is the key, not a fully qualified id.\n */\n customModels?: Record<string, CustomModelDefinition>;\n /**\n * Per-provider OAuth configuration. When present, `wstack auth login <id>`\n * uses this instead of prompting for a raw API key. Set by the catalog or\n * by the user via `/settings`.\n */\n oauthConfig?: {\n /** OAuth client id registered with the provider. */\n clientId?: string | undefined;\n /** Device authorization endpoint (RFC 8628). */\n deviceCodeEndpoint?: string | undefined;\n /** Token endpoint for code exchange and refresh. */\n tokenEndpoint?: string | undefined;\n /** Authorization server URL shown to the user for opening in browser. */\n authorizationEndpoint?: string | undefined;\n /** Default OAuth scopes to request. */\n scopes?: string[] | undefined;\n } | undefined;\n}\n\n/**\n * One entry in the per-task model matrix. Pins a catalog role, a phase, or\n * the `*` default to a specific model (and, optionally, a specific provider).\n * Resolved at subagent-spawn time so e.g. `security-scanner` can run a\n * different model than `documentation` while the leader stays on its own.\n */\nexport interface ModelMatrixEntry {\n /** Provider registry id (e.g. \"anthropic\", \"minimax\", \"zai\"). When omitted,\n * the leader's provider is used with this entry's model. */\n provider?: string | undefined;\n /** Model id to run for the matched role/phase/default. */\n model?: string | undefined;\n /**\n * Named fallback profile to use for the matched role/phase/default. When\n * `model` is omitted, the first model in the profile becomes the primary and\n * the remaining entries become that subagent's fallback chain.\n */\n fallbackProfile?: string | undefined;\n}\n\nexport interface MCPServerConfig {\n /** Human-readable description shown in `wstack mcp list`. */\n description?: string | undefined;\n name: string;\n transport: 'stdio' | 'sse' | 'streamable-http';\n command?: string | undefined;\n args?: string[] | undefined;\n env?: Record<string, string>;\n url?: string | undefined;\n headers?: Record<string, string>;\n enabled?: boolean | undefined;\n allowedTools?: string[] | undefined;\n permission?: Permission | undefined;\n startupTimeoutMs?: number | undefined;\n requestTimeoutMs?: number | undefined;\n /**\n * Lazy connect: when true, the server process is NOT spawned at boot. Its\n * tools are registered from a cached manifest (discovered on the first ever\n * connect) and the server only spawns when one of its tools is actually\n * called, then auto-sleeps after an idle period. Default (false/undefined) =\n * eager connect at boot.\n */\n lazy?: boolean | undefined;\n}\n\nexport interface LogConfig {\n level: 'error' | 'warn' | 'info' | 'debug' | 'trace';\n file?: string | undefined;\n}\n\nexport interface PluginConfig {\n name: string;\n enabled?: boolean | undefined;\n options?: Record<string, unknown>;\n}\n\n/**\n * Optional subsystems that the CLI can boot without. The core flow\n * (provider + agent loop + bundled tools + session) always works; these\n * just add capabilities. `--no-features` flips all of these off, which\n * is the minimum viable WrongStack: a single provider, a fixed config,\n * no network calls at startup.\n */\nexport interface FeaturesConfig {\n /** Load MCP servers declared in `mcpServers`. */\n mcp: boolean;\n /** Load + initialise npm plugins declared in `plugins`. */\n plugins: boolean;\n /** Register `remember` / `forget` tools backed by memory store. */\n memory: boolean;\n /**\n * Automatically consolidate session learnings into long-term memory\n * after each completed run. The agent extracts key facts, conventions,\n * and decisions via a lightweight LLM call and persists them.\n * Enabled by default when `memory` is on; set to false to opt out.\n */\n memoryConsolidation?: boolean | undefined;\n /** Fetch the models.dev catalog at startup. When false, the provider\n * must declare its `family` explicitly in `providers[<id>]`. */\n modelsRegistry: boolean;\n /** Discover + load skills from disk. */\n skills: boolean;\n /**\n * Enable the prompt library (`/prompt`, `/prompts`, `/prompt-gen`, the WebUI\n * modal and the bundled 168-prompt dataset). Defaults to on; set to false to\n * disable the subsystem entirely (the loader is withheld so every surface\n * reports it unavailable).\n */\n prompts?: boolean | undefined;\n /**\n * Token-saving mode tier. Controls how aggressively the system prompt\n * is compacted to reduce per-request token consumption.\n *\n * - 'off' — Full prompt, all tools, complete guidance\n * - 'minimal' — TIER1 tools only, stripped guidance (~3-4k tokens saved)\n * - 'light' — Core + memory tools, common patterns, minimal guidance\n * - 'medium' — Most development tools, some guidance\n * - 'aggressive' — Maximum savings before tools become unusable (~4-5k tokens)\n *\n * Boolean values are accepted for backward compatibility:\n * - `true` → 'medium'\n * - `false` → 'off'\n *\n * Enable via CLI: `--token-saving-tier <level>` or `--token-saving-mode` (maps to 'medium').\n * Configure via: `features.tokenSavingMode: \"minimal\"` in config.\n */\n tokenSavingMode?: TokenSavingTier | boolean | undefined;\n /**\n * Enable the autonomous-coordination toolkit (AutonomousCoordinator +\n * KnowledgeGraph + ConsensusProtocol + TaskAuctioneer + ChangeManager +\n * TaskDAG). When true (the default), the TUI boot wires the coordinator\n * lazily on the first Director spawn. When false, the coordinator is\n * never constructed and the `/coordinator` slash command reports it\n * unavailable — reducing the coordination domain's runtime surface for\n * users who only use the simpler Director/Fleet path.\n */\n autonomousCoordination?: boolean | undefined;\n /**\n * Allow tools to read/write paths outside the project root directory.\n * When true (default), tools can access any path on the filesystem.\n * When false, tools are restricted to the project root directory.\n */\n allowOutsideProjectRoot?: boolean | undefined;\n /**\n * Auto-bootstrap the mailbox HTTP bridge from any WrongStack surface\n * (REPL/TUI/WebUI/eternal). When 'auto' (the default), the first\n * surface to come up for a given project joins or spawns the bridge\n * so external agents can connect without the user running\n * `wstack mailbox serve` themselves. 'off' disables this — operators\n * must start the bridge explicitly (e.g. via the `/mailbox-serve`\n * slash command or the standalone `wstack mailbox serve` subcommand).\n * The per-project lock + token-persistence model means a second\n * surface on the same project joins the first's bridge rather than\n * spawning a duplicate.\n */\n mailboxBridge?: 'auto' | 'off' | undefined;\n}\n\nexport interface AutonomyConfig {\n /** Default autonomy mode at startup. Default: \"off\". */\n defaultMode?: 'off' | 'suggest' | 'auto' | undefined;\n /** ms to wait before auto-proceeding in 'auto' mode. Default: 45000. */\n autoProceedDelayMs?: number | undefined;\n /** Maximum consecutive auto-proceed turns before pausing. 0 = unlimited. Default: 50. */\n autoProceedMaxIterations?: number | undefined;\n /** Template used for YOLO+auto suggestions. Must include {{suggestion}}. */\n autonomyNextPrompt?: string | undefined;\n /** Animate the terminal/window title while the agent is active. Default: true. */\n terminalTitleAnimation?: boolean | undefined;\n /** Persisted YOLO preference mirrored into top-level config.yolo at runtime. Default: false. */\n yolo?: boolean | undefined;\n /** Stream fleet/subagent output into the main TUI chat. Default: true. */\n streamFleet?: boolean | undefined;\n /** Ring terminal bell when an agent run completes. Default: false. */\n chime?: boolean | undefined;\n /** Ask for confirmation before interrupt/exit. Default: true. */\n confirmExit?: boolean | undefined;\n /** Terminal mouse tracking preference. Default: false. */\n mouseMode?: boolean | undefined;\n /** Enable prompt refinement before sending. Default: true. */\n enhance?: boolean | undefined;\n /** Prompt-refinement preview countdown in ms. Default: 60000. */\n enhanceDelayMs?: number | undefined;\n /** Prompt-refinement language mode. Default: \"original\". */\n enhanceLanguage?: 'original' | 'english' | undefined;\n /** TUI statusline density. Default: \"detailed\". */\n statuslineMode?: 'minimum' | 'detailed' | undefined;\n /** Single short word shown in the TUI rainbow working-state chip. Default: \"thinking\". */\n thinkingWord?: string | undefined;\n}\n\n/**\n * Automatic codebase symbol-index maintenance. Keeps the `codebase-search`\n * index (SQLite, `~/.wrongstack/projects/<hash>/codebase-index/index.db`) fresh\n * without the user having to call `codebase-index` by hand.\n */\nexport interface IndexingConfig {\n /** Run a blocking incremental index at session start (with a visible summary). Default: true. */\n onSessionStart: boolean;\n /** Reindex files the agent writes/edits via tools, in the background. Default: true. */\n onEdit: boolean;\n /** Watch the project root for external editor changes and reindex them. Default: true. */\n watchExternal: boolean;\n /** Debounce window (ms) coalescing rapid edits to the same file. Default: 400. */\n debounceMs: number;\n /**\n * Watchdog timeout (ms) for a full index run. A run exceeding this is\n * aborted (so it can never wedge the indexing mutex or freeze the terminal)\n * and counts toward the indexing circuit breaker. Default: 120000.\n */\n indexTimeoutMs?: number | undefined;\n}\n\n/**\n * Saved launch preferences — restored on next boot so the pre-launch prompt\n * can offer a one-line \"Continue with last settings? [Y/n]\" instead of\n * re-asking every question from scratch.\n */\nexport interface LaunchConfig {\n /** Interactive mode: 'tui' (Ink TUI) or 'repl' (readline REPL). */\n mode?: 'tui' | 'repl' | undefined;\n /** Start with Director mode on (fleet manifest + multi-agent orchestration). */\n director?: boolean | undefined;\n /**\n * Launch-time autonomy mode (binary choice from pre-launch prompt).\n * 'off' = stops after each turn; 'auto' = self-driving.\n * Distinct from `AutonomyConfig.defaultMode` which also supports 'suggest'.\n */\n autonomy?: 'off' | 'auto' | undefined;\n}\n\n/**\n * Controls how much detail is persisted to the per-session JSONL log\n * (`~/.wrongstack/projects/<hash>/sessions/<date>/sess_<ULID>.jsonl`).\n */\nexport interface SessionLoggingConfig {\n /**\n * How much detail to write to the persistent session log.\n *\n * - \"minimal\" → Only events required for resume/rewind/recovery\n * - \"standard\" → (default) + high-value lightweight audit events\n * (compaction, tool timing, retries, errors, etc.)\n * - \"full\" → Also persist full request payloads (very large).\n * Consider enabling a separate replay log instead.\n */\n auditLevel?: 'minimal' | 'standard' | 'full' | undefined;\n\n /**\n * Sampling configuration for high-volume events (especially relevant at\n * `auditLevel: \"full\"`).\n */\n sampling?: {\n /** Controls sampling of `tool_progress` events. */\n toolProgress?: {\n /**\n * Sample rate for noisy progress events (`log`, `partial_output`).\n * - 1 = no sampling (every message is logged)\n * - 8 = default (first message + every 8th)\n */\n sampleRate?: number | undefined;\n };\n };\n}\n\nexport type SyncCategory = 'settings' | 'skills' | 'prompts' | 'memory' | 'history';\n\nexport interface SyncConfig {\n enabled: boolean;\n repo: string;\n /** GitHub token (fine-grained PAT). Encrypted at rest via SecretVault. */\n githubToken: string;\n categories: SyncCategory[];\n lastSyncedAt?: string | undefined;\n}\n\n/**\n * Per-model capability overrides the user can define in their config.\n * Used to add models not in the models.dev catalog, or override catalog\n * facts when the real backend differs (e.g. local Ollama models, proxies).\n */\nexport interface CustomModelDefinition {\n /** Provider this model belongs to. Defaults to the owning ProviderConfig. */\n provider?: string | undefined;\n /** Optional display name. */\n name?: string | undefined;\n /** Capability overrides — only specified fields are overlaid. */\n capabilities?: Partial<Capabilities> | undefined;\n /**\n * Max output tokens. If not specified, the provider family default\n * or catalog entry is used.\n */\n maxOutput?: number | undefined;\n}\n\nexport interface Config {\n version: 1;\n provider: string;\n model: string;\n apiKey?: string | undefined;\n baseUrl?: string | undefined;\n /**\n * Maximum number of subagent tasks the fleet coordinator dispatches\n * simultaneously. Extra tasks queue until a slot frees. Default: 4.\n * Overridden by WRONGSTACK_MAX_CONCURRENT env var and --max-concurrent\n * CLI flag. Change at runtime with /fleet concurrency <n>.\n */\n maxConcurrent?: number | undefined;\n providers?: Record<string, ProviderConfig>;\n /**\n * Top-level custom models (maps modelId → definition). Merged with\n * per-provider `customModels` at resolution time. The key is the\n * model id — not a fully qualified name. When the same model id\n * appears in both places, the top-level one wins.\n */\n models?: Record<string, CustomModelDefinition>;\n /**\n * Per-task model matrix. Keys are catalog roles (e.g. \"security-scanner\"),\n * phase names (e.g. \"review\"), or the `*` default. Resolution precedence at\n * subagent spawn: exact role → the role's phase → `*` → leader model. Set via\n * the `/setmodel` slash command; persisted to ~/.wrongstack/config.json.\n */\n modelMatrix?: Record<string, ModelMatrixEntry>;\n /**\n * User-curated model references shown/prioritized by model commands and used\n * by smart fallback derivation. Entries are `model`, `provider/model`, or\n * `provider model`.\n */\n favoriteModels?: string[] | undefined;\n /**\n * When true, auto-derived fallback chains are restricted to `favoriteModels`.\n * Explicit fallback profiles/chains are always honored as written.\n */\n favoriteModelsOnly?: boolean | undefined;\n context: ContextConfig;\n tools: ToolsConfig;\n mcpServers?: Record<string, MCPServerConfig>;\n /**\n * Per-agent ACP invocation overrides, keyed by catalog agent id\n * (`claude-code`, `codex-cli`, `gemini-cli`, …). Lets a user correct an\n * agent's ACP entry command — e.g. point `claude-code` at the right\n * adapter — without a code change. Consumed by `/acp`, `/ensemble`, and\n * `wstack acp`. SECURITY: this is an arbitrary-command exec surface, so it\n * is in the in-project config DENY list — only honoured from the user's\n * `~/.wrongstack/config.json`, never from a repo-committed config.\n */\n acp?: {\n agents?: Record<\n string,\n { command: string; args?: string[]; env?: Record<string, string> }\n >;\n };\n /**\n * Ordered list of fallback model references tried, in order, when the\n * primary model is overloaded (HTTP 429/529/5xx) and its own retries are\n * exhausted. Each entry is a model reference: a bare model id (same\n * provider), `provider/model`, or `provider model`. The primary is always\n * re-tried first at the start of every user turn. See `createFallbackModelExtension`.\n */\n fallbackModels?: string[] | undefined;\n /**\n * Named fallback chains. A profile's first entry can be used as a primary\n * model by `/setmodel`, while the whole ordered list is used for failover.\n */\n fallbackProfiles?: Record<string, string[]> | undefined;\n /**\n * When `true` (the default) and `fallbackModels` is empty, a fallback chain\n * is derived automatically from the other keyed providers/models so 429s\n * recover out of the box. Set `false` to disable the smart default and only\n * use an explicit `fallbackModels` list. Toggle via `/fallback auto on|off`.\n */\n fallbackAuto?: boolean | undefined;\n /**\n * Lifecycle shell hooks, keyed by event. Each command receives the hook\n * `HookInput` JSON on stdin; a JSON `HookOutcome` on stdout (and exit code 2\n * = block) steers the agent. In-process hooks are registered separately via\n * the plugin API. Disabled entirely under `--bare` / `--no-hooks`.\n */\n hooks?: Partial<Record<HookEvent, ShellHook[]>>;\n plugins?: (string | PluginConfig)[] | undefined;\n log: LogConfig;\n features: FeaturesConfig;\n yolo?: boolean | undefined;\n /** When true, show lightweight LLM-predicted next steps after each turn (/next). */\n nextPrediction?: boolean | undefined;\n cwd?: string | undefined;\n /** Autonomy mode configuration (auto-proceed delay, etc.). */\n autonomy?: AutonomyConfig | undefined;\n /** Show rotating launch hints on startup. Default: true. Set to false to suppress. */\n hints?: boolean | undefined;\n /** Raw SSE stream debugging — hex-dump every byte received from providers to stderr. */\n debugStream?: boolean | undefined;\n /**\n * Where settings are persisted. 'global' → ~/.wrongstack/config.json\n * (default). 'project' → <project>/.wrongstack/config.json.\n * When 'project', safe settings are saved per-project.\n */\n configScope?: 'global' | 'project' | undefined;\n /** Automatic codebase symbol-index maintenance (session-start + live updates). */\n indexing?: IndexingConfig | undefined;\n /**\n * Process circuit-breaker protection (gates `bash`/`exec` on repeated\n * failures). Default off — toggle with `/settings breaker on|off`.\n */\n circuitBreaker?: CircuitBreakerRuntimeConfig | undefined;\n /**\n * Adaptive concurrency controller — automatically adjusts `maxConcurrent` based on\n * rate-limit (429) errors. On 429: decreases concurrency. On sustained success:\n * gradually increases concurrency back up. Default off.\n */\n adaptiveConcurrency?: AdaptiveConcurrencyConfig | undefined;\n /** Saved launch preferences — restored on next boot for one-line confirmation. */\n launch?: LaunchConfig | undefined;\n\n /**\n * Session logging & audit configuration.\n * Controls what gets written to the persistent JSONL transcript.\n */\n session?: SessionLoggingConfig | undefined;\n /**\n * Runtime reasoning / cache controls applied to every provider request\n * (REPL/TUI/WebUI). Mapped into `Request.reasoning` and `Request.cache` by a\n * single request-pipeline middleware, gated by the active model's\n * capabilities. See `ModelRuntimeConfig`.\n */\n modelRuntime?: ModelRuntimeConfig | undefined;\n /** HQ client publishing settings, used by CLI/REPL/TUI/WebUI consistently. */\n hq?: HqClientConfig | undefined;\n /**\n * Cloud sync configuration. Stored separately in sync.json to avoid\n * accidentally committing the GitHub token to project configs.\n */\n sync?: SyncConfig | undefined;\n /**\n * Per-plugin namespaced config sections. Each plugin reads its own\n * subtree via `ConfigStore.getExtension(pluginName)`. Plugins should\n * declare a `configSchema` so the loader validates this section\n * automatically before `setup()` runs.\n *\n * Example:\n * extensions: {\n * 'wstack-auth': { tokenUrl: 'https://...', refreshBefore: 300 },\n * 'wstack-metrics': { sink: 'prometheus', port: 9090 },\n * }\n */\n extensions?: Record<string, Record<string, unknown>>;\n}\n\nexport interface ConfigLoader {\n load(opts?: { cliFlags?: Partial<Config> | undefined; cwd?: string | undefined }): Promise<Config>;\n /** Load and decrypt the sync config from ~/.wrongstack/sync.json. */\n loadSyncConfig(): Promise<SyncConfig | null>;\n /** Persist sync config to ~/.wrongstack/sync.json with encrypted token. */\n persistSyncConfig(cfg: SyncConfig): Promise<void>;\n}\n\n/**\n * Subscribable view over Config. Plugins and CLI subsystems use this instead\n * of holding a frozen Config reference, so they can react to runtime updates\n * (e.g. `/model` switching the active provider, secrets rotation, dynamic\n * extension reload).\n *\n * The store enforces immutability — `get()` always returns a frozen object.\n * Updates happen through `update(partial)`, which produces a new Config\n * (structurally cloned, then frozen) and notifies watchers.\n */\nexport interface ConfigStore {\n get(): Readonly<Config>;\n /**\n * Get a typed top-level section. Convenience for consumers that only\n * care about one slice (e.g. `tools` or `context`).\n */\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]>;\n /**\n * Return the extension namespace for `pluginName`, or an empty record\n * when none is configured. The returned object is frozen.\n */\n getExtension(pluginName: string): Readonly<Record<string, unknown>>;\n /**\n * Apply a partial update. Returns the new Config. Watchers are notified\n * synchronously after the update completes. Throws if the result fails\n * any registered invariants (currently: version must stay 1).\n */\n update(partial: Partial<Config>): Readonly<Config>;\n /** Subscribe to changes. Returns an unsubscribe function. */\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void;\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n descriptionMode: Object.freeze({}) as Record<string, 'extend' | 'simple' | undefined>,\n disabledTools: Object.freeze([]) as readonly string[],\n autoExtendLimit: true,\n restrictToProjectRoot: false,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/**\n * Default process circuit-breaker config. Protection is OFF by default — the\n * breaker only gates `bash`/`exec` once the user opts in via `/settings breaker on`.\n * The auto kill/reset delay is only consulted when protection is enabled.\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG = Object.freeze({\n enabled: false,\n autoKillResetMs: 60_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});\n\n/** Default retention window for local session pruning. */\nexport const DEFAULT_SESSION_PRUNE_DAYS = 30;\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v<N>:<base64-iv>:<base64-tag>:<base64-ciphertext>` where `<N>` is the\n * key version used for encryption. Plaintext strings (those that do not match\n * this prefix) are passed through unchanged so that existing configs and\n * env-var-derived values keep working.\n *\n * Key rotation produces a new key and re-encrypts all secrets under it.\n * After rotation, `encrypt()` emits the new version prefix (e.g. `enc:v2:`)\n * and `decrypt()` accepts any version prefix — it uses the current key\n * regardless, since rotation re-encrypts every value atomically.\n *\n * The vault is intentionally NOT designed to defeat a determined local\n * attacker who can read both the config file and the key file — that level\n * of secrecy needs the OS keychain. The goal is to keep keys from being\n * visible in screen shares, accidental log captures, and `cat config.json`\n * over someone's shoulder.\n */\nexport interface SecretVault {\n encrypt(plaintext: string): string;\n decrypt(value: string): string;\n isEncrypted(value: string): boolean;\n /** Current key version. Starts at 1; incremented by `rotateKey()`. */\n readonly keyVersion: number;\n}\n\n/**\n * RotatableSecretVault extends SecretVault with key rotation support.\n * `rotateKey()` generates a fresh key, writes it to disk, and increments\n * the key version. All subsequent `encrypt()` calls use the new version\n * prefix. The caller is responsible for re-encrypting existing config\n * values (see `rotateConfigKeys()`).\n */\nexport interface RotatableSecretVault extends SecretVault {\n rotateKey(): { oldVersion: number; newVersion: number };\n}\n\n/** Legacy v1 prefix — values encrypted before key rotation was introduced. */\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n\n/**\n * Match any versioned encrypted value prefix: `enc:v1:`, `enc:v2:`, etc.\n * Used by `isEncrypted()` and `decrypt()` to handle all versions uniformly.\n */\nexport const ENCRYPTED_PREFIX_PATTERN = /^enc:v(\\d+):/;\n\n/**\n * Return the encrypted prefix for a given key version.\n * @example encryptedPrefixForVersion(1) // 'enc:v1:'\n * @example encryptedPrefixForVersion(2) // 'enc:v2:'\n */\nexport function encryptedPrefixForVersion(version: number): string {\n return `enc:v${version}:`;\n}\n\n/**\n * Parse the key version from an encrypted value string.\n * Returns undefined if the string is not an encrypted value.\n */\nexport function parseEncryptedVersion(value: string): number | undefined {\n const match = value.match(ENCRYPTED_PREFIX_PATTERN);\n return match ? Number.parseInt(match[1]!, 10) : undefined;\n}\n\n/**\n * No-op SecretVault that passes values through unchanged.\n * Used in contexts where encryption is not needed — e.g. reading/writing\n * config sections that contain no secret fields (models, settings, etc.).\n */\nexport const noOpVault: SecretVault = {\n encrypt: (v) => v,\n decrypt: (v) => v,\n isEncrypted: () => false,\n keyVersion: 1,\n};\n","import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Logger } from '../types/logger.js';\nimport type { RotatableSecretVault, SecretVault } from '../types/secret-vault.js';\nimport { ConfigError, ERROR_CODES } from '../types/errors.js';\nimport {\n ENCRYPTED_PREFIX_PATTERN,\n encryptedPrefixForVersion,\n} from '../types/secret-vault.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\nexport interface SecretVaultOptions {\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\n keyFile: string;\n}\n\nconst KEY_BYTES = 32;\nconst IV_BYTES = 12;\nconst TAG_BYTES = 16;\nconst ALGO = 'aes-256-gcm';\n// Desired file mode for the key file on POSIX systems.\nconst KEY_FILE_MODE = 0o600;\n\n/**\n * Key file format v2+: 4-byte magic + 1-byte version + 32-byte key = 37 bytes.\n * The magic header distinguishes versioned key files from legacy 32-byte raw keys.\n */\nconst KEY_FILE_MAGIC = Buffer.from('WSKV', 'ascii');\nconst VERSIONED_KEY_FILE_SIZE = KEY_FILE_MAGIC.length + 1 + KEY_BYTES; // 37 bytes\n\n// ── WS-03: opt-in passphrase-wrapped key file (KEK) ─────────────────────────\n//\n// When WRONGSTACK_VAULT_PASSPHRASE is set, the data key is NOT stored in the\n// clear. Instead the key file holds the data key encrypted (AES-256-GCM) under\n// a key-encryption-key (KEK) derived from the passphrase with scrypt. This adds\n// at-rest protection beyond the file's 0o600 perms: an attacker who copies\n// ~/.wrongstack/.key + config.json off the disk still cannot decrypt without the\n// passphrase. When the env var is unset, behavior is byte-for-byte identical to\n// before (legacy raw / versioned formats) — this is purely additive and opt-in.\n//\n// Wrapped format v3: magic 'WSKW' (4) + keyVersion (1) + salt (16) + iv (12) +\n// tag (16) + ciphertext (32) = 81 bytes.\nconst KEK_MAGIC = Buffer.from('WSKW', 'ascii');\nconst KEK_SALT_BYTES = 16;\nconst WRAPPED_KEY_FILE_SIZE =\n KEK_MAGIC.length + 1 + KEK_SALT_BYTES + IV_BYTES + TAG_BYTES + KEY_BYTES; // 81 bytes\n// scrypt cost parameters. N=2^15 keeps derivation ~50-100ms — strong against\n// offline brute force while imperceptible for a one-time-per-process unlock.\nconst SCRYPT_N = 1 << 15;\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SCRYPT_MAXMEM = 64 * 1024 * 1024; // headroom above N*r*128 so derivation never throws\n\n/** Read the optional vault passphrase from the environment. Empty = unset. */\nfunction getVaultPassphrase(): string | undefined {\n const v = process.env['WRONGSTACK_VAULT_PASSPHRASE'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/** True if `buf` is a passphrase-wrapped (v3) key file. */\nfunction isWrappedKeyFile(buf: Buffer): boolean {\n return buf.length === WRAPPED_KEY_FILE_SIZE && buf.subarray(0, KEK_MAGIC.length).equals(KEK_MAGIC);\n}\n\n/** Derive the 32-byte KEK from a passphrase + salt via scrypt. */\nfunction deriveKEK(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, KEY_BYTES, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n}\n\n/** Serialize a data key into the wrapped (v3) on-disk format under `passphrase`. */\nfunction wrapDataKey(dataKey: Buffer, keyVersion: number, passphrase: string): Buffer {\n const salt = randomBytes(KEK_SALT_BYTES);\n const iv = randomBytes(IV_BYTES);\n const kek = deriveKEK(passphrase, salt);\n const cipher = createCipheriv(ALGO, kek, iv);\n const ct = Buffer.concat([cipher.update(dataKey), cipher.final()]);\n const tag = cipher.getAuthTag();\n const out = Buffer.alloc(WRAPPED_KEY_FILE_SIZE);\n let off = 0;\n KEK_MAGIC.copy(out, off); off += KEK_MAGIC.length;\n out[off] = keyVersion & 0xff; off += 1;\n salt.copy(out, off); off += KEK_SALT_BYTES;\n iv.copy(out, off); off += IV_BYTES;\n tag.copy(out, off); off += TAG_BYTES;\n ct.copy(out, off);\n return out;\n}\n\n/**\n * Parse a wrapped (v3) key file and return the data key + version. Throws a\n * clear ConfigError when the passphrase is missing or wrong (GCM auth failure).\n */\nfunction unwrapDataKey(buf: Buffer, keyFile: string): { key: Buffer; version: number } {\n const passphrase = getVaultPassphrase();\n if (!passphrase) {\n throw new ConfigError({\n message:\n `SecretVault: key file ${keyFile} is passphrase-protected — set the ` +\n `WRONGSTACK_VAULT_PASSPHRASE environment variable to unlock it.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile },\n });\n }\n let off = KEK_MAGIC.length;\n const version = buf[off]!; off += 1;\n const salt = buf.subarray(off, off + KEK_SALT_BYTES); off += KEK_SALT_BYTES;\n const iv = buf.subarray(off, off + IV_BYTES); off += IV_BYTES;\n const tag = buf.subarray(off, off + TAG_BYTES); off += TAG_BYTES;\n const ct = buf.subarray(off, off + KEY_BYTES);\n const kek = deriveKEK(passphrase, salt);\n const decipher = createDecipheriv(ALGO, kek, iv);\n decipher.setAuthTag(tag);\n try {\n const key = Buffer.concat([decipher.update(ct), decipher.final()]);\n return { key: Buffer.from(key), version };\n } catch {\n throw new ConfigError({\n message:\n `SecretVault: failed to unlock key file ${keyFile} — wrong ` +\n `WRONGSTACK_VAULT_PASSPHRASE (key unwrap authentication failed).`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile },\n });\n }\n}\n\n/**\n * Check and warn if the key file has incorrect permissions on POSIX.\n * On Windows this is a no-op (mode bits don't apply).\n */\nfunction checkKeyFilePermissions(keyFile: string): void {\n if (process.platform === 'win32') return; // No mode bits on Windows\n try {\n const stat = fs.statSync(keyFile);\n const actualMode = stat.mode & 0o777;\n if (actualMode !== KEY_FILE_MODE) {\n console.warn(JSON.stringify({\n level: 'warn',\n event: 'vault.key_file_wrong_permissions',\n message: `Key file ${keyFile} has mode ${actualMode.toString(8)} — expected ${KEY_FILE_MODE.toString(8)}. Run: chmod ${KEY_FILE_MODE.toString(8)} ${keyFile}`,\n keyFile,\n expectedMode: KEY_FILE_MODE,\n actualMode,\n timestamp: new Date().toISOString(),\n }));\n }\n } catch {\n // stat can fail for reasons other than the file not existing;\n // if it does, the ENOENT path handles it.\n }\n}\n\n/**\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\n * a fresh one is generated. Decryption of plaintext values is a no-op so\n * legacy configs continue to work.\n *\n * Key file format:\n * - Legacy (v1): exactly 32 raw bytes\n * - Versioned (v2+): 4-byte magic `WSKV` + 1-byte version + 32-byte key (37 bytes)\n *\n * Encrypted value format: `enc:v<N>:<iv>:<tag>:<ciphertext>` where N is the\n * key version. After rotation, encrypt() emits the new version prefix.\n */\nexport class DefaultSecretVault implements RotatableSecretVault {\n private readonly keyFile: string;\n private key?: Buffer | undefined;\n private _keyVersion: number = 1;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n /** Current key version. Starts at 1; incremented by rotateKey(). */\n get keyVersion(): number {\n // Ensure key is loaded so version is accurate\n if (!this.key) this.loadOrCreateKey();\n return this._keyVersion;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && ENCRYPTED_PREFIX_PATTERN.test(value);\n }\n\n encrypt(plaintext: string): string {\n if (this.isEncrypted(plaintext)) return plaintext;\n const key = this.loadOrCreateKey();\n const iv = randomBytes(IV_BYTES);\n const cipher = createCipheriv(ALGO, key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n const prefix = encryptedPrefixForVersion(this._keyVersion);\n return `${prefix}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\n }\n\n decrypt(value: string): string {\n if (!this.isEncrypted(value)) return value;\n // Strip the versioned prefix (enc:v1:, enc:v2:, etc.)\n const prefixMatch = value.match(ENCRYPTED_PREFIX_PATTERN);\n if (!prefixMatch) {\n throw new ConfigError({\n message: 'SecretVault: malformed encrypted value',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { field: 'encrypted_value' },\n });\n }\n const rest = value.slice(prefixMatch[0].length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new ConfigError({\n message: 'SecretVault: malformed encrypted value',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { field: 'encrypted_value' },\n });\n }\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\n const iv = Buffer.from(ivB64, 'base64');\n const tag = Buffer.from(tagB64, 'base64');\n const ct = Buffer.from(ctB64, 'base64');\n if (iv.length !== IV_BYTES) throw new ConfigError({\n message: 'SecretVault: bad IV length',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { expected: IV_BYTES, actual: iv.length },\n });\n if (tag.length !== TAG_BYTES) throw new ConfigError({\n message: 'SecretVault: bad tag length',\n code: ERROR_CODES.CONFIG_PARSE_FAILED,\n context: { expected: TAG_BYTES, actual: tag.length },\n });\n const key = this.loadOrCreateKey();\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return pt.toString('utf8');\n }\n\n /**\n * Generate a new encryption key, write it to disk, and increment the key version.\n * After rotation, encrypt() emits the new version prefix (e.g. enc:v2:).\n * The caller must re-encrypt existing config values (see rotateConfigKeys()).\n */\n rotateKey(): { oldVersion: number; newVersion: number } {\n const oldVersion = this._keyVersion;\n const newKey = randomBytes(KEY_BYTES);\n const newVersion = oldVersion + 1;\n\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const passphrase = getVaultPassphrase();\n if (passphrase) {\n // Keep the rotated key passphrase-wrapped (v3) so rotation never\n // downgrades a protected key file to plaintext.\n fs.writeFileSync(this.keyFile, wrapDataKey(newKey, newVersion, passphrase), { mode: 0o600 });\n } else {\n // Write versioned key file: WSKV + version byte + key\n const keyFileBuf = Buffer.alloc(VERSIONED_KEY_FILE_SIZE);\n KEY_FILE_MAGIC.copy(keyFileBuf, 0);\n keyFileBuf[KEY_FILE_MAGIC.length] = newVersion;\n newKey.copy(keyFileBuf, KEY_FILE_MAGIC.length + 1);\n fs.writeFileSync(this.keyFile, keyFileBuf, { mode: 0o600 });\n }\n checkKeyFilePermissions(this.keyFile);\n\n this.key = newKey;\n this._keyVersion = newVersion;\n return { oldVersion, newVersion };\n }\n\n /**\n * If WRONGSTACK_VAULT_PASSPHRASE is set but the key on disk is still stored\n * unwrapped (legacy v1 / versioned v2), re-write it in passphrase-wrapped (v3)\n * form. The data key is preserved, so all existing ciphertext keeps\n * decrypting. Best-effort: a write failure leaves the working unwrapped file\n * in place and is not fatal to load.\n */\n private migrateToWrappedIfPassphrase(): void {\n const passphrase = getVaultPassphrase();\n if (!passphrase || !this.key) return;\n try {\n fs.writeFileSync(this.keyFile, wrapDataKey(this.key, this._keyVersion, passphrase), {\n mode: 0o600,\n });\n checkKeyFilePermissions(this.keyFile);\n } catch {\n // Non-fatal: the at-rest upgrade failed, but the loaded key is valid.\n }\n }\n\n private loadOrCreateKey(): Buffer {\n // readFileSync blocks the event loop, but this is a one-time cost per\n // process: the key is cached after the first load and reused for every\n // subsequent encrypt/decrypt. For CLI usage (single run → exit) this is\n // negligible. For server contexts (eternal autonomy, MCP server mode),\n // the first encrypt/decrypt call causes a brief (<1ms) event loop stall.\n // Prefer calling vault.encrypt('') during boot to warm the cache if this\n // is a concern in your deployment.\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n\n // Passphrase-wrapped (v3): unwrap with WRONGSTACK_VAULT_PASSPHRASE.\n // Checked first because its size/magic are distinct from the others.\n if (isWrappedKeyFile(buf)) {\n const { key, version } = unwrapDataKey(buf, this.keyFile);\n this.key = key;\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n\n // Detect key file format:\n if (buf.length === KEY_BYTES) {\n // Legacy v1: raw 32-byte key\n this.key = buf;\n this._keyVersion = 1;\n checkKeyFilePermissions(this.keyFile);\n // Upgrade to passphrase-wrapped at rest if a passphrase is configured.\n this.migrateToWrappedIfPassphrase();\n return this.key;\n }\n\n if (buf.length === VERSIONED_KEY_FILE_SIZE) {\n // Versioned v2+: WSKV magic + version byte + 32-byte key\n const magic = buf.subarray(0, KEY_FILE_MAGIC.length);\n if (!magic.equals(KEY_FILE_MAGIC)) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has invalid magic header`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile },\n });\n }\n const version = buf[KEY_FILE_MAGIC.length]!;\n const key = buf.subarray(KEY_FILE_MAGIC.length + 1);\n if (key.length !== KEY_BYTES) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has wrong key size (${key.length} bytes, expected ${KEY_BYTES})`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: key.length },\n });\n }\n this.key = Buffer.from(key);\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n // Upgrade to passphrase-wrapped at rest if a passphrase is configured.\n this.migrateToWrappedIfPassphrase();\n return this.key;\n }\n\n // Wrong size — neither legacy nor versioned format\n throw new ConfigError({\n message:\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\n `(expected ${KEY_BYTES} for v1 or ${VERSIONED_KEY_FILE_SIZE} for v2+). ` +\n `Remove it manually to generate a new key.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: buf.length },\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n // Create a fresh key. Use sync APIs so the constructor-free getter\n // remains synchronous from the caller's perspective.\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const key = randomBytes(KEY_BYTES);\n // When a passphrase is configured, a brand-new key is written wrapped (v3)\n // from the start; otherwise the legacy raw-32-byte format is preserved.\n const passphrase = getVaultPassphrase();\n const initialBytes = passphrase ? wrapDataKey(key, 1, passphrase) : key;\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\n // to create the key file, only one succeeds and the loser gets EEXIST.\n try {\n fs.writeFileSync(this.keyFile, initialBytes, { mode: 0o600, flag: 'wx' });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // Another process won the race — re-read what they wrote.\n const buf = fs.readFileSync(this.keyFile);\n if (isWrappedKeyFile(buf)) {\n const { key: winnerKey, version } = unwrapDataKey(buf, this.keyFile);\n this.key = winnerKey;\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n if (buf.length === KEY_BYTES) {\n // Legacy v1 format\n this.key = buf;\n this._keyVersion = 1;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n if (buf.length === VERSIONED_KEY_FILE_SIZE) {\n // Versioned format\n const magic = buf.subarray(0, KEY_FILE_MAGIC.length);\n if (!magic.equals(KEY_FILE_MAGIC)) {\n throw new ConfigError({\n message: `SecretVault: key file ${this.keyFile} has invalid magic header`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile },\n });\n }\n const version = buf[KEY_FILE_MAGIC.length]!;\n const winnerKey = buf.subarray(KEY_FILE_MAGIC.length + 1);\n this.key = Buffer.from(winnerKey);\n this._keyVersion = version;\n checkKeyFilePermissions(this.keyFile);\n return this.key;\n }\n throw new ConfigError({\n message:\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\n `(expected ${KEY_BYTES} for v1 or ${VERSIONED_KEY_FILE_SIZE} for v2+). ` +\n `Remove it manually to generate a new key.`,\n code: ERROR_CODES.CONFIG_INVALID,\n context: { keyFile: this.keyFile, expectedBytes: KEY_BYTES, actualBytes: buf.length },\n });\n }\n this.key = key;\n this._keyVersion = 1;\n return key;\n }\n}\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n *\n * @param warn — callback for decryption warnings. Defaults to `console.warn`\n * for backward compatibility; pass `logger.warn` when a structured logger\n * is available (preferred in long-running/server contexts).\n */\nexport function decryptConfigSecrets<T>(\n cfg: T,\n vault: SecretVault,\n opts?: { warn?: (msg: string) => void },\n): T {\n const warn = opts?.warn ?? ((msg: string) => console.warn(msg));\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n warn(\n `[secret-vault] Failed to decrypt \"${key}\": ${err instanceof Error ? err.message : err}`,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(\n cfg: T,\n vault: SecretVault,\n _opts?: { warn?: (msg: string) => void },\n): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n * Use a named field with `isSecret: false` annotation if you must opt out —\n * see `NON_SECRET_OVERRIDES` below.\n */\nconst SECRET_KEY_PATTERN =\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nexport function isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n\n/**\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\n * fields encrypted. Used by the `wstack auth` subcommand.\n */\nexport async function rewriteConfigEncrypted(\n configPath: string,\n vault: SecretVault,\n patch?: Record<string, unknown>,\n): Promise<void> {\n let current: Record<string, unknown> = {};\n try {\n const raw = await fsp.readFile(configPath, 'utf8');\n current = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // start from empty\n }\n const merged = deepMerge(current, patch ?? {});\n const encrypted = encryptConfigSecrets(merged, vault);\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\n // atomicWrite: torn write here would erase every saved encrypted API key.\n await atomicWrite(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n await restrictFilePermissions(configPath);\n}\n\n/**\n * Scan a config file on disk for plaintext secret-bearing fields and\n * rewrite the file with them encrypted in place. Returns a count of how\n * many fields were migrated. Idempotent — calling on a fully-encrypted\n * file is a no-op and writes nothing. Used by the CLI on every boot so\n * users who had plaintext keys before the vault landed are upgraded\n * transparently.\n */\nexport async function migratePlaintextSecrets(\n configPath: string,\n vault: SecretVault,\n logger?: Pick<Logger, 'warn'>,\n): Promise<{ migrated: number; file: string }> {\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n return { migrated: 0, file: configPath };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { migrated: 0, file: configPath };\n }\n const counter = { n: 0 };\n const migrated = walkCount(parsed, vault, counter);\n if (counter.n === 0) return { migrated: 0, file: configPath };\n // atomicWrite: runs on every boot for legacy users — torn write = wipe.\n await atomicWrite(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n await restrictFilePermissions(\n configPath,\n logger ? { warn: (msg) => logger.warn(msg) } : undefined,\n );\n return { migrated: counter.n, file: configPath };\n}\n\n/**\n * Rotate the vault's encryption key and re-encrypt all secret-bearing\n * fields in a config file. This is the atomic key rotation operation:\n *\n * 1. Read the config file\n * 2. Decrypt all encrypted values with the old key\n * 3. Generate a new key (vault.rotateKey())\n * 4. Re-encrypt all values with the new key (new version prefix)\n * 5. Write the config file atomically\n *\n * Returns the number of fields re-encrypted and the version transition.\n * If the config file doesn't exist or has no encrypted fields, returns\n * { rotated: 0 } without modifying the key.\n */\nexport async function rotateConfigKeys(\n configPath: string,\n vault: RotatableSecretVault,\n logger?: Pick<Logger, 'warn' | 'info'>,\n): Promise<{ rotated: number; oldVersion: number; newVersion: number; file: string }> {\n const log = logger?.info ?? (() => {});\n const warn = logger?.warn ?? ((msg: string) => console.warn(msg));\n\n // Read the config file\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n // No config file — just rotate the key without re-encrypting anything\n const { oldVersion, newVersion } = vault.rotateKey();\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — no config file to re-encrypt`);\n return { rotated: 0, oldVersion, newVersion, file: configPath };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n warn(`[secret-vault] Config file ${configPath} is not valid JSON — skipping rotation`);\n return { rotated: 0, oldVersion: vault.keyVersion, newVersion: vault.keyVersion, file: configPath };\n }\n\n // Count encrypted fields and decrypt them\n const counter = { n: 0, failed: [] as string[] };\n const decrypted = walkDecryptCount(parsed, vault, counter);\n\n // Abort BEFORE rotating if any encrypted field could not be decrypted with\n // the current key. Rotation would discard the old key while these fields\n // still hold old-key ciphertext, and walkReencrypt skips already-encrypted\n // values — so they would become permanently undecryptable. Surface the\n // corruption and leave the key intact for the operator to investigate.\n if (counter.failed.length > 0) {\n throw new Error(\n `[secret-vault] Aborting key rotation: ${counter.failed.length} field(s) could not be decrypted ` +\n `with the current key and would be permanently lost on rotation: ${counter.failed.join(', ')}. ` +\n `Restore or remove these fields before rotating.`,\n );\n }\n\n if (counter.n === 0) {\n // No encrypted fields — just rotate the key\n const { oldVersion, newVersion } = vault.rotateKey();\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — no encrypted fields to re-encrypt`);\n return { rotated: 0, oldVersion, newVersion, file: configPath };\n }\n\n // Rotate the key (generates new key, increments version)\n const { oldVersion, newVersion } = vault.rotateKey();\n\n // Re-encrypt all secret fields with the new key\n const reencrypted = walkReencrypt(decrypted, vault);\n\n // Write the config file atomically\n await atomicWrite(configPath, JSON.stringify(reencrypted, null, 2), { mode: 0o600 });\n await restrictFilePermissions(configPath, { warn });\n\n log(`[secret-vault] Key rotated (v${oldVersion} → v${newVersion}) — re-encrypted ${counter.n} field(s)`);\n return { rotated: counter.n, oldVersion, newVersion, file: configPath };\n}\n\n/**\n * Walk a config object, decrypt all encrypted values, and count them.\n * Returns a new object with decrypted values.\n *\n * `counter.failed` collects the key paths of any field that is encrypted but\n * could NOT be decrypted with the current key. These are left as-is (old\n * ciphertext). The caller MUST treat a non-empty `failed` list as a hard stop\n * before rotating: rotation discards the old key, and `walkReencrypt` skips\n * already-encrypted values, so a retained old-key ciphertext would become\n * permanently undecryptable. Surfacing it is strictly safer than entombing it.\n */\nfunction walkDecryptCount<T>(\n node: T,\n vault: SecretVault,\n counter: { n: number; failed: string[] },\n pathPrefix = '',\n): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item, i) =>\n walkDecryptCount(item, vault, counter, `${pathPrefix}[${i}]`),\n ) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n const keyPath = pathPrefix ? `${pathPrefix}.${k}` : k;\n if (typeof v === 'string' && vault.isEncrypted(v)) {\n try {\n out[k] = vault.decrypt(v);\n counter.n++;\n } catch {\n // Decryption failed — record the path and keep the old ciphertext.\n // The caller aborts rotation when counter.failed is non-empty, so\n // the old key is never discarded while this value still depends on it.\n counter.failed.push(keyPath);\n out[k] = v;\n }\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkDecryptCount(v, vault, counter, keyPath);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * Walk a config object and re-encrypt all secret-bearing fields.\n * Unlike encryptConfigSecrets, this encrypts ALL string values that\n * were previously decrypted (they're now plaintext), not just those\n * matching the secret field pattern. This ensures we re-encrypt values\n * that were successfully decrypted in walkDecryptCount.\n */\nfunction walkReencrypt<T>(node: T, vault: SecretVault): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkReencrypt(item, vault)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && v.length > 0 && !vault.isEncrypted(v)) {\n // This was a decrypted secret — re-encrypt it\n out[k] = vault.encrypt(v);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkReencrypt(v, vault);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * Restrict a file to owner-only access. On POSIX this is chmod 0o600.\n * On Windows, chmod is a no-op — we use icacls to remove inherited\n * permissions and grant only the current user. Failures are logged\n * but not thrown so callers are not blocked on unsupported platforms.\n */\nasync function restrictFilePermissions(\n filePath: string,\n opts?: { warn?: (msg: string) => void },\n): Promise<void> {\n const warn = opts?.warn ?? ((msg: string) => console.warn(msg));\n if (process.platform === 'win32') {\n try {\n const { execFile } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execFileAsync = promisify(execFile);\n const user = windowsAccountName();\n if (!user) {\n warn(\n `[secret-vault] Could not determine the current Windows user for ${filePath}; skipping icacls hardening.`,\n );\n return;\n }\n // Remove inherited ACEs, grant full control only to current user.\n await execFileAsync('icacls', [filePath, '/inheritance:r', '/grant:r', `${user}:(F)`]);\n } catch {\n // Best-effort: icacls may not be available in all environments.\n warn(\n `[secret-vault] Could not restrict permissions on ${filePath} — config file may be readable by other users on this system.`,\n );\n }\n } else {\n try {\n await fsp.chmod(filePath, 0o600);\n } catch {\n // Best-effort\n }\n }\n}\n\nfunction windowsAccountName(): string | undefined {\n const username = process.env.USERNAME || process.env.USER;\n if (!username || username.includes('\\0')) return undefined;\n const domain = process.env.USERDOMAIN;\n if (domain && !domain.includes('\\0')) return `${domain}\\\\${username}`;\n return username;\n}\n\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkCount(item, vault, counter)) as never as T;\n }\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\n out[k] = vault.encrypt(v);\n counter.n++;\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkCount(v, vault, counter);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/** Keys that, when written into a plain object, can poison the prototype\n * chain. We never want user config to carry these. */\nimport { deepMerge } from '../utils/deep-merge.js';\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { LogLevel, Logger } from '../types/logger.js';\nimport { color } from '../utils/color.js';\nimport { writeErr } from '../utils/term.js';\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nconst COLORS: Record<LogLevel, (s: string) => string> = {\n error: color.red,\n warn: color.yellow,\n info: color.cyan,\n debug: color.gray,\n trace: color.dim,\n};\n\nconst LOG_LEVELS = new Set<LogLevel>(['error', 'warn', 'info', 'debug', 'trace']);\nconst LOG_FORMATS = new Set<string>(['pretty', 'json']);\n\nexport type LogFormat = 'pretty' | 'json';\n\nexport interface DefaultLoggerOptions {\n level?: LogLevel | undefined;\n file?: string | undefined;\n /**\n * @deprecated Use `format: 'json'` instead. Kept for backward compat\n * with existing callers but has no effect on output — the `format`\n * option controls whether stderr receives pretty-printed or JSON lines.\n */\n pretty?: boolean | undefined;\n /** Output format for stderr. `pretty` (colored, human-readable) or `json` (machine-parseable). Defaults to `WRONGSTACK_LOG_FORMAT` env var, falling back to `pretty`. */\n format?: LogFormat | undefined;\n bindings?: Record<string, unknown>;\n /**\n * When false, suppress stderr output entirely — only write to the log\n * file (if configured). Use this in TUI mode so plugin/library log\n * messages don't interleave with Ink's terminal rendering.\n * Default: true (stderr output is enabled).\n */\n stderr?: boolean | undefined;\n /**\n * Rotate the log file once it exceeds this many bytes: the current file is\n * renamed to `<file>.1` (replacing any previous one) and a fresh file\n * starts. Bounds total disk to ~2× this value. Default 10 MB.\n */\n maxFileBytes?: number | undefined;\n}\n\nexport class DefaultLogger implements Logger {\n /** How many file writes between rotation size checks (statSync is not free). */\n private static readonly ROTATE_CHECK_EVERY = 100;\n\n level: LogLevel;\n private file?: string | undefined;\n private bindings: Record<string, unknown>;\n private format: LogFormat;\n private stderr: boolean;\n private maxFileBytes: number;\n private writesSinceRotateCheck = 0;\n /**\n * Serialized async tail for file writes. Every appendFile (and any\n * chained rotation) is awaited through this promise so file I/O\n * never overlaps itself — preserving the per-line ordering the\n * sync version had, but without blocking the caller thread. Any\n * rejection is swallowed (`catch(() => {})`) because logging must\n * never crash the host.\n *\n * Children share the parent's tail: `child.tail === parent.tail`\n * for the lifetime of the chain. Read/write access goes through\n * `_tail` so that, when a child has been wired to a parent, both\n * `enqueueRotate` and `log` always observe the parent's current tail\n * rather than a stale snapshot taken at `child()` time.\n */\n private tail: Promise<void> = Promise.resolve();\n private parent: DefaultLogger | null = null;\n\n /**\n * Resolve the current tail. For the root logger this is the field;\n * for a child logger we always read through the parent so that a\n * child's appends land on the parent's most recent tail, and a\n * parent's `flush()` waits for everything the child chained.\n */\n private get _tail(): Promise<void> {\n return this.parent ? this.parent._tail : this.tail;\n }\n private set _tail(next: Promise<void>) {\n if (this.parent) this.parent.tail = next;\n else this.tail = next;\n }\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? parseLogLevel(process.env.WRONGSTACK_LOG_LEVEL);\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.format = opts.format ?? parseLogFormat(process.env.WRONGSTACK_LOG_FORMAT);\n this.stderr = opts.stderr !== false; // default true\n this.maxFileBytes = opts.maxFileBytes ?? 10 * 1024 * 1024;\n if (this.file) {\n // Chain mkdir onto the file-write tail so the first append can't\n // race a still-pending mkdir (especially under tests that call\n // `flush()` immediately after `info()`). mkdir is best-effort;\n // a rejection only blocks subsequent appends in the chain that\n // observed it via the rejected promise, which would skip the\n // append — that is acceptable because ENOENT/EEXIST/EPERM all\n // either are no-ops or indicate an unrecoverable environment.\n const dir = path.dirname(this.file);\n this._tail = this._tail\n .then(async () => {\n await fsp.mkdir(dir, { recursive: true });\n })\n .catch(() => undefined);\n }\n }\n\n error(msg: string, ctx?: unknown): void {\n this.log('error', msg, ctx);\n }\n warn(msg: string, ctx?: unknown): void {\n this.log('warn', msg, ctx);\n }\n info(msg: string, ctx?: unknown): void {\n this.log('info', msg, ctx);\n }\n debug(msg: string, ctx?: unknown): void {\n this.log('debug', msg, ctx);\n }\n trace(msg: string, ctx?: unknown): void {\n this.log('trace', msg, ctx);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n // Construct without invoking the class constructor (which would mkdir\n // again and create a separate file-write tail). The parent and child\n // must share the same tail so `parent.flush()` waits for child\n // appends too — otherwise a test that flushes the parent after\n // `child.info(...)` would race the child append and observe an empty\n // file. Sharing the tail preserves the order the parent originally\n // had via its serialised file-write queue.\n const child = Object.create(DefaultLogger.prototype) as DefaultLogger;\n child.level = this.level;\n child.file = this.file;\n child.bindings = { ...this.bindings, ...bindings };\n child.format = this.format;\n child.stderr = this.stderr;\n child.maxFileBytes = this.maxFileBytes;\n child.parent = this;\n child.writesSinceRotateCheck = this.writesSinceRotateCheck;\n return child;\n }\n\n /**\n * Wait until all queued file writes (and any pending rotation) have\n * completed. `log()` is fire-and-forget by design — the caller never\n * blocks on disk — so tests, shutdown handlers, and processes that\n * need a deterministic \"everything is on disk now\" guarantee should\n * `await logger.flush()` before reading the file or exiting.\n */\n flush(): Promise<void> {\n return this._tail;\n }\n\n /**\n * Size-based rotation: when the file outgrows `maxFileBytes`, rename it to\n * `<file>.1` (dropping the previous `.1`) so the live file restarts empty.\n * Checked on the first write and every ROTATE_CHECK_EVERY writes after.\n * Best-effort: a rename can fail on Windows while another process holds\n * the file — the next check retries. Multiple processes appending to the\n * same log all run this check; whoever crosses the threshold first wins.\n *\n * Async: the rotation runs on the file-write tail (so its writes don't\n * interleave with the next append), and the caller never blocks on a\n * statSync / renameSync syscall on the hot log path.\n */\n private enqueueRotate(file: string): void {\n if (this.writesSinceRotateCheck++ % DefaultLogger.ROTATE_CHECK_EVERY !== 0) return;\n this._tail = this._tail\n .then(async () => {\n let st;\n try {\n st = await fsp.stat(file);\n } catch {\n return; // file missing — nothing to rotate\n }\n if (st.size < this.maxFileBytes) return;\n try {\n await fsp.rm(`${file}.1`, { force: true });\n await fsp.rename(file, `${file}.1`);\n } catch {\n // file locked, or raced by another process — ignore\n }\n })\n .catch(() => undefined);\n }\n\n private log(level: LogLevel, msg: string, ctx?: unknown): void {\n const r = LEVEL_RANK[level];\n const allowed = LEVEL_RANK[this.level];\n if (r > allowed) return;\n const ts = new Date().toISOString();\n const entry: Record<string, unknown> = { ts, level, msg, ...this.bindings };\n if (ctx !== undefined) {\n entry.ctx = ctx instanceof Error ? { message: ctx.message, stack: ctx.stack } : ctx;\n }\n // Disk: JSON line. Serialized through `_tail` so concurrent log\n // calls preserve per-line order without blocking the caller on\n // sync file I/O. Children route through their parent's tail, so\n // a parent's `flush()` waits for every chained child append.\n if (this.file) {\n this.enqueueRotate(this.file);\n const line = `${JSON.stringify(entry)}\\n`;\n this._tail = this._tail\n .then(() => fsp.appendFile(this.file!, line))\n .catch(() => undefined);\n }\n // Stderr: pretty or json. Suppressed when this.stderr is false (TUI mode)\n // so plugin/library log messages don't interleave with Ink's rendering.\n if (!this.stderr) return;\n if (this.format === 'json') {\n writeErr(`${JSON.stringify(entry)}\\n`);\n } else {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n writeErr(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n writeErr(`${head}\\n`);\n }\n }\n }\n}\n\nfunction parseLogLevel(raw: string | undefined): LogLevel {\n return raw && LOG_LEVELS.has(raw as LogLevel) ? (raw as LogLevel) : 'info';\n}\n\nfunction parseLogFormat(raw: string | undefined): LogFormat {\n return raw && LOG_FORMATS.has(raw) ? (raw as LogFormat) : 'pretty';\n}\n\nfunction formatCtx(ctx: unknown): string {\n if (ctx instanceof Error) return color.dim(ctx.message);\n if (typeof ctx === 'string') return color.dim(ctx);\n try {\n return color.dim(JSON.stringify(ctx));\n } catch {\n return color.dim(String(ctx));\n }\n}\n\n/**\n * A logger that silently discards all messages. Used during boot before\n * the real logger is configured, and in test contexts where logging\n * would be noise.\n */\nexport const noOpLogger: Logger = {\n // 'error' is the quietest level the Logger contract offers; the methods\n // discard everything regardless, this only matters to level checks.\n level: 'error',\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n trace: () => {},\n child: () => noOpLogger,\n};\n","import type { EventBus } from '../kernel/events.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { Usage } from '../types/provider.js';\nimport type { CacheStats, TokenCounter } from '../types/token-counter.js';\n\ninterface PriceEntry {\n input?: number | undefined;\n output?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nconst PRICE_CACHE_MAX_SIZE = 100;\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry | undefined;\n private readonly providerId?: string | undefined;\n private readonly events?: EventBus | undefined;\n private sessionId?: string | (() => string | undefined) | undefined;\n private priceCache = new Map<string, PriceEntry>();\n /** Most recently accounted request's tokens. Used for per-request context pressure. */\n private lastInput = 0;\n private lastCacheRead = 0;\n\n constructor(\n opts: {\n registry?: ModelsRegistry | undefined;\n providerId?: string | undefined;\n events?: EventBus | undefined;\n sessionId?: string | (() => string | undefined) | undefined;\n } = {},\n ) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n this.sessionId = opts.sessionId;\n }\n\n setSessionId(sessionId: string | (() => string | undefined) | undefined): void {\n this.sessionId = sessionId;\n }\n\n account(usage: Usage, model?: string): void {\n const eventSessionId = this.currentSessionId();\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n this.emitAccounted(eventSessionId);\n return;\n }\n\n if (this.registry && this.providerId && model) {\n // Evict oldest entry when cache is full before async lookup.\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0] ?? '');\n }\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n // Token totals are authoritative even when pricing is unresolved.\n // Emit after the lookup settles so live UIs update for unknown models\n // without double-emitting when pricing is resolved.\n this.emitAccounted(eventSessionId);\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', {\n ...(eventSessionId ? { sessionId: eventSessionId } : {}),\n model: model ?? '<unknown>',\n });\n this.emitAccounted(eventSessionId);\n return undefined;\n });\n return;\n }\n\n // No pricing source exists. Still emit token totals so live UIs do not stay\n // at 0 just because cost cannot be estimated.\n this.emitAccounted(eventSessionId);\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n const eventSessionId = this.currentSessionId();\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n const price = priceFromModel(resolved);\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0] ?? '');\n }\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n this.emitAccounted(eventSessionId);\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n currentRequestTokens(): { input: number; cacheRead: number } {\n return { input: this.lastInput, cacheRead: this.lastCacheRead };\n }\n\n setCurrentRequestTokens(input: number, cacheRead?: number): void {\n this.lastInput = input;\n this.lastCacheRead = cacheRead ?? 0;\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n private emitAccounted(sessionId = this.currentSessionId()): void {\n this.events?.emit('token.accounted', {\n ...(sessionId ? { sessionId } : {}),\n usage: this.total(),\n cost: { input: this.costInput, output: this.costOutput, total: this.costInput + this.costOutput },\n });\n }\n\n private currentSessionId(): string | undefined {\n const value = typeof this.sessionId === 'function' ? this.sessionId() : this.sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n this.lastInput = 0;\n this.lastCacheRead = 0;\n this.emitAccounted();\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n const hasCacheWriteSplit = usage.cacheWrite5m !== undefined || usage.cacheWrite1h !== undefined;\n const cacheWrite5m = usage.cacheWrite5m ?? (hasCacheWriteSplit ? 0 : usage.cacheWrite);\n const cacheWrite1h = usage.cacheWrite1h ?? 0;\n if (cacheWrite5m && (price.cacheWrite5m ?? price.cacheWrite)) {\n this.costInput += (cacheWrite5m / 1_000_000) * (price.cacheWrite5m ?? price.cacheWrite ?? 0);\n }\n if (cacheWrite1h && (price.cacheWrite1h ?? price.cacheWrite)) {\n this.costInput += (cacheWrite1h / 1_000_000) * (price.cacheWrite1h ?? price.cacheWrite ?? 0);\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n cacheWrite5m: m.cost?.cache_write_5m ?? m.cost?.cache_write,\n cacheWrite1h: m.cost?.cache_write_1h ?? (m.cost?.input !== undefined ? m.cost.input * 2 : undefined),\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","export type MemoryScope = 'project-agents' | 'project-memory' | 'user-memory';\n\n// ── Memory categories ──────────────────────────────────────────────────\n\nexport type MemoryType = 'fact' | 'decision' | 'convention' | 'preference' | 'reference' | 'anti_pattern';\n\nexport const MEMORY_TYPE_LABELS: Record<MemoryType, string> = {\n fact: 'Fact',\n decision: 'Decision',\n convention: 'Convention',\n preference: 'Preference',\n reference: 'Reference',\n anti_pattern: 'Anti-pattern',\n};\n\nexport type MemoryPriority = 'critical' | 'high' | 'medium' | 'low';\n\nexport interface MemoryEntry {\n scope: MemoryScope;\n text: string;\n ts: string;\n /** Category — helps the agent decide whether to inject or ignore. */\n type?: MemoryType | undefined;\n /** Free-form tags for grouping (e.g. [\"build\", \"pnpm\", \"typescript\"]). */\n tags?: string[] | undefined;\n /** Priority — critical entries are always injected; low may be skipped. */\n priority?: MemoryPriority | undefined;\n /** Session or agent that created this entry. */\n source?: string | undefined;\n /** 0.0–1.0 confidence. Low-confidence entries are injected less often. */\n confidence?: number | undefined;\n /** ISO timestamp of last access (read or injection into context). */\n lastAccessed?: string | undefined;\n}\n\n// ── Memory events — emitted by DefaultMemoryStore so plugins can react ──\n\nexport interface MemoryRememberedPayload {\n scope: MemoryScope;\n text: string;\n ts: string;\n type?: MemoryType | undefined;\n tags?: string[] | undefined;\n priority?: MemoryPriority | undefined;\n}\n\nexport interface MemoryForgottenPayload {\n scope: MemoryScope;\n query: string;\n removed: number;\n}\n\nexport interface MemoryClearedPayload {\n /** Scope that was cleared, or undefined when all scopes were cleared. */\n scope?: MemoryScope | undefined;\n}\n\nexport interface MemoryConsolidatedPayload {\n scope: MemoryScope;\n /** Entries removed by deduplication. */\n removed: number;\n}\n\n// ── Relevance scoring ──────────────────────────────────────────────────\n\n/**\n * Context used to score memory relevance for context injection.\n * Passed by the system prompt builder.\n */\nexport interface MemoryRelevanceContext {\n /** Current user message or task description. */\n currentTask: string;\n /** Active skills in this session (e.g. [\"typescript-strict\", \"git-flow\"]). */\n activeSkills?: string[] | undefined;\n /** Active mode (e.g. \"Teach\", \"Brief\", \"Code Reviewer\"). */\n activeMode?: string | undefined;\n /** Available tools — memories referencing relevant tools score higher. */\n toolNames?: string[] | undefined;\n}\n\nexport interface ScoredEntry extends MemoryEntry {\n score: number;\n matchReason: string;\n}\n\n// ── Store interface ────────────────────────────────────────────────────\n\nexport interface MemoryStore {\n readAll(): Promise<string>;\n read(scope: MemoryScope): Promise<string>;\n remember(text: string, scope?: MemoryScope, metadata?: Omit<Partial<MemoryEntry>, 'scope' | 'text' | 'ts'>): Promise<void>;\n forget(query: string, scope?: MemoryScope): Promise<number>;\n consolidate(scope: MemoryScope): Promise<void>;\n clear(scope?: MemoryScope): Promise<void>;\n /** List entries, newest first. */\n list(scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /** Search by content (substring or semantic). */\n search(query: string, scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /** Access the backend for advanced queries. */\n getBackend?(): unknown;\n /** Graph-based related memory traversal. */\n findRelated?(text: string, scope?: MemoryScope, limit?: number): Promise<MemoryEntry[]>;\n /**\n * Score and rank memories by relevance to the current context.\n * Returns only entries that meet a relevance threshold.\n */\n scoreRelevant?(ctx: MemoryRelevanceContext, scope?: MemoryScope, limit?: number): Promise<ScoredEntry[]>;\n /**\n * Attach a trace ID to this store so that all subsequent `storage.*`\n * events include it for observability correlation. Mutates the store\n * in place and returns the same instance (convenience chaining).\n */\n withTraceId(traceId: string): MemoryStore;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateMessageTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\n// ── Pre-compiled regexes for scoreMessage ─────────────────────────────\n// These were previously declared inline as literal expressions inside\n// `scoreMessage`, which means a fresh RegExp object was compiled on every\n// call. With ~50k messages in a long agent run, that's a lot of wasted\n// work. Hoisting them to module scope means the regex engine compiles\n// them exactly once at module load.\n\n// Repeated-failure detection (used twice in scoreMessage — once for the\n// boolean match, once to extract the error key).\nconst FAILURE_PATTERN = /(error|fail|exception|timeout|enonet|eacces|eperm|enoent|abort)/i;\n\n// User corrections / stop signals.\nconst CORRECTION_PATTERN = /\\b(wrong|no\\b|stop\\b|don'?t\\b|actually|fix that|undo|revert|forget|ignore|skip)\\b/i;\n\n// Error / exception / crash language.\nconst ERROR_LANG_PATTERN = /\\b(error|exception|fatal|critical|crash|panic|abort|segfault|core dump|undefined is not|null pointer|typeerror|referenceerror|syntaxerror)\\b/i;\n\n// Security findings.\nconst SECURITY_PATTERN = /\\b(security|vulnerability|injection|xss|csrf|secret|apikey|api.key|hardcoded|leak|exploit|cve)\\b/i;\n\n// Architecture / design decisions.\nconst ARCHITECTURE_PATTERN = /\\b(architecture|design|approach|strategy|pattern|refactor|migrate|restructure|decision|trade.?off)\\b/i;\n\n// Grep / list / tree output markers (low-priority boilerplate).\nconst BOILERPLATE_PATTERN = /\\b(files_with_matches|count|found \\d+ match|directory tree|\\.\\.\\. and \\d+ more)\\b/i;\n\n// Path hint extraction — used inside firstErrorLine path summaries.\nconst PATH_HINT_PATTERN = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\nconst PATH_BACKSLASH_PATTERN = /\\\\/g;\nconst PATH_TRIM_PATTERN = /^[\"'`]+|[\"'`),;:]+$/g;\n\n// Error line detection — first non-blank line whose text matches the\n// set of words that indicate something went wrong.\nconst ERROR_LINE_PATTERN = /\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm)\\b/i;\nconst NEWLINE_SPLIT_PATTERN = /\\r?\\n/;\nconst WHITESPACE_COLLAPSE_PATTERN = /\\s+/g;\n\n/**\n * Instrumentation state for compaction hot-path analysis.\n * Tracks actual vs. nominal iteration counts to detect O(n·m) blowup.\n *\n * Logged as structured events so they can be aggregated from session JSONL\n * and plotted per-message-count to catch regressions before they ship.\n */\ninterface CompactionMetrics {\n /** Total messages in the compaction pass. */\n messageCount: number;\n /** Index where the preserved window starts (from findPreserveStart). */\n preserveStart: number;\n /** Outer-loop iterations in the elision fast-path scan. */\n fastPathIterations: number;\n /**\n * Inner-loop block iterations in the fast-path scan.\n * Ratio fastPathInner / fastPathIterations indicates avg blocks per message.\n */\n fastPathInnerIterations: number;\n /**\n * Outer-loop iterations in the full elision pass.\n * A targeted pass starts at the first oversized old tool block and stops at\n * the preserve boundary, so this should stay well below messageCount when\n * the fast-path hit is late in the old window.\n */\n fullPassIterations: number;\n /**\n * Inner-loop block iterations in the full elision pass.\n * Ratio fullPassInner / fullPassIterations indicates avg blocks per message.\n */\n fullPassInnerIterations: number;\n /** Estimated tokens saved by the elision pass. */\n tokensSaved: number;\n /** Whether the full elision pass made any changes. */\n changed: boolean;\n}\n\n/**\n * Whether compaction instrumentation should be emitted to stdout.\n * Gated behind WRONGSTACK_DEBUG=1 or NODE_ENV=development so the hot path\n * does not pay for JSON.stringify + console.log on every compaction pass\n * in production. Matches the guard at the ratio-guard site (line ~281).\n */\nfunction compactionDebugEnabled(): boolean {\n return process.env['NODE_ENV'] === 'development' || process.env['WRONGSTACK_DEBUG'] === '1';\n}\n\n/** Emit compaction instrumentation as a structured log event (debug-only). */\nfunction emitCompactionMetrics(event: string, metrics: CompactionMetrics): void {\n if (!compactionDebugEnabled()) return;\n console.log(\n JSON.stringify({\n level: 'debug',\n event,\n messageCount: metrics.messageCount,\n preserveStart: metrics.preserveStart,\n fastPathIterations: metrics.fastPathIterations,\n fastPathInnerIterations: metrics.fastPathInnerIterations,\n // Ratios — anything > 2.0 indicates the inner loop is running more than expected\n fastPathInnerPerOuter:\n metrics.fastPathIterations > 0\n ? metrics.fastPathInnerIterations / metrics.fastPathIterations\n : 0,\n fullPassIterations: metrics.fullPassIterations,\n fullPassInnerIterations: metrics.fullPassInnerIterations,\n fullPassInnerPerOuter:\n metrics.fullPassIterations > 0\n ? metrics.fullPassInnerIterations / metrics.fullPassIterations\n : 0,\n tokensSaved: metrics.tokensSaved,\n changed: metrics.changed,\n }),\n );\n}\n\n/**\n * Token estimate for a message array (text + tool I/O). Re-exported from the\n * canonical `token-estimate` helper so compactors and the context-pressure\n * monitor share one number.\n */\nexport const estimateMessages = estimateMessageTokens;\n\n/**\n * Shared, pure compaction primitives.\n *\n * Before this module the three compactors (`HybridCompactor`,\n * `IntelligentCompactor`, `SelectiveCompactor`) each carried their own copies\n * of message-token estimation, tool-result elision, text detection and digest\n * rendering — with subtle divergences (notably Selective lacked the\n * tool_use/tool_result pair preservation, so it could elide the result of a\n * tool call it was supposed to keep). These helpers are the single source of\n * truth. They operate on plain `Message[]` and never touch `Context`/state, so\n * each compactor keeps its own `ctx.state.replaceMessages(...)` plumbing.\n */\n\n/** Does this message carry any non-empty text? */\nexport function hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n}\n\n/**\n * Index where the preserved (recent) window starts. Walks back counting\n * user/assistant messages until `preserveK` are covered, then walks forward to\n * keep any tool_use/tool_result protocol pair intact — so a tool_result whose\n * tool_use is preserved is never elided.\n *\n * Instrumentation: emits `compaction.find_preserve_start.ended` with the\n * repair-loop block count so we can track whether protocol-pair repair is\n * scanning too much content.\n */\nexport function findPreserveStart(messages: readonly Message[], preserveK: number): number {\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // If the preserved window starts on a user tool_result, widen backward to\n // include the immediately preceding assistant tool_use. This keeps provider\n // protocol adjacency intact and avoids orphaned results after compaction.\n let pairRepairIterations = 0;\n let pairRepairInnerIterations = 0;\n while (preserveStart > 0) {\n pairRepairIterations++;\n const first = messages[preserveStart];\n const prev = messages[preserveStart - 1];\n if (!first || !prev || first.role !== 'user' || prev.role !== 'assistant') break;\n if (typeof first.content === 'string' || typeof prev.content === 'string') break;\n const pairCheck = hasMatchingToolPair(first.content, prev.content);\n pairRepairInnerIterations += pairCheck.iterations;\n if (!pairCheck.matched) break;\n preserveStart--;\n }\n\n if (compactionDebugEnabled()) {\n console.log(\n JSON.stringify({\n level: 'debug',\n event: 'compaction.find_preserve_start.ended',\n messageCount: messages.length,\n preserveK,\n preserveStart,\n pairRepairIterations,\n pairRepairInnerIterations,\n pairRepairInnerPerOuter:\n pairRepairIterations > 0 ? pairRepairInnerIterations / pairRepairIterations : 0,\n }),\n );\n }\n\n return preserveStart;\n}\n\nfunction hasMatchingToolPair(\n resultContent: readonly ContentBlock[],\n useContent: readonly ContentBlock[],\n): { matched: boolean; iterations: number } {\n let iterations = 0;\n let firstResultId: string | undefined;\n let resultIds: Set<string> | undefined;\n\n for (const block of resultContent) {\n iterations++;\n if (block.type !== 'tool_result') continue;\n if (firstResultId === undefined) {\n firstResultId = block.tool_use_id;\n } else {\n resultIds ??= new Set([firstResultId]);\n resultIds.add(block.tool_use_id);\n }\n }\n if (firstResultId === undefined) return { matched: false, iterations };\n\n for (const block of useContent) {\n iterations++;\n if (block.type !== 'tool_use') continue;\n if (resultIds ? resultIds.has(block.id) : block.id === firstResultId) {\n return { matched: true, iterations };\n }\n }\n\n return { matched: false, iterations };\n}\n\nexport interface EliseResult {\n /** New message array, or the same reference when nothing changed. */\n messages: Message[];\n /** Estimated tokens reclaimed. */\n saved: number;\n changed: boolean;\n}\n\n/**\n * Elide oversized tool I/O that falls before the preserve window. Pure:\n * returns a fresh array (or the same reference when unchanged). Replaces the\n * duplicate copies that lived in all three compactors.\n */\nexport function eliseOldToolResults(\n messages: readonly Message[],\n opts: { preserveK: number; eliseThreshold: number },\n): EliseResult {\n const preserveStart = findPreserveStart(messages, opts.preserveK);\n\n // ── Fast path: probe for oversized tool I/O ─────────────────────────────\n //\n // Instruments the ratio of actual iterations to message count so we can\n // detect whether the inner block-scan loop is O(n·m) as expected or has\n // regressed to quadratic behaviour.\n let hasOversized = false;\n let firstOversizedIndex = -1;\n let fastPathIterations = 0;\n let fastPathInnerIterations = 0;\n for (let i = 0; i < preserveStart && !hasOversized; i++) {\n fastPathIterations++;\n const msg = messages[i];\n if (!msg || !Array.isArray(msg.content)) continue;\n for (const b of msg.content) {\n fastPathInnerIterations++;\n const oversized =\n (b.type === 'tool_result' && estimateToolResultTokens(b.content) >= opts.eliseThreshold) ||\n (b.type === 'tool_use' && estimateToolInputTokens(b.input) >= opts.eliseThreshold);\n if (oversized) {\n hasOversized = true;\n firstOversizedIndex = i;\n break;\n }\n }\n }\n\n // ── Emit fast-path metrics (covers both fast-path hit and the early-exit) ──\n emitCompactionMetrics(\n hasOversized\n ? 'compaction.elision.fast_path.oversized_found'\n : 'compaction.elision.fast_path.no_oversized',\n {\n messageCount: messages.length,\n preserveStart,\n fastPathIterations,\n fastPathInnerIterations,\n fullPassIterations: 0,\n fullPassInnerIterations: 0,\n tokensSaved: 0,\n changed: false,\n },\n );\n\n if (!hasOversized) return { messages: messages as Message[], saved: 0, changed: false };\n\n // ── Targeted elision pass ────────────────────────────────────────────────\n //\n // The fast path already proved that every message before firstOversizedIndex\n // is below threshold, and preserveStart caps the old window. Only scan that\n // narrowed range, and only clone the message array/content array when an\n // actual replacement is made.\n let saved = 0;\n let changed = false;\n let fullPassIterations = 0;\n let fullPassInnerIterations = 0;\n let next: Message[] | undefined;\n for (let i = firstOversizedIndex; i < preserveStart; i++) {\n fullPassIterations++;\n const msg = messages[i];\n if (!msg || !Array.isArray(msg.content)) continue;\n const original = msg.content;\n let newContent: ContentBlock[] | undefined;\n for (let idx = 0; idx < original.length; idx++) {\n fullPassInnerIterations++;\n const b = original[idx];\n if (!b) continue;\n if (b.type === 'tool_use') {\n const tokens = estimateToolInputTokens(b.input);\n if (tokens < opts.eliseThreshold) continue;\n const elidedInput = summarizeToolUseInputElision(b, tokens);\n saved += Math.max(0, tokens - estimateToolInputTokens(elidedInput));\n newContent ??= original.slice();\n newContent[idx] = { ...b, input: elidedInput };\n continue;\n }\n\n if (b.type !== 'tool_result') continue;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < opts.eliseThreshold) continue;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: summarizeToolResultElision(b, tokens),\n is_error: b.is_error,\n };\n newContent ??= original.slice();\n newContent[idx] = elided;\n }\n if (newContent) {\n next ??= messages.slice() as Message[];\n next[i] = { ...msg, content: newContent };\n changed = true;\n }\n\n // ── Ratio guard: defensive assertion + conditional early-break ─────────\n //\n // Defensive assertion (threshold 10): fires in dev/debug if the inner loop\n // is running more than 10x what we'd expect per message. This catches\n // pathological regressions where a single message has hundreds of blocks.\n if (compactionDebugEnabled()) {\n const ratio = fullPassInnerIterations / fullPassIterations;\n\n if (ratio > 10) {\n // Defensive assertion: never expected in practice\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'compaction.elision.regression',\n message: `fullPassInnerPerOuter=${ratio.toFixed(2)} exceeds threshold 10 — possible O(n·m) regression`,\n messageCount: messages.length,\n fullPassIterations,\n fullPassInnerIterations,\n }),\n );\n }\n }\n }\n\n emitCompactionMetrics('compaction.elision.full_pass.ended', {\n messageCount: messages.length,\n preserveStart,\n fastPathIterations,\n fastPathInnerIterations,\n fullPassIterations,\n fullPassInnerIterations,\n tokensSaved: saved,\n changed,\n });\n\n return { messages: changed && next ? next : (messages as Message[]), saved, changed };\n}\n\nfunction summarizeToolUseInputElision(\n block: ToolUseBlock,\n tokens: number,\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(block.input ?? {})) {\n fields[key] = summarizeToolUseInputValue(value);\n }\n\n return {\n __elided_tool_input: `~${tokens} tokens; original arguments are in the session log`,\n tool: block.name,\n fields,\n };\n}\n\nfunction summarizeToolUseInputValue(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const oneLine = value.replace(/\\s+/g, ' ').trim();\n return oneLine.length <= 160 ? oneLine : `${oneLine.slice(0, 120)}...(${oneLine.length} chars)`;\n }\n if (Array.isArray(value)) {\n return `[array:${value.length}]`;\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n return `[object:${keys.slice(0, 8).join(',')}${keys.length > 8 ? ',...' : ''}]`;\n }\n return String(value);\n}\n\nfunction summarizeToolResultElision(block: ToolResultBlock, tokens: number): string {\n const parts = [`elided: ~${tokens} tokens`];\n if (block.name) parts.push(`tool=${block.name}`);\n const files = extractPathHints(block.content).slice(0, 5);\n if (files.length > 0) parts.push(`files=${files.join(', ')}`);\n const error = firstErrorLine(block.content);\n if (error) parts.push(`error=${error}`);\n return `[${parts.join('; ')}]`;\n}\n\nfunction extractPathHints(content: unknown): string[] {\n const text = typeof content === 'string' ? content : JSON.stringify(content);\n const out = new Set<string>();\n for (const match of text.matchAll(PATH_HINT_PATTERN)) {\n const clean = match[0]?.replace(PATH_BACKSLASH_PATTERN, '/').replace(PATH_TRIM_PATTERN, '');\n if (clean && clean.length <= 220) out.add(clean);\n if (out.size >= 5) break;\n }\n return [...out];\n}\n\nfunction firstErrorLine(content: unknown): string | undefined {\n const text = typeof content === 'string' ? content : JSON.stringify(content);\n for (const line of text.split(NEWLINE_SPLIT_PATTERN)) {\n if (!ERROR_LINE_PATTERN.test(line)) continue;\n const trimmed = line.replace(WHITESPACE_COLLAPSE_PATTERN, ' ').trim();\n if (trimmed) return trimmed.slice(0, 180);\n }\n return undefined;\n}\n\n/**\n * Lossless textual digest of a message range. Every text block is kept verbatim\n * (across all roles, so prior `system` digests fold forward and nothing\n * accumulates as loss). `tool_use` / `tool_result` blocks are counted and\n * replaced with a marker rather than serialized — their payload is already\n * persisted in the session log. Empty/tool-only messages are skipped.\n */\nexport function buildLosslessDigest(messages: readonly Message[]): string {\n const lines: string[] = [];\n for (const m of messages) {\n let text: string;\n let omitted = 0;\n if (typeof m.content === 'string') {\n text = m.content;\n } else {\n const parts: string[] = [];\n for (const b of m.content) {\n if (isTextBlock(b)) parts.push(b.text);\n else if (b.type === 'tool_use' || b.type === 'tool_result') omitted++;\n }\n text = parts.join(' ');\n }\n if (text.trim().length === 0 && omitted === 0) continue;\n const marker = omitted > 0 ? ` [${omitted} tool call(s) omitted — see session log]` : '';\n lines.push(`[${m.role}]: ${text}${marker}`);\n }\n return lines.join('\\n');\n}\n\n// ── Content-aware scoring ─────────────────────────────────────────────────\n\n/** Importance score for a message — drives retention vs. summarization. */\nexport type ContentScore = 0 | 1 | 2 | 3 | 4 | 5;\n// 5 = critical (error, correction, decision) — keep verbatim\n// 3 = medium (normal exchange, successful tool) — keep first sentence\n// 1 = low (large tool result, grep output) — one-line summary\n// 0 = noise (repeated failure pattern) — collapse to count\n\n/**\n * Extract the plain text from a message (ignoring tool blocks).\n * Returns empty string if no text content exists.\n */\nexport function extractText(m: Message): string {\n if (typeof m.content === 'string') return m.content;\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n}\n\n/** Check if a message contains a tool_use block. */\nexport function hasToolUse(m: Message): boolean {\n if (typeof m.content === 'string') return false;\n return m.content.some((b) => b.type === 'tool_use');\n}\n\n/** Check if a message contains a tool_result block over the given char threshold. */\nexport function hasLargeToolResult(m: Message, threshold = 3000): boolean {\n if (typeof m.content === 'string') return false;\n return m.content.some(\n (b) =>\n b.type === 'tool_result' &&\n (b as ToolResultBlock).content &&\n (typeof (b as ToolResultBlock).content === 'string'\n ? (b as ToolResultBlock).content.length\n : JSON.stringify((b as ToolResultBlock).content).length) > threshold,\n );\n}\n\n/**\n * Score a message by content importance.\n *\n * CRITICAL (5): user corrections, explicit \"no/wrong/stop\", error messages,\n * architecture decisions, security findings.\n * MEDIUM (3): normal exchanges, successful tool calls, file reads, edits.\n * LOW (1): large tool results (>3K chars), grep/file-list outputs, boilerplate.\n * NOISE (0): repeated identical failures (same tool, same error, 5th+ occurrence\n * within the range), pure tool I/O with no text.\n */\nexport function scoreMessage(\n m: Message,\n context?: { failureCounts?: Map<string, number> },\n): ContentScore {\n const text = extractText(m).toLowerCase();\n\n // ── Noise detection: pure tool I/O with no text ─────────────────────\n if (text.trim().length === 0 && (hasToolUse(m) || typeof m.content !== 'string')) {\n const hasResult =\n typeof m.content !== 'string' && m.content.some((b) => b.type === 'tool_result');\n if (hasToolUse(m) || hasResult) return 0;\n }\n\n // ── Repeated failure detection ─────────────────────────────────────\n if (context?.failureCounts && m.role === 'user' && hasToolUse(m) === false) {\n // Check if this is a tool_result that matches a failure pattern\n const failureMatch = FAILURE_PATTERN.exec(text);\n if (failureMatch) {\n // Build a key from the error type. Reuse the match result from\n // the boolean test above to avoid scanning the text twice.\n const errKey = failureMatch[0]?.toLowerCase() ?? 'error';\n const count = (context.failureCounts.get(errKey) ?? 0) + 1;\n context.failureCounts.set(errKey, count);\n if (count >= 5) return 0; // 5th+ identical failure → noise\n if (count >= 3) return 1; // 3rd-4th → low priority\n }\n }\n\n // ── Critical: user corrections / stop signals ──────────────────────\n if (m.role === 'user') {\n if (CORRECTION_PATTERN.test(text)) {\n return 5;\n }\n }\n\n // ── Critical: error / exception messages ───────────────────────────\n if (ERROR_LANG_PATTERN.test(text)) {\n return 5;\n }\n\n // ── Critical: security findings ────────────────────────────────────\n if (SECURITY_PATTERN.test(text)) {\n return 5;\n }\n\n // ── Critical: architecture / design decisions ──────────────────────\n if (m.role === 'assistant' && ARCHITECTURE_PATTERN.test(text)) {\n return 5;\n }\n\n // ── Low: large tool results ────────────────────────────────────────\n if (hasLargeToolResult(m)) return 1;\n\n // ── Low: grep / list / tree outputs ────────────────────────────────\n if (\n m.role === 'user' &&\n !hasToolUse(m) &&\n BOILERPLATE_PATTERN.test(text)\n ) {\n return 1;\n }\n\n // ── Default: medium ────────────────────────────────────────────────\n return 3;\n}\n\n/**\n * Build a content-aware digest of messages.\n *\n * Unlike `buildLosslessDigest` which preserves all text equally, this uses\n * `scoreMessage` to apply tiered treatment:\n * - Score 5 (critical): verbatim text\n * - Score 3 (medium): first sentence only\n * - Score 1 (low): one-line summary\n * - Score 0 (noise): collapsed to count marker\n */\nexport function buildSmartDigest(messages: readonly Message[]): string {\n const lines: string[] = [];\n const failureCounts = new Map<string, number>();\n let noiseCount = 0;\n\n for (const m of messages) {\n // Noise early-bail: a message with no text AND no tool_use block is\n // pure tool I/O (only tool_result blocks). scoreMessage would return 0\n // for it after a full scan, so skip the regex suite entirely. This is\n // the dominant case in long sessions — repeated tool I/O often\n // accounts for >50% of message count.\n const isPureToolIO =\n Array.isArray(m.content) && m.content.length > 0 && !hasToolUse(m) && m.content.every((b) => b.type === 'tool_result');\n if (isPureToolIO) {\n noiseCount++;\n continue;\n }\n\n const score = scoreMessage(m, { failureCounts });\n const text = extractText(m);\n const toolCount = countToolBlocks(m);\n\n if (score === 0) {\n noiseCount++;\n continue;\n }\n\n const marker = toolCount > 0 ? ` [${toolCount} tool call(s)]` : '';\n let display: string;\n\n switch (score) {\n case 5: // Critical — keep verbatim\n display = text.trim();\n break;\n case 3: // Medium — first sentence\n display = firstSentence(text);\n break;\n case 1: // Low — one-line summary\n display = oneLineSummary(m, text);\n break;\n default:\n display = firstSentence(text);\n }\n\n if (display.length === 0 && toolCount === 0) continue;\n lines.push(`[${m.role}]: ${display}${marker}`);\n }\n\n if (noiseCount > 0) {\n lines.push(\n `[system]: ${noiseCount} low-importance turn(s) collapsed (repeated failures / pure tool I/O)`,\n );\n }\n\n return lines.join('\\n');\n}\n\nfunction countToolBlocks(m: Message): number {\n if (typeof m.content === 'string') return 0;\n return m.content.filter((b) => b.type === 'tool_use' || b.type === 'tool_result').length;\n}\n\nfunction firstSentence(text: string): string {\n const trimmed = text.trim();\n if (trimmed.length === 0) return '';\n const dot = trimmed.indexOf('. ');\n if (dot === -1) return trimmed.length > 150 ? `${trimmed.slice(0, 147)}…` : trimmed;\n const sentence = trimmed.slice(0, dot + 1);\n return sentence.length > 150 ? `${sentence.slice(0, 147)}…` : sentence;\n}\n\nfunction oneLineSummary(m: Message, text: string): string {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n // Pure tool result with no text\n if (typeof m.content !== 'string') {\n const results = m.content.filter((b) => b.type === 'tool_result');\n if (results.length > 0) {\n return `[${results.length} tool result(s) — see session log]`;\n }\n }\n return '[no text content]';\n }\n // Truncate to one line (~100 chars)\n const firstLine = trimmed.split('\\n')[0] ?? '';\n return firstLine.length > 100 ? `${firstLine.slice(0, 97)}…` : firstLine;\n}\n\n/**\n * Nearest safe cut boundary in [from, to]: the start of the exchange of the\n * closest user-with-text message. Returns -1 when no such boundary exists.\n */\nexport function findSafeBoundary(messages: readonly Message[], from: number, to: number): number {\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n return findExchangeStart(messages, i);\n }\n }\n return -1;\n}\n\n/**\n * Walk backwards from a user message to find where its logical exchange began\n * (just after the last assistant message that made no tool calls).\n */\nexport function findExchangeStart(messages: readonly Message[], userIndex: number): number {\n for (let i = userIndex - 1; i >= 0; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'assistant') {\n const hasToolUse = Array.isArray(m.content)\n ? m.content.some((b) => b.type === 'tool_use')\n : false;\n if (!hasToolUse) return i + 1;\n } else if (m.role === 'user') {\n return i;\n }\n }\n return 0;\n}\n","import type { Context } from '../core/context.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport { estimateRequestTokens } from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\nimport { buildContextEvidenceDigest } from '../utils/context-evidence.js';\nimport {\n buildLosslessDigest,\n buildSmartDigest,\n eliseOldToolResults,\n estimateMessages,\n hasTextContent,\n} from './compaction-core.js';\n\nexport interface CompactorOptions {\n preserveK?: number | undefined;\n eliseThreshold?: number | undefined;\n /**\n * Enable content-aware digest mode. When true, `collapseAncientTurns` uses\n * `buildSmartDigest` which scores messages by importance: critical content\n * (errors, corrections, decisions) is kept verbatim; normal exchanges get\n * first-sentence summaries; large tool outputs and repeated failures are\n * aggressively compressed. Defaults to false (lossless digest).\n */\n smart?: boolean | undefined;\n /**\n * @deprecated Ignored. Token estimation is centralized in\n * `compaction-core`/`token-estimate` so all compactors and the context-pressure\n * monitor agree on one number. Kept only for backward-compatible call sites.\n */\n estimator?: (((text: string) => number)) | undefined;\n}\n\n/**\n * Default tools config values shared across CLI and WebUI.\n * Import this instead of hardcoding to avoid cross-surface inconsistencies.\n * These mirror the values in BEHAVIOR_DEFAULTS (config-loader.ts).\n *\n * @deprecated Import from '../types/default-config.js' instead.\n * This re-export exists for backward compatibility.\n */\nexport { DEFAULT_TOOLS_CONFIG, DEFAULT_CONTEXT_CONFIG, DEFAULT_AUTONOMY_CONFIG } from '../types/default-config.js';\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly smart: boolean;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.smart = opts.smart ?? false;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean | undefined } = {}): Promise<CompactReport> {\n const beforeTokens = estimateMessages(ctx.messages);\n const beforeFull = this.estimateFullRequest(ctx);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision (shared core handles tool_use/tool_result pair preservation).\n const elide = eliseOldToolResults(ctx.messages, { preserveK, eliseThreshold });\n if (elide.changed) ctx.state.replaceMessages(elide.messages);\n if (elide.saved > 0) reductions.push({ phase: 'elision', saved: elide.saved });\n\n // Phase 2: lossless collapse of ancient turns into a single digest.\n // Preserves ALL textual content (instructions, decisions, conclusions);\n // only raw tool I/O is dropped (it remains in the session log). No sub-LLM call.\n let collapsedDigest: string | undefined;\n let evidenceDigest: string | undefined;\n if (opts.aggressive) {\n const phase2 = this.collapseAncientTurns(ctx, preserveK);\n if (phase2.saved > 0) reductions.push({ phase: 'summary', saved: phase2.saved });\n collapsedDigest = phase2.digest;\n evidenceDigest = phase2.evidenceDigest;\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = estimateMessages(ctx.messages);\n const afterFull = this.estimateFullRequest(ctx);\n const quality = checkCompactionQuality(ctx, {\n collapsedDigest,\n evidenceDigest,\n reduced: beforeTokens > afterTokens || beforeFull > afterFull,\n });\n return {\n before: beforeTokens,\n after: afterTokens,\n fullRequestTokensBefore: beforeFull,\n fullRequestTokensAfter: afterFull,\n reductions,\n collapsedDigest,\n evidenceDigest,\n quality,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n /**\n * Estimate the full API request token count: messages + systemPrompt + toolDefs.\n * This is the accurate figure for context-window pressure monitoring.\n */\n private estimateFullRequest(ctx: Context): number {\n return estimateRequestTokens(ctx.messages, ctx.systemPrompt, ctx.tools ?? []).total;\n }\n\n /**\n * Lossless rule-based collapse of ancient turns into a single digest message.\n *\n * Preserves ALL textual content of the collapsed range — user instructions,\n * assistant decisions/conclusions, and any prior digests (chained forward so\n * the digest stays lossless across repeated compactions). Only `tool_use` /\n * `tool_result` protocol blocks are dropped and replaced with a count marker;\n * their full payload already lives in the session log. No sub-LLM call.\n *\n * Returns the token savings and the digest text (for audit logging).\n */\n private collapseAncientTurns(\n ctx: Context,\n preserveK = this.preserveK,\n ): { saved: number; digest?: string | undefined; evidenceDigest?: string | undefined } {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - preserveK * 2);\n if (cutTarget <= 0) return { saved: 0 };\n\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget.\n let boundary = -1;\n for (let i = cutTarget; i < messages.length; i++) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n if (boundary <= 0) return { saved: 0 };\n\n const removed = messages.slice(0, boundary);\n const removedTokens = estimateMessages(removed);\n\n const historyDigest =\n this.smart\n ? buildSmartDigest(removed) ||\n `${removed.length} earlier turns (no textual content; tool I/O omitted; see session log)`\n : buildLosslessDigest(removed) ||\n `${removed.length} earlier turns (no textual content; tool I/O omitted; see session log)`;\n\n const evidenceDigest = buildContextEvidenceDigest(ctx);\n const digest = evidenceDigest\n ? `[context_state]\\n${evidenceDigest}\\n\\n[prior_history]\\n${historyDigest}`\n : historyDigest;\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_digest: ${digest}]`,\n };\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n return {\n saved: Math.max(0, removedTokens - estimateMessages([summaryMsg])),\n digest,\n evidenceDigest: evidenceDigest || undefined,\n };\n }\n}\n\nfunction checkCompactionQuality(\n ctx: Context,\n opts: {\n collapsedDigest?: string | undefined;\n evidenceDigest?: string | undefined;\n reduced: boolean;\n },\n): CompactReport['quality'] {\n const evidence = ctx.contextEvidence;\n const digest = `${opts.collapsedDigest ?? ''}\\n${opts.evidenceDigest ?? ''}`;\n const hasIntent = Boolean(evidence?.currentIntent?.text || /\\b(intent|goal|session_goals)\\b/i.test(digest));\n const hasPathTrail = Boolean(\n Object.keys(evidence?.fileGraph ?? {}).length > 0 ||\n (evidence?.toolCalls.length ?? 0) > 0 ||\n /\\b(dependency_graph|tool_trail|files=)\\b/i.test(digest),\n );\n const issues: string[] = [];\n if (opts.reduced && !hasIntent) issues.push('missing intent anchor');\n if (opts.reduced && !hasPathTrail) issues.push('missing tool/path trail');\n return {\n ok: issues.length === 0,\n hasIntent,\n hasPathTrail,\n issues,\n };\n}\n\nfunction readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n // Use AGENTS.md, not the bare .wrongstack directory. A bare .wrongstack/\n // directory can be the global config directory (~/.wrongstack), which is\n // NOT a project marker. Only .wrongstack/AGENTS.md signals a real\n // WrongStack project.\n '.wrongstack/AGENTS.md',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n const home = path.resolve(os.homedir());\n const startPath = path.resolve(start);\n while (dir !== root) {\n // Don't walk past the user home directory. Home often has stray\n // markers (.git for dotfile tracking, package.json from global\n // tooling) that are unrelated to the actual working directory.\n // When cwd IS home we still check markers there — this guard\n // only fires during the upward walk from a subdirectory.\n if (dir === home && dir !== startPath) {\n break;\n }\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return startPath;\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath) ? path.basename(absPath) : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string | undefined; projectRoot?: string | undefined }).fullPath = absPath;\n (err as Error & { fullPath?: string | undefined; projectRoot?: string | undefined }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","/**\n * Shared regex patterns used across execution and security-scanner.\n * Centralized here to avoid duplication and keep patterns in sync.\n */\n\n/** Matches Node.js ECONN* errors and fetch failure messages. */\nexport const NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { Config } from '../types/config.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor | undefined;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens|exceeds the context window|context window/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor | undefined;\n modelsRegistry?: ModelsRegistry | undefined;\n getConfig?: (() => Config) | undefined;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !isContextOverflowError(err)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n // 429 is intentionally NOT handled here: the rate_limit_backoff\n // strategy above always returns a decision for 429, so this strategy\n // is never reached for it. Downgrade applies to overload (529) and\n // generic 5xx server errors only.\n if (err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const visibleModels = opts?.getConfig?.().providers?.[providerId]?.models;\n const candidates = provider.models.filter((m) => {\n if (visibleModels !== undefined && !visibleModels.includes(m.id)) return false;\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image'))\n return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n // Pick the cheapest candidate. Treat a missing input cost as\n // +Infinity (most expensive) — matching the filter above, which\n // already excludes undefined-cost models — so the sentinel stays\n // consistent if the filter is ever loosened.\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? Number.POSITIVE_INFINITY) <\n (prev.cost?.input ?? Number.POSITIVE_INFINITY)\n ? curr\n : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nfunction isContextOverflowError(err: ProviderError): boolean {\n return CONTEXT_OVERFLOW_RE.test([\n err.message,\n err.body?.message,\n err.body?.type,\n err.body?.raw,\n ].filter(Boolean).join('\\n'));\n}\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n // AbortError can be thrown in both browser (DOMException) and Node (Error).\n // Guard with typeof check so Node builds don't reference the browser-only DOMException.\n if (\n typeof DOMException !== 'undefined' &&\n err instanceof DOMException &&\n err.name === 'AbortError'\n ) {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || isContextOverflowError(err)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}\n","import { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status === 599) return 5; // stream hang — transient, worth retrying aggressively\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","/**\n * Prompt library types — the canonical home for the prompt data model and the\n * loader/registry contracts. Has no internal dependencies so both `storage/`\n * (the writable store) and `execution/` (the layered loader) can import it\n * without creating a cycle.\n */\n\n/** Provenance of a prompt — which layer it came from. */\nexport type PromptSource = 'builtin' | 'user' | 'project' | 'synced';\n\n/**\n * The fourteen first-party categories shipped with the builtin dataset, plus\n * the `uncategorized` sentinel used when migrating legacy v1 entries. Builtin\n * prompts MUST use one of these (enforced by the dataset schema test); user and\n * project prompts may use any free-form string.\n */\nexport const BUILTIN_PROMPT_CATEGORIES = [\n 'coding',\n 'debugging',\n 'refactoring',\n 'testing',\n 'code-review',\n 'architecture',\n 'devops',\n 'documentation',\n 'data-analysis',\n 'writing',\n 'research',\n 'product',\n 'agentic-workflows',\n 'meta-prompting',\n 'uncategorized',\n] as const;\n\nexport type BuiltinPromptCategory = (typeof BUILTIN_PROMPT_CATEGORIES)[number];\n\n/**\n * Human-readable labels for the builtin categories (for UI chips / pickers).\n */\nexport const PROMPT_CATEGORY_LABELS: Record<BuiltinPromptCategory, string> = {\n coding: 'Coding',\n debugging: 'Debugging',\n refactoring: 'Refactoring',\n testing: 'Testing',\n 'code-review': 'Code Review',\n architecture: 'Architecture',\n devops: 'DevOps',\n documentation: 'Documentation',\n 'data-analysis': 'Data Analysis',\n writing: 'Writing',\n research: 'Research',\n product: 'Product',\n 'agentic-workflows': 'Agentic Workflows',\n 'meta-prompting': 'Meta-Prompting',\n uncategorized: 'Uncategorized',\n};\n\n/**\n * A prompt's category. Typed as a free-form string because user/project prompts\n * may invent their own; the builtin dataset is constrained to\n * {@link BUILTIN_PROMPT_CATEGORIES} by its schema.\n */\nexport type PromptCategory = BuiltinPromptCategory | (string & {});\n\nexport function isBuiltinCategory(value: string): value is BuiltinPromptCategory {\n return (BUILTIN_PROMPT_CATEGORIES as readonly string[]).includes(value);\n}\n\n/** A `{{name}}` placeholder declared by a prompt. */\nexport interface PromptVariable {\n /** Placeholder name as it appears between `{{ }}` (case-sensitive). */\n name: string;\n description?: string | undefined;\n default?: string | undefined;\n required?: boolean | undefined;\n /**\n * Closed set of allowed values. When present, surfaces render a dropdown\n * instead of a free text field and a supplied value outside the set is\n * reported as invalid by {@link renderPrompt}.\n */\n enum?: string[] | undefined;\n /**\n * UI hint: the value is expected to span multiple lines (pasted code, a\n * diff, a long passage). Surfaces render a textarea instead of a one-line\n * input. Has no effect on rendering — purely presentational.\n */\n multiline?: boolean | undefined;\n}\n\n/**\n * A reusable prompt. v2 schema. Legacy v1 entries (only `id/title/content/tags/\n * createdAt/updatedAt`) are upgraded lazily on read by `migratePromptEntry`.\n */\nexport interface PromptEntry {\n /** Stable unique handle (ULID for new entries; legacy short hex tolerated). */\n id: string;\n /** kebab-case stable key — the dedup key across layers and registry key. */\n slug: string;\n title: string;\n /** One-line summary shown in lists/pickers. */\n description: string;\n content: string;\n category: PromptCategory;\n /** Secondary facets (free-form). */\n tags: string[];\n source: PromptSource;\n favorite: boolean;\n /** `{{placeholder}}` variables this prompt expects, if any. */\n variables?: PromptVariable[] | undefined;\n author?: string | undefined;\n version?: string | undefined;\n license?: string | undefined;\n /** sha256 of `content` — set for builtin/synced entries for integrity. */\n checksum?: string | undefined;\n /** When a builtin was copy-on-written into the user layer, its origin slug. */\n forkedFrom?: string | undefined;\n createdAt: string;\n updatedAt: string;\n}\n\n/** One category with its prompt count, for picker chips. */\nexport interface PromptCategoryCount {\n id: PromptCategory;\n label: string;\n count: number;\n}\n\nexport interface PromptSearchOptions {\n category?: PromptCategory | undefined;\n /** Max results (default: unbounded). */\n limit?: number | undefined;\n}\n\n/**\n * Read-side contract over the three prompt layers (project > user > builtin),\n * merged and de-duplicated by slug. Mirrors `SkillLoader` in shape.\n */\nexport interface PromptLoader {\n /** All prompts across layers, project/user shadowing builtin by slug. */\n list(): Promise<PromptEntry[]>;\n /** Resolve by slug first, then by id. */\n find(slugOrId: string): Promise<PromptEntry | undefined>;\n /** Ranked search over title/description/content/tags, optional category filter. */\n search(query: string, opts?: PromptSearchOptions): Promise<PromptEntry[]>;\n /** Category counts across all layers, for UI chips. */\n categories(): Promise<PromptCategoryCount[]>;\n /**\n * Persist into the writable (user, or project when `scope:'project'`) layer.\n * Throws if the resolved target is the read-only builtin layer.\n */\n save(entry: PromptEntry, opts?: { scope?: 'user' | 'project' }): Promise<void>;\n /** Delete from a writable layer. Returns false if not found / builtin. */\n delete(slugOrId: string): Promise<boolean>;\n /**\n * Mark/unmark a prompt as favorite. Favoriting a builtin copies it down into\n * the user layer (copy-on-write, `source:'user'`, `forkedFrom:<slug>`).\n */\n setFavorite(slugOrId: string, favorite: boolean): Promise<PromptEntry | undefined>;\n /** Clear the internal cache so the next read re-scans disk. */\n invalidateCache(): void;\n}\n\n/**\n * The packed builtin index (also the shape a remote registry manifest mirrors\n * — see `types/prompt-registry.ts`).\n */\nexport interface PromptManifest {\n datasetVersion: number;\n generatedAt: string;\n count: number;\n categories: PromptCategoryCount[];\n prompts: PromptManifestRef[];\n}\n\nexport interface PromptManifestRef {\n id: string;\n slug: string;\n title: string;\n description: string;\n category: PromptCategory;\n tags: string[];\n checksum: string;\n /** Relative path of the per-prompt file within the dataset. */\n file: string;\n}\n","/**\n * Prompt registry / sync types — the contract for a remote prompt hub\n * (e.g. prompts.wrongstack.com) and the local installed-prompts manifest.\n *\n * The manifest shape intentionally mirrors the bundled dataset's\n * `data/prompts/index.json` (see `PromptManifest` in `types/prompt.ts`): the\n * builtin dataset IS a local registry, so builtin and synced prompts can flow\n * through one validation + diff path. This file defines the format and the\n * structural validator; the actual fetch/download is a deliberately small stub\n * (see `prompts/prompt-installer.ts`) — \"groundwork now, sync later\".\n */\nimport type { PromptCategory } from './prompt.js';\n\nexport interface PromptRegistryRef {\n id: string;\n slug: string;\n title: string;\n description: string;\n category: PromptCategory;\n tags: string[];\n /** sha256 of the prompt content — drives the update diff. */\n checksum: string;\n version?: string | undefined;\n license?: string | undefined;\n /** Optional direct URL to the full prompt JSON. */\n url?: string | undefined;\n}\n\nexport interface PromptRegistryManifest {\n registryVersion: 1;\n /** Where this manifest came from (hub URL or `owner/repo`). */\n source: string;\n generatedAt: string;\n prompts: PromptRegistryRef[];\n}\n\n/** One entry recorded in `~/.wrongstack/installed-prompts.json`. */\nexport interface InstalledPromptEntry {\n slug: string;\n /** The registry/source this prompt was pulled from. */\n source: string;\n /** The ref pinned at install (tag/branch/commit or manifest version). */\n ref: string;\n checksum: string;\n /** True once the prompt body has actually been written locally. */\n synced: boolean;\n installedAt: string;\n}\n\nexport interface PromptManifestData {\n version: 1;\n entries: InstalledPromptEntry[];\n}\n\n/** Result of validating an untrusted manifest. */\nexport type ManifestValidation =\n | { ok: true; manifest: PromptRegistryManifest }\n | { ok: false; errors: string[] };\n\nconst SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CHECKSUM_RE = /^[a-f0-9]{64}$/;\nconst MAX_STR = 4096;\n\n/**\n * Structurally validate an untrusted registry manifest. Treats the manifest as\n * DATA, not instructions: enforces slug charset, checksum format, and field\n * lengths so a malicious hub can't smuggle oversized or malformed entries into\n * the local store. Does NOT fetch prompt bodies.\n */\nexport function validateRegistryManifest(raw: unknown): ManifestValidation {\n const errors: string[] = [];\n if (!raw || typeof raw !== 'object') return { ok: false, errors: ['manifest is not an object'] };\n const m = raw as Record<string, unknown>;\n\n if (m['registryVersion'] !== 1) errors.push('registryVersion must be 1');\n if (typeof m['source'] !== 'string' || !m['source'])\n errors.push('source must be a non-empty string');\n if (typeof m['generatedAt'] !== 'string') errors.push('generatedAt must be a string');\n if (!Array.isArray(m['prompts'])) {\n errors.push('prompts must be an array');\n return { ok: false, errors };\n }\n\n const seen = new Set<string>();\n const refs: PromptRegistryRef[] = [];\n (m['prompts'] as unknown[]).forEach((p, i) => {\n if (!p || typeof p !== 'object') {\n errors.push(`prompts[${i}] is not an object`);\n return;\n }\n const r = p as Record<string, unknown>;\n const slug = r['slug'];\n if (typeof slug !== 'string' || !SLUG_RE.test(slug)) {\n errors.push(`prompts[${i}].slug invalid (must be kebab-case)`);\n return;\n }\n if (seen.has(slug)) {\n errors.push(`prompts[${i}].slug \"${slug}\" duplicated`);\n return;\n }\n seen.add(slug);\n if (typeof r['checksum'] !== 'string' || !CHECKSUM_RE.test(r['checksum'])) {\n errors.push(`prompts[${i}].checksum must be a 64-char sha256 hex`);\n return;\n }\n for (const field of ['id', 'title', 'description', 'category'] as const) {\n const v = r[field];\n if (typeof v !== 'string' || v.length === 0 || v.length > MAX_STR) {\n errors.push(`prompts[${i}].${field} must be a non-empty string under ${MAX_STR} chars`);\n return;\n }\n }\n const tags = Array.isArray(r['tags'])\n ? (r['tags'].filter((t) => typeof t === 'string') as string[])\n : [];\n refs.push({\n id: r['id'] as string,\n slug,\n title: r['title'] as string,\n description: r['description'] as string,\n category: r['category'] as string,\n tags,\n checksum: r['checksum'] as string,\n version: typeof r['version'] === 'string' ? r['version'] : undefined,\n license: typeof r['license'] === 'string' ? r['license'] : undefined,\n url: typeof r['url'] === 'string' ? r['url'] : undefined,\n });\n });\n\n if (errors.length > 0) return { ok: false, errors };\n return {\n ok: true,\n manifest: {\n registryVersion: 1,\n source: m['source'] as string,\n generatedAt: m['generatedAt'] as string,\n prompts: refs,\n },\n };\n}\n\nexport interface RegistryDiff {\n /** Slugs present in the manifest but not locally. */\n added: PromptRegistryRef[];\n /** Slugs present locally but whose checksum differs in the manifest. */\n updated: PromptRegistryRef[];\n /** Slugs present locally and identical in the manifest. */\n unchanged: PromptRegistryRef[];\n}\n\n/**\n * Compute what a pull WOULD change, by slug+checksum, against the prompts the\n * caller already has. Pure — no I/O, no writes.\n */\nexport function diffRegistry(\n local: { slug: string; checksum?: string | undefined }[],\n manifest: PromptRegistryManifest,\n): RegistryDiff {\n const localBySlug = new Map(local.map((e) => [e.slug, e.checksum]));\n const diff: RegistryDiff = { added: [], updated: [], unchanged: [] };\n for (const ref of manifest.prompts) {\n if (!localBySlug.has(ref.slug)) diff.added.push(ref);\n else if (localBySlug.get(ref.slug) !== ref.checksum) diff.updated.push(ref);\n else diff.unchanged.push(ref);\n }\n return diff;\n}\n","/**\n * Design Studio — curated frontend/mobile UI design kits.\n *\n * A \"design kit\" is a self-contained, selectable design direction (an aesthetic\n * + concrete design tokens + per-stack implementation guidance) that the model\n * commits to BEFORE writing UI code. Kits are surfaced progressively: a compact\n * menu is injected when frontend work is detected, and the heavy kit body is\n * only loaded once the model (or user) picks one — keeping per-turn tokens low.\n *\n * This mirrors the skills subsystem (`types/skill.ts` + `execution/skill-loader.ts`)\n * but adds the per-stack body selection and a token snapshot for visual pickers.\n */\n\n/** Target implementation stacks a kit can speak to. */\nexport const DESIGN_STACKS = ['web', 'react-native', 'flutter', 'swiftui', 'compose'] as const;\n\nexport type DesignStack = (typeof DESIGN_STACKS)[number];\n\nexport function isDesignStack(v: string): v is DesignStack {\n return (DESIGN_STACKS as readonly string[]).includes(v);\n}\n\nexport interface DesignKitManifest {\n id: string;\n name: string;\n /** One-line vibe shown in the menu, e.g. \"Restrained, Linear-style minimalism\". */\n aesthetic: string;\n /** Free-form tags for filtering. */\n tags: string[];\n /** Stacks this kit provides guidance for. */\n stacks: DesignStack[];\n /** Whether the kit ships light + dark themes (almost always true). */\n themes: string[];\n /** \"Best for…\" one-liner used in menu + pickers. */\n bestFor: string;\n version?: string | undefined;\n path: string;\n source: 'project' | 'user' | 'bundled';\n}\n\n/** A single theme's concrete token values (OKLCH strings, font names, etc.). */\nexport interface DesignTokenSet {\n [token: string]: string;\n}\n\n/** Parsed `tokens.json` — light + dark token snapshots used by visual pickers. */\nexport interface DesignKitTokens {\n light?: DesignTokenSet | undefined;\n dark?: DesignTokenSet | undefined;\n}\n\n/** Compact menu entry rendered into the request when frontend work is detected. */\nexport interface DesignKitEntry {\n id: string;\n name: string;\n aesthetic: string;\n bestFor: string;\n stacks: DesignStack[];\n source: DesignKitManifest['source'];\n}\n\n/**\n * Live Design Studio state stashed on `ctx.meta.designStudio`. Set by the\n * detection middleware (user intent + frontend file writes); read by the\n * request middleware that injects the menu / active-kit reminder.\n */\nexport interface DesignStudioState {\n /** True once frontend/UI work has been detected this session. */\n active: boolean;\n /** Detected target stack, if any. */\n stack?: DesignStack | undefined;\n /** What triggered activation (for transparency / debugging). */\n signals: string[];\n /** Kit id the model/user committed to, if any. */\n activeKit?: string | undefined;\n /**\n * User color/token overrides applied over the active kit's tokens. Keys are\n * token names (`primary`) applied to both themes, or theme-scoped\n * (`light.bg`/`dark.bg`). See `applyTokenOverrides`.\n */\n overrides?: Record<string, string> | undefined;\n}\n\nexport interface DesignKitLoader {\n list(): Promise<DesignKitManifest[]>;\n /** Structured entries for the compact menu. */\n listEntries(): Promise<DesignKitEntry[]>;\n find(id: string): Promise<DesignKitManifest | undefined>;\n /** Compact, model-facing menu of every available kit. */\n menuText(): Promise<string>;\n /**\n * Full kit body for a given stack. Strips frontmatter and, when `stack` is\n * provided, narrows stack-specific sections to that stack.\n */\n readBody(id: string, stack?: DesignStack | undefined): Promise<string>;\n /** Parsed `tokens.json` for a kit (light/dark snapshots), if present. */\n readTokens(id: string): Promise<DesignKitTokens | undefined>;\n /** The mandatory cross-cutting baseline (responsive / a11y / theming / motion). */\n foundationsText(stack?: DesignStack | undefined): Promise<string>;\n invalidateCache(): void;\n}\n","import type { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n {\n type: 'anthropic_key',\n regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g,\n },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n {\n type: 'stripe_key',\n regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g,\n },\n {\n type: 'telegram_bot_token',\n // Telegram tokens are of the form bot<digits>:<alphanum> in URL paths\n regex: /\\/bot\\d+:[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g,\n },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex:\n /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex:\n /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n // AI/ML provider keys — modern LLM services with well-known prefixes\n {\n type: 'huggingface_token',\n // HuggingFace tokens: hf_ followed by 34 alphanumeric chars\n regex: /(?<![A-Za-z0-9])hf_[A-Za-z0-9]{34}(?![A-Za-z0-9])/g,\n },\n {\n type: 'replicate_token',\n // Replicate tokens: r8_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])r8_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'perplexity_key',\n // Perplexity API keys: pplx- followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])pplx-[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'groq_key',\n // Groq API keys: gsk_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])gsk_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'bearer_token',\n // Anchored with alternation instead of negative lookahead — avoids V8\n // backtracking risk on adversarial input. Bounded at 512 chars.\n // Min 12 chars: some OAuth providers issue shorter-lived tokens (< 20\n // chars). A 12-char base64 string has ~71 bits of entropy — above the\n // threshold where random strings are unlikely to produce false matches.\n // The trailing boundary is a NON-consuming lookahead: two adjacent bearer\n // tokens sharing a single delimiter (`Bearer a… Bearer b…`) must both be\n // redacted. A consuming trailing delimiter would eat the separator the\n // next match needs for its leading anchor, leaking the second token.\n regex: /(?:^|[^A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{12,512}=*(?=$|[^A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Anchored with alternation instead of lookbehind to avoid backtracking.\n // Value bounded at 512 chars.\n // The trailing boundary is a NON-consuming lookahead so two secrets\n // separated by a single delimiter (one space OR one newline, e.g.\n // `printenv` / `.env` dumps: `API_KEY=… \\n SESSION_TOKEN=…`) are BOTH\n // redacted. A consuming trailing `\\s` would swallow the separator the\n // next match needs for its leading anchor, so every other secret would\n // leak in plaintext.\n // The leading delimiter is CAPTURED (group 1) and re-emitted by the\n // replacement so the separator between adjacent secrets is preserved\n // rather than collapsed. Capture groups are therefore: 1=leading\n // delimiter, 2=key name, 3=value.\n regex: /(^|\\s)([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,512})['\"]?(?=\\s|$)/g,\n },\n];\n\n/**\n * `high_entropy_env` is the one pattern that needs special replacement logic\n * (it preserves the key name), so it runs in its own pass. Every other pattern\n * is folded into a single combined regex. Derive the split by type rather than\n * by hard-coded indices so adding/removing a pattern can't silently drop one.\n */\nconst SIMPLE_PATTERNS = PATTERNS.filter((p) => p.type !== 'high_entropy_env');\n\n/**\n * Combined single-pass regex for all simple patterns. Each alternative is a\n * capturing group so the callback can determine which original pattern fired\n * (only one group is non-undefined at match time). Order matches SIMPLE_PATTERNS\n * (longer/more-specific prefixes first). Relies on each simple pattern source\n * containing no internal capturing groups — only `(?:...)` and lookarounds.\n */\nconst COMBINED_REGEX = new RegExp(SIMPLE_PATTERNS.map((p) => `(${p.regex.source})`).join('|'), 'g');\n\n/** Separate pattern for high_entropy_env (different replacement logic). */\nconst HIGH_ENTROPY_REGEX = PATTERNS.find((p) => p.type === 'high_entropy_env')!.regex;\n\n/**\n * Replacements for the combined patterns, parallel to SIMPLE_PATTERNS. The\n * combined-regex callback indexes into this with the matched group's position.\n */\nconst COMBINED_REPLACEMENTS = SIMPLE_PATTERNS.map((p) => `[REDACTED:${p.type}]`);\n\n/**\n * Per-chunk cap. Splits long inputs into 64 KB chunks to keep scrub() memory\n * bounded. Real scrub() inputs (LLM responses, tool outputs) are typically\n * much smaller; this cap handles edge cases without impacting normal usage.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\n/**\n * Overlap window used to nudge a chunk boundary onto a safe separator so a\n * secret straddling the 64 KB cut isn't split in half (which would leave\n * neither half matching, leaking the secret verbatim).\n *\n * Sized above the longest BOUNDED credential pattern: `high_entropy_env`\n * caps its value at 512 chars (+ key name + quotes ≈ 560) and `bearer_token`\n * at 512; every prefix-keyed pattern is far shorter. Because all of these\n * patterns are whitespace-free, the first whitespace at/after the nominal cut\n * is guaranteed to sit *past the end* of any such secret — so snapping the\n * boundary forward to it keeps every bounded secret wholly inside one chunk.\n * 1 KB gives comfortable headroom over the 560-char worst case.\n */\nconst SCRUB_OVERLAP_BYTES = 1024;\n\n/**\n * Quick pre-scan: check if the text contains any substring that MUST be\n * present for a credential pattern to match. If none are found, the text\n * is guaranteed clean — skip all regex passes (2 total: 16-pattern combined + high_entropy_env).\n *\n * Each anchor is the shortest unique substring from the corresponding pattern.\n * V8's `String.includes()` is hand-tuned C++ — O(n) with near-zero overhead\n * for typical tool-output lengths (100–5000 chars). A single combined regex\n * via `text.search()` is consistently slower for this many alternatives.\n */\nfunction hasCredentialAnchors(text: string): boolean {\n return (\n text.includes('-----BEGIN') || // Private keys (most unique → cheap reject)\n text.includes('sk-') || // Anthropic + OpenAI keys\n text.includes('sk_') || // Stripe live/test keys\n text.includes('ghp_') || // GitHub PAT v1\n text.includes('github_pat_') || // GitHub PAT v2\n text.includes('eyJ') || // JWT\n text.includes('AKIA') || // AWS access key\n text.includes('AIza') || // GCP service key\n text.includes('xox') || // Slack token (xoxa/xoxb/xoxp/xoxo/xoxs)\n text.includes('Bearer ') || // Bearer token (space suffix reduces false positives)\n text.includes('/bot') || // Telegram bot token (URL path pattern)\n text.includes('hf_') || // HuggingFace token\n text.includes('r8_') || // Replicate token\n text.includes('pplx-') || // Perplexity API key\n text.includes('gsk_') || // Groq API key\n text.includes('_KEY=') || // High-entropy env vars: API_KEY=, SECRET_KEY=, ...\n text.includes('_TOKEN=') || // ACCESS_TOKEN=, AUTH_TOKEN=, ...\n text.includes('_SECRET=') || // API_SECRET=, CLIENT_SECRET=, ...\n text.includes('_PASSWORD=') || // DB_PASSWORD=, ROOT_PASSWORD=, ...\n text.includes('mongodb://') ||\n text.includes('mongodb+srv://') ||\n text.includes('postgres://') ||\n text.includes('postgresql://') ||\n text.includes('mysql://') ||\n text.includes('redis://')\n );\n}\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\n\n // Fast path: if no credential anchor substrings exist in the text,\n // none of the 17 regex patterns can match. Skip all regex work.\n // This covers the vast majority of tool outputs (~95% of calls on\n // typical sessions are file paths, status messages, diffs, etc.).\n if (!hasCredentialAnchors(text)) return text;\n\n // For oversize inputs, scrub in fixed chunks to keep memory bounded.\n // The boundary is snapped FORWARD to the next whitespace within an\n // overlap window so a secret straddling the nominal 64 KB cut is never\n // split in half. Every bounded credential pattern is whitespace-free, so\n // the next whitespace at/after the cut necessarily falls past the end of\n // any such secret — guaranteeing it stays wholly inside the current chunk.\n if (text.length <= SCRUB_CHUNK_BYTES) {\n return this.scrubOne(text);\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n let end = Math.min(i + SCRUB_CHUNK_BYTES, text.length);\n if (end < text.length) {\n // Look for the first whitespace at/after the nominal cut, bounded by\n // the overlap window. Extending forward (not backward) ensures any\n // secret that began before `end` finishes before the new boundary.\n const limit = Math.min(end + SCRUB_OVERLAP_BYTES, text.length);\n let safe = -1;\n for (let j = end; j < limit; j++) {\n const ch = text.charCodeAt(j);\n // space, \\t, \\n, \\r\n if (ch === 32 || ch === 9 || ch === 10 || ch === 13) {\n safe = j;\n break;\n }\n }\n // Snap onto the whitespace if found; otherwise fall back to the hard\n // cut (an unbroken >1 KB run with no whitespace can't be a bounded\n // secret anyway — those are all ≤ ~560 chars and whitespace-free).\n end = safe === -1 ? end : safe + 1;\n }\n out.push(this.scrubOne(text.slice(i, end)));\n i = end;\n }\n return out.join('');\n }\n\n private scrubOne(text: string): string {\n // Redundant guard: if we reached scrubOne via the chunked path, the\n // chunk may have been small enough to anchor-skip independently.\n if (!hasCredentialAnchors(text)) return text;\n\n // Pass 1: combined single-pass regex for all simple patterns. Each\n // alternative is a capturing group; only the group that matched is\n // non-undefined. The trailing offset/string args replace() appends are\n // always defined, so the matched group (which precedes them) is found first.\n let out = text.replace(\n COMBINED_REGEX,\n (match, ...groups) => {\n // groups[i] corresponds to SIMPLE_PATTERNS[i]; find which one fired.\n const idx = groups.findIndex((g) => g !== undefined);\n if (idx < 0) return match;\n const replacement = COMBINED_REPLACEMENTS[idx];\n return replacement !== undefined ? replacement : match;\n },\n );\n\n // Pass 2: high_entropy_env needs special handling — preserve the key name.\n // Groups: 1=leading delimiter (re-emitted so adjacent-secret separators\n // aren't collapsed), 2=key name, 3=value (redacted).\n out = out.replace(HIGH_ENTROPY_REGEX, (_match, lead, key, _value) => {\n return `${lead}${key}=[REDACTED:high_entropy_env]`;\n });\n\n return out;\n }\n\n /**\n * Recursively scrub every string value in an object/array graph. Secrets can\n * appear under any key — a URL query param, an `authorization` header, an\n * arbitrarily-named nested field — so we don't gate recursion on key names.\n * The per-string `scrub()` fast-path (anchor pre-scan) keeps this cheap: any\n * value without a credential anchor returns immediately without regex work.\n */\n scrubObject<T>(obj: T): T {\n const seen = new WeakSet();\n const visit = (v: unknown): unknown => {\n if (typeof v === 'string') return this.scrub(v);\n if (v === null || typeof v !== 'object') return v;\n if (seen.has(v as object)) return v;\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(visit);\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n out[k] = visit(val);\n }\n return out;\n };\n return visit(obj) as T;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { toErrorMessage } from '../utils/error.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.js';\nimport { FetchError } from '../types/errors.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\n/** Env var to override the models.dev base URL (e.g. for self-hosted mirrors). */\nconst ENV_URL_KEY = 'WRONGSTACK_MODELS_DEV_URL';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\nconst DEFAULT_REFRESH_TIMEOUT_MS = 15_000;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string | undefined;\n ttlSeconds?: number | undefined;\n fetchImpl?: typeof fetch | undefined;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload | undefined;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number | undefined;\n /**\n * Timeout in milliseconds for the models.dev network fetch. When exceeded,\n * the fetch is aborted and cache/stale fallback is used instead.\n * Defaults to 15 seconds. Set to `0` to disable (infinite wait).\n */\n refreshTimeoutMs?: number | undefined;\n /**\n * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload | undefined;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string | undefined;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string | undefined;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string | undefined;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload | undefined;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: ModelsDevPayload | undefined;\n /**\n * Extra providers injected at runtime via `mergeOverlay()` — e.g. an\n * openai-compatible server (omniroute, LiteLLM, …) auto-discovered from its\n * `/v1/models` endpoint at boot. Applied LAST (on top of base + curated\n * overlay) and re-applied across `refresh()` so the discovered catalog\n * survives a models.dev refetch.\n */\n private extraOverlay?: ModelsDevPayload | undefined;\n private fetchedAt?: Date | undefined;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload | undefined;\n private readonly maxStaleAgeMs: number;\n private readonly refreshTimeoutMs: number;\n private readonly overlay?: ModelsDevPayload | undefined;\n private readonly overlayUrl?: string | undefined;\n private readonly overlayFile?: string | undefined;\n private readonly overlayCacheFile?: string | undefined;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? process.env[ENV_URL_KEY] ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n this.refreshTimeoutMs = opts.refreshTimeoutMs ?? DEFAULT_REFRESH_TIMEOUT_MS;\n this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = this.withExtraOverlay(mergeModelsPayload(base, overlay));\n return this.payload;\n }\n\n /**\n * Merge an additional provider payload on top of the resolved catalog. Used\n * for runtime-discovered openai-compatible providers. Remembered so it is\n * re-applied across `refresh()`. A no-op for an empty payload.\n */\n mergeOverlay(payload: ModelsDevPayload): void {\n if (!hasEntries(payload)) return;\n this.extraOverlay = this.extraOverlay\n ? mergeModelsPayload(this.extraOverlay, payload)\n : payload;\n if (this.payload) this.payload = mergeModelsPayload(this.payload, this.extraOverlay);\n }\n\n private withExtraOverlay(payload: ModelsDevPayload): ModelsDevPayload {\n return this.extraOverlay ? mergeModelsPayload(payload, this.extraOverlay) : payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean | undefined } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n const ageSeconds = Math.floor((Date.now() - this.fetchedAt.getTime()) / 1000);\n // eslint-disable-next-line no-console -- user-visible operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${toErrorMessage(err)}); ` +\n `using stale cache from ${formatAge(ageSeconds)} ago. Run \\`wstack models refresh\\` to retry.`,\n );\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n toErrorMessage(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const controller = new AbortController();\n /* v8 ignore next -- timing: the abort callback only fires if the real fetch exceeds the timeout */\n const timeout = setTimeout(() => controller.abort(), this.refreshTimeoutMs);\n try {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) {\n throw new FetchError({\n message: `ModelsRegistry: HTTP ${res.status} fetching ${this.url}`,\n status: res.status,\n context: { url: this.url, op: 'refreshModels' },\n });\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === 'AbortError') {\n throw new FetchError({\n message: `ModelsRegistry: fetch timed out after ${this.refreshTimeoutMs}ms`,\n status: 408,\n context: { url: this.url, op: 'refreshModels', timedOut: true },\n });\n }\n throw err;\n }\n }\n\n /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n /* v8 ignore next -- unreachable: load() caches `payload` and short-circuits before re-calling loadOverlay non-forced */\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (hasEntries(this.overlay)) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (hasEntries(fetched)) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean | undefined }): Promise<\n ModelsDevPayload | undefined\n > {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new FetchError({\n message: `HTTP ${res.status}`,\n status: res.status,\n context: { url: this.url, op: 'refreshModels' },\n });\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n /* v8 ignore next -- best-effort: overlay-cache write failure is intentionally ignored */\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n const ageSeconds = Math.floor((Date.now() - new Date(cached.fetchedAt).getTime()) / 1000);\n // eslint-disable-next-line no-console -- operator-visible warning\n console.warn(\n `ModelsRegistry: overlay unavailable; using stale overlay from ${formatAge(ageSeconds)} ago.`,\n );\n return cached.payload;\n }\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = this.withExtraOverlay(mergeModelsPayload(base, overlay));\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? model.reasoningConfig !== undefined,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n reasoningConfig: model.reasoningConfig,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n\n/** Render a seconds-duration as a human-friendly \"Xh Ym\" or \"Xd\" string. */\nfunction formatAge(seconds: number): string {\n if (seconds < 60) return '<1m';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n if (seconds < 86400) {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\n }\n return `${Math.floor(seconds / 86400)}d`;\n}\n\nfunction hasEntries(payload: ModelsDevPayload | undefined): payload is ModelsDevPayload {\n return payload !== undefined && Object.keys(payload).length > 0;\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function modePrompt(id: string): string {\n for (const dir of modePromptDirCandidates()) {\n try {\n return readFileSync(path.join(dir, `${id}.md`), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nfunction modePromptDirCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../../instructions/modes'),\n path.resolve(here, '../instructions/modes'),\n path.resolve(here, 'instructions/modes'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","import { modePrompt } from './mode-prompts.js';\nexport interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[] | undefined;\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[] | undefined;\n /**\n * Skill names that are particularly relevant to this mode. The system\n * prompt builder appends a \"Suggested skills\" note so the model knows\n * which domain knowledge to leverage first. Skill must exist in the\n * loaded skill set to appear.\n */\n suggestedSkills?: string[] | undefined;\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string | undefined;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: modePrompt('code-reviewer'),\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n suggestedSkills: ['bug-hunter', 'security-scanner', 'typescript-strict', 'testing'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: modePrompt('code-auditor'),\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n suggestedSkills: ['security-scanner', 'bug-hunter', 'audit-log'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: modePrompt('architect'),\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n suggestedSkills: ['api-design', 'refactor-planner', 'node-modern', 'docker-deploy'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: modePrompt('debugger'),\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n suggestedSkills: ['bug-hunter', 'audit-log', 'observability'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: modePrompt('tester'),\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n suggestedSkills: ['testing', 'bug-hunter', 'typescript-strict'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: modePrompt('devops'),\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n suggestedSkills: ['docker-deploy', 'observability', 'security-scanner'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: modePrompt('refactorer'),\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n suggestedSkills: ['refactor-planner', 'typescript-strict', 'node-modern', 'testing'],\n },\n {\n id: 'ui-design',\n name: 'UI Design',\n description: 'Design-first frontend & mobile UI work (Design Studio)',\n prompt: modePrompt('ui-design'),\n tags: ['ui', 'frontend', 'mobile', 'design'],\n toolPreferences: ['design', 'write', 'edit', 'read', 'scaffold'],\n suggestedSkills: ['react-modern'],\n },\n {\n id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: modePrompt('brief'),\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n suggestedSkills: [],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: modePrompt('teach'),\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n suggestedSkills: ['prompt-engineering', 'skill-creator', 'node-modern', 'typescript-strict'],\n },\n {\n id: 'research-web',\n name: 'Research Web',\n description: 'Current-data research — search web, verify, inject findings into context',\n prompt: modePrompt('research-web'),\n tags: ['research', 'web', 'current-data', 'up-to-date'],\n toolPreferences: ['search/fetch', 'search/fetch', 'search', 'fetch', 'context_manager'],\n suggestedSkills: ['research-web', 'tech-stack', 'node-modern', 'security-scanner', 'react-modern'],\n },\n];\n","import { expectDefined } from '../utils/expect-defined.js';\nexport type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string | undefined;\n warnThreshold?: number | undefined;\n softThreshold?: number | undefined;\n hardThreshold?: number | undefined;\n preserveK?: number | undefined;\n eliseThreshold?: number | undefined;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null | undefined,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? expectDefined(getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID));\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)?.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { AgentError, ERROR_CODES } from '../types/errors.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n /** Stores the transport unsubscribe function so it can be called on stop(). */\n private _transportUnsubscribe?: ((() => void)) | undefined;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this._transportUnsubscribe = this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new AgentError({\n message: 'Bridge is stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n });\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Guard against concurrent calls reusing the same id. Without this check,\n // a second .set() would silently overwrite the first record — the original\n // caller's timer fires, deletes the entry, and resolves its promise, but\n // the second caller now has no entry to resolve when its timer fires.\n // Throwing here surfaces the caller bug rather than letting it hang.\n if (this.inflightGuards.has(correlationId)) {\n throw new AgentError({\n message: `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { correlationId },\n });\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new AgentError({\n message: `Request ${correlationId} timed out after ${timeout}ms`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { correlationId, timeoutMs: timeout },\n }));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n // Reject if stop() was called after the initial check and cleared\n // the guard — this prevents a request from being enqueued after\n // stop() has already released the lock on pendingRequests.\n if (!this.inflightGuards.has(correlationId)) {\n clearTimeout(timer);\n reject(new AgentError({\n message: 'Bridge stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n }));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new AgentError({\n message: 'Bridge stopped',\n code: ERROR_CODES.AGENT_ABORTED,\n }));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n // Call the transport unsubscribe to clean up the subscription handler.\n // This prevents memory leaks when bridges are created and destroyed frequently.\n this._transportUnsubscribe?.();\n this._transportUnsubscribe = undefined;\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string | undefined,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType =\n | 'overview'\n | 'requirements'\n | 'architecture'\n | 'api'\n | 'data'\n | 'security'\n | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[] | undefined;\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[] | undefined;\n implements?: string[] | undefined;\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean | undefined;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[] | undefined;\n dependencies?: string[] | undefined;\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n {\n type: 'non-functional',\n priority: 'medium',\n acceptanceCriteria: [],\n blockedBy: [],\n implements: [],\n },\n ],\n};\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string | undefined;\r\n estimateHours?: number | undefined;\r\n actualHours?: number | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n parentId?: string | undefined;\r\n children?: string[] | undefined;\r\n createdAt: number;\r\n updatedAt: number;\r\n startedAt?: number | undefined; // set when status → in_progress\r\n completedAt?: number | undefined;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number | undefined;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[] | undefined;\r\n priority?: TaskPriority[] | undefined;\r\n type?: TaskType[] | undefined;\r\n assignee?: string[] | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0;\r\n let pending = 0;\r\n let inProgress = 0;\r\n let blocked = 0;\r\n let failed = 0;\r\n let review = 0;\r\n let estimatedHours = 0;\r\n let actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed':\r\n completed++;\r\n break;\r\n case 'pending':\r\n pending++;\r\n break;\r\n case 'in_progress':\r\n inProgress++;\r\n break;\r\n case 'blocked':\r\n blocked++;\r\n break;\r\n case 'failed':\r\n failed++;\r\n break;\r\n case 'review':\r\n review++;\r\n break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\n * Well-known tool capabilities used for authorization decisions.\n *\n * These are the preferred values for `Tool.capabilities`.\n * New capabilities should be added here with clear documentation.\n *\n * Philosophy (2026-06+):\n * - Prefer capabilities over exact tool name matching.\n * - Subagent guards and future policies should primarily key off capabilities.\n * - Name-based denylists are legacy and will be phased down.\n */\nexport const ToolCapabilities = {\n /** Can execute arbitrary commands in the user's shell (the `bash` tool). */\n SHELL_ARBITRARY: 'shell.arbitrary',\n\n /** Can execute a restricted set of commands (the `exec` tool). */\n SHELL_RESTRICTED: 'shell.restricted',\n\n /** Can read files inside the project (and possibly outside via symlinks if not guarded). */\n FS_READ: 'fs.read',\n\n /** Can write / modify / delete files inside the project. */\n FS_WRITE: 'fs.write',\n\n /** Can write files outside the current project root (very high risk). */\n FS_WRITE_OUTSIDE_PROJECT: 'fs.write.outside-project',\n\n /** Can perform outbound network requests. */\n NET_OUTBOUND: 'net.outbound',\n\n /** Proxies tools from external MCP servers (unknown capability). */\n MCP_PROXY: 'mcp.proxy',\n\n /** Can spawn or manage subagents / multi-agent tasks. */\n SUBAGENT_SPAWN: 'subagent.spawn',\n\n /** Can inspect fleet/subagent coordination state without mutating it. */\n COORDINATION_FLEET_READ: 'coordination.fleet.read',\n\n /** Can read or write inter-agent mailbox messages. */\n COORDINATION_MAIL: 'coordination.mail',\n\n /** Can schedule, inspect, or cancel in-session cron jobs. */\n COORDINATION_CRON: 'coordination.cron',\n\n /** Can mutate global or session configuration / trust state. */\n CONFIG_MUTATE: 'config.mutate',\n\n /** Can install packages or run package managers with side effects. */\n PACKAGE_INSTALL: 'package.install',\n} as const;\n\nexport type ToolCapability = (typeof ToolCapabilities)[keyof typeof ToolCapabilities];\n\n/**\n * Set of capabilities that are considered dangerous for subagents by default.\n * Subagents should not receive these capabilities unless the leader explicitly\n * allows the specific tool at spawn time.\n */\nexport const DANGEROUS_FOR_SUBAGENTS: readonly ToolCapability[] = [\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.SHELL_RESTRICTED,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.FS_WRITE_OUTSIDE_PROJECT,\n ToolCapabilities.MCP_PROXY,\n ToolCapabilities.SUBAGENT_SPAWN,\n ToolCapabilities.CONFIG_MUTATE,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Wide capability allowlist for subagents that the user has authorized to act\n * with full developer power (the CLI fleet host applies this to any subagent\n * that isn't given an explicit, narrower grant). It covers everything needed to\n * do real work end-to-end — read, write/edit inside the project, outbound\n * network, and shell/build/install — so a delegated coding or build agent runs\n * the same toolchain the leader would, without per-tool confirmation it cannot\n * answer.\n *\n * Deliberately EXCLUDED (require an explicit per-spawn `allowedCapabilities`\n * grant, because they escape the task's blast radius rather than perform it):\n * - `fs.write.outside-project` — writing outside the repo (e.g. ~/.ssh).\n * - `mcp.proxy` — third-party MCP tools (also hard-blocked by name).\n * - `subagent.spawn` — recursive delegation (the baseline prompt forbids it).\n * - `config.mutate` — rewriting trust/config is privilege escalation, not work.\n */\nexport const WIDE_SUBAGENT_CAPABILITIES: readonly ToolCapability[] = [\n ToolCapabilities.FS_READ,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.NET_OUTBOUND,\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.SHELL_RESTRICTED,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Check if a tool (or its capabilities array) includes any dangerous capability\n * for subagent execution.\n */\nexport function hasDangerousCapabilityForSubagents(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n): boolean {\n if (!toolOrCaps) return false;\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.some((c) => DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability));\n}\n\n/**\n * Check if a tool declares a specific capability (or any of the provided ones).\n */\nexport function hasCapability(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n capability: ToolCapability | ToolCapability[],\n): boolean {\n if (!toolOrCaps) return false;\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n const toCheck = Array.isArray(capability) ? capability : [capability];\n return toCheck.some((c) => caps.includes(c));\n}\n\n/**\n * Returns the intersection of a tool's capabilities with the dangerous set.\n * Useful for logging and audit trails.\n */\nexport function getDangerousCapabilities(\n toolOrCaps: { capabilities?: readonly string[] | undefined } | readonly string[] | undefined,\n): ToolCapability[] {\n if (!toolOrCaps) return [];\n const input = toolOrCaps as never as { capabilities?: readonly string[] | undefined };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.filter((c): c is ToolCapability =>\n DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability),\n );\n}\n","import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport {\n getDangerousCapabilities,\n hasDangerousCapabilityForSubagents,\n} from '../security/capabilities.js';\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Tool, ToolProgressEvent, ToolErrorCategory } from '../types/tool.js';\nimport { ToolErrorCategory as ToolErrorCategoryEnum } from '../types/tool.js';\nimport type {\n ToolBatchResult,\n ToolConfirmPendingResult,\n ToolExecutionOutput,\n ToolExecutorOptions,\n ToolExecutorStrategy,\n} from '../types/tool-executor.js';\nimport { toErrorMessage } from '../utils/error.js';\nimport { expectDefined } from '../utils/expect-defined.js';\nimport { validateAgainstSchema } from '../utils/json-schema-validate.js';\nimport { subjectForToolInput } from '../utils/tool-subject.js';\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\nimport { wstackGlobalRoot } from '../utils/wstack-paths.js';\nimport { FetchError, isWrongStackError, ToolError, ToolValidationError, WrongStackError } from '../types/errors.js';\nimport { MALFORMED_ARG_MARKERS } from '../types/tool-markers.js';\nimport type { ToolResultRenderMode } from '../types/config.js';\nimport { resolveToolResultRenderMode } from '../utils/tool-result-render-mode.js';\nimport type { ToolResultRenderModeConfig } from '../types/config.js';\nexport class ToolExecutor {\n /** Minimum gap between coalesced `partial_output` tool.progress emits. */\n static readonly PROGRESS_EMIT_INTERVAL_MS = 100;\n /** Max chars of accumulated stream text carried per coalesced emit (tail). */\n static readonly PROGRESS_TAIL_CHARS = 16_384;\n /** Max chars of the head (beginning of output) kept alongside the tail. */\n static readonly PROGRESS_HEAD_CHARS = 16_384;\n\n private readonly serializer;\n private readonly iterationTimeoutMs: number;\n private readonly maxToolTimeoutMs: number;\n\n constructor(\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\n private opts: ToolExecutorOptions,\n ) {\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.maxToolTimeoutMs = opts.maxToolTimeoutMs ?? 300_000;\n this.serializer = createToolOutputSerializer({\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\n });\n }\n\n /**\n * Clear the interactive confirm awaiter so the executor returns\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\n * the CLI to switch from inline prompts (REPL) to event-driven\n * confirmation (TUI) at runtime.\n */\n clearConfirmAwaiter(): void {\n this.opts.confirmAwaiter = undefined;\n }\n\n /**\n * Push the tool's per-tool result-render mode into the renderer as the\n * next-result render mode. The config key is `tools.resultRenderMode[name]`\n * — independent of the LLM-side `descriptionMode` so the two can be\n * toggled separately (`/tool read desc simple` vs `/tool read result\n * simple`). Defaults to `extend` when no entry is set.\n *\n * The hint is one-shot: the renderer consumes it on the next\n * `writeToolResult` call so an unset follow-up doesn't inherit a\n * previous tool's mode. Safe no-op when the renderer doesn't implement\n * `setResultRenderMode` (e.g. headless/test renderers).\n */\n private hintRenderMode(toolName: string): void {\n const renderer = this.opts.renderer;\n if (!renderer || typeof renderer.setResultRenderMode !== 'function') return;\n const modes: ToolResultRenderModeConfig | undefined = this.opts.resultRenderModes;\n const mode: ToolResultRenderMode = resolveToolResultRenderMode(modes, toolName);\n renderer.setResultRenderMode(toolName, mode);\n }\n\n private toolLogBase(\n ctx: Context,\n use: ToolUseBlock,\n toolName: string,\n durationMs: number,\n ): Record<string, unknown> {\n return {\n event: 'tool.execution',\n traceId: ctx.traceId,\n sessionId: ctx.session.id,\n agentId: ctx.agentId ?? '<unknown>',\n toolName,\n toolUseId: use.id,\n durationMs,\n };\n }\n\n private logToolSuccess(\n ctx: Context,\n use: ToolUseBlock,\n toolName: string,\n durationMs: number,\n outputChars: number,\n ): void {\n this.opts.events?.emit('tool.completed', {\n name: toolName,\n id: use.id,\n sessionId: ctx.session.id,\n ...(ctx.traceId ? { traceId: ctx.traceId } : {}),\n agentId: ctx.agentId ?? '<unknown>',\n durationMs,\n outputChars,\n });\n this.opts.logger?.info('tool execution completed', {\n ...this.toolLogBase(ctx, use, toolName, durationMs),\n outcome: 'success',\n isError: false,\n outputChars,\n });\n }\n\n private logToolFailure(\n ctx: Context,\n use: ToolUseBlock,\n toolName: string,\n durationMs: number,\n err: unknown,\n ): void {\n const { category, retryable, detail } = classifyToolError(err);\n const structured = isWrongStackError(err);\n const structuredError = structured\n ? {\n errorCode: err.code,\n errorSubsystem: err.subsystem,\n errorSeverity: err.severity,\n }\n : {};\n this.opts.events?.emit('tool.failed', {\n name: toolName,\n id: use.id,\n sessionId: ctx.session.id,\n ...(ctx.traceId ? { traceId: ctx.traceId } : {}),\n agentId: ctx.agentId ?? '<unknown>',\n durationMs,\n category,\n retryable,\n ...(detail ? { detail } : {}),\n ...structuredError,\n });\n this.opts.logger?.warn('tool execution failed', {\n ...this.toolLogBase(ctx, use, toolName, durationMs),\n outcome: 'failure',\n isError: true,\n errorCategory: category,\n retryable,\n errorDetail: detail,\n ...structuredError,\n });\n }\n\n /**\n * Execute a batch of tool uses using the configured strategy.\n * Returns the execution results and the remaining output budget.\n */\n async executeBatch(\n toolUses: ToolUseBlock[],\n ctx: Context,\n strategy: ToolExecutorStrategy,\n ): Promise<ToolBatchResult> {\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\n\n const runOne = async (use0: ToolUseBlock): Promise<ToolExecutionOutput> => {\n const start = Date.now();\n // `use` is rebindable because a PreToolUse hook may rewrite its input.\n let use = use0;\n const tool = this.registry.get(use.name);\n\n // Fast path: unknown tool\n if (!tool) {\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Strong guarantee: Validate input against the tool's declared JSON Schema\n // *before* permission checks or execution. This is a hard gate — bad calls\n // are rejected early with actionable feedback so the model can self-correct.\n const validation = validateAgainstSchema(use.input, tool.inputSchema);\n if (!validation.ok) {\n const errorDetails = validation.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}\\n\\n` +\n `Please call the tool again with arguments that match its inputSchema. ` +\n `You can use the \"tool-help\" tool with name=\"${tool.name}\" to see the exact expected schema.`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Capability safety net at the executor level (defense in depth).\n // Tools declaring dangerous capabilities are subject to stricter\n // permission enforcement in the post-policy block below (line ~150+).\n // In non-YOLO contexts, an `auto` permission is elevated to `confirm`\n // for dangerous-capability tools, reducing prompt-injection blast radius.\n const toolDangerousCaps = getDangerousCapabilities(tool);\n\n // Provider boundary: the model's tool arguments arrive as a raw JSON\n // string accumulated over streamed deltas. When that string is not a\n // valid JSON object (truncated, scalar, or mangled by a proxy/local\n // model), the parsers wrap it under a sentinel key instead of silently\n // producing `{}`. Executing the tool with such input yields a cryptic\n // \"<field> is required\" error that the model can't act on. Detect the\n // sentinel here and feed back an actionable message so the model\n // resends well-formed arguments.\n if (hasMalformedArguments(use.input)) {\n const result = this.malformedInputResult(use, extractMalformedRaw(use.input));\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // PreToolUse hooks: may block the call outright or rewrite its input.\n // Runs before the permission check so a hook can veto a tool that the\n // trust policy would otherwise auto-allow.\n if (this.opts.hookRunner?.has('PreToolUse')) {\n const pre = await this.opts.hookRunner.preToolUse(tool.name, use.input, ctx);\n if (pre.block) {\n const result = this.blockedByHookResult(use, pre.reason);\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n if (pre.input) {\n // P3 #19 (before-release.md): skip the re-validation when the hook\n // passed the input through unchanged. Most hooks either block or\n // return the original input verbatim — re-validating the same shape\n // the executor already validated above is wasted work. Use\n // node:util's isDeepStrictEqual for a structural, order-sensitive\n // comparison (tool inputs are plain JSON, so reference identity is\n // not enough — a hook may clone before returning).\n if (!isDeepStrictEqual(pre.input, use.input)) {\n // A hook rewrote the arguments — re-validate before trusting them.\n const reval = validateAgainstSchema(pre.input, tool.inputSchema);\n if (!reval.ok) {\n const errorDetails = reval.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `A PreToolUse hook rewrote the arguments for \"${tool.name}\" into an invalid shape.\\n\\n` +\n `Validation errors:\\n${errorDetails}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n use = { ...use, input: pre.input };\n }\n }\n }\n\n // P3 #16 (before-release.md): cross-field validation. Called after\n // schema validation and PreToolUse hooks (which may have rewritten\n // the input) but before permission checks and execution. Lets tools\n // express invariants the JSON Schema cannot (e.g. old_string !==\n // new_string) and get them rejected with the same error formatting.\n if (typeof tool.validate === 'function') {\n const crossFieldErrors = tool.validate(use.input);\n if (crossFieldErrors.length > 0) {\n const errorDetails = crossFieldErrors.map((e) => ` - ${e}`).join('\\n');\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n }\n\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\n\n // Post-permission dangerous capability enforcement (B-side guarantee).\n // Even after the permission policy has spoken, we apply an extra conservative\n // rule for tools that declare high-risk capabilities (shell arbitrary, write outside\n // project, mcp proxy, etc.). This reduces the blast radius of prompt injection.\n let effectivePermission = decision.permission;\n\n // YOLO is the user's explicit fast-path for normal project work, so it\n // waives the post-policy dangerous-capability net only after the permission\n // policy has already returned `auto`. Destructive-gated calls still arrive\n // here as `confirm` unless the destructive YOLO override is active. Outside\n // YOLO, a trust-file auto-allow for a shell tool still gets a confirm, so a\n // single trusted pattern can't silently widen into arbitrary shell.\n // Detected via optional methods so policies without them (AutoApprove,\n // test mocks) keep the stricter default.\n const policy = this.opts.permissionPolicy;\n const yolo = policy.getYolo?.() === true || policy.getYoloDestructive?.() === true;\n\n // An `auto` decision sourced from `'yolo'` is authoritative: it comes\n // either from the leader's explicit YOLO mode or from a subagent's\n // `AutoApprovePermissionPolicy`, which already enforces a capability\n // allowlist (and now requires every dangerous capability to be granted\n // explicitly). In both cases the allowlist IS the blast-radius control,\n // so the conservative downgrade below would be redundant — and for a\n // non-interactive subagent (no confirmAwaiter) it would turn a granted\n // write into a `confirm` that can never be answered. Trust-file `auto`\n // (source 'trust') is NOT waived: a single trusted pattern must not\n // silently widen into arbitrary dangerous-capability execution.\n const authoritativeAuto = decision.source === 'yolo';\n\n if (\n toolDangerousCaps.length > 0 &&\n effectivePermission === 'auto' &&\n !yolo &&\n !authoritativeAuto\n ) {\n // Outside yolo we force at least 'confirm' for dangerous-capability tools.\n effectivePermission = 'confirm';\n }\n\n if (effectivePermission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (effectivePermission === 'confirm') {\n if (this.opts.confirmAwaiter) {\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\n if (choice !== 'yes' && choice !== 'always') {\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" denied by user.`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n // fall through to execute\n } else {\n const suggestedPattern = subjectForToolInput(tool.name, use.input, tool.subjectKey) ?? tool.name;\n const pending: ToolConfirmPendingResult = {\n type: 'tool_confirm_pending',\n toolUseId: use.id,\n toolName: tool.name,\n input: use.input,\n suggestedPattern,\n };\n return { result: pending, tool, durationMs: Date.now() - start };\n }\n }\n\n // effectivePermission === 'auto' (after all safety layers)\n // Capability audit for observability.\n const toolCapsForAudit = hasDangerousCapabilityForSubagents(tool)\n ? (tool.capabilities ?? [])\n : [];\n\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\n // adapter or other Tracer is bound — zero overhead by default.\n // Skip JSON.stringify for the common case (no dangerous capabilities)\n // to avoid per-call serialization of a static empty array.\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\n 'tool.name': tool.name,\n 'tool.mutating': tool.mutating,\n 'tool.permission': tool.permission,\n 'tool.capabilities': toolCapsForAudit.length > 0\n ? JSON.stringify(tool.capabilities ?? [])\n : '[]',\n 'tool.has_dangerous_capabilities': toolCapsForAudit.length > 0,\n });\n try {\n // Split produce (async, concurrency-safe) from settle (synchronous,\n // budget-mutating). The long tool run + serialize + scrub + spill\n // happens here and touches no shared budget. The cap is then applied\n // synchronously below against the LIVE budget, so parallel tools\n // settling in sequence share one cumulative cap instead of each\n // reading the same stale starting budget (which let N parallel tools\n // pass N× the cap). Pass the current budget only as a spill-threshold\n // hint, not as the authoritative cap.\n const producedText = await this.produceToolOutput(tool, use, ctx, budget);\n // ── Synchronous settle: no `await` between reading `budget` and\n // writing it back, so two parallel tools can't interleave here.\n let { block: result, bytes } = this.settleToolOutput(tool, use, producedText, budget);\n budget -= bytes;\n // PostToolUse hooks: observe the result and optionally append\n // context (e.g. a linter note) that the model sees alongside the\n // tool output. Append the post-hook bytes to the budget spend\n // without re-walking the full result content.\n if (this.opts.hookRunner?.has('PostToolUse')) {\n const post = await this.opts.hookRunner.postToolUse(\n tool.name,\n use.input,\n { content: String(result.content), isError: !!result.is_error },\n ctx,\n );\n if (post.additionalContext) {\n const appended = `\\n\\n${post.additionalContext}`;\n result = { ...result, content: `${result.content}${appended}` };\n // Only the appended bytes are new — the pre-hook portion was\n // already counted by enforceCap. Walking just the appended\n // tail is `O(additionalContext.length)`, never `O(content)`.\n // Floor at 0 to match `decrementBudget`'s pre-fix clamp.\n budget = Math.max(0, budget - Buffer.byteLength(appended, 'utf8'));\n }\n }\n const outputChars = typeof result.content === 'string' ? result.content.length : 0;\n span?.setAttribute('tool.is_error', !!result.is_error);\n span?.setAttribute('tool.output_bytes', outputChars);\n this.logToolSuccess(ctx, use, tool.name, Date.now() - start, outputChars);\n return { result, tool, durationMs: Date.now() - start };\n } catch (err) {\n // Preserve structured errors on the throw path. A WrongStackError\n // carries `code`, `subsystem`, `severity`, `recoverable`, `context`,\n // and `cause` — flattening it to `err.message` here would lose all of\n // that before the agent loop, audit log, or recovery strategies ever\n // see it. Re-throw so safeRun's catch can render via `describe()` and\n // any outer handler (agent-loop.toWrongStackError, etc.) preserves the\n // structured shape. Bare Errors and primitives keep the old behavior:\n // there's no rich data to preserve, so the user gets a scrubbed\n // tool_result block.\n if (isWrongStackError(err)) {\n if (err instanceof Error) span?.recordError(err);\n span?.setAttribute('tool.is_error', true);\n this.logToolFailure(ctx, use, tool.name, Date.now() - start, err);\n throw err;\n }\n const msg = toErrorMessage(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\n const { category, retryable, detail } = classifyToolError(err);\n this.hintRenderMode(tool.name);\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" threw: ${scrubbed}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n if (err instanceof Error) span?.recordError(err);\n span?.setAttribute('tool.is_error', true);\n span?.setAttribute('tool.error_category', category);\n span?.setAttribute('tool.error_retryable', retryable);\n if (detail) span?.setAttribute('tool.error_detail', detail);\n this.logToolFailure(ctx, use, tool.name, Date.now() - start, err);\n return { result, tool, durationMs: Date.now() - start };\n } finally {\n span?.end();\n }\n };\n\n // Run a single tool but never let an exception propagate to the\n // gather() below — `runOne` is already try/catch-wrapped for the\n // execution phase, but the *pre*-execution paths (permission policy,\n // confirmAwaiter) are unguarded and an unexpected throw there would\n // collapse Promise.all and lose every sibling's output. Wrap each\n // call so a per-tool failure becomes a per-tool error result.\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\n try {\n return await runOne(use);\n } catch (err) {\n // For structured errors, render via describe() so the model and user\n // see `code: message [context...]` instead of just `message`. This is\n // the second half of the structured-error preservation path — the\n // first half is runOne's catch rethrowing instead of flattening.\n // Bare errors keep the old \"execution failed: <scrubbed>\" prefix.\n const isStructured = isWrongStackError(err);\n const msg = isStructured ? err.describe() : toErrorMessage(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\n const { category, retryable, detail } = classifyToolError(err);\n const tool = this.registry.get(use.name);\n const toolName = tool?.name ?? use.name;\n this.hintRenderMode(toolName);\n this.opts.renderer?.writeToolResult(toolName, scrubbed, true);\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: isStructured\n ? scrubbed\n : `Tool \"${use.name}\" execution failed: ${scrubbed}`,\n is_error: true,\n };\n budget = this.budgetForString(result.content, budget);\n // Classification result is stored in the result for future retry logic;\n // span attributes are set in runOne's catch block (this err bubbles from there).\n void category;\n void retryable;\n void detail;\n return { result, tool, durationMs: 0 };\n }\n };\n\n if (strategy === 'sequential') {\n const outputs: ToolExecutionOutput[] = [];\n for (const use of toolUses) {\n if (use) outputs.push(await safeRun(use));\n }\n return { outputs, remainingBudget: budget };\n }\n\n if (strategy === 'parallel') {\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\n return { outputs, remainingBudget: budget };\n }\n\n // smart: non-mutating in parallel, then mutating sequentially\n const nonMutating: ToolUseBlock[] = [];\n const mutating: ToolUseBlock[] = [];\n for (const use of toolUses) {\n if (!use) continue;\n const tool = this.registry.get(use.name);\n if (tool?.mutating) mutating.push(use);\n else nonMutating.push(use);\n }\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\n const secondPass: ToolExecutionOutput[] = [];\n for (const use of mutating) {\n secondPass.push(await safeRun(use));\n }\n return {\n outputs: [...firstPass, ...secondPass],\n remainingBudget: budget,\n };\n }\n\n /**\n * Execute a single tool with timeout, permission check, and output capping.\n * Emits `tool.started` via the injected EventBus (if any) right before\n * invoking the tool — closes the observability gap between \"model decided\n * to call a tool\" and \"tool.executed\".\n */\n async executeTool(\n tool: Tool,\n use: ToolUseBlock,\n ctx: Context,\n budget: number,\n ): Promise<{ block: ToolResultBlock; bytes: number }> {\n const text = await this.produceToolOutput(tool, use, ctx, budget);\n return this.settleToolOutput(tool, use, text, budget);\n }\n\n /**\n * Async \"produce\" phase: run the tool, serialize, scrub, and spill an\n * oversized output to a disk artifact. Returns the pre-cap text. This is\n * the long-running, concurrency-safe part — it touches NO shared budget\n * state, so multiple invocations can run in parallel without racing.\n *\n * The `budgetHint` only gates the disk-spill threshold (a heuristic for\n * \"is this output large enough to persist\"); it is NOT the output cap.\n * The authoritative cap is applied synchronously in settleToolOutput()\n * against the live budget.\n */\n private async produceToolOutput(\n tool: Tool,\n use: ToolUseBlock,\n ctx: Context,\n budgetHint: number,\n ): Promise<string> {\n this.opts.events?.emit('tool.started', {\n sessionId: ctx.session.id,\n name: tool.name,\n id: use.id,\n input: use.input,\n });\n this.opts.renderer?.writeToolCall(tool.name, use.input);\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\n const text = this.serializer.serialize(output, { toolName: tool.name, input: use.input, tool });\n const scrubbed = this.opts.secretScrubber.scrub(text);\n return maybePersistLargeToolOutput(tool.name, scrubbed, budgetHint);\n }\n\n /**\n * Synchronous \"settle\" phase: enforce the output cap against the CURRENT\n * budget, render, and build the result block. This MUST stay synchronous\n * (no awaits) so that, in the parallel/smart strategies, two tools settling\n * one after another against the shared closure budget can't interleave a\n * stale read with a write. The first to settle consumes its bytes; the next\n * settles against the reduced budget; once the budget hits 0, enforceCap\n * truncates — making the per-iteration cap genuinely CUMULATIVE across\n * parallel tools instead of degrading into a per-tool cap.\n */\n private settleToolOutput(\n tool: Tool,\n use: ToolUseBlock,\n text: string,\n budget: number,\n ): { block: ToolResultBlock; bytes: number } {\n // enforceCap already walks the text to compute bytes for the budget\n // cap. Carry the residual budget back as `bytes` so the caller can\n // deduct the spend without a second `Buffer.byteLength` walk — and\n // never falls back to `JSON.stringify` on a structured value.\n const { text: capped, newBudget } = this.serializer.enforceCap(text, budget);\n this.hintRenderMode(tool.name);\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\n return {\n block: {\n type: 'tool_result',\n tool_use_id: use.id,\n name: tool.name,\n content: capped,\n is_error: false,\n },\n // `budget - newBudget` is the exact byte count enforceCap spent\n // (capped at `budget` so a truncated output shows as `budget`\n // consumed, matching the pre-fix `decrementBudget` semantics).\n bytes: budget - newBudget,\n };\n }\n\n private async runWithTimeout(\n tool: Tool,\n input: unknown,\n parentSignal: AbortSignal,\n ctx: Context,\n toolUseId?: string | undefined,\n ): Promise<unknown> {\n if (parentSignal.aborted) {\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\n }\n const timeoutMs = clampTimeoutMs(\n tool.timeoutMs ?? this.iterationTimeoutMs,\n this.maxToolTimeoutMs,\n );\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n const combined = AbortSignal.any([parentSignal, timeoutSignal]);\n\n let output: unknown;\n try {\n // Streaming variant takes precedence — yields progress events, then\n // a final 'final' event with the typed output. Tools that don't\n // implement executeStream fall through to the standard execute path.\n output =\n typeof tool.executeStream === 'function'\n ? await this.runStreamedTool(tool, input, ctx, combined, toolUseId)\n : await tool.execute(input, ctx, { signal: combined });\n } catch (err) {\n // If aborted, run cleanup before re-throwing so the tool can release\n // resources (child processes, file handles, network connections).\n if (combined.aborted) await this.runToolCleanup(tool, input, ctx);\n throw err;\n }\n // The tool returned without throwing, but the signal may have aborted (e.g.\n // a timeout fired) while a tool that ignores the abort signal kept running.\n // Treat that as an abort: clean up and surface the abort to the caller so a\n // late, stale result is never returned as success.\n if (combined.aborted) {\n await this.runToolCleanup(tool, input, ctx);\n throw combined.reason instanceof Error\n ? combined.reason\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'tool timeout');\n }\n return output;\n }\n\n /** Best-effort tool cleanup; never let it mask the original error. */\n private async runToolCleanup(tool: Tool, input: unknown, ctx: Context): Promise<void> {\n if (typeof tool.cleanup !== 'function') return;\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow — never let cleanup mask the original error */\n }\n }\n\n private async runStreamedTool(\n tool: Tool,\n input: unknown,\n ctx: Context,\n signal: AbortSignal,\n toolUseId: string | undefined,\n ): Promise<unknown> {\n let finalOutput: unknown;\n let sawFinal = false;\n if (!tool.executeStream) {\n throw new ToolError({\n message: `Tool \"${tool.name}\" does not support streaming execution`,\n code: 'TOOL_EXECUTION_FAILED',\n toolName: tool.name,\n context: { reason: 'streaming_not_supported' },\n });\n }\n const stream = tool.executeStream(input, ctx, { signal });\n // Manual iteration so we can explicitly close the async iterator after\n // receiving the final event, ensuring any cleanup in the tool's generator\n // finally block runs regardless of whether the engine calls return() on\n // break of a for-await-of loop.\n const iter = stream[Symbol.asyncIterator]();\n // Coalesce `partial_output` progress into at most one EventBus emit per\n // PROGRESS_EMIT_INTERVAL_MS, carrying the most recent PROGRESS_TAIL_CHARS\n // of accumulated text PLUS the first PROGRESS_HEAD_CHARS (the head).\n // P3 #22 (before-release.md): without the head, an important error\n // message at the beginning of a long output (e.g. `pnpm build`) was\n // gone by the time the user saw the live tail. Now both the head and\n // tail survive — when the output exceeds the combined buffer, the flush\n // emits \"head...\\n[...truncated...]\\n...tail\" so subscribers see both\n // ends.\n let progressTail = '';\n let progressHead = '';\n let headComplete = false;\n let lastProgressEmitAt = 0;\n const emitProgress = (ev: ToolProgressEvent) => {\n this.opts.events?.emit('tool.progress', {\n sessionId: ctx.session.id,\n name: tool.name,\n id: toolUseId ?? '<unknown>',\n event: ev,\n });\n };\n const flushProgressTail = (force: boolean) => {\n if (progressTail.length === 0) return;\n const now = Date.now();\n if (!force && now - lastProgressEmitAt < ToolExecutor.PROGRESS_EMIT_INTERVAL_MS) return;\n lastProgressEmitAt = now;\n // On the final force-flush, if we have a head AND tail (output was\n // truncated in the middle), emit both with a truncation marker. On\n // normal coalesced flushes, just emit the tail — matching the\n // pre-P3-#22 per-event behavior.\n let text: string;\n if (force && headComplete && progressTail.length > 0) {\n text = `${progressHead}\\n[...output truncated...]\\n${progressTail}`;\n } else {\n text = progressTail;\n }\n progressTail = '';\n emitProgress({ type: 'partial_output', text });\n };\n try {\n while (true) {\n const { done, value: ev } = await iter.next();\n if (done) break;\n if (ev.type === 'final') {\n finalOutput = ev.output;\n sawFinal = true;\n // Result is locked — stop consuming further events.\n break;\n }\n if (ev.type === 'partial_output' && typeof ev.text === 'string') {\n // P3 #22: accumulate the head (first PROGRESS_HEAD_CHARS) for the\n // final force-flush, while the tail follows the original per-event\n // coalescing behavior. This preserves backward compatibility with\n // tests that expect each partial_output to emit independently,\n // while ensuring long outputs retain their beginning in the final\n // flush.\n if (!headComplete) {\n const remaining = ToolExecutor.PROGRESS_HEAD_CHARS - progressHead.length;\n if (ev.text.length <= remaining) {\n progressHead += ev.text;\n } else {\n progressHead += ev.text.slice(0, remaining);\n headComplete = true;\n }\n }\n progressTail += ev.text;\n if (progressTail.length > ToolExecutor.PROGRESS_TAIL_CHARS) {\n progressTail = progressTail.slice(-ToolExecutor.PROGRESS_TAIL_CHARS);\n }\n flushProgressTail(false);\n continue;\n }\n // Non-partial events (log/warning/metric/file_changed) are low-volume;\n // flush buffered text first so subscribers see events in stream order.\n flushProgressTail(true);\n emitProgress(ev);\n }\n flushProgressTail(true);\n } finally {\n // Always close the iterator so the tool's generator finally block\n // runs even if we broke early on a final event or errored.\n await iter.return?.(undefined);\n }\n if (!sawFinal) {\n throw new ToolError({\n message: `tool \"${tool.name}\" executeStream completed without a 'final' event`,\n code: 'TOOL_EXECUTION_FAILED',\n toolName: tool.name,\n context: { reason: 'missing_final_event' },\n });\n }\n return finalOutput;\n }\n\n private unknownToolResult(use: ToolUseBlock, listFns: () => string[]): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\n is_error: true,\n };\n }\n\n private malformedInputResult(use: ToolUseBlock, raw?: string): ToolResultBlock {\n let content =\n `Tool \"${use.name}\" received arguments that were not a valid JSON object, so they ` +\n `could not be parsed. Re-issue the call with the arguments encoded as a single ` +\n `well-formed JSON object matching the tool's input schema.`;\n // Echo the raw payload back so the model can see *what* it produced and\n // self-correct. Without this the model is blind to its own mistake and\n // tends to resend the identical malformed call in a loop. Common causes:\n // unescaped newlines/quotes/backslashes inside a string field, or the\n // arguments being truncated mid-stream.\n if (raw) {\n const max = 800;\n const excerpt =\n raw.length > max ? `${raw.slice(0, max)}… (truncated, ${raw.length} chars total)` : raw;\n content +=\n ` Common cause: a string field (e.g. code in old_string/new_string) ` +\n `contains literal newlines, quotes, or backslashes that must be JSON-escaped, ` +\n `or the payload was cut off mid-stream. The raw arguments received were:\\n${excerpt}`;\n }\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content,\n is_error: true,\n };\n }\n\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\n is_error: true,\n };\n }\n\n private blockedByHookResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" was blocked by a PreToolUse hook: ${reason ?? 'no reason given'}`,\n is_error: true,\n };\n }\n\n /**\n * Subtract a string-content result's UTF-8 byte length from the\n * iteration output budget. Used for synthesized results (unknown tool,\n * validation error, blocked, threw) where the content is a small\n * string built in the executor. The success path no longer goes\n * through here — `executeTool` carries the exact byte count it spent\n * in its return value, derived from `enforceCap`'s `newBudget`.\n *\n * Floors the result at 0 to match the pre-fix `decrementBudget`\n * semantics (over-budget spends don't underflow the running total).\n */\n private budgetForString(content: string, budget: number): number {\n return Math.max(0, budget - Buffer.byteLength(content, 'utf8'));\n }\n\n}\n\nfunction clampTimeoutMs(timeoutMs: number, maxTimeoutMs: number): number {\n const fallback = 300_000;\n const finiteTimeout = Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : fallback;\n const finiteMax = Number.isFinite(maxTimeoutMs) && maxTimeoutMs > 0 ? maxTimeoutMs : fallback;\n return Math.max(1, Math.min(finiteTimeout, finiteMax));\n}\n\n/**\n * Sentinel keys the provider adapters use to wrap tool arguments that could\n * not be parsed into a proper JSON object. `parseToolInput` (Anthropic /\n * shared) uses `__raw`, `contentFromOpenAI` uses `__raw_arguments`, and the\n * streaming response builder's `safeJsonOrRaw` uses `_raw`.\n *\n * P3 #14 (before-release.md): centralized in `types/tool-markers.ts` so the\n * providers package (which produces these markers) and this executor (which\n * detects them) share a single source of truth. The old \"Keep this list in\n * sync\" comment is gone.\n *\n * NOTE: `parseToolInput` and `safeJsonOrRaw` now attempt JSON repair\n * (auto-closing braces and strings) before wrapping — so a truncated blob\n * like `{\"old_string\": \"line1\\nline2` gets repaired first. The sentinel is\n * only used when repair also fails.\n */\n\nfunction hasMalformedArguments(input: unknown): boolean {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const obj = input as Record<string, unknown>;\n // The sentinel is the *only* key when wrapping occurred — a real tool call\n // that legitimately uses a key named e.g. `_raw` will carry other keys too.\n const keys = Object.keys(obj);\n return keys.length === 1 && MALFORMED_ARG_MARKERS.includes(keys[0] as never);\n}\n\n/**\n * Pull the original (unparseable) payload back out of a sentinel-wrapped input\n * so the executor can echo it to the model. The wrapped value is usually the\n * raw argument string, but a scalar/array that parsed cleanly is wrapped too —\n * stringify those. Returns undefined if nothing usable is present.\n */\nfunction extractMalformedRaw(input: unknown): string | undefined {\n if (!hasMalformedArguments(input)) return undefined;\n const obj = input as Record<string, unknown>;\n const value = obj[expectDefined(Object.keys(obj)[0])];\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nconst TOOL_OUTPUT_ARTIFACT_THRESHOLD_BYTES = 64 * 1024;\n\n/**\n * Classify a tool execution error into a structured ToolErrorCategory.\n * Used for observability (span attributes) and retry strategy decisions.\n */\nexport function classifyToolError(err: unknown): { category: ToolErrorCategory; retryable: boolean; detail?: string } {\n // AbortError — user cancellation, never retry\n if (err instanceof Error && err.name === 'AbortError') {\n return { category: ToolErrorCategoryEnum.FATAL, retryable: false, detail: 'aborted' };\n }\n\n // Node.js ErrnoException with system error codes\n if (err instanceof Error && 'code' in err) {\n const code = (err as NodeJS.ErrnoException).code;\n switch (code) {\n case 'ETIMEDOUT':\n case 'ECONNRESET':\n case 'ECONNREFUSED':\n case 'ENETUNREACH':\n case 'EHOSTUNREACH':\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: code };\n case 'ENOENT':\n case 'ENOTDIR':\n return { category: ToolErrorCategoryEnum.NOT_FOUND, retryable: false, detail: code };\n case 'EACCES':\n case 'EPERM':\n return { category: ToolErrorCategoryEnum.PERMISSION, retryable: false, detail: code };\n case 'EBUSY':\n case 'EMFILE':\n case 'ENFILE':\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: code };\n }\n }\n\n // HTTP response errors (fetch failed with non-OK status).\n // P3 #18 (before-release.md): prefer the structured FetchError subclass\n // (instanceof is reliable) over the duck-typing `'response' in err` check,\n // which catches any Error with a `response` property — custom errors,\n // proxies, mocks. The duck-typing arm stays as a fallback for code that\n // still throws bare Error objects with an ad-hoc `response` field.\n if (err instanceof FetchError) {\n return httpStatusToCategory(err.status);\n }\n if (err instanceof Error && 'response' in err) {\n const response = (err as { response: { status?: number } }).response;\n const status = response?.status;\n if (status !== undefined) {\n return httpStatusToCategory(status);\n }\n }\n\n // Validation errors. Prefer the structured ValidationError subclass\n // (P2 #6) — instanceof is locale-independent and cannot misclassify an\n // unrelated error whose message happens to contain \"validation\". The\n // legacy string-match arm stays as a fallback for tools that still throw\n // bare Error('...validation...') and have not yet migrated.\n if (err instanceof ToolValidationError) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: 'validation' };\n }\n if (err instanceof Error && err.message.includes('validation')) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: 'validation' };\n }\n\n // Structured WrongStackError catch-all: any error that is a WrongStackError\n // subclass (FsError, SessionError, ConfigError, ParseError, PluginError,\n // AgentError, etc.) but wasn't matched by the FetchError or\n // ToolValidationError arms above. Route by severity + recoverability:\n // fatal → FATAL (abort the loop)\n // error → FATAL (surface to the user, don't retry)\n // warning → TRANSIENT (log and continue; the subsystem flagged it as\n // recoverable so the loop can proceed)\n if (err instanceof WrongStackError) {\n const wse = err as WrongStackError;\n const category =\n wse.severity === 'warning'\n ? ToolErrorCategoryEnum.TRANSIENT\n : ToolErrorCategoryEnum.FATAL;\n return {\n category,\n retryable: wse.recoverable,\n detail: `${wse.code} [${wse.subsystem}]`,\n };\n }\n\n // Default: fatal/unclassified\n return {\n category: ToolErrorCategoryEnum.FATAL,\n retryable: false,\n detail: err instanceof Error ? err.message.slice(0, 100) : String(err).slice(0, 100),\n };\n}\n\n/**\n * Map an HTTP status code to a ToolErrorCategory. Shared by the FetchError\n * and duck-typed-response paths in classifyToolError.\n */\nfunction httpStatusToCategory(status: number): { category: ToolErrorCategory; retryable: boolean; detail: string } {\n if (status === 429 || status === 503 || status === 502 || status === 504) {\n return { category: ToolErrorCategoryEnum.TRANSIENT, retryable: true, detail: `HTTP ${status}` };\n }\n if (status === 404 || status === 410) {\n return { category: ToolErrorCategoryEnum.NOT_FOUND, retryable: false, detail: `HTTP ${status}` };\n }\n if (status === 401 || status === 403) {\n return { category: ToolErrorCategoryEnum.PERMISSION, retryable: false, detail: `HTTP ${status}` };\n }\n if (status === 400) {\n return { category: ToolErrorCategoryEnum.VALIDATION, retryable: false, detail: `HTTP ${status}` };\n }\n return { category: ToolErrorCategoryEnum.FATAL, retryable: false, detail: `HTTP ${status}` };\n}\n\nasync function maybePersistLargeToolOutput(\n toolName: string,\n content: string,\n budget: number,\n): Promise<string> {\n const bytes = Buffer.byteLength(content, 'utf8');\n if (bytes <= Math.min(TOOL_OUTPUT_ARTIFACT_THRESHOLD_BYTES, Math.max(0, budget))) {\n return content;\n }\n\n try {\n const dir = path.join(wstackGlobalRoot(), 'tool-output');\n await fs.mkdir(dir, { recursive: true });\n const safeTool = toolName.replace(/[^a-zA-Z0-9._-]+/g, '_').slice(0, 40) || 'tool';\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filePath = path.join(dir, `${stamp}-${safeTool}-${randomUUID()}.log`);\n await fs.writeFile(filePath, content, 'utf8');\n return (\n content +\n `\\n[full tool output: ${bytes} bytes at ${filePath}; read/grep that file selectively instead of re-running or requesting more output]`\n );\n } catch {\n return content;\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport { computeMessageTokens } from '../utils/token-estimate.js';\nimport type { Context, TodoItem } from './context.js';\n\n/**\n * Observable wrapper for mutable conversation state. Production code should\n * mutate messages, todos, and meta through this API so subscribers see a\n * deterministic change stream. The underlying Context arrays are still\n * exposed for read compatibility and legacy tests.\n *\n * L1-A invariant: direct mutations of `ctx.messages` / `ctx.todos` bypass\n * the observer layer. Prefer `ctx.state.appendMessage()` etc. to keep\n * subscribers in sync. The compatibility arrays exist so existing code\n * that reads `ctx.messages` directly still works — they are NOT safe for\n * external writes.\n */\nexport type StateChange =\n | { kind: 'message_appended'; message: Message }\n | { kind: 'messages_replaced'; messages: readonly Message[] }\n | { kind: 'message_updated'; index: number; message: Message }\n | { kind: 'todos_replaced'; todos: readonly TodoItem[] }\n | { kind: 'meta_set'; key: string; value: unknown }\n | { kind: 'meta_deleted'; key: string }\n | { kind: 'meta_cleared' };\n\nexport type StateChangeHandler = (change: StateChange, state: ConversationState) => void;\n\nexport interface ReadonlyConversationState {\n readonly messages: readonly Message[];\n readonly todos: readonly TodoItem[];\n readonly meta: Readonly<Record<string, unknown>>;\n}\n\nexport class ConversationState {\n private readonly ctx: Context;\n private readonly listeners = new Set<StateChangeHandler>();\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n\n get messages(): readonly Message[] {\n return this.ctx.messages;\n }\n\n get todos(): readonly TodoItem[] {\n return this.ctx.todos;\n }\n\n get meta(): Readonly<Record<string, unknown>> {\n return this.ctx.meta;\n }\n\n /**\n * Cheap immutable snapshot. Useful for tests and for compaction passes\n * that need a stable view across an async boundary.\n *\n * Uses shallow-freeze instead of deep-freeze: only the wrapper object\n * and the three content arrays are frozen. Individual message/todo\n * objects are NOT recursively frozen — they are reconstructed via\n * spread copies and are immutable by convention. This cuts the freeze\n * count from O(n·m·d) (n=messages, m=content blocks, d=depth) to O(1).\n */\n snapshot(): ReadonlyConversationState {\n const snap = {\n messages: [...this.ctx.messages],\n todos: [...this.ctx.todos],\n meta: { ...this.ctx.meta },\n };\n Object.freeze(snap.messages);\n Object.freeze(snap.todos);\n Object.freeze(snap.meta);\n return Object.freeze(snap) as ReadonlyConversationState;\n }\n\n appendMessage(message: Message): void {\n // Pre-compute token estimate once at mutation time so every downstream\n // estimateMessageTokens / estimateRequestTokens call is an O(1) sum\n // instead of re-walking the content blocks on every invocation.\n if (message._estTokens === undefined) {\n message._estTokens = computeMessageTokens(message);\n }\n this.ctx.messages.splice(this.ctx.messages.length, 0, message);\n this.emit({ kind: 'message_appended', message });\n }\n\n /**\n * Append a content block to the trailing user message's content array.\n * Mutates only that one message (a single indexed assignment) — avoids\n * the O(n) array copy + token-cache re-walk that `replaceMessages()`\n * would do for a single-message edit. Used by the agent loop to fold\n * btw-notes / queued-mailbox blocks into the conversation.\n *\n * The block is folded only into a *user* message (preserves\n * user/assistant alternation between tool batches). Returns false when\n * there is no trailing user message to fold into — callers should\n * `appendMessage({ role: 'user', content: [block] })` instead.\n */\n appendBlockToLastUserMessage(block: ContentBlock): boolean {\n const arr = this.ctx.messages;\n const last = arr[arr.length - 1];\n if (!last || last.role !== 'user') return false;\n const content: ContentBlock[] =\n typeof last.content === 'string'\n ? [{ type: 'text', text: last.content }, block]\n : [...last.content, block];\n // Replace only the trailing message object — O(1), no full-array copy.\n // Recompute the token estimate for the one changed message; everything\n // else in the array is untouched and its cache stays valid.\n const updated: Message = { ...last, content, _estTokens: computeMessageTokens({ ...last, content }) };\n arr[arr.length - 1] = updated;\n // Text/informational blocks never carry tool_use/tool_result, so\n // toolAdjacencyDirty is unaffected — no need to set it here.\n this.emit({ kind: 'message_updated', index: arr.length - 1, message: updated });\n return true;\n }\n\n replaceMessages(messages: Message[]): void {\n // M1 (combined with the existing _estTokens loop): single pass over the\n // replacement messages that handles per-message token estimation AND\n // tool-block detection for the adjacency-dirty flag. The previous\n // implementation did a separate `messages.some(m => m.content.some(...))`\n // walk — a second O(n·m) pass that the first loop can absorb with a\n // tiny amount of extra state. For 200 messages with a 5-block average\n // this halves the work done here.\n let hasToolBlock = false;\n for (const m of messages) {\n if (m._estTokens === undefined) {\n m._estTokens = computeMessageTokens(m);\n // Scan for tool blocks only while already walking content to compute\n // tokens — avoids a separate O(n·m) pass over already-cached messages.\n // The `!hasToolBlock` guard on the outer loop skips messages after the\n // first tool block is found, so worst case is one full content scan.\n if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'tool_use' || b.type === 'tool_result') {\n hasToolBlock = true;\n break;\n }\n }\n }\n }\n }\n // In-place replacement without array spread to avoid a temporary\n // allocation of 200+ elements on large compaction rewrites.\n // When messages.length > arr.length, JavaScript auto-extends the array\n // on indexed assignment (arr[i] = val where i >= arr.length sets\n // arr.length = i + 1 per ECMAScript §9.4.2.1).\n const arr = this.ctx.messages;\n if (messages.length < arr.length) {\n arr.length = messages.length;\n }\n for (let i = 0; i < messages.length; i++) {\n arr[i] = messages[i]!;\n }\n\n // Mark adjacency dirty when the replacement contains tool-use\n // blocks — the next request pipeline must re-check adjacency.\n // Without this, replaceMessages() can silently skip repair when\n // it introduces or modifies tool_use/tool_result pairs (e.g. test\n // setup, agent-loop content rewrite).\n if (hasToolBlock) {\n this.ctx.toolAdjacencyDirty = true;\n }\n\n this.emit({ kind: 'messages_replaced', messages: [...messages] });\n }\n\n replaceTodos(todos: TodoItem[]): void {\n // Auto-clear: when every item is completed and the list is non-empty,\n // the board has served its purpose. Treat it as a clear signal so the\n // user doesn't have to manually `/todos clear` after each task.\n const allDone = todos.length > 0 && todos.every((t) => t.status === 'completed');\n const effective = allDone ? [] : todos;\n\n this.ctx.todos.length = 0;\n this.ctx.todos.splice(0, 0, ...effective);\n this.emit({ kind: 'todos_replaced', todos: [...effective] });\n }\n\n setMeta(key: string, value: unknown): void {\n this.ctx.meta[key] = value;\n this.emit({ kind: 'meta_set', key, value });\n }\n\n deleteMeta(key: string): void {\n if (!(key in this.ctx.meta)) return;\n delete this.ctx.meta[key];\n this.emit({ kind: 'meta_deleted', key });\n }\n\n clearMeta(): void {\n const keys = Object.keys(this.ctx.meta);\n if (keys.length === 0) return;\n for (const key of keys) delete this.ctx.meta[key];\n this.emit({ kind: 'meta_cleared' });\n }\n\n /**\n * Subscribe to mutations that go through this wrapper. Direct mutations of\n * the compatibility arrays are intentionally not observed.\n */\n onChange(listener: StateChangeHandler): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private emit(change: StateChange): void {\n for (const h of this.listeners) {\n try {\n h(change, this);\n } catch {\n // Listeners are observational only; one bad subscriber must not\n // prevent state mutation or block sibling listeners.\n }\n }\n }\n}\n\n/**\n * Convenience constructor. The wrapper holds a reference, not a copy.\n */\nexport function wrapAsState(ctx: Context): ConversationState {\n return new ConversationState(ctx);\n}\n","import * as path from 'node:path';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Usage } from '../types/provider.js';\nimport type { SessionWriter } from '../types/session.js';\nimport type { ContextEvidenceState } from '../types/context-evidence.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { Tool } from '../types/tool.js';\nimport { createContextEvidenceState } from '../utils/context-evidence.js';\nimport { ConversationState } from './conversation-state.js';\nimport type { RunEnv } from './run-env.js';\n\nexport interface TodoItem {\n id: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm?: string | undefined;\n /** When promoted from a plan item, stores the plan item's id. */\n promotedFromPlan?: string | undefined;\n /** When promoted from a task, stores the task's id. */\n promotedFromTask?: string | undefined;\n}\n\nexport interface RunOptions {\n signal?: AbortSignal | undefined;\n model?: string | undefined;\n executionStrategy?: 'parallel' | 'sequential' | 'smart' | undefined;\n maxIterations?: number | undefined;\n /**\n * Enable autonomous continue for this specific run. When true, the agent\n * loop re-runs on `[continue]`/`[next step]`/`[proceed]` markers or\n * `continue_to_next_iteration()` tool calls instead of returning.\n * Overrides `AgentInit.autonomousContinue` for this call only.\n */\n autonomousContinue?: boolean | undefined;\n}\n\nexport interface ContextInit {\n systemPrompt: TextBlock[];\n provider: Provider;\n session: SessionWriter;\n signal: AbortSignal;\n tokenCounter: TokenCounter;\n cwd: string;\n projectRoot: string;\n /** Mutable working directory. Defaults to `cwd`. Must stay within `projectRoot`. */\n workingDir?: string | undefined;\n /**\n * When false, file tools and `setWorkingDir()` are confined to `projectRoot`.\n * Defaults to `false` (restrictive) when omitted so directly-constructed\n * contexts (tests, embedded callers) keep the safe behavior; the runtime\n * passes the config-derived value (default `true` — permissive) explicitly.\n */\n allowOutsideProjectRoot?: boolean | undefined;\n model: string;\n tools?: Tool[] | undefined;\n /** Agent id performing this run (e.g. 'leader', 'executor', 'tech-stack'). */\n agentId?: string | undefined;\n /** Human-readable agent name. */\n agentName?: string | undefined;\n /**\n * Session-level trace ID for correlating storage events with agent\n * iterations in observability pipelines. Stored on the SessionWriter\n * so that storage operations can emit it in `storage.*` events.\n * When set, the Context constructor propagates it to\n * `session.traceId` automatically.\n */\n traceId?: string | undefined;\n}\n\n/**\n * L1-A: `Context` is the live agent-run object. Its read-only environment\n * shape is exposed by the `RunEnv` interface (every field below the\n * conversation state) and its mutable shape by `ConversationState` (the\n * `state` accessor). New code should declare the narrower type at its\n * parameter — pass `ctx` for it. Existing tools that accept `Context`\n * still work because `Context` structurally satisfies both.\n *\n * The single source of truth for the project directory is `projectRoot`.\n * All tools (read/write/bash/exec) resolve paths relative to this.\n * Sessions, config, memory, and logs are also stored under this root.\n *\n * There IS a mutable `workingDir` (separate from `projectRoot`) that can be\n * changed at runtime via `setWorkingDir()`. It starts as `cwd` and allows\n * the agent and user to navigate within the project without spawning a new\n * process. All changes must stay inside `projectRoot`.\n */\nexport class Context implements RunEnv {\n messages: Message[] = [];\n todos: TodoItem[] = [];\n /**\n * Files whose content the **user / model has explicitly seen** via the\n * `read` tool (or an edit's auto-read, which surfaces the content to the\n * model). This is the set the permission policy's write-smart-bypass\n * (step 7) checks — writing a file the model has already read is treated\n * as \"no new content to approve\". It must NEVER contain files only touched\n * by `edit`/`write`, otherwise the model could repeatedly overwrite a file\n * whose content the user never saw (P1 #1, before-release.md).\n *\n * Tool-driven mutations record via `writtenFiles` + `recordRead(..., 'write')`\n * so mtime tracking still works without widening the bypass.\n */\n readFiles = new Set<string>();\n /**\n * Files written by `edit`/`write` in this session. Tracked for observability\n * and to keep `readFiles` (the permission-bypass source of truth) clean.\n * `recordRead(path, mtime, 'write')` adds here instead of `readFiles`.\n */\n writtenFiles = new Set<string>();\n fileMtimes = new Map<string, number>();\n /**\n * Structured side-effect records accumulated during the current run\n * (P2 #5). Populated by `recordSideEffect()` — read by /diag for an\n * in-memory audit trail without parsing the JSONL file. Cleared by\n * `clearFileTracking()` alongside read/written-file tracking.\n */\n sideEffects: import('../types/side-effect.js').SideEffect[] = [];\n contextEvidence: ContextEvidenceState = createContextEvidenceState();\n systemPrompt: TextBlock[];\n provider: Provider;\n session: SessionWriter;\n signal: AbortSignal;\n tokenCounter: TokenCounter;\n cwd: string;\n projectRoot: string;\n /** Mutable working directory — starts as `cwd`. Change via `setWorkingDir()`. */\n workingDir: string;\n /**\n * When true, file tools (via `_util.ts`) and `setWorkingDir()` reject paths\n * outside `projectRoot`. When false, those boundary checks are bypassed so\n * tools may reach paths outside the project (still gated by permission\n * tiers). Mutable so `/settings` can toggle it live on the running session.\n */\n allowOutsideProjectRoot: boolean;\n model: string;\n tools: Tool[] = [];\n meta: Record<string, unknown> = {};\n /** Agent id performing this run (e.g. 'leader', 'executor'). */\n agentId: string;\n /** Human-readable agent name. */\n agentName: string;\n /**\n * Session-level trace ID for correlating storage events with agent\n * iterations. Stored here and also propagated to `session.traceId`\n * so storage operations can include it in `storage.*` events.\n */\n traceId: string | undefined;\n\n /** Callbacks fired when `setWorkingDir()` changes the working directory. */\n private _onWorkingDirChanged: Array<(newDir: string, oldDir: string) => void> = [];\n\n /**\n * Set to true when the conversation gains new tool_use or tool_result\n * blocks — the only time repairToolUseAdjacency() can find new issues.\n * buildAndRunRequestPipeline() checks this flag to skip an O(n) scan\n * on iterations where no tool content was added (pure text responses).\n */\n toolAdjacencyDirty = false;\n\n /**\n * H1: pre-computed total-request token estimate from the most recent\n * `estimateRequestTokens()` call in the agent loop's pre-flight step.\n * The middleware that decides when to compact, the `emitContextPct`\n * helper that drives the live context-fill bar, and the pre-flight\n * itself all need this number; previously each one walked the same\n * messages/system/tools arrays independently. Stashing it here lets\n * the three call sites share a single compute per iteration.\n *\n * The value is the **uncalibrated** total. Callers that want the\n * calibrated number apply the per-(provider,model) ratio themselves.\n */\n lastRequestTokens: number | undefined = undefined;\n\n constructor(init: ContextInit) {\n this.systemPrompt = init.systemPrompt;\n this.provider = init.provider;\n this.session = init.session;\n this.signal = init.signal;\n this.tokenCounter = init.tokenCounter;\n this.cwd = init.cwd;\n this.projectRoot = init.projectRoot;\n this.workingDir = init.workingDir ?? init.cwd;\n this.allowOutsideProjectRoot = init.allowOutsideProjectRoot ?? false;\n this.model = init.model;\n this.tools = init.tools ?? [];\n this.agentId = init.agentId ?? 'unknown';\n this.agentName = init.agentName ?? 'Unknown Agent';\n this.traceId = init.traceId;\n this.allowOutsideProjectRoot = init.allowOutsideProjectRoot ?? false;\n // Propagate traceId to the SessionWriter so storage operations\n // can read it without needing a direct handle on the Context.\n this.session.traceId = init.traceId;\n }\n\n /**\n * Observable wrapper over the mutable conversation state. Lazy so\n * subsystems that don't subscribe pay nothing. Mutations made directly\n * on `ctx.messages` / `ctx.todos` are still visible through this\n * wrapper's read API (it holds a reference, not a copy) but only\n * mutations that go through `state.appendMessage()` etc. fire\n * `onChange`. New code should prefer the wrapper API.\n */\n private _state: ConversationState | null = null;\n get state(): ConversationState {\n if (!this._state) this._state = new ConversationState(this);\n return this._state;\n }\n\n /**\n * Register a teardown hook tied to the current run's abort signal.\n * Hooks registered before a run starts are stored and fired when the\n * next run ends; there is no immediate fire when no run is active.\n *\n * **Scope:** these hooks fire on the **whole agent run's** abort, not on\n * an individual tool call. For per-tool teardown of resources owned by\n * the tool author (child processes, handles), prefer `Tool.cleanup` —\n * see its JSDoc for the full rule.\n */\n private abortHooks = new Set<() => void | Promise<void>>();\n registerAbortHook(fn: () => void | Promise<void>): () => void {\n this.abortHooks.add(fn);\n return () => this.abortHooks.delete(fn);\n }\n async drainAbortHooks(): Promise<void> {\n const snapshot = [...this.abortHooks].reverse();\n // Clear before running so new hooks registered during iteration\n // fire on the next abort cycle (not the current one — hook chains\n // are intentionally not supported).\n this.abortHooks.clear();\n for (const fn of snapshot) {\n try {\n await fn();\n } catch {\n // hooks must be best-effort; swallow so siblings still fire\n }\n }\n }\n\n /**\n * Record that a file's content was seen / mtime was observed.\n *\n * `source` controls which tracking set is populated — and therefore whether\n * the permission policy's write-smart-bypass (step 7) will auto-approve a\n * subsequent `write` to this path:\n *\n * - `'user'` (default): the model/user saw the content (via `read`, or an\n * edit's auto-read that surfaced it). Adds to `readFiles` → bypass applies.\n * - `'write'`: a tool wrote the file (`edit`/`write`) and is recording the\n * new mtime so subsequent edits detect external modification. Adds to\n * `writtenFiles` only — the bypass does NOT apply, because the user never\n * approved the new content (P1 #1, before-release.md).\n *\n * `fileMtimes` is updated in both cases so mtime-based staleness checks work.\n */\n recordRead(absPath: string, mtimeMs: number, source: 'user' | 'write' = 'user'): void {\n this.fileMtimes.set(absPath, mtimeMs);\n if (source === 'write') {\n this.writtenFiles.add(absPath);\n } else {\n this.readFiles.add(absPath);\n }\n }\n\n /** Clear accumulated file-read metadata after compaction or at boundaries\n * where stale read history could cause tools to skip legitimate re-reads.\n * The agent re-populates this naturally on the next file access. */\n clearFileTracking(): void {\n this.readFiles.clear();\n this.writtenFiles.clear();\n this.fileMtimes.clear();\n this.sideEffects = [];\n }\n\n /**\n * Record a structured side effect for the audit trail (P2 #5).\n * Called by tools that perform non-filesystem mutations (bash, install,\n * fetch) so /diag and session replay can show what the agent did beyond\n * file edits.\n *\n * Unlike recordFileChange(), this does NOT support undo — it is purely\n * for observability and audit. The event is appended to the session\n * JSONL fire-and-forget; errors are swallowed so recording never blocks\n * tool execution.\n */\n recordSideEffect(sideEffect: import('../types/side-effect.js').SideEffect): void {\n this.sideEffects.push(sideEffect);\n this.session.append({\n type: 'side_effect',\n ts: sideEffect.ts,\n toolUseId: sideEffect.toolUseId,\n toolName: sideEffect.toolName,\n input: sideEffect.input,\n outcome: sideEffect.outcome,\n risk: sideEffect.risk,\n }).catch(() => { /* best-effort — never block tool execution */ });\n }\n\n /**\n * True if the model/user has explicitly seen this file's content via `read`\n * (or an edit auto-read). Tool-only writes (`source: 'write'`) do NOT count\n * — this is the source of truth for the permission policy's write bypass.\n */\n hasRead(absPath: string): boolean {\n return this.readFiles.has(absPath);\n }\n\n /** True if `edit`/`write` wrote this file in the current session. */\n hasWritten(absPath: string): boolean {\n return this.writtenFiles.has(absPath);\n }\n\n lastReadMtime(absPath: string): number | undefined {\n return this.fileMtimes.get(absPath);\n }\n\n /**\n * Change the working directory for path resolution. Resolves relative paths\n * against `projectRoot` and validates the result is within the project root.\n * Fires all registered `onWorkingDirChanged` callbacks.\n * Returns the resolved absolute path.\n */\n setWorkingDir(dir: string): string {\n const resolved = path.isAbsolute(dir)\n ? path.resolve(dir)\n : path.resolve(this.projectRoot, dir);\n\n // Validate containment within projectRoot — unless filesystem access is\n // unrestricted, in which case the working dir may leave the project root.\n if (!this.allowOutsideProjectRoot) {\n const root = path.resolve(this.projectRoot);\n const rel = path.relative(root, resolved);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(\n `Working directory \"${resolved}\" is outside project root \"${root}\"`,\n );\n }\n }\n\n const old = this.workingDir;\n this.workingDir = resolved;\n // Fire callbacks (catch errors so one bad listener doesn't break others)\n for (const cb of this._onWorkingDirChanged) {\n try { cb(resolved, old); } catch { /* best-effort */ }\n }\n return resolved;\n }\n\n /**\n * Register a callback that fires when the working directory changes.\n * Returns an unsubscribe function. Callbacks are fired synchronously\n * inside `setWorkingDir()` — errors in callbacks are swallowed so one\n * bad listener doesn't prevent others from executing.\n */\n onWorkingDirChanged(cb: (newDir: string, oldDir: string) => void): () => void {\n this._onWorkingDirChanged.push(cb);\n return () => {\n const idx = this._onWorkingDirChanged.indexOf(cb);\n if (idx >= 0) this._onWorkingDirChanged.splice(idx, 1);\n };\n }\n\n usage(): Usage {\n return this.tokenCounter.total();\n }\n}\n","import * as fs from 'node:fs/promises';\nimport { expectDefined } from '../utils/expect-defined.js';\nimport type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\nimport { sessionScopedPath } from '../utils/session-scoped-path.js';\nimport type { SessionData, SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n private readonly eventCache = new Map<string, SessionData>();\r\n private readonly eventCacheMtimes = new Map<string, number>();\r\n private static readonly EVENT_CACHE_MAX_ENTRIES = 32;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n private async loadCachedSessionData(sessionId: string): Promise<SessionData> {\r\n const storeWithPath = this.store as SessionStore & {\r\n dir?: string | undefined;\r\n clearLoadCache?: ((sessionId?: string | undefined) => void) | undefined;\r\n };\r\n const rootDir = storeWithPath.dir;\r\n if (!rootDir) {\r\n return await this.store.load(sessionId);\r\n }\r\n const sessionPath = sessionScopedPath(rootDir, sessionId, '.jsonl');\n let mtimeMs: number | null = null;\r\n try {\r\n const stat = await fs.stat(sessionPath);\r\n mtimeMs = stat.mtimeMs;\r\n } catch {\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n return await this.store.load(sessionId);\r\n }\r\n\r\n const cachedMtime = this.eventCacheMtimes.get(sessionId);\r\n const cachedData = this.eventCache.get(sessionId);\r\n if (cachedData && cachedMtime === mtimeMs) {\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n this.eventCache.set(sessionId, cachedData);\r\n this.eventCacheMtimes.set(sessionId, mtimeMs);\r\n return cachedData;\r\n }\r\n\r\n const data = await this.store.load(sessionId);\r\n this.eventCache.delete(sessionId);\r\n this.eventCacheMtimes.delete(sessionId);\r\n this.eventCache.set(sessionId, data);\r\n this.eventCacheMtimes.set(sessionId, mtimeMs);\r\n while (this.eventCache.size > DefaultSessionReader.EVENT_CACHE_MAX_ENTRIES) {\r\n const oldest = this.eventCache.keys().next().value;\r\n if (oldest === undefined) break;\r\n this.eventCache.delete(oldest);\r\n this.eventCacheMtimes.delete(oldest);\r\n }\r\n\r\n if (data.metadata.endedAt) {\r\n storeWithPath.clearLoadCache?.(sessionId);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n // Prefer the store's filtered list when available — it pushes the\r\n // filter into the cached index instead of fetching 1000 + linear scan.\r\n const storeWithFilter = this.store as SessionStore & {\r\n listFiltered?: ((criteria: {\r\n since?: string | undefined;\r\n until?: string | undefined;\r\n provider?: string | undefined;\r\n model?: string | undefined;\r\n minTokens?: number | undefined;\r\n titleContains?: string | undefined;\r\n limit?: number | undefined;\r\n }) => Promise<import('../types/session.js').SessionSummary[]>) | undefined;\r\n };\r\n let raw: import('../types/session.js').SessionSummary[];\r\n if (typeof storeWithFilter.listFiltered === 'function') {\r\n raw = await storeWithFilter.listFiltered({\r\n since: q.since,\r\n until: q.until,\r\n provider: q.provider,\r\n model: q.model,\r\n minTokens: q.minTokens,\r\n titleContains: q.titleContains,\r\n limit: q.limit,\r\n });\r\n } else {\r\n const fetched = await this.store.list(q.limit ? Math.max(q.limit, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n raw = fetched.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n }\r\n const out: SessionSummaryLite[] = raw.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string | undefined, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE scanning events — avoids touching the JSONL\r\n // for sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n // Prefer the store's filtered list when available — avoids fetching\r\n // 1000 sessions and linear-filtering in-process.\r\n const storeWithFilter = this.store as SessionStore & {\r\n listFiltered?: ((criteria: {\r\n since?: string | undefined;\r\n until?: string | undefined;\r\n provider?: string | undefined;\r\n model?: string | undefined;\r\n minTokens?: number | undefined;\r\n titleContains?: string | undefined;\r\n limit?: number | undefined;\r\n }) => Promise<import('../types/session.js').SessionSummary[]>) | undefined;\r\n };\r\n let sessions: import('../types/session.js').SessionSummary[];\r\n if (typeof storeWithFilter.listFiltered === 'function') {\r\n sessions = await storeWithFilter.listFiltered({\r\n since: sessionQuery?.since,\r\n until: sessionQuery?.until,\r\n provider: sessionQuery?.provider,\r\n model: sessionQuery?.model,\r\n minTokens: sessionQuery?.minTokens,\r\n titleContains: sessionQuery?.titleContains,\r\n limit: 1000,\r\n });\r\n } else {\r\n sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n sessions = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n }\r\n ids = sessions.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n\r\n // Fast path: when the underlying store supports streaming search,\r\n // walk each session's JSONL line-by-line and bail out the moment we\r\n // hit `limit`. This avoids reading + parsing the entire file (which\r\n // `load()` does) and never reuses `_loadCache`, so concurrent\r\n // analytics queries don't churn the writer-side cache.\r\n const streaming = this.store.searchEvents?.bind(this.store);\r\n if (streaming) {\r\n for (const id of ids) {\r\n const matched = await streaming(\r\n id,\r\n (ev) => {\r\n if (allowedTypes && !allowedTypes.has(ev.type)) return false;\r\n const text = eventText(ev);\r\n if (text === null) return false;\r\n return matcher(text) !== null;\r\n },\r\n { limit: limit - hits.length },\r\n );\r\n for (const m of matched) {\r\n const text = expectDefined(eventText(m.event));\r\n const hit = expectDefined(matcher(text));\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: m.eventIndex,\r\n ts: m.ts,\r\n type: m.event.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n // Fallback: stores that don't implement streaming. Loads the full\r\n // event stream per session — necessary for in-memory or non-file\r\n // stores that don't expose a streaming surface.\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.loadCachedSessionData(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = expectDefined(data.events[i]);\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.loadCachedSessionData(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n"]}
|