@wrongstack/core 0.1.10 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/{agent-bridge-6KPqsFx6.d.ts → agent-bridge-C3DUGjSb.d.ts} +1 -1
  2. package/dist/{compactor-B4mQZXf2.d.ts → compactor-BUU6Zm_3.d.ts} +1 -1
  3. package/dist/{config-BU9f_5yH.d.ts → config-CKLYPkCi.d.ts} +1 -1
  4. package/dist/{context-BmM2xGUZ.d.ts → context-IovtuTf8.d.ts} +10 -0
  5. package/dist/coordination/index.d.ts +211 -13
  6. package/dist/coordination/index.js +964 -67
  7. package/dist/coordination/index.js.map +1 -1
  8. package/dist/defaults/index.d.ts +33 -18
  9. package/dist/defaults/index.js +1273 -42
  10. package/dist/defaults/index.js.map +1 -1
  11. package/dist/{events-BMNaEFZl.d.ts → events-CNB9PALO.d.ts} +99 -1
  12. package/dist/execution/index.d.ts +12 -12
  13. package/dist/extension/index.d.ts +9 -0
  14. package/dist/extension/index.js +234 -0
  15. package/dist/extension/index.js.map +1 -0
  16. package/dist/index-BDb0cAMP.d.ts +806 -0
  17. package/dist/index.d.ts +112 -29
  18. package/dist/index.js +2036 -490
  19. package/dist/index.js.map +1 -1
  20. package/dist/infrastructure/index.d.ts +6 -6
  21. package/dist/kernel/index.d.ts +12 -9
  22. package/dist/kernel/index.js +73 -7
  23. package/dist/kernel/index.js.map +1 -1
  24. package/dist/{mcp-servers-Dzgg4x1w.d.ts → mcp-servers-DR35ojJZ.d.ts} +3 -3
  25. package/dist/models/index.d.ts +2 -2
  26. package/dist/models/index.js +24 -1
  27. package/dist/models/index.js.map +1 -1
  28. package/dist/{multi-agent-fmkRHtof.d.ts → multi-agent-B9a6sflH.d.ts} +71 -3
  29. package/dist/observability/index.d.ts +2 -2
  30. package/dist/{path-resolver-DBjaoXFq.d.ts → path-resolver-Cl_q0u-R.d.ts} +2 -2
  31. package/dist/provider-runner-BXuADQqQ.d.ts +36 -0
  32. package/dist/sdd/index.d.ts +3 -3
  33. package/dist/{secret-scrubber-CicHLN4G.d.ts → secret-scrubber-CgG2tV2B.d.ts} +1 -1
  34. package/dist/{secret-scrubber-DF88luOe.d.ts → secret-scrubber-Cuy5afaQ.d.ts} +1 -1
  35. package/dist/security/index.d.ts +20 -4
  36. package/dist/security/index.js +37 -2
  37. package/dist/security/index.js.map +1 -1
  38. package/dist/{selector-BbJqiEP4.d.ts → selector-wT2fv9Fg.d.ts} +1 -1
  39. package/dist/{session-reader-Drq8RvJu.d.ts → session-reader-CcPi4BQ8.d.ts} +1 -1
  40. package/dist/{skill-DhfSizKv.d.ts → skill-C_7znCIC.d.ts} +2 -2
  41. package/dist/storage/index.d.ts +164 -6
  42. package/dist/storage/index.js +297 -2
  43. package/dist/storage/index.js.map +1 -1
  44. package/dist/{renderer-rk_1Swwc.d.ts → system-prompt-Dk1qm8ey.d.ts} +30 -2
  45. package/dist/{tool-executor-CpuJPYm9.d.ts → tool-executor-DKu4A6nB.d.ts} +5 -5
  46. package/dist/types/index.d.ts +16 -16
  47. package/dist/types/index.js +24 -1
  48. package/dist/types/index.js.map +1 -1
  49. package/dist/utils/index.d.ts +1 -1
  50. package/dist/utils/index.js +24 -1
  51. package/dist/utils/index.js.map +1 -1
  52. package/package.json +5 -1
  53. package/dist/plugin-DJk6LL8B.d.ts +0 -434
  54. package/dist/system-prompt-BC_8ypCG.d.ts +0 -23
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/color.ts","../../src/infrastructure/logger.ts","../../src/utils/atomic-write.ts","../../src/storage/session-store.ts","../../src/storage/queue-store.ts","../../src/storage/attachment-store.ts","../../src/storage/memory-store.ts","../../src/storage/config-store.ts","../../src/types/secret-vault.ts","../../src/security/secret-vault.ts","../../src/utils/safe-json.ts","../../src/storage/config-loader.ts","../../src/storage/config-migration.ts","../../src/storage/recovery-lock.ts","../../src/storage/session-reader.ts","../../src/storage/session-analyzer.ts","../../src/security/secret-scrubber.ts","../../src/utils/glob-match.ts","../../src/security/permission-policy.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/execution/retry-policy.ts","../../src/execution/error-handler.ts","../../src/execution/skill-loader.ts","../../src/utils/token-estimate.ts","../../src/execution/compactor.ts","../../src/types/blocks.ts","../../src/execution/intelligent-compactor.ts","../../src/models/llm-selector.ts","../../src/execution/selective-compactor.ts","../../src/execution/auto-compaction-middleware.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/execution/autonomous-runner.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/coordination/director-prompts.ts","../../src/coordination/fleet-bus.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/coordination/director.ts","../../src/coordination/agent-subagent-runner.ts","../../src/coordination/director-session.ts","../../src/coordination/fleet.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/models/mode-store.ts","../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/observability/metrics.ts","../../src/observability/health.ts","../../src/observability/tracer.ts","../../src/observability/otel-tracer.ts","../../src/observability/event-bridge.ts","../../src/observability/prometheus.ts","../../src/observability/otlp-metrics.ts","../../src/observability/otlp-traces.ts","../../src/infrastructure/context-manager.ts","../../src/infrastructure/mcp-servers.ts"],"names":["open","fs","path","path2","fs2","stat","randomBytes","path4","fsp2","fsp3","path5","fs3","path6","path7","fsp4","FORBIDDEN_PROTO_KEYS","deepMerge","fs5","path8","fsp5","fs6","fs7","path9","afterTokens","handlers","resolve","randomUUID","fsp6","path10","path11","fs8","path12","path13","fs9","readFileSync","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":";;;;;;;;;;;AAAA,IAAM,aAAa,MAAe;AAChC,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,OAAO,KAAA;AACjC,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,OAAO,IAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AACtC,CAAA;AAEA,IAAM,QAAQ,UAAA,EAAW;AAEzB,IAAM,IAAA,GACJ,CAACA,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;;;ACzBA,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;AASO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAgC;AAAA,EAC3C,KAAA;AAAA,EACiB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAU,OAAA,CAAQ,IAAI,oBAAA,IAAqC,MAAA;AAC7E,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC7B,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAI;AACF,QAAGC,GAAA,CAAA,SAAA,CAAeC,cAAQ,IAAA,CAAK,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC3D,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;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;AAC/C,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,QAAA;AAAS,KAC3C,CAAA;AAAA,EACH;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;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAI;AACF,QAAGD,mBAAe,IAAA,CAAK,IAAA,EAAM,GAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;AAAA,CAAI,CAAA;AAAA,MAC3D,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,CAAA,IAAK,WAAW,IAAA,IAAQ,IAAA,CAAK,UAAU,OAAA,IAAW,IAAA,CAAK,UAAU,OAAA,EAAS;AAC5E,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,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC;AAAA,CAAI,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;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;ACrGA,eAAsB,WAAA,CACpB,UAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,GAAA,GAAWE,cAAQ,UAAU,CAAA;AACnC,EAAA,MAASC,GAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAWD,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,MAASC,GAAA,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,MAASA,cAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAASA,GAAA,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,MAASD,GAAA,CAAA,IAAA,CAAK,UAAU,CAAA;AACrC,MAAA,IAAA,GAAOC,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,MAASD,GAAA,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,MAASA,GAAA,CAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,EACjC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI;AACF,MAAA,MAASA,WAAO,GAAG,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAsB,UAAU,GAAA,EAA4B;AAC1D,EAAA,MAASA,GAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACzC;;;ACtCO,IAAM,sBAAN,MAAkD;AAAA,EACtC,GAAA;AAAA,EACA,MAAA;AAAA,EAEjB,YAAY,IAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,MAAM,OAAO,IAAA,EAAkE;AAC7E,IAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,CAAA,EAAG,UAAU,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,IAAIE,WAAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAC1F,IAAA,MAAM,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC9C,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAU,GAAA,CAAA,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,GAAK,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AAGZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,gCAAgC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QAChF;AAAA,UACE,KAAA,EAAO;AAAA;AACT,OACF;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,iBAAA,CAAkB,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IAC7F,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACnC,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAAqC;AAChD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAC/B,IAAA,MAAM,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC9C,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAU,GAAA,CAAA,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,GAAK,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,EAAE,CAAA,cAAA,EAAiB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QAC9F,EAAE,OAAO,GAAA;AAAI,OACf;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAI,iBAAA;AAAA,MACjB,EAAA;AAAA,MACA,MAAA;AAAA,MAAA,iBACA,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACvB;AAAA,QACE,EAAA;AAAA,QACA,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,QACrB,QAAA,EAAU,KAAK,QAAA,CAAS;AAAA,OAC1B;AAAA,MACA,EAAE,OAAA,EAAS,IAAA,EAAM,KAAK,IAAA,CAAK,GAAA,EAAK,UAAU,IAAA;AAAK,KACjD;AACA,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AAAA,EAEA,MAAM,KAAK,EAAA,EAAkC;AAC3C,IAAA,MAAM,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAU,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACpD,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAIvC,QAAA,IACE,MAAA,KAAW,IAAA,IACX,OAAO,MAAA,KAAW,QAAA,IAClB,OAAQ,MAAA,CAA8B,IAAA,KAAS,QAAA,IAC/C,OAAQ,MAAA,CAA4B,EAAA,KAAO,QAAA,EAC3C;AACA,UAAA,MAAA,CAAO,KAAK,MAAsB,CAAA;AAAA,QACpC;AAAA,MAGF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI,MAAM,CAAA;AAC3C,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,KAAU,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAE,CAAA;AAClD,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,EACnD;AAAA,EAEA,MAAM,IAAA,CAAK,KAAA,GAAQ,EAAA,EAA+B;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,MAAU,GAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AACxC,MAAA,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAG1F,MAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,EAAA,KAAO,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAC,CAAC,CAAA;AACzF,MAAA,MAAM,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAA2B,MAAM,IAAI,CAAA;AAClE,MAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,QAAA,IAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA;AACtC,QAAA,IAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA,CAAA;AAEtC,QAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,EAAA,EAAqC;AAC5D,IAAA,MAAM,WAAgB,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,aAAA,CAAe,CAAA;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAU,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AAGN,MAAA,MAAM,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC9C,MAAA,MAAMD,KAAAA,GAAO,MAAU,GAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAChC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,IAAIA,KAAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AACjE,MAAA,MACG,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA,CAC5D,KAAA,CAAM,CAAC,GAAA,KAAQ;AAId,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,iDAAiD,EAAE,CAAA,EAAA,CAAA;AAAA,UACnD,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACjD;AAAA,MACF,CAAC,CAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAU,WAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,EAAE,QAAQ,CAAC,CAAA;AACnD,IAAA,MAAU,GAAA,CAAA,MAAA,CAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,aAAA,CAAe,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EACnF;AAAA,EAEA,MAAc,SAAA,CAAU,EAAA,EAAY,KAAA,EAAwC;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AACjE,MAAA,MAAM,KAAA,GACJ,aAAa,SAAA,CAAU,IAAA,KAAS,eAC5B,cAAA,CAAe,SAAA,CAAU,OAAO,CAAA,GAChC,iBAAA;AACN,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA,EAAW,KAAK,QAAA,CAAS,SAAA;AAAA,QACzB,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,KAAA,IAAS,SAAA;AAAA,QAC9B,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,QAAA,IAAY,SAAA;AAAA,QACpC,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM;AAAA,OAC5C;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,IAAY,MAAA,EAAyC;AAC1E,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,eAAe,CAAA;AAC3D,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AACvD,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,WAAW,KAAA,EAAO,EAAA,IAAA,qBAAU,IAAA,CAAK,CAAC,GAAE,WAAA,EAAY;AAAA,MAChD,SAAS,GAAA,EAAK,EAAA;AAAA,MACd,OAAO,KAAA,EAAO,KAAA;AAAA,MACd,UAAU,KAAA,EAAO;AAAA,KACnB;AAAA,EACF;AAAA,EAEQ,MAAA,CACN,MAAA,EACA,SAAA,GAAY,SAAA,EAC0C;AACtD,IAAA,MAAM,WAAsB,EAAC;AAC7B,IAAA,IAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,UAAA,EAAY,CAAA,EAAE;AAC/D,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAA,CAAE,SAAS,YAAA,EAAc;AAC3B,QAAA,YAAA,CAAa,KAAA,EAAM;AACnB,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA;AAAA,MACpD,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,cAAA,EAAgB;AACpC,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA;AACvD,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,IAAI,EAAE,IAAA,KAAS,UAAA,EAAY,YAAA,CAAa,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,QAClD;AACA,QAAA,KAAA,GAAQ;AAAA,UACN,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,CAAA,CAAE,MAAM,KAAA,IAAS,CAAA,CAAA;AAAA,UACvC,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,CAAA,CAAE,MAAM,MAAA,IAAU,CAAA,CAAA;AAAA,UAC1C,YAAY,KAAA,CAAM,SAAA,IAAa,CAAA,KAAM,CAAA,CAAE,MAAM,SAAA,IAAa,CAAA,CAAA;AAAA,UAC1D,aAAa,KAAA,CAAM,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,MAAM,UAAA,IAAc,CAAA;AAAA,SAC/D;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe;AACnC,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAG3B,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,iBAAA,EAAmB;AAAA,YACnC,SAAA;AAAA,YACA,MAAA,EAAQ,CAAA,oBAAA,EAAuB,CAAA,CAAE,EAAE,CAAA,0BAAA;AAAA,WACpC,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,CAAA;AACxB,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B;AAAA,YACE,IAAA,EAAM,aAAA;AAAA,YACN,aAAa,CAAA,CAAE,EAAA;AAAA,YACf,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,YAC7E,UAAU,CAAA,CAAE;AAAA;AACd,SACF;AACA,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAChC,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/B,YAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,UAC9B,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AAE3C,YAAA,IAAA,CAAK,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,OAAA,EAAQ,EAAG,GAAG,OAAO,CAAA;AAAA,UAClE,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,UACzC;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,iBAAA,EAAmB;AAAA,QACnC,SAAA;AAAA,QACA,MAAA,EAAQ,CAAA,EAAG,YAAA,CAAa,IAAI,CAAA,iEAAA;AAAA,OAC7B,CAAA;AAGD,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,IAC3B;AACA,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,EAC3B;AACF;AAEA,IAAM,oBAAN,MAAiD;AAAA,EAY/C,YACkB,EAAA,EACC,MAAA,EACA,WACA,IAAA,EACjB,IAAA,GAA+D,EAAC,EAChE;AALgB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGjB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,KAAA;AAC/B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,GAAW,KAAA,CAAA,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,aAAA,CAAe,CAAA,GAAI,EAAA;AAC3E,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,EAAA;AAAA,MACA,KAAA,EAAO,iBAAA;AAAA,MACP,SAAA;AAAA,MACA,KAAA,EAAO,KAAK,KAAA,IAAS,SAAA;AAAA,MACrB,QAAA,EAAU,KAAK,QAAA,IAAY,SAAA;AAAA,MAC3B,UAAA,EAAY;AAAA,KACd;AAAA,EAGF;AAAA,EAnBkB,EAAA;AAAA,EACC,MAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EAfX,MAAA,GAAS,KAAA;AAAA,EACT,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,QAAA,GAAW,CAAA;AAAA,EACF,QAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACF,OAAA;AAAA,EACT,eAAA,GAAkB,CAAA;AAAA,EAClB,gBAAA,GAAmB,CAAA;AAAA,EAwB3B,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU;AAAA,MAC/B,IAAA,EAAM,IAAA,CAAK,OAAA,GAAU,iBAAA,GAAoB,eAAA;AAAA,MACzC,IAAI,IAAA,CAAK,SAAA;AAAA,MACT,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS,SAAA;AAAA,MAC1B,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY;AAAA,KACjC,CAAC;AAAA,CAAA;AACF,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,MAAU,GAAA,CAAA,SAAA,CAAU,KAAK,QAAA,EAAU,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAA,EAAoC;AAC/C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,GAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAAA,IACnE,SAAS,GAAA,EAAK;AAIZ,MAAA,IAAA,CAAK,eAAA,EAAA;AACL,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,gBAAA,GAAmB,GAAA,EAAM;AACtC,QAAA,MAAM,UAAA,GAAa,KAAK,eAAA,GAAkB,CAAA;AAC1C,QAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,GAAI,CAAA,GAAA,EAAM,UAAU,CAAA,YAAA,CAAA,GAAiB,EAAA;AAC/D,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,0BAAA;AAAA,UACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,UAC/C;AAAA,SACF;AACA,QAAA,IAAA,CAAK,gBAAA,GAAmB,GAAA;AACxB,QAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,KAAA,EAA2B;AACnD,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,OAAA,CAAQ,UAAU,iBAAA,EAAmB;AAC3E,MAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAS,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA,IACzE,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AACxC,MAAA,IAAA,CAAK,OAAA,IAAW,MAAM,KAAA,CAAM,KAAA;AAC5B,MAAA,IAAA,CAAK,QAAA,IAAY,MAAM,KAAA,CAAM,MAAA;AAC7B,MAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAS,UAAA,EAAY,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,QAAA,EAAS;AAAA,IAC7E,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,aAAA,EAAe;AAEvC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA;AAC9C,MAAA,IAAI,KAAA,GAAQ,GAAG,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAU,GAAA,CAAA,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,MACtF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAA;AAEA,SAAS,eAAe,OAAA,EAA0C;AAChE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,SAAiB,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAA;AAC3D,EAAA,MAAM,OAAO,OAAA,CACV,MAAA,CAAO,CAAC,CAAA,KAA2C,EAAE,IAAA,KAAS,MAAM,CAAA,CACpE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,GAAG,CAAA;AACX,EAAA,OAAA,CAAQ,IAAA,IAAQ,kBAAA,EAAoB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACjD;ACvXO,IAAM,aAAN,MAAiB;AAAA,EACL,IAAA;AAAA,EAEjB,YAAY,IAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,IAAA,GAAYE,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,MAAM,KAAA,EAA4C;AACtD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGtB,MAAA,MAAM,KAAK,KAAA,EAAM;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,IAAA,GAAsC;AAC1C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAUC,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IAC5C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,MAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AAC/B,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,SAAU,EAAC;AACpC,IAAA,MAAM,MAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,oBAAA,CAAqB,CAAC,CAAA,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAUA,GAAA,CAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,MAAA,IAAI,SAAS,QAAA,EAAU;AAIvB,MAAA,OAAA,CAAQ,KAAK,CAAA,8BAAA,EAAiC,IAAA,CAAK,IAAI,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,CAAA,EAAqC;AACjE,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OAAO,OAAO,EAAE,aAAa,CAAA,KAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC1E;AChEA,IAAM,0BAA0B,GAAA,GAAM,IAAA;AACtC,IAAM,cAAA,GAAiB,iCAAA;AAQhB,IAAM,yBAAN,MAAwD;AAAA,EAC5C,KAAA,uBAAY,GAAA,EAAwB;AAAA,EACpC,OAAwB,EAAC;AAAA,EAClC,UAA0C,EAAE,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EAC9D,QAAA;AAAA,EACA,cAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,mBAAA,IAAuB,uBAAA;AAAA,EACpD;AAAA,EAEA,MAAM,IAAI,KAAA,EAAmD;AAC3D,IAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAI,CAAA;AACrC,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAIF,WAAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAC7E,IAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,CAAW,KAAA,CAAM,MAAM,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,QAAA,GAAW,MAAM,CAAA;AACtF,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,OAA2B,KAAA,CAAM,IAAA;AACrC,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,KAAA,IAAS,IAAA,CAAK,cAAA,EAAgB;AACjD,MAAA,MAAUG,UAAM,IAAA,CAAK,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,MAAA,WAAA,GAAmBC,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA;AAClD,MAAA,MAAUD,GAAA,CAAA,SAAA,CAAU,aAAa,KAAA,CAAM,IAAA,EAAM,MAAM,IAAA,KAAS,OAAA,GAAU,WAAW,MAAM,CAAA;AACvF,MAAA,IAAA,GAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAkB;AAAA,MACtB,EAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,IAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,KAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AACtB,IAAA,MAAM,GAAA,GAAqB,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AACvE,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,CAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAA6C;AACrD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,OAAO,IAAA,EAAuC;AAClD,IAAA,MAAM,UAAU,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,cAAc,CAAC,CAAA;AACjD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,GAAI,EAAC;AACpE,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,GAAA,GAAM,EAAE,KAAA,IAAS,CAAA;AACvB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,GAAG,CAAA;AACxC,MAAA,IAAI,MAAA,SAAe,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,CAAC,CAAW,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,MAAM,GAAA,GAAM,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,GAAI,MAAA;AAC3C,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA,CAAE,CAAC,GAAG,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,MACrC;AACA,MAAA,SAAA,GAAY,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,IACzB;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,IAAI,IAAA,SAAa,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAClD,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA;AACnB,IAAA,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EAC9C;AAAA,EAEA,MAAc,QAAQ,GAAA,EAAwC;AAC5D,IAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,MAAM,IAAA,GACJ,GAAA,CAAI,IAAA,KAAS,GAAA,CAAI,IAAA,GAAO,MAAUA,GAAA,CAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,GAAI,EAAA,CAAA;AACjF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,SAAA,IAAa,WAAA;AAAA,UAClC;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,KAAS,GAAA,CAAI,IAAA,GAAO,MAAUA,GAAA,CAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA,GAAI,EAAA,CAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,QAAA,GAAW,eAAe,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,CAAA,GAAO,UAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,QAAA,GAAW,SAAA,GAAY,WAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,GAAG,KAAK;AAAA,EAAK,GAAG;AAAA,EAAK,KAAK,CAAA,CAAA,EAAG;AAAA,EAC5D;AACF;AAEA,SAAS,WAAW,IAAA,EAA8B;AAChD,EAAA,OAAO,IAAA,KAAS,SAAS,QAAA,GAAW,IAAA;AACtC;AAEA,SAAS,aAAa,MAAA,EAAgC;AACpD,EAAA,IAAI,MAAA,KAAW,UAAU,OAAO,MAAA;AAChC,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,OAAA;AAC/B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,MAAA,EAAwC;AACjE,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,SAAS,MAAA,EAAQ;AACrD,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AC9IA,IAAM,eAAA,GAAkB,IAAA;AAYjB,IAAM,qBAAN,MAAgD;AAAA,EACpC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAAA,uBAAiB,GAAA,EAAmC;AAAA,EAErE,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,gBAAA,EAAkB,KAAK,KAAA,CAAM,mBAAA;AAAA,MAC7B,gBAAA,EAAkB,KAAK,KAAA,CAAM,aAAA;AAAA,MAC7B,aAAA,EAAe,KAAK,KAAA,CAAM;AAAA,KAC5B;AAAA,EACF;AAAA,EAEA,MAAc,aAAA,CAAiB,KAAA,EAAoB,IAAA,EAAoC;AACrF,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA,CAAW,IAAI,KAAK,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAG5D,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,MAAM,MAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA;AAAA,IACf,CAAA,SAAE;AAKA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,MAAM,IAAA,EAAM;AACvC,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,aAAa,CAAA,EAAoB;AACxF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAClC,MAAA,IAAI,IAAA,CAAK,MAAK,EAAG,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAK,CAAC;;AAAA,EAAO,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,KAAK,KAAA,EAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,MAASE,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,GAAG,MAAM,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,KAAA,GAAqB,gBAAA,EAAiC;AACjF,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,YAAY;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,SAAA,CAAeC,KAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClC,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAASD,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,MAC3C,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,EAAA,GAAA,iBAAK,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAElC,MAAA,MAAM,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ;AAAA,GAAA,EAAQ,EAAE,KAAK,EAAE,CAAA,CAAA,EAAI,KAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC;AAAA,CAAA;AAC3D,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,EAAK,GACvB,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,KAAA,GAC/B,CAAA;AAAA,EAAwB,KAAK,CAAA,CAAA;AACjC,MAAA,MAAM,WAAA,CAAY,MAAM,IAAI,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA,IAAI,MAAM,eAAA,EAAiB;AAGzB,QAAA,MAAM,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CAAO,KAAA,EAAe,KAAA,GAAqB,gBAAA,EAAmC;AAClF,IAAA,OAAO,IAAA,CAAK,cAAc,KAAA,EAAO,YAAY,KAAK,YAAA,CAAa,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,YAAA,CAAa,KAAA,EAAe,KAAA,EAAqC;AAC7E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,IAAA,MAAM,SAAA,GAAY,aAAA;AAClB,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS;AAClD,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AAEtC,MAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAEzB,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AACzC,QAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AAC9C,UAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAChD,UAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,KAAA,EAAO;AAC7C,YAAA,OAAA,EAAA;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,QAAA,OAAA,EAAA;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,WAAA,CAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAA,EAAmC;AACnD,IAAA,OAAO,KAAK,aAAA,CAAc,KAAA,EAAO,YAAY,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAc,kBAAkB,KAAA,EAAmC;AACjE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS;AAClD,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AACtC,MAAA,MAAM,IAAA,GAAO,OAAA,CACV,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,CACxB,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,IAAA,EAAK,CACL,WAAA,EAAY;AACf,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,KAAA;AAC3B,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAI5B,IAAA,MAAM,SAAS,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAASA,GAAA,CAAA,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AAGN,MAAA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAA,EAAoC;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,YAAY,WAAA,CAAY,KAAK,KAAA,CAAM,KAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACX,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,aAAa,CAAA,CAAoB,GAAA;AAAA,QAAI,CAAC,CAAA,KAC1E,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,YAAY,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAC;AAAA;AAClE,KACF;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,KAAA,EAA4B;AAC3C,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,gBAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,aAAA;AAAA;AAEb;;;ACpNO,IAAM,qBAAN,MAAgD;AAAA,EAC7C,OAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAA8D;AAAA,EAErF,YAAY,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,EACpD;AAAA,EAEA,GAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,WAAmC,GAAA,EAA6B;AAC9D,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACzB;AAAA,EAEA,aAAa,UAAA,EAAuD;AAClE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,GAAa,UAAU,CAAA;AAChD,IAAA,OAAO,MAAO,GAAA,GAA4C,YAAA;AAAA,EAC5D;AAAA,EAEA,OAAO,OAAA,EAA4C;AAKjD,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,eAAA,CAAgB,EAAE,GAAG,KAAK,OAAA,EAAS,GAAG,OAAA,EAAS,CAAC,CAAA;AAExE,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAIf,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,MAAM,IAAI,CAAA;AAAA,MACd,SAAS,GAAA,EAAK;AAKZ,QAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,GAAG,CAAA;AAAA,MACpD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,EAAA,EAA0E;AAC9E,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,EAAE,CAAA;AACpB,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAAA,EACtC;AACF;AAEA,IAAM,YAAA,GAAkD,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAExE,SAAS,WAAc,GAAA,EAAW;AAChC,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,GAAA;AACpD,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAA;AACjC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAa,CAAA,EAAG;AAC5C,IAAA,MAAM,CAAA,GAAK,IAAgC,GAAG,CAAA;AAC9C,IAAA,IAAI,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,YAAY,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAC9D,MAAA,UAAA,CAAW,CAAC,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,GAAG,CAAA;AAC1B;;;AC/DO,IAAM,gBAAA,GAAmB,SAAA;;;ACNhC,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,IAAA,GAAO,aAAA;AAQN,IAAM,qBAAN,MAAgD;AAAA,EACpC,OAAA;AAAA,EACT,GAAA;AAAA,EAER,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAAA,EAEA,YAAY,KAAA,EAAwB;AAClC,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,WAAW,gBAAgB,CAAA;AAAA,EACvE;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,GAAKL,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,OAAO,GAAG,gBAAgB,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,EACvG;AAAA,EAEA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,GAAG,OAAO,KAAA;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,gBAAA,CAAiB,MAAM,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;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,GAAG,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,MAAM,4BAA4B,CAAA;AACxE,IAAA,IAAI,IAAI,MAAA,KAAW,SAAA,EAAW,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC3E,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,EAEQ,eAAA,GAA0B;AAChC,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;AACxC,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,eAAA,CAAiB,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,MAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,MAAM,GAAA;AAAA,IAC9D;AAGA,IAAG,GAAA,CAAA,SAAA,CAAeO,cAAQ,IAAA,CAAK,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAMP,YAAY,SAAS,CAAA;AAGjC,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,KAAK,OAAA,EAAS,GAAA,EAAK,EAAE,IAAA,EAAM,GAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACjE,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,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,eAAA,CAAiB,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,MAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAOO,SAAS,oBAAA,CAAwB,KAAQ,KAAA,EAAuB;AAIrE,EAAA,OAAO,IAAA,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,OAAA,CAAQ,IAAA;AAAA,QACN,qCAAqC,GAAG,CAAA,EAAA,CAAA;AAAA,QACxC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AACA,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,oBAAA,CAAwB,KAAQ,KAAA,EAAuB;AACrE,EAAA,OAAO,IAAA,CAAK,KAAK,KAAA,EAAO,CAAC,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjD;AAEA,SAAS,IAAA,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,KAAS,KAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,MAA+B,EAAC;AACtC,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,GAAI,IAAA,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;AAEhE,SAAS,cAAc,IAAA,EAAuB;AAC5C,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,MAAUQ,GAAA,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,UAAWD,KAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7D,EAAA,MAAUC,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACnF,EAAA,IAAI;AACF,IAAA,MAAUA,GAAA,CAAA,KAAA,CAAM,YAAY,GAAK,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAUA,eAAsB,uBAAA,CACpB,YACA,KAAA,EAC6C;AAC7C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAUA,GAAA,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;AAC5D,EAAA,MAAUA,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAClF,EAAA,IAAI;AACF,IAAA,MAAUA,GAAA,CAAA,KAAA,CAAM,YAAY,GAAK,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,CAAA,EAAG,MAAM,UAAA,EAAW;AACjD;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,MAA+B,EAAC;AACtC,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;AAIA,IAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAE9E,SAAS,SAAA,CAA6C,GAAM,CAAA,EAA+B;AACzF,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,CAAA,EAAE;AAC5C,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AACtC,IAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,EAAG;AACjC,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;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,QAAA,EAAqC,CAA4B,CAAA;AAAA,IACtF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;ACzQO,SAAS,SAAA,CAAuB,KAAA,EAAe,QAAA,GAAW,GAAA,EAA+B;AAC9F,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,qBAAA,EAAwB,QAAQ,CAAA,OAAA,CAAA,EAAU;AAAA,EACvE;AACA,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAO;AAAA,EACnD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACxD;AAAA,EACF;AACF;;;ACJA,IAAM,iBAAA,GAAwD;AAAA,EAC5D,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,aAAA,EAAe,IAAA;AAAA,IACf,aAAA,EAAe,GAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,wBAAA,EAA0B,OAAA;AAAA,IAC1B,aAAA,EAAe,GAAA;AAAA,IACf,kBAAA,EAAoB,GAAA;AAAA,IACpB,gBAAA,EAAkB,IAAA;AAAA,IAClB,0BAAA,EAA4B,GAAA;AAAA,IAC5B,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,GAAA,EAAK,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,EACrB,QAAA,EAAU;AAAA,IACR,GAAA,EAAK,IAAA;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,cAAA,EAAgB,IAAA;AAAA,IAChB,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEA,IAAM,OAAA,GAAqE;AAAA,EACzE,mBAAA,EAAqB,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA;AAAA,EACf,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1B,IAAA,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,EACZ,CAAA;AAAA,EACA,kBAAA,EAAoB,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,IAAA,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACb,CAAA;AAAA,EACA,mBAAA,EAAqB,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,IAAA,CAAA,CAAE,OAAA,GAAU,CAAA;AAAA,EACd,CAAA;AAAA,EACA,oBAAA,EAAsB,CAAC,CAAA,EAAG,CAAA,KAAM;AAC9B,IAAA,IAAI,CAAC,CAAA,CAAE,GAAA,IAAO,GAAA,GAAM,EAAE,OAAO,MAAA,EAAO;AACpC,IAAA,CAAA,CAAE,IAAI,KAAA,GAAQ,CAAA;AAAA,EAChB;AACF,CAAA;AAMA,SAAS,iBAAiB,CAAA,EAAuB;AAC/C,EAAA,OAAO,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,MAAM,IAAA,IAAQ,OAAO,MAAM,QAAQ,CAAA;AAC3D;AAEA,IAAMC,wCAAuB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAE9E,SAASC,UAAAA,CAAa,MAAS,KAAA,EAAsB;AACnD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,SAAc,KAAA,IAAe,IAAA;AACtE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,IAAA;AACxD,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAI,IAAA,EAAiC;AAC5E,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAIrE,IAAA,IAAID,qBAAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,EAAG;AACjC,IAAA,MAAM,QAAA,GAAW,IAAI,CAAC,CAAA;AAGtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACpB,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAQ,CAAA,IAAK,iBAAiB,CAAC,CAAA,IAAK,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAChF,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,GAAG,CAAC,CAAC,CAAC,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACT,QAAA,IAAI,OAAA,CAAQ,IAAI,uBAAA,EAAyB;AACvC,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,kCAAA,EAAqC,CAAC,CAAA,0DAAA,EAChB,QAAA,EAAoC,UAAU,CAAC,CAAA,iBAAA,EAAoB,EAAE,MAAM,CAAA,CAAA;AAAA,WACnG;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IACE,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,QACN,OAAO,QAAA,KAAa,QAAA,IACpB,QAAA,KAAa,IAAA,EACb;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAIC,UAAAA,CAAU,QAAA,EAAU,CAA4B,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAC1B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AA2BO,IAAM,sBAAN,MAAkD;AAAA,EACtC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAEjB,YAAY,IAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,KAAA;AAC7B,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EACvC;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,GAAqD,EAAC,EAAoB;AACnF,IAAA,IAAI,GAAA,GAAqB,EAAE,GAAG,iBAAA,EAAkB;AAGhD,IAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACxC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,MACrC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,kBAAkB;AAAA,KAC5C,CAAA;AACD,IAAA,GAAA,GAAMA,UAAAA,CAAU,KAAK,MAAM,CAAA;AAC3B,IAAA,GAAA,GAAMA,UAAAA,CAAU,KAAK,KAAK,CAAA;AAG1B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/C,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,CAAA,EAAG,EAAA,CAAG,GAAA,EAAK,CAAC,CAAA;AAAA,IAClB;AAIA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnD,MAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,QAAA,IAAY,EAAA,KAAO,EAAE,QAAA,IAAY,EAAA,CAAA;AAC/C,MAAA,IAAI,EAAA,KAAO,GAAG,OAAO,EAAA;AACrB,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,QAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,UAAA,GAAA,GAAMA,UAAAA,CAAU,KAAK,KAAK,CAAA;AAAA,QAC5B;AAAA,MACF,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAI,YAAY,GAAG,CAAA;AAAA,MACxD;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,GAAA,GAAMA,UAAAA,CAAU,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,GAAA,GAAM,oBAAA,CAAqB,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5C;AAQA,IAAA,IAAI,IAAI,SAAA,EAAW;AACjB,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/C,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,QAAA,MAAM,UAAW,IAAA,CAA+B,OAAA;AAChD,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AAKrD,QAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AAAA,UACnB,CAAC,CAAA,KACC,CAAC,CAAC,KACF,OAAO,CAAA,KAAM,QAAA,IACb,OAAQ,CAAA,CAA0B,KAAA,KAAU,QAAA,IAC5C,OAAQ,EAA2B,MAAA,KAAW;AAAA,SAClD;AACA,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,QAAA,MAAM,WAAY,IAAA,CAA6B,MAAA;AAC/C,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACrC,QAAA,MAAM,cAAe,IAAA,CAAgC,SAAA;AACrD,QAAA,MAAM,MAAA,GAAS,WAAA,GACV,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAW,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,GACpD,KAAK,CAAC,CAAA;AACV,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAC,IAAA,CAA6B,SAAS,MAAA,CAAO,MAAA;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAAA,IAC3B;AAKA,IAAA,OAAO,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAc,SAAS,IAAA,EAAsC;AAC3D,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAASC,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,IACtC,SAAS,GAAA,EAAK;AAIZ,MAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,MACxD;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,MAAA,GAAS,UAAyB,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,KAAA,EAAO;AAI/B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,6BAA6B,IAAI,CAAA,yDAAA;AAAA,OACnC;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEQ,iBAAiB,GAAA,EAA0B;AACjD,IAAA,IAAI,IAAI,OAAA,KAAY,MAAA,EAAW,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC9E,IAAA,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACnF,IAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AACd,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAMzD,IAAA,MAAM,MAAA,GAAgC,CAAC,eAAA,EAAiB,eAAA,EAAiB,eAAe,CAAA;AACxF,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAChD,QAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,CAAC,CAAC,CAAA,8BAAA,EAAiC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1F;AAAA,IACF;AACA,IAAA,IAAI,EAAE,aAAA,IAAiB,CAAA,CAAE,iBAAiB,CAAA,CAAE,aAAA,IAAiB,EAAE,aAAA,EAAe;AAC5E,MAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,iBAAiB,GAAA,EAA0B;AACjD,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,IAC3F;AAAA,EACF;AACF;;;AC3PO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EACrC,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EAET,YAAY,IAAA,EAKT;AACD,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACF;AAkBO,SAAS,mBAAA,CACd,KAAA,EACA,aAAA,EACA,UAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,SAAS,MAAM,QAAA,GAAY,KAAA,CAAM,SAAS,CAAA,GAAe,CAAA;AACtF,EAAA,IAAI,OAAA,GAAmC,EAAE,GAAG,KAAA,EAAM;AAClD,EAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,mBAAmB,aAAA,EAAe;AACvC,IAAA,IAAI,EAAE,QAAQ,GAAA,EAAK;AACjB,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,OAAA,EAAS,CAAA,8CAAA,EAAiD,OAAO,CAAA,SAAA,EAAY,aAAa,CAAA,CAAA,CAAA;AAAA,QAC1F,WAAA,EAAa,OAAA;AAAA,QACb,aAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AAC7D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,OAAA,EAAS,CAAA,qCAAA,EAAwC,cAAc,CAAA,UAAA,EAAa,aAAa,CAAA,kDAAA,CAAA;AAAA,QACzF,WAAA,EAAa,OAAA;AAAA,QACb,aAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,MAAM,GAAA,GAAwB,EAAE,WAAA,EAAa,cAAA,EAAgB,eAAe,KAAA,EAAM;AAClF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AAGtC,IAAA,IAAI,OAAO,KAAK,SAAS,CAAA,KAAM,YAAY,IAAA,CAAK,SAAS,CAAA,KAAM,IAAA,CAAK,EAAA,EAAI;AACtE,MAAA,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,EAAA;AAAA,IACzB;AACA,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,cAAA,GAAiB,IAAA,CAAK,EAAA;AACtB,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,OAAA,EAAK,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACxC,IAAA,aAAA,GAAgB,aAAA,IAAiB,GAAA,CAAI,aAAA,IAAiB,IAAA,CAAK,OAAO,IAAA,CAAK,EAAA;AAAA,EACzE;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,aAAA,EAAc;AACnD;AAiBO,IAAM,4BAAwD;ACtFrE,IAAM,SAAA,GAAY,aAAA;AAClB,IAAM,kBAAA,GAAqB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAEnC,IAAM,eAAN,MAAmB;AAAA,EACP,IAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EAEjB,YAAY,IAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,IAAA,GAAYC,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACzC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAe,EAAA,CAAA,QAAA,EAAS;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,kBAAA;AACjC,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,UAAA,IAAc,iBAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAA,GAAmD;AACvD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAC5D,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AAEpC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAOlC,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,CAAK,QAAA,IAAY,KAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AAE3D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAK,SAAS,CAAA;AACxD,QAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AAC/D,QAAA,IAAI,QAAQ,OAAO,IAAA;AACnB,QAAA,YAAA,GAAe,KAAK,QAAA,CAAS,MAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAGN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,SAAA,EAAkC;AAC5C,IAAA,MAAM,SAAA,CAAeA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACvC,IAAA,MAAM,IAAA,GAAiB;AAAA,MACrB,CAAA,EAAG,CAAA;AAAA,MACH,SAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAGA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,IAAA,CAAA;AACxB,IAAA,MAAUC,GAAA,CAAA,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAC9D,IAAA,MAAUA,GAAA,CAAA,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAUA,GAAA,CAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,MAAA,IAAI,SAAS,QAAA,EAAU;AACvB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,QAAA,GAAqC;AACjD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAUA,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IAC5C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,MAAA,IAAI,IAAA,KAAS,UAAU,OAAO,IAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,IAAA;AAChC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,WAAW,CAAA,EAA2B;AAC7C,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OACE,CAAA,CAAE,GAAG,CAAA,KAAM,CAAA,IACX,OAAO,CAAA,CAAE,WAAW,CAAA,KAAM,QAAA,IAC1B,OAAO,CAAA,CAAE,KAAK,CAAA,KAAM,QAAA,IACpB,OAAO,CAAA,CAAE,UAAU,MAAM,QAAA,IACzB,OAAO,CAAA,CAAE,WAAW,CAAA,KAAM,QAAA;AAE9B;AAWA,SAAS,kBAAkB,GAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA,IAAO,GAAG,OAAO,KAAA;AAC/C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,IAAA;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACnMO,IAAM,uBAAN,MAAoD;AAAA,EACxC,KAAA;AAAA,EAEjB,YAAY,IAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA,EAEA,MAAM,KAAA,CAAM,CAAA,GAAkB,EAAC,EAAkC;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,GAAG,IAAI,GAAI,CAAA;AAC7E,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AACjD,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,OAAO,OAAO,KAAA;AAC7C,MAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,OAAO,OAAO,KAAA;AAC7C,MAAA,IAAI,EAAE,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,UAAU,OAAO,KAAA;AACpD,MAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,KAAA;AAC3C,MAAA,IAAI,EAAE,SAAA,KAAc,MAAA,IAAa,EAAE,UAAA,GAAa,CAAA,CAAE,WAAW,OAAO,KAAA;AACpE,MAAA,IAAI,WAAA,IAAe,CAAC,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,KAAA;AACxE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,GAAA,GAA4B,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACrD,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,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,MAAA,CAAO,CAAA,EAAuB,SAAA,EAAiD;AACnF,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;AAElD,IAAA,MAAM,GAAA,GAAM,SAAA,GAAY,CAAC,SAAS,KAAK,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACnF,IAAA,MAAM,OAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAAA,MACjC,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,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACxB,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,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,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,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,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,EAAA,GAAK,IAAI,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACpC,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;;;ACtQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,QAAQ,MAAA,EAAyC;AAC/C,IAAA,MAAM,iBAAyC,EAAC;AAChD,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,MAAM,cAA4B,EAAC;AACnC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,IAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,eAAA,IAAmB,KAAA,CAAM,SAAS,iBAAA,EAAmB;AACtE,QAAA,IAAI,CAAC,SAAA,EAAW,SAAA,GAAY,KAAA,CAAM,EAAA;AAAA,MACpC;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,QAAA,cAAA,CAAe,MAAM,IAAI,CAAA,GAAA,CAAK,eAAe,KAAA,CAAM,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,MACnE;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MAC1E;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,MACnE;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,QAAA,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,UAC1B,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAA,EAAQ,SAAA;AAAA,UACR,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AAAA,MACH;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACpC,QAAA,IAAI,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA;AAAA,MAC1B;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,gBAAA,EAAkB;AACnC,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACpC,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,CAAA,CAAE,MAAA,GAAS,WAAA;AACX,UAAA,CAAA,CAAE,cAAc,KAAA,CAAM,EAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,YAC1B,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,MAAA,EAAQ,WAAA;AAAA,YACR,WAAW,KAAA,CAAM,EAAA;AAAA,YACjB,aAAa,KAAA,CAAM;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACpC,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,UAAA,CAAA,CAAE,cAAc,KAAA,CAAM,EAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,YAC1B,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,MAAA,EAAQ,QAAA;AAAA,YACR,WAAW,KAAA,CAAM,EAAA;AAAA,YACjB,aAAa,KAAA,CAAM;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,aAAA,EAAe,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAAA,MACvC,cAAA;AAAA,MACA,YAAY,MAAA,CAAO,MAAA;AAAA,MACnB,WAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KACtC;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,QAAwB,MAAA,EAAqC;AACjE,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,MAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,IAAU,CAAC,MAAA,CAAO,WAAW,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG,OAAO,KAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,CAAA,CAAE,SAAS,UAAA,EAAY;AACrD,QAAA,MAAM,SAAA,GAAY,CAAA;AAClB,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,SAAS,SAAA,CAAU,IAAI,GAAG,OAAO,KAAA;AAAA,MACzD;AACA,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAM,KAAK,IAAI,IAAA,CAAK,CAAA,CAAE,EAAE,EAAE,OAAA,EAAQ;AAClC,QAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,OAAO,SAAA,CAAU,KAAK,EAAE,OAAA,EAAQ;AACvD,QAAA,MAAM,MAAM,IAAI,IAAA,CAAK,OAAO,SAAA,CAAU,GAAG,EAAE,OAAA,EAAQ;AACnD,QAAA,IAAI,EAAA,GAAK,KAAA,IAAS,EAAA,GAAK,GAAA,EAAK,OAAO,KAAA;AAAA,MACrC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,aAAa,MAAA,EAAgC;AACnD,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAG,EAAE,EAAE,OAAA,EAAQ;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAG,EAAE,CAAA,CAAE,OAAA,EAAQ;AAC7D,IAAA,OAAO,IAAA,GAAO,KAAA;AAAA,EAChB;AACF;;;AC1IA,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,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,gDAAA,EAAiD;AAAA,EAC9E;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,EACnD;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA;AAAA,IAEN,KAAA,EACE;AAAA;AAEN,CAAA;AASA,IAAM,oBAAoB,EAAA,GAAK,IAAA;AAExB,IAAM,wBAAN,MAAsD;AAAA,EAC3D,MAAM,IAAA,EAAsB;AAC1B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAKlB,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;AACrC,IAAA,IAAI,GAAA,GAAM,IAAA;AACV,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAC,MAAA,EAAQ,QAAQ,MAAA,KAAW;AACrD,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,kBAAA,IAAsB,MAAA,IAAU,MAAA,EAAQ;AACrD,UAAA,OAAO,CAAA,EAAG,MAAM,CAAA,WAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA;AAAA,QACtC;AACA,QAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA,CAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,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;;;AC5GA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,gBAAA,EAAkB,MAAM,CAAA;AAC3C;AAIA,IAAM,mBAAA,uBAA0B,GAAA,EAAoB;AACpD,IAAM,cAAA,GAAiB,GAAA;AAEvB,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,GAAA,CAAI,OAAO,CAAA;AAC9C,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,mBAAA,CAAoB,QAAQ,cAAA,EAAgB;AAE9C,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,mBAAA,CAAoB,MAAM,CAAA;AAC3C,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,cAAA,GAAiB,CAAC,GAAG,CAAA,EAAA,EAAK;AACvD,MAAA,mBAAA,CAAoB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,MAAM,EAAA,GAAK,YAAY,OAAO,CAAA;AAC9B,EAAA,mBAAA,CAAoB,GAAA,CAAI,SAAS,EAAE,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,YAAY,OAAA,EAAyB;AACnD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,EAAA,GAAK,GAAA;AACT,EAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,IAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAE1B,QAAA,EAAA,IAAM,IAAA;AACN,QAAA,CAAA,IAAK,CAAA;AAEL,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK,CAAA,EAAA;AAAA,MAC1B,CAAA,MAAO;AAEL,QAAA,EAAA,IAAM,OAAA;AACN,QAAA,CAAA,EAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,GAAA,EAAK;AACpB,MAAA,EAAA,IAAM,MAAA;AACN,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,GAAA,GAAM,GAAA;AACV,MAAA,CAAA,EAAA;AACA,MAAA,IAAI,QAAQ,CAAC,CAAA,KAAM,OAAO,OAAA,CAAQ,CAAC,MAAM,GAAA,EAAK;AAC5C,QAAA,GAAA,IAAO,GAAA;AACP,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,CAAC,MAAM,GAAA,EAAK;AAC/C,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAA;AAKzB,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,GAAA,IAAO,MAAA;AAAA,QACT,CAAA,MAAA,IAAW,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AACnC,UAAA,GAAA,IAAO,KAAK,EAAE,CAAA,CAAA;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,GAAA,IAAO,EAAA;AAAA,QACT;AACA,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,GAAA;AACP,MAAA,EAAA,IAAM,GAAA;AACN,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,EAAA,IAAM,WAAA,CAAY,KAAK,EAAE,CAAA;AACzB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,EAAA,IAAM,GAAA;AACN,EAAA,OAAO,IAAI,OAAO,EAAE,CAAA;AACtB;AAEO,SAAS,SAAA,CAAU,SAAiB,KAAA,EAAwB;AACjE,EAAA,OAAO,aAAA,CAAc,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC1C;AAEO,SAAS,QAAA,CAAS,UAAoB,KAAA,EAAwB;AACnE,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,CAAA,EAAG,KAAK,CAAC,CAAA;AACjD;;;ACxEO,IAAM,0BAAN,MAA0D;AAAA,EACvD,SAAsB,EAAC;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EAEjB,YAAY,IAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,IAAQ,KAAA;AACzB,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASC,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,MAAM,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,UAAuB,GAAG,CAAA;AACzC,MAAA,IAAI,OAAO,EAAA,IAAM,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,SAAS,MAAA,CAAO,KAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAS,EAAC;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAY,KAAA,EAAgB,IAAA,EAA4C;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAM,KAAK,MAAA,EAAO;AAGpC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAGxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAK,cAAA;AAGxC,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,KAAK,IAAA,EAAM,KAAA,EAAO,KAAK,UAAU,CAAA;AAGjE,IAAA,IAAI,OAAO,IAAA,IAAQ,OAAA,IAAW,SAAS,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA,EAAG;AAC3D,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,sBAAA,EAAuB;AAAA,IAC9E;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,QAAQ,mBAAA,EAAoB;AAAA,IAC9E;AAGA,IAAA,IAAI,OAAO,KAAA,IAAS,OAAA,IAAW,SAAS,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA,EAAG;AAC7D,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,QAAQ,uBAAA,EAAwB;AAAA,IAChF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAQ;AAAA,IAC/C;AAGA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC9C;AAGA,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,MAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAU;AAAA,IACjD;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,KAAA,EAAO,OAAA,IAAW,KAAK,IAAI,CAAA;AAC5E,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,IAAA,EAAM,CAAA;AACnE,QAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,qBAAA,EAAsB;AAAA,MAC7E;AACA,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,aAAA,EAAc;AAAA,MACrE;AACA,MAAA,OAAO,EAAE,UAAA,EAAY,QAAA,KAAa,QAAQ,MAAA,GAAS,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,IAC5E;AACA,IAAA,OAAO,EAAE,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU;AAAA,EACpD;AAAA,EAEA,MAAM,MAAM,IAAA,EAAwD;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAM,KAAK,MAAA,EAAO;AACpC,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,EAAC;AACzC,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,iBAAK,IAAI,IAAI,CAAC,GAAI,KAAA,CAAM,KAAA,IAAS,EAAC,EAAI,IAAA,CAAK,OAAO,CAAC,CAAC,CAAA;AACxE,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,CAAY,KAAK,SAAA,EAAW,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACxE,SAAS,GAAA,EAAK;AAEZ,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC/C,QAAA,IAAI,QAAQ,EAAA,EAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,UAAA,CAAW,QAAA,EAAkB,KAAA,EAAgB,UAAA,EAAyC;AAC5F,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA;AAKZ,IAAA,MAAM,SAAA,GAAY,WAAA;AAClB,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AACtE,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAc,UAAA,CAAW,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAKrE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,CAAA,GAAI,IAAI,UAAU,CAAA;AACxB,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAGzB,QAAA,OAAO,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,UACpE,aAAA,CAAc,CAAC,CAAA,GACf,UAAA,CAAW,CAAC,CAAA;AAAA,MAClB;AAAA,IAIF;AAGA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAU,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AAC1D,MAAA,OAAO,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,OAAO,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,QAAA,EAAU;AAC/B,MAAA,OAAO,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,OAAO,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,QAAA,EAAmD;AAC5E,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AAC1C,MAAA,IAAI,IAAI,QAAA,CAAS,GAAG,KAAK,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA,EAAG;AACjD,QAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACtGO,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,CAAA;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;AAkGO,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,eAAA,GAAkB,SAAA,GAAY,OAAA;AAAA,MACtD,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,IAAA,KAAS,uBAAA;AAAA,MAC/C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF,CAAA;AAQO,SAAS,iBAAA,CACd,GAAA,EACA,IAAA,GAA6E,kBAAA,EAC5D;AACjB,EAAA,IAAI,GAAA,YAAe,iBAAiB,OAAO,GAAA;AAC3C,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,OAAO,IAAI,UAAA,CAAW;AAAA,IACpB,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,KAAS,SAAA,GAAY,kBAAA,GAAqB,IAAA;AAAA,IAChD,KAAA,EAAO;AAAA,GACR,CAAA;AACH;;;AC/HO,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,GAAsD,EAAC,EACvD;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,CAAA;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;AAEA,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,EAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA,MAAA,CAAA;AACjD;AAEA,SAAS,oBAAA,CAAqB,QAAgB,IAAA,EAA0B;AACtE,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,wBAAA;AACzB,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,EAAK,OAAO,uBAAA;AAC1D,EAAA,IAAI,IAAA,KAAS,sBAAA,IAA0B,MAAA,KAAW,GAAA,EAAK,OAAO,sBAAA;AAC9D,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,EAAK,OAAO,qBAAA;AAC1D,EAAA,IAAI,IAAA,KAAS,uBAAA,IAA2B,MAAA,KAAW,GAAA,EAAK,OAAO,0BAAA;AAC/D,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,wBAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,uBAAA;AAC1B,EAAA,OAAO,0BAAA;AACT;;;ACrMO,IAAM,kBAAA,GAAN,MAAM,mBAAA,CAA0C;AAAA,EACrD,OAAwB,cAAA,GACtB,yDAAA;AAAA,EAEF,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,mBAAA,CAAmB,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAC5D,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,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;;;ACbA,IAAM,mBAAA,GAAsB,0BAAA;AAC5B,IAAM,cAAA,GAAiB,yDAAA;AAMhB,SAAS,wBAAwB,IAAA,EAGjB;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,GAAA,CAAI,WAAW,GAAA,IAAO,CAAC,oBAAoB,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG,OAAO,IAAA;AAEzE,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,EAAO,KAAK,GAAA,CAAI,OAAA,EAAS,GAAM,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;AAGzE,QAAe,OAAO,IAAA;AAoCtB,MACF;AAAA;AACF,GACF;AACF;AAEO,IAAM,8BAA8B,uBAAA,EAAwB;AAE5D,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,IAAI,MAAA,KAAW,GAAA,IAAO,oBAAoB,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/D,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;AC1JO,IAAM,qBAAN,MAAgD;AAAA,EACpC,IAAA;AAAA,EACT,KAAA;AAAA,EAER,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO;AAAA,MACV,EAAE,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,QAAQ,SAAA,EAAU;AAAA,MACrD,EAAE,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,QAAQ,MAAA;AAAO,KACjD;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,KAAK,UAAA,EAAY,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAiC;AACrC,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,KAAK,IAAA,EAAM;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAASC,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC7D,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,IAAI,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG;AACtB,UAAA,MAAM,SAAA,GAAiBC,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,MAAM,UAAU,CAAA;AACnD,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,MAASD,GAAA,CAAA,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAC/C,YAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,CAAC,KAAK,WAAA,EAAa;AACrC,YAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACzB,YAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,aAAa,IAAA,CAAK,WAAA;AAAA,cAClB,SAAS,IAAA,CAAK,OAAA;AAAA,cACd,IAAA,EAAM,SAAA;AAAA,cACN;AAAA,aACD,CAAA;AAAA,UACH,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,IAAA,EAAkD;AAC3D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,YAAA,GAAgC;AACpC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,EAAY;AACvC,IAAA,MAAM,KAAA,GAAQ,CAAC,qBAAqB,CAAA;AACpC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,QAAA,EAAM,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/E,MAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,WAAA,GAAqC;AACzC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAASA,GAAA,CAAA,QAAA,CAAS,CAAA,CAAE,MAAM,MAAM,CAAA;AAC5C,QAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,iBAAiB,GAAG,CAAA;AAC/C,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,MAC/E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,IAAA,EAA+B;AAC5C,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,WAAA,CAAa,CAAA;AACnD,IAAA,OAAUA,GAAA,CAAA,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACnC;AACF;AAQA,SAAS,iBAAiB,GAAA,EAA0B;AAClD,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,SAAU,EAAC;AACpC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAClC,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,OAAO,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,IAAI,GAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,QAAkB,EAAC;AACvB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAAA,IACnC;AACA,IAAA,GAAA,GAAM,IAAA;AACN,IAAA,KAAA,GAAQ,EAAC;AAAA,EACX,CAAA;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,KAAA,EAAM;AACN,MAAA,GAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACf,MAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACrB,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,KAAA,GAAQ,EAAC;AAAA,MACX,WAAW,IAAA,EAAM;AACf,QAAA,KAAA,GAAQ,CAAC,IAAI,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,KAAA,GAAQ,EAAC;AAAA,MACX;AAAA,IACF,WAAW,GAAA,EAAK;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,GAAA;AACT;AAOA,SAAS,iBAAiB,GAAA,EAAmD;AAC3E,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,GAAG,WAAA,IAAe,EAAA;AAG/B,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC1C,EAAA,MAAM,UACJ,gBAAA,KAAqB,EAAA,GACjB,KAAK,KAAA,CAAM,CAAA,EAAG,mBAAmB,CAAC,CAAA,CAAE,IAAA,EAAK,GACxC,KAAK,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAGrC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,WAAA,GAAc,qCAAA,CAAsC,IAAA,CAAK,IAAI,CAAA;AACnE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAQ,WAAA,CAAY,CAAC,EACxB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;;;AC7KA,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAAyB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAS3F,IAAM,cAAA,uBAAqB,GAAA,EAAoB;AAE/C,IAAM,uBAAA,GAA0B,GAAA;AAEhC,SAAS,iBAAA,CAAkB,KAAa,OAAA,EAA+B;AACrE,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;AAElD,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,cAAA,CAAe,MAAM,CAAA;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,uBAAA,GAA0B,CAAC,GAAG,CAAA,EAAA,EAAK;AAChE,MAAA,cAAA,CAAe,MAAA,CAAO,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,IAChC;AAAA,EACF;AACA,EAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,EAAA,cAAA,CAAe,GAAA,CAAI,KAAK,QAAQ,CAAA;AAChC,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;AACA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAChC,EAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,MAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC7D;AAKO,SAAS,yBAAyB,OAAA,EAAmC;AAC1E,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,mBAAmB,OAAO,CAAA;AAClE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAClC,EAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,MAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC7D;AAKO,SAAS,mBAAmB,IAAA,EAAsB;AACvD,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC;;;AC7CO,IAAM,kBAAN,MAA2C;AAAA,EAC/B,SAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,EAAA;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AAAA,EACrC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAc,IAAA,GAAiC,EAAC,EAA2B;AACvF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACvD,IAAA,MAAM,aAA0C,EAAC;AAGjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAChD,IAAA,IAAI,WAAA,GAAc,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,CAAA;AAG7E,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,oBAAA,CAAqB,GAAG,CAAA;AACjD,MAAA,IAAI,WAAA,GAAc,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACtD,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,aAAa,UAAA,EAAW;AAAA,EAChE;AAAA,EAEQ,oBAAoB,GAAA,EAAsB;AAChD,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAIrB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,gBAAgB,QAAA,CAAS,MAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,IAAK,SAAA,GAAY,IAAA,CAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AAC3E,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,WAAA,EAAa;AAC/C,QAAA,SAAA,EAAA;AACA,QAAA,aAAA,GAAgB,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,YAAA,GAAe,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAEtB,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvC,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAA6B,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe,OAAO,CAAA;AACrC,QAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,CAAA,CAAE,OAAO,CAAA;AACjD,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA;AACzC,QAAA,KAAA,IAAS,MAAA;AACT,QAAA,MAAM,MAAA,GAA0B;AAAA,UAC9B,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,OAAA,EAAS,aAAa,MAAM,CAAA,gDAAA,CAAA;AAAA,UAC5B,UAAU,CAAA,CAAE;AAAA,SACd;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IACE,UAAA,CAAW,MAAA,KAAW,GAAA,CAAI,OAAA,CAAQ,UAClC,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,EACnD;AACA,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,EAAK,SAAS,UAAA,EAAW;AAChD,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,YAAY,CAAA;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,GAAA,EAAsB;AACjD,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAA,GAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAClE,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,CAAA;AAG3B,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,GAAG,OAAO,CAAA;AAE1B,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAEnD,IAAA,MAAM,OAAA,GAAqB;AAAA,MACzB;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAA,2BAAA,EAA8B,OAAA,CAAQ,MAAM,CAAA,2DAAA;AAAA,OACvD;AAAA,MACA,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,oCAAA;AAAqC,KACrE;AAGA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACxC,IAAA,GAAA,CAAI,MAAM,eAAA,CAAgB,CAAC,GAAG,OAAA,EAAS,GAAG,IAAI,CAAC,CAAA;AAC/C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EACnE;AAAA,EAEQ,iBAAiB,QAAA,EAA6B;AACpD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,QAAA,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,IAAI,EAAE,IAAA,KAAS,MAAA,WAAiB,IAAA,CAAK,SAAA,CAAU,EAAE,IAAI,CAAA;AAAA,eAAA,IAC5C,EAAE,IAAA,KAAS,UAAA,EAAY,KAAA,IAAS,uBAAA,CAAwB,EAAE,KAAK,CAAA;AAAA,eAAA,IAC/D,EAAE,IAAA,KAAS,aAAA,EAAe,KAAA,IAAS,wBAAA,CAAyB,EAAE,OAAO,CAAA;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAe,CAAA,EAAqB;AAC3C,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;;;ACjFO,SAAS,YAAY,CAAA,EAAiC;AAC3D,EAAA,OAAO,EAAE,IAAA,KAAS,MAAA;AACpB;;;AChBO,IAAM,uBAAN,MAAgD;AAAA,EACpC,QAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EAEjB,YAAY,IAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,IAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,KAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,GACH,KAAK,gBAAA,IACL,4QAAA;AACF,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,eAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAc,IAAA,GAAiC,EAAC,EAA2B;AACvF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACrD,IAAA,MAAM,aAA0C,EAAC;AAEjD,IAAA,MAAM,IAAA,GAAO,eAAe,IAAA,CAAK,UAAA;AAGjC,IAAA,MAAM,UAAA,GACJ,QAAQ,IAAA,CAAK,aAAA,GAAgB,OAAQ,IAAA,CAAK,UAAA,IAAc,QAAQ,IAAA,CAAK,aAAA;AAGvE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,CAAA;AAGnE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAG,CAAA;AACnD,MAAA,IAAI,MAAA,GAAS,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,IACrE,CAAA,MAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,EAAe;AAErC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAC1C,MAAA,IAAI,MAAA,GAAS,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACpD,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,aAAa,UAAA,EAAW;AAAA,EAChE;AAAA,EAEA,MAAc,sBAAsB,GAAA,EAA+B;AACjE,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAA,GAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC/D,IAAA,IAAI,MAAA,IAAU,GAAG,OAAO,CAAA;AAGxB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,GAAG,MAAM,CAAA;AAC1D,IAAA,IAAI,QAAA,IAAY,GAAG,OAAO,CAAA;AAE1B,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAErD,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa,GAAG,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AAEN,MAAA,WAAA,GAAc,CAAA,CAAA,EAAI,YAAY,MAAM,CAAA,iFAAA,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,UAAA,GAAsB;AAAA,MAC1B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yBAAyB,WAAW,CAAA,CAAA;AAAA,KAC/C;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,CAAC,UAAU,CAAC,CAAA;AAGtD,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,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,GAAgB,aAAa,CAAA;AAAA,EAClD;AAAA,EAEQ,gBAAA,CAAiB,QAAA,EAAqB,IAAA,EAAc,EAAA,EAAoB;AAG9E,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,IAAA,EAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA,EAAG;AAG/C,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,UAAqB,SAAA,EAA2B;AAGxE,IAAA,KAAA,IAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,GACtC,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,GAC3C,KAAA;AACJ,QAAA,IAAI,CAAC,UAAA,EAAY;AAEf,UAAA,OAAO,CAAA,GAAI,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,CAE9B,MAAO;AAEL,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAA,CAAe,QAAA,EAAqB,GAAA,EAA+B;AAC/E,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAK,gBAAA,EAAiB;AAAA,MAC5C,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,kCAAA,EAAmC;AAAA,MACzD,GAAG,IAAA,CAAK,cAAA,CAAe,QAAQ;AAAA,KACjC;AAEA,IAAA,MAAM,GAAA,GAAe;AAAA,MACnB,KAAA,EAAO,IAAA,CAAK,eAAA,IAAmB,GAAA,CAAI,KAAA;AAAA,MACnC,MAAA,EAAQ,MAAA;AAAA,MACR,UAAU,EAAC;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAOA,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,MAAA,GAAY,IAAI,eAAA,EAAgB;AACxD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,EAAA,CAAI,MAAA;AACjC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,GAAA,EAAK,EAAE,QAAQ,CAAA;AAExD,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA;AACjD,IAAA,OACE,UAAA,CACG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,IAAI,CAAA,CACT,IAAA,EAAK,IAAK,iBAAA;AAAA,EAEjB;AAAA,EAEQ,eAAe,QAAA,EAAkC;AACvD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA;AAClC,MAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACpD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AACnC,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,WAAW,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AACjE,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAAA,EAClD;AAAA,EAEQ,mBAAmB,GAAA,EAAsB;AAE/C,IAAA,OAAO,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,EACrC;AAAA,EAEQ,oBAAoB,GAAA,EAAsB;AAChD,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,gBAAgB,QAAA,CAAS,MAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,IAAK,SAAA,GAAY,IAAA,CAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AAC3E,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,WAAA,EAAa;AAC/C,QAAA,SAAA,EAAA;AACA,QAAA,aAAA,GAAgB,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,YAAA,GAAe,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAEtB,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvC,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAA6B,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe,OAAO,CAAA;AACrC,QAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,CAAA,CAAE,OAAO,CAAA;AACjD,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA;AACzC,QAAA,KAAA,IAAS,MAAA;AACT,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,OAAA,EAAS,aAAa,MAAM,CAAA,QAAA,CAAA;AAAA,UAC5B,UAAU,CAAA,CAAE;AAAA,SACd;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IACE,UAAA,CAAW,MAAA,KAAW,GAAA,CAAI,OAAA,CAAQ,UAClC,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,EACnD;AACA,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,EAAK,SAAS,UAAA,EAAW;AAChD,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,YAAY,CAAA;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,CAAA,EAAqB;AAC1C,IAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AACpE,IAAA,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;AAAA,EAC5E;AAAA,EAEQ,eAAe,QAAA,EAA6B;AAClD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,QAAA,KAAA,IAAS,kBAAA,CAAmB,EAAE,OAAO,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAQ,KAAA,IAAS,kBAAA,CAAmB,EAAE,IAAI,CAAA;AAAA,eAAA,IAChD,EAAE,IAAA,KAAS,UAAA,EAAY,KAAA,IAAS,uBAAA,CAAwB,EAAE,KAAK,CAAA;AAAA,eAAA,IAC/D,EAAE,IAAA,KAAS,aAAA,EAAe,KAAA,IAAS,wBAAA,CAAyB,EAAE,OAAO,CAAA;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACjSA,IAAM,qBAAA,GAAwB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,0EAAA,CAAA;AAwB9B,SAAS,eAAe,QAAA,EAA6B;AACnD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,KAAA,IAAS,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ,KAAA,IAAS,KAAK,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAAA,aACtD,KAAA,IAAS,KAAK,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,cAAA,CAAe,QAAA,EAAqB,QAAA,GAAW,GAAA,EAAc;AACpE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA;AAClC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAM,UAAU,CAAA,CAAE,OAAA;AAClB,MAAA,IAAA,GAAO,OAAA,CACJ,MAAA,CAAO,WAAW,CAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,GAAG,CAAA;AAEX,MAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAC5D,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,IAAQ,CAAA,SAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAO,EAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAClF;AAAA,IACF;AACA,IAAA,MAAM,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,IAAI,MAAM,IAAI,CAAA,CAAA;AACrC,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,QAAA,EAAU;AACnC,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,IAAA,IAAQ,IAAA,CAAK,MAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAOO,IAAM,cAAN,MAA6C;AAAA,EACjC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EAEjB,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,SAAA;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,IAAoB,GAAA;AACjD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,qBAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAA,CAAO,QAAA,EAAqB,SAAA,EAA4C;AAC5E,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,KAAK,gBAAgB,CAAA;AAGjE,IAAA,MAAM,WAAA,GAAc,eAAe,QAAQ,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,eAAe,QAAQ,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,IAAA,CAAK,YAAY;;AAAA,cAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,YAAA,EAAe,WAAW,oBAAoB,eAAe,CAAA;AAAA,CAAA;AAGxI,IAAA,MAAM,iBAAA,GACJ,cAAc,eAAA,GACV;;AAAA,+BAAA,EAAsC,WAAW,CAAA,yBAAA,EAA4B,eAAe,CAAA,oFAAA,CAAA,GAC5F,EAAA;AAEN,IAAA,MAAM,GAAA,GAAe;AAAA,MACnB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,UAAA,GAAa,mBAAmB,CAAA;AAAA,MAC/D,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,MACjD,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AAIF,MAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA;AACnE,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA;AACjD,MAAA,GAAA,GAAM,UAAA,CACH,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,IAAI,CAAA,CACT,IAAA,EAAK;AAAA,IACV,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAO,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,eAAe,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,GAAA,EAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACtD;AAAA,EAEQ,cAAA,CAAe,UAAqB,MAAA,EAAgC;AAE1E,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,aAA0C,EAAC;AAEjD,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,QAAA,GAAW,CAAA;AAGf,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,MAAM,IAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GACjB,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAC9B,EAAE,OAAA,CAAQ,MAAA;AAAA,QACR,CAAC,KAAK,CAAA,KACJ,GAAA,IACC,EAAE,IAAA,KAAS,MAAA,GACR,KAAK,IAAA,CAAK,CAAA,CAAE,KAAK,MAAA,GAAS,CAAC,IAC3B,IAAA,CAAK,IAAA,CAAK,KAAK,SAAA,CAAU,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAA;AAAA,QAC5C;AAAA,OACF;AAEN,MAAA,IAAI,UAAA,GAAa,QAAQ,MAAA,EAAQ;AAC/B,QAAA,UAAA,IAAc,IAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAA,GAAI,CAAA;AACf,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,GAAG,EAAA,EAAI,QAAA,GAAW,GAAG,CAAA;AAAA,IAC/C;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,SAAS,MAAA,GAAS,CAAA,EAAG,UAAA,EAAY,MAAA,EAAQ,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,UAAA;AAAA,MACX,WAAW,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAA,GAAS,QAAQ,oBAAoB,MAAM,CAAA,aAAA;AAAA,KACxF;AAAA,EACF;AAAA,EAEQ,mBAAA,CAAoB,KAAa,YAAA,EAAsC;AAE7E,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACnC,IAAA,IAAI,SAAA,KAAc,EAAA,IAAM,OAAA,KAAY,EAAA,EAAI;AAEtC,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,QACV,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAG,CAAa,CAAA;AAAA,QACrF,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,KAAK,KAAA,CAAM,GAAA,CAAI,MAAM,SAAA,EAAW,OAAA,GAAU,CAAC,CAAC,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,QACV,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAG,CAAa,CAAA;AAAA,QACrF,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,IAAA,GACH,GAAA,CAAI,IAAA,IAAgF,EAAC;AACxF,IAAA,MAAM,SAAA,GACH,GAAA,CAAI,SAAA,IAAmF,EAAC;AAE3F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACrB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,UAAA,EAAa,EAAE,UAAA,IAAc;AAAA,OAC/B,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAI,CAAA,CAAE,EAAA,EAAI,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAAA,MAChF,WAAW,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GAAW,IAAI,SAAA,GAAY;AAAA,KACjE;AAAA,EACF;AACF;;;ACzLO,IAAM,qBAAN,MAA8C;AAAA,EAClC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EAEjB,YAAY,IAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GACH,IAAA,CAAK,QAAA,IAAY,IAAI,WAAA,CAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,aAAA,EAAe,CAAA;AACzF,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,IAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,KAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC7C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,aAAA,IAAiB,SAAA;AACrE,IAAA,IAAA,CAAK,gBAAA,GACH,KAAK,gBAAA,IACL,0MAAA;AAAA,EACJ;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAc,IAAA,GAAiC,EAAC,EAA2B;AACvF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACrD,IAAA,MAAM,aAA0C,EAAC;AAEjD,IAAA,MAAM,IAAA,GAAO,eAAe,IAAA,CAAK,UAAA;AACjC,IAAA,MAAM,aAAA,GAAgB,IAAA,IAAQ,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA;AAEzD,IAAA,IAAI,CAAC,aAAA,EAAe;AAElB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC1C,MAAA,IAAI,KAAA,GAAQ,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AAC1D,MAAA,MAAME,YAAAA,GAAc,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACpD,MAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAOA,cAAa,UAAA,EAAW;AAAA,IAChE;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AACjD,IAAA,IAAI,YAAA,GAAe,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,YAAA,EAAc,CAAA;AAG/E,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAElD,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,YAAY,CAAA;AAC/D,MAAA,IAAI,cAAA,GAAiB,GAAG,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACpD,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,aAAa,UAAA,EAAW;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CAAY,GAAA,EAAc,YAAA,EAAuC;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAE/C,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,UAAU,YAAY,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA,CAAK,sBAAsB,GAAG,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAElC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CAAY,GAAA,EAAc,IAAA,EAAqC;AAC3E,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAK/B,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAE1E,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,IAAI,KAAA,CAAM,IAAA,GAAO,CAAA,IAAK,KAAA,CAAM,EAAA,IAAM,SAAS,MAAA,IAAU,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,EAAA,EAAI;AAE5E,MAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AACpB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAC3D,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,UAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,gBAAgB,KAAA,CAAM,IAAI,IAAI,KAAA,CAAM,EAAE,KAAK,OAAO,CAAA,CAAA;AAAA,OAC7D;AAEA,MAAA,QAAA,CAAS,MAAA,CAAO,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,GAAO,GAAG,UAAU,CAAA;AAAA,IACnE;AAEA,IAAA,GAAA,CAAI,KAAA,CAAM,gBAAgB,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEA,MAAc,cAAA,CAAe,QAAA,EAAqB,GAAA,EAA+B;AAC/E,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,IAAA,CAAK,gBAAgB;;AAAA,sCAAA,CAAA;AAC3C,IAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,EAAA,EAAK,KAAK,cAAA,CAAe,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAE5F,IAAA,MAAM,GAAA,GAAe;AAAA,MACnB,OAAO,IAAA,CAAK,eAAA;AAAA,MACZ,QAAQ,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAA;AAAA,MAC3C,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,MAC1C,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,GAAA,EAAK;AAAA,QAC5C,MAAA,EAAQ,GAAA,CAAI,MAAA,IAAU,IAAI,iBAAgB,CAAE;AAAA,OAC7C,CAAA;AACD,MAAA,OACE,GAAA,CAAI,OAAA,CACD,MAAA,CAAO,WAAW,EAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,IAAI,CAAA,CACT,MAAK,IAAK,SAAA;AAAA,IAEjB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA,uBAAA,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,eAAe,CAAA,EAAoB;AACzC,IAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAChE,IAAA,OAAO,EAAE,OAAA,CACN,MAAA,CAAO,WAAW,CAAA,CAClB,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,EACjB,IAAA,CAAK,GAAG,CAAA,CACR,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,GAAA,EAAsB;AAClD,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAA,GAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAEpE,IAAA,IAAI,WAAA,IAAe,GAAG,OAAO,CAAA;AAG7B,IAAA,IAAI,QAAA,GAAW,WAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,aAAa,CAAA,GAAI,QAAA,CAAS,UAAU,CAAA,GAAI,WAAA,GAAc,GAAG,CAAA,EAAA,EAAK;AACzE,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA,EAAG;AAC/C,QAAA,QAAA,GAAW,CAAA;AACX,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAEjD,IAAA,MAAM,UAAA,GAAsB;AAAA,MAC1B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,0DAAA;AAAA,KAC7B;AACA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACpC,IAAA,GAAA,CAAI,MAAM,eAAA,CAAgB,CAAC,UAAA,EAAY,GAAG,IAAI,CAAC,CAAA;AAE/C,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA,GAAgB,KAAK,cAAA,CAAe,CAAC,UAAU,CAAC,CAAC,CAAA;AAAA,EACtE;AAAA,EAEQ,oBAAoB,IAAA,EAAsB;AAChD,IAAA,IAAI,IAAA,IAAQ,KAAK,aAAA,EAAe;AAC9B,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,GAAa,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,IAAA,IAAQ,KAAK,aAAA,EAAe;AAC9B,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,GAAa,IAAI,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,GAAa,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEQ,oBAAoB,GAAA,EAAsB;AAChD,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,gBAAgB,QAAA,CAAS,MAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,IAAK,SAAA,GAAY,IAAA,CAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AAC3E,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,WAAA,EAAa;AAC/C,QAAA,SAAA,EAAA;AACA,QAAA,aAAA,GAAgB,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,YAAA,GAAe,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAEtB,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvC,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAA6B,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe,OAAO,CAAA;AACrC,QAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AACjF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAC3C,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA;AACzC,QAAA,KAAA,IAAS,MAAA;AACT,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,OAAA,EAAS,aAAa,MAAM,CAAA,QAAA,CAAA;AAAA,UAC5B,UAAU,CAAA,CAAE;AAAA,SACd;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,EAAG,GAAA,KAAQ,MAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AACxD,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,GAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,EAAK,SAAS,UAAA,EAAW;AAChD,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,YAAY,CAAA;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,CAAA,EAAqB;AAC1C,IAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AACpE,IAAA,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;AAAA,EAC5E;AAAA,EAEQ,eAAe,QAAA,EAA6B;AAClD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,QAAA,KAAA,IAAS,IAAA,CAAK,kBAAA,CAAmB,CAAA,CAAE,OAAO,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,IAAI,EAAE,IAAA,KAAS,MAAA,WAAiB,IAAA,CAAK,kBAAA,CAAmB,EAAE,IAAI,CAAA;AAAA,eAAA,IACrD,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,KAAA,IAAS,IAAA,CAAK,mBAAmB,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,eAAA,IAC/E,CAAA,CAAE,SAAS,aAAA,EAAe;AACjC,YAAA,KAAA,IAAS,IAAA,CAAK,kBAAA;AAAA,cACZ,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO;AAAA,aACtE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,IAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EAC/C;AACF;;;AC5SO,IAAM,2BAAN,MAA+B;AAAA,EAC3B,IAAA,GAAO,gBAAA;AAAA,EAEC,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAajB,WAAA,CACE,WACA,UAAA,EACA,SAAA,EACA,YACA,kBAAA,GAAuE,IACvE,MAAA,EACA;AACA,IAAA,MAAM,IAAA,GACJ,OAAO,kBAAA,KAAuB,QAAA,GAC1B,EAAE,YAAA,EAAc,kBAAA,EAAoB,QAAO,GAC3C,kBAAA;AACN,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,gBAAgB,UAAA,CAAW,IAAA;AAChC,IAAA,IAAA,CAAK,gBAAgB,UAAA,CAAW,IAAA;AAChC,IAAA,IAAA,CAAK,gBAAgB,UAAA,CAAW,IAAA;AAChC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,MAAA;AACzC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,eAAA;AAAA,EACzC;AAAA,EAEA,OAAA,GAAsC;AACpC,IAAA,OAAO,OAAO,KAAK,IAAA,KAAS;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,UAAA;AAE3B,MAAA,IAAI,IAAA,IAAQ,KAAK,aAAA,EAAe;AAC9B,QAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,EAAK,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,EAAe;AACrC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,YAAA,KAAiB,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,MACvF,CAAA,MAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,EAAe;AACrC,QAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,MAChE;AAEA,MAAA,OAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,CACZ,GAAA,EACA,UAAA,EACA,QAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,EAAE,YAAY,CAAA;AAAA,IAClD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,MAAM,KAAA,GACJ,KAAK,WAAA,KAAgB,OAAA,IACpB,KAAK,WAAA,KAAgB,eAAA,IAAmB,SAAS,KAAA,KAAU,MAAA;AAC9D,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,mBAAA,EAAqB;AAAA,QACrC,GAAA,EAAK,KAAA;AAAA,QACL,UAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf;AAAA,OACD,CAAA;AACD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAI,UAAA,CAAW;AAAA,UACnB,OAAA,EAAS,CAAA,0BAAA,EAA6B,QAAA,CAAS,KAAK,CAAA,UAAA,CAAA;AAAA,UACpD,IAAA,EAAM,wBAAA;AAAA,UACN,WAAA,EAAa,IAAA;AAAA,UACb,OAAA,EAAS;AAAA,YACP,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,YAAY,IAAA,CAAK;AAAA,WACnB;AAAA,UACA,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC7GO,SAAS,0BAAA,CAA2B,IAAA,GAAoC,EAAC,EAAG;AACjF,EAAA,MAAM,QAAA,GAAW,KAAK,0BAAA,IAA8B,GAAA;AAEpD,EAAA,SAAS,UAAU,KAAA,EAAwB;AACzC,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,EAAG,OAAO,MAAM,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,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;;;ACxCO,IAAM,eAAN,MAAmB;AAAA,EAIxB,WAAA,CACmB,UACA,IAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,kBAAA,IAAsB,GAAA;AACrD,IAAA,IAAA,CAAK,aAAa,0BAAA,CAA2B;AAAA,MAC3C,0BAAA,EAA4B,KAAK,0BAAA,IAA8B;AAAA,KAChE,CAAA;AAAA,EACH;AAAA,EAPmB,QAAA;AAAA,EACA,IAAA;AAAA,EALF,UAAA;AAAA,EACA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBjB,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,GAAA,KAAoD;AACxE,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,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,EAAQ,MAAM,CAAA;AAC5C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,QAAA,CAAS,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAE/E,MAAA,IAAI,QAAA,CAAS,eAAe,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,EAAQ,MAAM,CAAA;AAC5C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAEA,MAAA,IAAI,QAAA,CAAS,eAAe,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,EAAQ,MAAM,CAAA;AAC5C,YAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,UACxD;AAAA,QAEF,CAAA,MAAO;AACL,UAAA,MAAM,gBAAA,GACJ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,IAAI,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA,IAAK,IAAA,CAAK,IAAA;AACjE,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;AAKA,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;AAAA,OACzB,CAAA;AACD,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,YAAY,IAAA,EAAM,GAAA,EAAK,KAAK,MAAM,CAAA;AAC5D,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAC5C,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,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,GAAG,CAAA;AACnD,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,EAAQ,MAAM,CAAA;AAC5C,QAAA,IAAI,GAAA,YAAe,KAAA,EAAO,IAAA,EAAM,WAAA,CAAY,GAAG,CAAA;AAC/C,QAAA,IAAA,EAAM,YAAA,CAAa,iBAAiB,IAAI,CAAA;AACxC,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,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,GAAG,CAAA;AACnD,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,EAAQ,MAAM,CAAA;AAC5C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,IAAI,GAAA,CAAI,IAAI,CAAA,EAAG,UAAA,EAAY,CAAA,EAAE;AAAA,MACpE;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,EAC0B;AAC1B,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,MAAM,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AACpD,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,KAAK,UAAA,CAAW,UAAA,CAAW,UAAU,MAAM,CAAA;AACpE,IAAA,IAAA,CAAK,KAAK,QAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;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,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,kBAAA;AACzC,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA,EAAG,SAAS,CAAA;AAC/E,IAAA,MAAM,WAAW,WAAA,CAAY,GAAA,CAAI,CAAC,YAAA,EAAc,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5D,IAAA,IAAI;AAIF,MAAA,IAAI,OAAO,IAAA,CAAK,aAAA,KAAkB,UAAA,EAAY;AAC5C,QAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,KAAA,EAAO,GAAA,EAAK,UAAU,SAAS,CAAA;AAAA,MACzE;AACA,MAAA,OAAO,MAAM,KAAK,OAAA,CAAQ,KAAA,EAAO,KAAK,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC5D,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,OAAO,IAAA,CAAK,YAAY,UAAA,EAAY;AAE1D,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;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,MAAM,SAAS,IAAA,CAAK,aAAA,CAAe,OAAO,GAAA,EAAK,EAAE,QAAQ,CAAA;AACzD,IAAA,WAAA,MAAiB,MAAM,MAAA,EAAQ;AAC7B,MAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,QAAA,WAAA,GAAc,EAAA,CAAG,MAAA;AACjB,QAAA,QAAA,GAAW,IAAA;AAGX,QAAA;AAAA,MACF;AACA,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;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,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,eAAA,CAAgB,QAAyB,MAAA,EAAwB;AACvE,IAAA,MAAM,eACJ,OAAO,MAAA,CAAO,YAAY,QAAA,GACtB,MAAA,CAAO,WAAW,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA,GACxC,OAAO,UAAA,CAAW,IAAA,CAAK,UAAU,MAAA,CAAO,OAAO,GAAG,MAAM,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,YAAY,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAA,CAAW,QAAA,EAAkB,KAAA,EAAgB,UAAA,EAAyC;AAC5F,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,SAAA,GAAY,WAAA;AAClB,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AACtE,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAc,UAAA,CAAW,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAIrE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,CAAA,GAAI,IAAI,UAAU,CAAA;AACxB,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,QAAA,OAAO,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,UACpE,aAAA,CAAc,CAAC,CAAA,GACf,UAAA,CAAW,CAAC,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAU,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AAC1D,MAAA,OAAO,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,OAAO,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,QAAA,EAAU;AAC/B,MAAA,OAAO,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,OAAO,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACtUO,IAAM,uBAAN,MAA2B;AAAA,EAGhC,YAA6B,SAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GACH,SAAA,CAAU,IAAA,KAAS,cAAA,IAAkB,SAAA,CAAU,UAAU,IAAI,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAAA,EAC7F;AAAA,EAH6B,SAAA;AAAA,EAFZ,aAAA;AAAA,EAOjB,MAAM,KAAA,EAAwF;AAC5F,IAAA,QAAQ,IAAA,CAAK,UAAU,IAAA;AAAM,MAC3B,KAAK,YAAA;AACH,QAAA,IAAI,KAAK,SAAA,CAAU,aAAA,IAAiB,MAAM,UAAA,IAAc,IAAA,CAAK,UAAU,aAAA,EAAe;AACpF,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAQ,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,SAAA,CAAA;AAAA,YACvD,GAAG;AAAA,WACL;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,YAAA;AACH,QAAA,IAAI,KAAK,SAAA,CAAU,YAAA,IAAgB,MAAM,SAAA,IAAa,IAAA,CAAK,UAAU,YAAA,EAAc;AACjF,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAQ,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,SAAA,CAAA;AAAA,YACtD,GAAG;AAAA,WACL;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,cAAA;AACH,QAAA,IAAI,IAAA,CAAK,iBAAiB,KAAA,CAAM,UAAA,IAAc,KAAK,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACvF,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAQ,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAA,CAAA;AAAA,YACzD,GAAG;AAAA,WACL;AAAA,QACF;AACA,QAAA;AAIA;AAGJ,IAAA,OAAO,EAAE,MAAM,KAAA,EAAO,UAAA,EAAY,MAAM,UAAA,EAAY,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EACjF;AACF;AAWO,IAAM,mBAAN,MAAuB;AAAA,EAO5B,YAA6B,IAAA,EAA+B;AAA/B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,oBAAA,CAAqB,IAAA,CAAK,aAAa,CAAA;AAAA,EAChE;AAAA,EAF6B,IAAA;AAAA,EANrB,UAAA,GAAa,CAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACD,WAAA;AAAA,EAMjB,MAAM,GAAA,GAAiC;AAUrC,IAAA,MAAM,kBAAkB,IAAA,CAAK,IAAA,CAAK,MAAM,MAAA,EAAQ,EAAA,GAAK,iBAAiB,MAAM;AAC1E,MAAA,IAAA,CAAK,SAAA,EAAA;AAAA,IACP,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,OAAA,EAAQ;AAAA,IAC5B,CAAA,SAAE;AACA,MAAA,eAAA,IAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,GAAqC;AACjD,IAAA,OAAO,CAAC,KAAK,OAAA,EAAS;AACpB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM;AAAA,QACnC,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AAED,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,MAAA,GAA2B;AAAA,UAC/B,MAAA,EAAQ,MAAA;AAAA,UACR,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAQ,KAAA,CAAM;AAAA,SAChB;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AACzB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,SAAA,EAAW,KAAK,UAAA,EAAY,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAEjF,MAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM,IAAA,CAAK,OAAM,EAAG,IAAA,CAAK,IAAA,CAAK,kBAAA,IAAsB,GAAM,CAAA;AAErF,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,EAAA,EAAI;AAAA,UAC3C,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,aAAA,EAAe,CAAA;AAAA,UACf,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAED,QAAA,IAAA,CAAK,UAAA,EAAA;AAIL,QAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,UAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AAAA,QAC3B;AAIA,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,SAAA,EAAW;AAC7D,UAAA,MAAM,YAAA,GAAiC;AAAA,YACrC,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,WAAW,IAAA,CAAK;AAAA,WAClB;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,SAAS,YAAY,CAAA;AAC/B,UAAA,OAAO,YAAA;AAAA,QACT;AAAA,MACF,SAAS,CAAA,EAAG;AAIV,QAAA,MAAM,UACH,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,gBACxC,CAAA,YAAa,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS,gBACjC,CAAA,YAAa,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,SAAS,mBAAmB,CAAA;AAC/D,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,aAAA,GAAkC;AAAA,YACtC,MAAA,EAAQ,QAAA;AAAA,YACR,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAAA,YAC1B,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,MAAA,EAAQ;AAAA,WACV;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,SAAS,aAAa,CAAA;AAChC,UAAA,OAAO,aAAA;AAAA,QACT;AAIA,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,MAAM,YAAA,GAAiC;AAAA,UACrC,MAAA,EAAQ,QAAA;AAAA,UACR,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAAA,UAC1B,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAQ,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,SACnD;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,YAAY,CAAA;AAC/B,QAAA,OAAO,YAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AACF;;;ACpMO,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,CAAG,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;;;ACnCO,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,EAElD,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,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC9C,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,MAAM,mBAAmB,CAAA;AACrD,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,KAAA;AAAA,QACR,sBAAsB,aAAa,CAAA,yEAAA;AAAA,OACrC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,aAAa,CAAA;AAErC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,QAAAA,EAAS,MAAA,KAAW;AACtC,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,KAAA,CAAM,CAAA,QAAA,EAAW,aAAa,CAAA,iBAAA,EAAoB,OAAO,IAAI,CAAC,CAAA;AAAA,MAC3E,GAAG,OAAO,CAAA;AAEV,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;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,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,IAAIC,UAAAA,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;;;ACnHO,IAAM,yBAAA,GAA4B,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA;AA2ClC,IAAM,yBAAA,GAA4B,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA;AAqClC,SAAS,qBAAA,CAAsB,KAAA,GAA6B,EAAC,EAAW;AAC7E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,IAAoB,yBAAA;AAC3C,EAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,GAAG,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AACzE,EAAA,IAAI,MAAM,aAAA,IAAiB,KAAA,CAAM,cAAc,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAChE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAmC,KAAA,CAAM,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,MAAM,UAAA,IAAc,KAAA,CAAM,WAAW,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC1D,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAC7B;AA6CO,SAAS,qBAAA,CAAsB,KAAA,GAA6B,EAAC,EAAW;AAC7E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,yBAAA;AACnC,EAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,GAAG,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AACzE,EAAA,IAAI,MAAM,IAAA,IAAQ,KAAA,CAAM,KAAK,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,MAAM,IAAA,IAAQ,KAAA,CAAM,KAAK,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,MAAM,gBAAA,IAAoB,KAAA,CAAM,iBAAiB,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACtE,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA;AAAA,+DAAA,EACoE,KAAA,CAAM,gBAAA,CAAiB,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA,oHAAA;AAAA,KAMnG;AAAA,EACF;AACA,EAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,SAAS,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACtD,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAC7B;AAWO,SAAS,yBACd,MAAA,EAIQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,IAAI,MAAA,GAAA,CAChB,GAAA,CAAI,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,EAAI,MAAK,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAClF,EAAA;AACJ,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,CAAA,QAAA,EAAM,QAAQ,CAAA,CAAA,GAAK,EAAA;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACtLO,IAAM,WAAN,MAAe;AAAA,EACH,IAAA,uBAAW,GAAA,EAA+B;AAAA,EAC1C,MAAA,uBAAa,GAAA,EAA+B;AAAA,EAC5C,GAAA,uBAAU,GAAA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa7C,MAAA,CAAO,UAAA,EAAoB,GAAA,EAAe,MAAA,EAA6B;AACrE,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,cAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,OAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,KAAK,eAAA,EAAiB;AAC/B,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,GAAA,CAAI,EAAA,CAAG,CAAA,EAAG,CAAC,OAAA,KAAqB;AAC9B,UAAA,IAAA,CAAK,IAAA,CAAK,EAAE,UAAA,EAAY,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA;AAAA,QACpE,CAAC;AAAA,OACH;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,GAAA,EAAI;AAAA,IAC9B,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,CAAU,YAAoB,OAAA,EAAmC;AAC/D,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IACrB,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,MAAc,OAAA,EAAmC;AACtD,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IACrB,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAA,EAAmC;AACvC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,OAAO,CAAA;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IACzB,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAyB;AAI5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,UAAU,CAAA;AAC3C,IAAA,IAAI,IAAA;AACF,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,KAAK,CAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,IAAI,CAAA;AACzC,IAAA,IAAI,MAAA;AACF,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,KAAK,CAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACF,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,GAAA,EAAK;AACxB,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,KAAK,CAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAyCO,IAAM,uBAAN,MAA2B;AAAA,EAIhC,WAAA,CACmB,GAAA,EACA,WAAA,EAGA,UAAA,EAGjB;AAPiB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAGA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAIjB,IAAA,GAAA,CAAI,OAAO,mBAAA,EAAqB,CAAC,MAAM,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAC,CAAA;AACjE,IAAA,GAAA,CAAI,OAAO,eAAA,EAAiB,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AACzD,IAAA,GAAA,CAAI,OAAO,mBAAA,EAAqB,CAAC,MAAM,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,EACnE;AAAA,EAXmB,GAAA;AAAA,EACA,WAAA;AAAA,EAGA,UAAA;AAAA,EARF,WAAA,uBAAkB,GAAA,EAAmC;AAAA,EACrD,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA;AAAA,EAiBrF,QAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,MACvB,aAAa,MAAA,CAAO,WAAA;AAAA,QAClB,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,EAAS,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,EAAE,GAAG,CAAA,EAAG,CAAC;AAAA;AACtE,KACF;AAAA,EACF;AAAA,EAEQ,OAAO,UAAA,EAA2C;AACxD,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,GAAa,UAAU,CAAA;AACzC,MAAA,IAAA,GAAO;AAAA,QACL,UAAA;AAAA,QACA,UAAU,IAAA,EAAM,QAAA;AAAA,QAChB,OAAO,IAAA,EAAM,KAAA;AAAA,QACb,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,UAAA,EAAY,CAAA;AAAA,QACZ,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,EAAW,CAAA;AAAA,QACX,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAA,EAAa,KAAK,GAAA;AAAI,OACxB;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,IAAI,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,CAAA,EAAqB;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AACrC,IAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AAGZ,IAAA,MAAM,QAAQ,CAAA,EAAG,KAAA;AACjB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,KAAA,IAAS,MAAM,KAAA,IAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,IAAU,MAAM,MAAA,IAAU,CAAA;AAC/B,IAAA,IAAA,CAAK,SAAA,IAAa,MAAM,SAAA,IAAa,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,UAAA,IAAc,CAAA;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,IAAS,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,IAAU,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,IAAa,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,IAAc,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,GAAc,CAAA,CAAE,UAAU,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA,GAAA,CACF,KAAA,CAAM,KAAA,IAAS,CAAA,IAAK,GAAA,IAAc,KAAA,CAAM,KAAA,IAAS,CAAA,CAAA,GAAA,CACjD,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,GAAA,IAAc,KAAA,CAAM,MAAA,IAAU,CAAA,CAAA,GAAA,CACnD,KAAA,CAAM,SAAA,IAAa,CAAA,IAAK,GAAA,IAAc,KAAA,CAAM,SAAA,IAAa,CAAA,CAAA,GAAA,CACzD,KAAA,CAAM,UAAA,IAAc,CAAA,IAAK,GAAA,IAAc,KAAA,CAAM,UAAA,IAAc,CAAA,CAAA;AAC/D,MAAA,IAAA,CAAK,IAAA,IAAQ,KAAA;AACb,MAAA,IAAA,CAAK,MAAM,IAAA,IAAQ,KAAA;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,cAAc,CAAA,CAAE,EAAA;AAAA,EACvB;AAAA,EAEQ,eAAe,CAAA,EAAqB;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AACrC,IAAA,IAAA,CAAK,SAAA,IAAa,CAAA;AAClB,IAAA,IAAA,CAAK,cAAc,CAAA,CAAE,EAAA;AAAA,EACvB;AAAA,EAEQ,mBAAmB,CAAA,EAAqB;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,IAAA,IAAA,CAAK,cAAc,CAAA,CAAE,EAAA;AAAA,EACvB;AACF;;;AC/QO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EACpC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAkB,KAAA,EAAe,QAAA,EAAkB;AAC7D,IAAA,KAAA,CAAM,oBAAoB,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,CAAG,CAAA;AACvE,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACF;AAuCO,IAAM,iBAAN,MAAqB;AAAA,EACjB,MAAA;AAAA,EACD,UAAA,GAAa,CAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,CAAA;AAAA,EACb,WAAA,GAAc,CAAA;AAAA,EACd,OAAA,GAAU,CAAA;AAAA,EACV,SAAA,GAA2B,IAAA;AAAA,EAEnC,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACrC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EAC5B;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,UAAA,EAAA;AACL,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,KAAkB,MAAA,IAAa,KAAK,UAAA,GAAa,IAAA,CAAK,OAAO,aAAA,EAAe;AAC1F,MAAA,MAAM,IAAI,mBAAA,CAAoB,YAAA,EAAc,KAAK,MAAA,CAAO,aAAA,EAAe,KAAK,UAAU,CAAA;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,SAAA,EAAA;AACL,IAAA,IAAI,IAAA,CAAK,OAAO,YAAA,KAAiB,MAAA,IAAa,KAAK,SAAA,GAAY,IAAA,CAAK,OAAO,YAAA,EAAc;AACvF,MAAA,MAAM,IAAI,mBAAA,CAAoB,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA,EAAc,KAAK,SAAS,CAAA;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,KAAA,EAAc,OAAA,GAAU,CAAA,EAAS;AAC3C,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA;AACzB,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM,MAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,IAAW,OAAA;AAEhB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,WAAA;AAC3C,IAAA,IAAI,KAAK,MAAA,CAAO,SAAA,KAAc,UAAa,WAAA,GAAc,IAAA,CAAK,OAAO,SAAA,EAAW;AAC9E,MAAA,MAAM,IAAI,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,WAAW,WAAW,CAAA;AAAA,IAC5E;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,MAAA,IAAa,KAAK,OAAA,GAAU,IAAA,CAAK,OAAO,UAAA,EAAY;AACjF,MAAA,MAAM,IAAI,mBAAA,CAAoB,MAAA,EAAQ,KAAK,MAAA,CAAO,UAAA,EAAY,KAAK,OAAO,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAqB;AACnB,IAAA,IAAI,KAAK,SAAA,KAAc,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,cAAc,MAAA,EAAW;AACpE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AAClC,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACnC,MAAA,MAAM,IAAI,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA,EAGA,UAAA,GAAsB;AACpB,IAAA,IAAI,KAAK,SAAA,KAAc,IAAA,IAAQ,KAAK,MAAA,CAAO,SAAA,KAAc,QAAW,OAAO,KAAA;AAC3E,IAAA,OAAO,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAAA,EACnD;AAAA,EAEA,KAAA,GAAqB;AACnB,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN,OAAO,IAAA,CAAK,UAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,WAAA;AAAA,QACb,KAAA,EAAO,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK;AAAA,OAChC;AAAA,MACA,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAA,EAAW,KAAK,SAAA,KAAc,IAAA,GAAO,IAAI,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK;AAAA,KAC7D;AAAA,EACF;AACF;;;AC5FO,IAAM,4BAAA,GAAN,cAA2C,YAAA,CAA8C;AAAA,EACrF,aAAA;AAAA,EACA,MAAA;AAAA,EACQ,MAAA;AAAA,EAEA,SAAA,uBAAgB,GAAA,EAA2B;AAAA,EAEpD,eAA2B,EAAC;AAAA,EAC5B,mBAAiC,EAAC;AAAA,EAClC,eAAA,GAAkB,CAAA;AAAA,EAClB,QAAA,GAAW,CAAA;AAAA,EAEnB,WAAA,CAAY,MAAA,EAA0B,OAAA,GAAwC,EAAC,EAAG;AAChF,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAEA,MAAM,MAAM,QAAA,EAAgD;AAC1D,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,EAAA,IAAMA,UAAAA,EAAW;AACrC,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,UAAA,EAAY,EAAA;AAAA,MACZ,OAAO,EAAC;AAAA;AAAA;AAAA;AAAA,MAIR,YAAA,EAAc,IAAA;AAAA,MACd,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB;AAAA,KAC9C;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,EAAA,EAAI;AAAA,MACrB,MAAA,EAAQ,EAAE,GAAG,QAAA,EAAU,EAAA,EAAG;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR,eAAA,EAAiB,IAAI,eAAA;AAAgB,KACtC,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,EAAE,QAAA,EAAU,EAAE,GAAG,QAAA,EAAU,EAAA,EAAG,EAAG,CAAA;AAE/D,IAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,OAAA,EAAS,EAAA,EAAG;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,IAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,MAAM,QAAA,CAAS,EAAA,EAAY,GAAA,EAAmC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,EAAE,CAAA,WAAA,CAAa,CAAA;AAC3D,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,EAAE,CAAA,2DAAA,CAAwD,CAAA;AAAA,IACzF;AACA,IAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,CAAkB,YAAoB,MAAA,EAA2B;AAC/D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,WAAA,CAAa,CAAA;AACnE,IAAA,QAAA,CAAS,QAAQ,YAAA,GAAe,MAAA;AAAA,EAClC;AAAA,EAEA,MAAM,KAAK,UAAA,EAAmC;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AAIf,IAAA,QAAA,CAAS,gBAAgB,KAAA,EAAM;AAC/B,IAAA,QAAA,CAAS,MAAA,GAAS,SAAA;AAClB,IAAA,QAAA,CAAS,WAAA,GAAc,MAAA;AACvB,IAAA,QAAA,CAAS,QAAQ,YAAA,GAAe,IAAA;AAEhC,IAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,UAAA,EAAY,MAAA,EAAQ,0BAA0B,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAE7B,IAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,UAAU,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,EAChF;AAAA,EAEA,SAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,QAChE,EAAA;AAAA,QACA,IAAA,EAAM,EAAE,MAAA,CAAO,IAAA;AAAA,QACf,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AAAA,MACF,YAAA,EAAc,KAAK,YAAA,CAAa,MAAA;AAAA,MAChC,cAAA,EAAgB,KAAK,gBAAA,CAAiB,MAAA;AAAA,MACtC,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,IAAA,EAAM,KAAK,MAAA;AAAO,KACpB;AAAA,EACF;AAAA;AAAA,EAGA,OAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,MAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA,EAIQ,eAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA,CAAK,aAAY,EAAG;AACzB,MAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,EAAiB;AACzC,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AACrC,MAAA,IAAI,CAAC,IAAA,EAAM;AAKX,MAAA,IAAA,CAAK,cAAc,UAAA,EAAY,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAClD,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,UAAA;AAAA,UACA,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,MAAA,EAAQ,QAAA;AAAA,UACR,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,UACtD,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAW,CAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAA;AACzC,IAAA,OAAO,IAAA,CAAK,QAAA,GAAW,GAAA,IAAO,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAAA,EAC3D;AAAA,EAEQ,gBAAA,GAAkC;AACxC,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,KAAK,SAAA,EAAW;AACpC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAQ,OAAO,EAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAA,CAAc,UAAA,EAAoB,IAAA,EAA+B;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,QAAA,CAAS,MAAA,GAAS,SAAA;AAClB,IAAA,QAAA,CAAS,cAAc,IAAA,CAAK,EAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAEhC,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,IAAA,EAAM,YAAY,CAAA;AAI/C,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,MAChC,eAAe,QAAA,CAAS,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,OAAO,aAAA,EAAe,aAAA;AAAA,MAC3E,YAAA,EACE,KAAK,YAAA,IACL,QAAA,CAAS,OAAO,YAAA,IAChB,IAAA,CAAK,OAAO,aAAA,EAAe,YAAA;AAAA,MAC7B,WAAW,QAAA,CAAS,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,aAAA,EAAe,SAAA;AAAA,MACnE,YAAY,QAAA,CAAS,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,OAAO,aAAA,EAAe,UAAA;AAAA,MACrE,SAAA,EACE,KAAK,SAAA,IAAa,QAAA,CAAS,OAAO,SAAA,IAAa,IAAA,CAAK,OAAO,aAAA,EAAe;AAAA,KAC7E,CAAA;AACD,IAAA,QAAA,CAAS,YAAA,GAAe,MAAA;AAExB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAOhB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,QAAA,EAAA;AAEL,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,UAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA;AAAA,MACA,MAAA,EAAQ,SAAS,eAAA,CAAgB,MAAA;AAAA,MACjC,MAAA,EAAQ,QAAA,CAAS,OAAA,CAAQ,YAAA,IAAgB;AAAA,KAC3C;AAEA,IAAA,IAAI,MAAA;AAEJ,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC/E,MAAA,MAAA,GAAS;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,MAAA,EAAQ,SAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF,SAAS,GAAA,EAAK;AAIZ,MAAA,MAAM,MAAA,GACJ,GAAA,YAAe,mBAAA,IAAuB,GAAA,CAAI,IAAA,KAAS,SAAA,GAC/C,SAAA,GACA,QAAA,CAAS,eAAA,CAAgB,MAAA,CAAO,OAAA,GAC9B,SAAA,GACA,QAAA;AACR,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,MAAA,MAAA,GAAS;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,MAAA;AAAA,QACA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,QACtD,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAc,kBAAA,CACZ,MAAA,EACA,IAAA,EACA,KACA,MAAA,EACA;AACA,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,SAAA;AAChC,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,OAAO,MAAA,CAAO,MAAM,GAAG,CAAA;AAEpD,IAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,KAAA,GAAQ,WAAW,MAAM;AAEvB,QAAA,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG,gBAAgB,KAAA,EAAM;AAC1D,QAAA,MAAA,CAAO,IAAI,mBAAA,CAAoB,SAAA,EAAW,WAAW,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AAAA,MAClE,GAAG,SAAS,CAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,QAAQ,IAAA,CAAK,CAAC,OAAO,IAAA,EAAM,GAAG,CAAA,EAAG,cAAc,CAAC,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAA,EAA0B;AACjD,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,UAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,QAAA,EAAA;AAAA,IACP,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AAGtB,MAAA,IAAA,CAAK,KAAK,SAAA,EAAW;AAAA,QACnB,IAAA,EAAM,oBAAA;AAAA,QACN,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,UAAU,CAAA;AACrD,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,SAAA,EAAW;AAC7C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,KAAW,QAAA,IAAY,OAAO,MAAA,KAAW,SAAA;AAC/D,MAAA,QAAA,CAAS,MAAA,GAAS,SAAS,OAAA,GAAU,MAAA;AACrC,MAAA,QAAA,CAAS,WAAA,GAAc,MAAA;AAIvB,MAAA,IAAI,QAAA,CAAS,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AAC3C,QAAA,QAAA,CAAS,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,MACjD;AAGA,MAAA,IAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AAC/B,QAAA,cAAA,CAAe,MAAM;AACnB,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,OAAA,EAAS,QAAA,CAAS,MAAA,GAAS,MAAA;AACnD,UAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,QACvB,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,MAC1B,IAAA,EAAM,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAO,MAAM,CAAA,IAAK,EAAE,EAAA,EAAI,OAAO,MAAA,EAAO;AAAA,MACzF;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,IAAA,CAAK,QAAO,EAAG;AACjB,MAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,QAChB,SAAS,IAAA,CAAK,gBAAA;AAAA,QACd,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,MAAA,GAAkB;AACxB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,KAAS,gBAAA,EAAkB;AACvD,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,KAAK,QAAA,KAAa,CAAA;AAAA,IAC7D;AACA,IAAA,IACE,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,aAAA,KAAkB,MAAA,IAC5C,KAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,aAAA,EAClD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACpQO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EACpC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACT,WAAA,CAAY,IAAA,EAAwC,KAAA,EAAe,QAAA,EAAkB;AACnF,IAAA,KAAA;AAAA,MACE,IAAA,KAAS,YAAA,GACL,CAAA,gDAAA,EAAmD,QAAQ,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAA,GACrF,CAAA,gEAAA,EAAmE,QAAQ,CAAA,sBAAA,EAAyB,KAAK,CAAA;AAAA,KAC/G;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EACX,EAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA;AAAA,EACQ,SAAA;AAAA,EACA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA,uBAAkB,GAAA,EAMjC;AAAA;AAAA;AAAA;AAAA,EAIe,SAAA,uBAAgB,GAAA,EAAwB;AAAA;AAAA;AAAA,EAGxC,YAAA,uBAAmB,GAAA,EAAmD;AAAA,EACtE,YAAA,uBAAmB,GAAA,EAGlC;AAAA;AAAA;AAAA,EAGe,eAAA,uBAAsB,GAAA,EAAiC;AAAA;AAAA,EAEvD,eAAA,uBAAsB,GAAA,EAUrC;AAAA,EACe,YAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKR,oBAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAED,UAAA,GAAa,CAAA;AAAA,EAErB,YAAY,IAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiBA,UAAAA,EAAW;AAClD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,IAAoB,yBAAA;AACjD,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,IAAoB,yBAAA;AACjD,IAAA,IAAA,CAAK,oBAAA,GAAuB,KAAK,oBAAA,IAAwB,IAAA;AACzD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,MAAA,CAAO,iBAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,CAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AACrC,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAI7B,MAAA,KAASC,GAAA,CAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,EAAsB,EAAE,SAAA,EAAW,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACtF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,uBAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,SAAS,IAAI,mBAAA;AAAA,MAChB,EAAE,OAAA,EAAS,IAAA,CAAK,EAAA,EAAI,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,MAC3C,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,QAAQ,IAAI,oBAAA;AAAA,MACf,IAAA,CAAK,KAAA;AAAA,MACL,CAAC,EAAA,KAAO,IAAA,CAAK,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,MAChC,CAAC,EAAA,KAAO,IAAA,CAAK,YAAA,CAAa,IAAI,EAAE;AAAA,KAClC;AACA,IAAA,IAAA,CAAK,cAAc,IAAI,4BAAA;AAAA,MACrB,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,MACzC,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KACxB;AAKA,IAAA,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,gBAAA,EAAkB,CAAC,OAAA,KAAoD;AACzF,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,MAAM,CAAA;AAC5C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAChB,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,KAAA,CACJ,MAAA,EACA,WAAA,EACiB;AAGjB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAA,EAAe;AACzC,MAAA,MAAM,IAAI,mBAAA,CAAoB,iBAAA,EAAmB,IAAA,CAAK,aAAA,EAAe,KAAK,UAAU,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAI,mBAAA,CAAoB,YAAA,EAAc,KAAK,SAAA,EAAW,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,MAAM,CAAA;AAClD,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY;AAAA,MACvC,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AACD,IAAA,IAAI,aAAa,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,YAAY,WAAW,CAAA;AAMrE,IAAA,MAAM,iBAAiB,IAAI,mBAAA;AAAA,MACzB,EAAE,OAAA,EAAS,MAAA,CAAO,UAAA,EAAY,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,MACrD,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,MAAA,CAAO,UAAA,EAAY,cAAc,CAAA;AACpE,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,cAAc,CAAA;AAG1D,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY;AAAA,MAC1C,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAS;AAAC,KACX,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,UAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,GAAA,CAAiB,UAAA,EAAoB,OAAA,EAAkB,SAAA,EAAgC;AAC3F,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,UAAU,CAAA,oCAAA,EAAuC,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,SAAS,CAAA,CAAA;AAAA,OAC5I;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAqB;AAAA,MACzB,IAAID,UAAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,MAAM,IAAA,CAAK,EAAA;AAAA,MACX,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAW,KAAK,SAAS,CAAA;AACzD,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAA,CAAO,OAAA,EAAmB,KAAA,GAA6B,UAAA,EAAoB;AACzE,IAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAA,KAAO,KAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,EAAE,MAAA,CAAO,CAAC,CAAA,KAAuB,CAAC,CAAC,CAAC,CAAA;AAC3F,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,QACV,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACf,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,QACF,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,sEAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAC/C,MAAA,MAAM,GAAA,GAAM,IAAA,EAAM,QAAA,IAAY,IAAA,EAAM,KAAA,GAAQ,CAAA,MAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,EAAA;AAClF,MAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,UAAU,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,QAAA,EAAM,CAAA,CAAE,UAAU,CAAA,WAAA,EAAW,CAAA,CAAE,SAAS,CAAA,YAAA,EAAY,CAAA,CAAE,UAAU,CAAA,GAAA,CAAK,CAAA;AAC5F,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,WAAA,IACtC,OAAO,CAAA,CAAE,MAAA,KAAW,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAM,CAAA;AAAA,WAAA,IACjD,EAAE,MAAA,KAAW,MAAA;AACpB,QAAA,KAAA,CAAM,IAAA,CAAK,cAAc,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,OAAO,CAAA;AAAA,WACjE,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,GAAwC;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAC/B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,eAAe,IAAA,CAAK,EAAA;AAAA,MACpB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC9D,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,QAIH,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC9B,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAChC,UAAA,OAAO,CAAA,GACH;AAAA,YACE,MAAA,EAAQ,GAAA;AAAA,YACR,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,WAAW,CAAA,CAAE,SAAA;AAAA,YACb,YAAY,CAAA,CAAE;AAAA,WAChB,GACA,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,SAAA,EAAmB;AAAA,QAChD,CAAC;AAAA,OACH,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAS,KAC7B;AACA,IAAA,MAAUC,GAAA,CAAA,KAAA,CAAWC,cAAQ,IAAA,CAAK,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpE,IAAA,MAAUD,GAAA,CAAA,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACzF,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,CAAK,YAAY,OAAA,EAAQ;AAC/B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC7C,MAAA,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,cAAc,MAAM,IAAA,CAAK,eAAc,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,IAAA,EAAiC;AAC5C,IAAA,MAAM,UAAA,GAAuB,KAAK,EAAA,GAAK,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,EAAA,EAAID,UAAAA,EAAW,EAAE;AAC1E,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,UAAU,CAAA;AACtD,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,IAC7C;AACA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA;AACxC,IAAA,OAAO,UAAA,CAAW,EAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,OAAA,EAA0C;AACnD,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,MACb,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAA,KAAO;AAClB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACpC,QAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACxC,QAAA,IAAI,QAAA,SAAiB,QAAA,CAAS,OAAA;AAC9B,QAAA,IAAID,QAAAA;AACJ,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAoB,CAAC,GAAA,KAAQ;AAC/C,UAAAA,QAAAA,GAAU,GAAA;AAAA,QACZ,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,YAAY,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,OAAA,EAAAA,UAAS,CAAA;AAC7C,QAAA,OAAO,OAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,UAAA,EAAmC;AACjD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,CAAK,YAAY,OAAA,EAAQ;AAAA,EACjC;AAAA,EAEA,MAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,YAAY,SAAA,EAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,EAAA,CACE,OACA,OAAA,EACY;AAGZ,IAAA,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,GAAiC;AAC/B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,QAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,EAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAmB,UAAA,EAA6B;AAC9C,IAAA,OAAO,qBAAA,CAAsB;AAAA,MAC3B,UAAA,EAAY,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,kBAAA;AAAA,MAClD,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,eAAe,IAAA,CAAK,MAAA,GAAS,wBAAA,CAAyB,IAAA,CAAK,MAAM,CAAA,GAAI;AAAA,KACtE,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,oBAAA,CAAqB,QAAwB,SAAA,EAA4B;AACvE,IAAA,OAAO,qBAAA,CAAsB;AAAA,MAC3B,UAAU,IAAA,CAAK,gBAAA;AAAA,MACf,MAAM,MAAA,CAAO,MAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,gBAAA,EAAkB,KAAK,oBAAA,IAAwB,MAAA;AAAA,MAC/C,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,MAAA,EAAiD;AACrD,IAAA,MAAM,CAAA,GAAY;AAAA,MAChB,aAAA,CAAc,MAAM,MAAM,CAAA;AAAA,MAC1B,eAAe,IAAI,CAAA;AAAA,MACnB,mBAAmB,IAAI,CAAA;AAAA,MACvB,YAAY,IAAI,CAAA;AAAA,MAChB,eAAe,IAAI,CAAA;AAAA,MACnB,kBAAkB,IAAI,CAAA;AAAA,MACtB,oBAAoB,IAAI,CAAA;AAAA,MACxB,mBAAmB,IAAI;AAAA,KACzB;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AASA,SAAS,aAAA,CAAc,UAAoB,MAAA,EAA+C;AACxF,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAChC,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC/B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,KAC/B;AAAA,IACA,UAAU;AAAC,GACb;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EACE,6KAAA;AAAA,IACF,SAAA,EACE,iHAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAK,SAAS,EAAC;AACrB,MAAA,MAAM,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,MAAA;AACnD,MAAA,MAAM,IAAA,GAAmC,IAAA,IAAQ,MAAA,GAAS,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AACzE,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,EAAM;AACjB,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,eAAA,EAAkB,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,SAAS,CAAA;AAAA,SACnG;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAsB;AAAA,QAC1B,GAAI,IAAA,IAAQ,EAAE,IAAA,EAAO,CAAA,CAAE,QAAmB,UAAA;AAAW,OACvD;AACA,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA;AAC7C,MAAA,IAAI,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU,GAAA,CAAI,WAAW,CAAA,CAAE,QAAA;AACrD,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AAC/C,MAAA,IAAI,OAAO,EAAE,oBAAA,KAAyB,QAAA;AACpC,QAAA,GAAA,CAAI,uBAAuB,CAAA,CAAE,oBAAA;AAC/B,MAAA,IAAI,OAAO,CAAA,CAAE,aAAA,KAAkB,QAAA,EAAU,GAAA,CAAI,gBAAgB,CAAA,CAAE,aAAA;AAC/D,MAAA,IAAI,OAAO,CAAA,CAAE,YAAA,KAAiB,QAAA,EAAU,GAAA,CAAI,eAAe,CAAA,CAAE,YAAA;AAC7D,MAAA,IAAI,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,EAAU,GAAA,CAAI,aAAa,CAAA,CAAE,UAAA;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAC3C,QAAA,OAAO,EAAE,UAAA,EAAY,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AAAA,MAChF,SAAS,GAAA,EAAK;AAKZ,QAAA,IAAI,eAAe,mBAAA,EAAqB;AACtC,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,QAAA,EAAU,GAAA,CAAI,QAAA,EAAS;AAAA,QACxF;AACA,QAAA,OAAO,EAAE,OAAO,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,MACnE;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,MAC3E,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8CAAA,EAA+C;AAAA,MAC5F,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA;AAAmC,KAC/E;AAAA,IACA,QAAA,EAAU,CAAC,YAAA,EAAc,aAAa;AAAA,GACxC;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EACE,2HAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA;AAMV,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,IAAIC,UAAAA,EAAW;AAAA,QACf,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,WAAW,CAAA,CAAE;AAAA,OACf;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACzC,MAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA,CAAE,UAAA,EAAW;AAAA,IAC5C;AAAA,GACF;AACF;AAEA,SAAS,mBAAmB,QAAA,EAA0B;AACpD,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAS;AAAA,GACtB;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EACE,kJAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,EAAE,OAAO,CAAA;AACnD,MAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,IACnB;AAAA,GACF;AACF;AAEA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uCAAA;AAAwC,KACpF;AAAA,IACA,QAAA,EAAU,CAAC,YAAA,EAAc,UAAU;AAAA,GACrC;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EACE,2LAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA,CAAE,SAAS,CAAA;AACrF,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,MAC9E;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EACE;AAAA,OACJ;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,UAAA,EAAY,MAAM,CAAA;AAAA,QACzB,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAS;AAAA,GACtB;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EACE,yLAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,EAAE,OAAA,EAAS,CAAA,CAAE,SAAS,UAAU,CAAA;AAChE,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,QAAQ,MAAA,EAAO;AAAA,IAC5C;AAAA,GACF;AACF;AAEA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,oBAAA;AAAqB,KAClE;AAAA,IACA,QAAA,EAAU,CAAC,YAAY;AAAA,GACzB;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EACE,uJAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,WAAA;AAAA,IACA,MAAM,QAAQ,KAAA,EAAgB;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,QAAA,CAAS,SAAA,CAAU,CAAA,CAAE,UAAU,CAAA;AACrC,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA,GACF;AACF;AAEA,SAAS,oBAAoB,QAAA,EAA0B;AACrD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EACE,6JAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IAC5D,MAAM,OAAA,GAAU;AACd,MAAA,OAAO,SAAS,MAAA,EAAO;AAAA,IACzB;AAAA,GACF;AACF;AAEA,SAAS,mBAAmB,QAAA,EAA0B;AACpD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EACE,8KAAA;AAAA,IACF,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IAC5D,MAAM,OAAA,GAAU;AACd,MAAA,OAAO,SAAS,QAAA,EAAS;AAAA,IAC3B;AAAA,GACF;AACF;;;AC1xBO,SAAS,wBAAwB,IAAA,EAA0C;AAChF,EAAA,MAAM,MAAA,GAAS,KAAK,eAAA,IAAmB,sBAAA;AAEvC,EAAA,OAAO,OAAO,MAAgB,GAAA,KAAyD;AACrF,IAAA,MAAM,EAAE,OAAO,MAAA,EAAO,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAM,CAAA;AAKvD,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAI,WAAA,GAA0C,IAAA;AAE9C,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAiB;AAKtC,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,WAAA,GACE,GAAA,YAAe,mBAAA,GACX,GAAA,GACA,IAAI,mBAAA;AAAA,QACF,YAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AAGN,MAAA,IAAI,WAAA,KAAgB,GAAA,IAAO,GAAA,YAAe,KAAA,EAAO;AAC/C,QAAA,WAAA,CAAY,OAAA,IAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,OAAO,CAAA,CAAA,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAA2B,EAAC;AAClC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,MAAA,CAAO,EAAA,CAAG,cAAA,EAAgB,MAAM;AAC9B,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,OAAO,cAAA,EAAe;AAAA,QAC5B,SAAS,CAAA,EAAG;AACV,UAAA,aAAA,CAAc,CAAC,CAAA;AAAA,QACjB;AAAA,MACF,CAAC,CAAA;AAAA,MACD,MAAA,CAAO,EAAA,CAAG,mBAAA,EAAqB,CAAC,CAAA,KAAM;AACpC,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,MAAA,CAAO,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA;AAAA,QAChC,SAAS,EAAA,EAAI;AACX,UAAA,aAAA,CAAc,EAAE,CAAA;AAAA,QAClB;AAAA,MACF,CAAC,CAAA;AAAA,MACD,MAAA,CAAO,EAAA,CAAG,mBAAA,EAAqB,MAAM;AACnC,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,OAAO,eAAA,EAAgB;AAC3B,UAAA,GAAA,CAAI,OAAO,YAAA,EAAa;AAAA,QAC1B,SAAS,CAAA,EAAG;AACV,UAAA,aAAA,CAAc,CAAC,CAAA;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,KAAA,EAAM;AAC1C,IAAA,GAAA,CAAI,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,aAAa,CAAA;AAElD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAG,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,IAC/E,CAAA,SAAE;AACA,MAAA,GAAA,CAAI,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,aAAa,CAAA;AACrD,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,CAAA,EAAE;AAAA,IAC3B;AAKA,IAAA,IAAI,aAAa,MAAM,WAAA;AAEvB,IAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,MAAA,CAAO,KAAA,YAAiB,KAAA,GAC1B,MAAA,CAAO,KAAA,GACP,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,cAAc,CAAC,CAAA;AAAA,IACtD;AAIA,IAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,MAAA,MAAM,IAAI,MAAM,eAAe,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,gBAAA,EAAkB;AACtC,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,EAAM;AAC/B,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,SAAA;AAAA,MACf,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,WAAW,KAAA,CAAM;AAAA,KACnB;AAAA,EACF,CAAA;AACF;AAEA,SAAS,uBAAuB,IAAA,EAA4B;AAC1D,EAAA,OAAO,KAAK,WAAA,IAAe,EAAA;AAC7B;ACxFO,SAAS,2BACd,IAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,IAAiB,CAAA,EAAA,iBAAG,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,SAAA,CAAA;AAErF,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,KAAK,KAAA,EAAO;AAKd,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AACb,IAAA,GAAA,GAAM,KAAK,YAAA,GAAoBG,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,KAAK,CAAA,GAAI,kBAAA;AAAA,EAClE,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,GAAA,GAAWA,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,KAAK,CAAA;AACxC,IAAA,KAAA,GAAQ,IAAI,mBAAA,CAAoB,EAAE,GAAA,EAAK,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,aAAA,EAAe,KAAA;AAAA,IACf,MAAM,qBAAA,CAAsB,EAAE,YAAY,QAAA,EAAU,KAAA,EAAO,OAAM,EAAG;AAIlE,MAAA,OAAO,MAAM,MAAA,CAAO;AAAA,QAClB,EAAA,EAAI,UAAA;AAAA,QACJ,OAAO,KAAA,IAAS,UAAA;AAAA,QAChB,UAAU,QAAA,IAAY,SAAA;AAAA,QACtB,OAAO,KAAA,IAAS;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;AC3FO,IAAM,eAAA,GAAkC;AAAA,EAC7C,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAA,CAAA;AAAA,EAyBR,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW;AACb;AAMO,IAAM,gBAAA,GAAmC;AAAA,EAC9C,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,uDAAA,CAAA;AAAA,EAoCR,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW;AACb;AAMO,IAAM,sBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,IAAA,EAAM,kBAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,oDAAA,CAAA;AAAA,EAoCR,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW;AACb;AAMO,IAAM,sBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,IAAA,EAAM,kBAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,CAAA;AAAA,EA4CR,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW;AACb;AAGO,IAAM,YAAA,GAA+C;AAAA,EAC1D,WAAA,EAAa,eAAA;AAAA,EACb,YAAA,EAAc,gBAAA;AAAA,EACd,kBAAA,EAAoB,sBAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB;AAGO,IAAM,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,YAAY;ACrM1D,IAAM,WAAA,GAAc,6BAAA;AACpB,IAAM,sBAAsB,EAAA,GAAK,IAAA;AA6BjC,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,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,EACnD,OAAA;AAAA,EACA,SAAA;AAAA,EACS,SAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EAEjB,YAAY,IAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,GAAA,GAAM,KAAK,GAAA,IAAO,WAAA;AACvB,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;AAAA,EACzC;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,GAA4B,EAAC,EAA8B;AACpE,IAAA,IAAI,KAAK,OAAA,IAAW,CAAC,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,OAAA;AAC7C,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;AACA,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,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,OAAA,EAAQ;AAAA,IAC5B,SAAS,GAAA,EAAK;AAEZ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,QAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAqC;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,GAAA,EAAK;AAAA,MACzC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB,KACvC,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,GAAA,CAAI,MAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,MACtC,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACX;AACA,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;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,MAAM,SAAA,IAAa,KAAA;AAAA,QAC9B,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,CAAA;AAAA,QACpC,SAAA,EAAW,MAAM,KAAA,EAAO,MAAA;AAAA,QACxB,WAAW,KAAA,CAAM;AAAA,OACnB;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,SAAA,EAAU;AACpC,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,SAAA,GAAgD;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASC,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,MAAM,CAAA;AACpD,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,OAAYC,KAAA,CAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,EACpC;AACF;;;AClMO,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,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,CAAA;AAAA,IAUR,IAAA,EAAM,CAAC,QAAA,EAAU,SAAA,EAAW,UAAU,CAAA;AAAA,IACtC,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAM;AAAA,GACzD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,gCAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,CAAA;AAAA,IAUR,IAAA,EAAM,CAAC,UAAA,EAAY,OAAA,EAAS,YAAY,CAAA;AAAA,IACxC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM;AAAA,GACnD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,iDAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gEAAA,CAAA;AAAA,IAWR,IAAA,EAAM,CAAC,cAAA,EAAgB,QAAA,EAAU,aAAa,CAAA;AAAA,IAC9C,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAClD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,6CAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,CAAA;AAAA,IAWR,IAAA,EAAM,CAAC,OAAA,EAAS,eAAA,EAAiB,kBAAkB,CAAA;AAAA,IACnD,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAC1D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,kDAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,CAAA;AAAA,IAWR,IAAA,EAAM,CAAC,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AAAA,IACjC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAClD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAAA,IAWR,IAAA,EAAM,CAAC,QAAA,EAAU,gBAAA,EAAkB,YAAY,CAAA;AAAA,IAC/C,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,KAAK;AAAA,GACzD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAAA,CAAA;AAAA,IAWR,IAAA,EAAM,CAAC,UAAA,EAAY,eAAA,EAAiB,aAAa,CAAA;AAAA,IACjD,iBAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAM;AAAA;AAE3D,CAAA;;;AC3JO,IAAM,mBAAN,MAA4C;AAAA,EACzC,YAAA,GAA8B,IAAA;AAAA,EAC9B,KAAA;AAAA,EACA,SAAA;AAAA,EAER,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,GAAG,aAAa,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,aAAA,GAAsC;AAC1C,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC5B;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,cAAc,MAAA,EAAsC;AACxD,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,MAAM,KAAK,cAAA,EAAe;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAA,GAA6B;AACjC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAsC;AAClD,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,IAAK,IAAA;AAAA,EACpD;AAAA,EAEA,MAAM,QAAQ,IAAA,EAA2B;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA;AACxD,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+B;AAC9C,IAAA,MAAM,UAAU,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAQ;AAChC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAkBC,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AACxD,MAAA,MAAM,OAAA,GAAU,MAASC,GAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AACpD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,UAAA,IAAc,IAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI;AACF,MAAA,MAASA,UAAM,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,MAAA,MAAM,UAAA,GAAkBD,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AACxD,MAAA,MAASC,GAAA,CAAA,SAAA;AAAA,QACP,UAAA;AAAA,QACA,IAAA,CAAK,UAAU,EAAE,UAAA,EAAY,KAAK,YAAA,EAAa,EAAG,MAAM,CAAC,CAAA;AAAA,QACzD;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAOA,eAAsB,iBAAiB,QAAA,EAAmC;AACxE,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAASA,GAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA;AACzC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,MAAM,QAAA,CAAS,KAAK,KAAK,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACvD,MAAA,MAAM,QAAA,GAAgBD,KAAA,CAAA,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAC1C,MAAA,MAAM3B,KAAAA,GAAO,MAAS4B,GAAA,CAAA,IAAA,CAAK,QAAQ,CAAA;AACnC,MAAA,IAAI,CAAC5B,KAAAA,CAAK,MAAA,EAAO,EAAG;AACpB,MAAA,MAAM,OAAA,GAAU,MAAS4B,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAClD,MAAA,MAAM,EAAA,GAAUD,KAAA,CAAA,QAAA,CAAS,KAAA,EAAYA,KAAA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA;AAAA,QACA,IAAA,EAAM,EAAA,CAAG,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,QACtE,aAAa,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAAA,QACvC,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,CAAC,SAAS;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,cAAc,QAAA,EAAmC;AACrE,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAoBA,KAAA,CAAA,IAAA,CAAK,QAAA,EAAU,YAAY,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAASC,GAAA,CAAA,QAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AACtD,IAAA,MAAM,QAAA,GAAyB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjD,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;;;ACtHO,IAAM,aAAN,MAAiB;AAAA,EACtB,MAAM,OAAA,EAAgC;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,MAC9B,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,MAClC,MAAA,EAAQ,OAAA;AAAA,MACR,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEQ,aAAa,KAAA,EAAyB;AAC5C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACtC,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,wBAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAAyB;AAC9C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,CAAA,GAAI,+BAAA,CAAgC,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC1D,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,KAAA,EAAyB;AAC/C,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACvC,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,YAAA,GAAe,IAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAI,gBAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChD,MAAA,IAAI,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAAE,MAAK,IAAK,sBAAA;AAAA,EAC5C;AAAA,EAEQ,gBAAgB,KAAA,EAAgC;AACtD,IAAA,MAAM,WAA0B,EAAC;AACjC,IAAA,IAAI,cAAA,GAA8C,IAAA;AAClD,IAAA,IAAI,eAAyB,EAAC;AAC9B,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAEzC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAI,cAAA,IAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,SAAS,SAAS,CAAA;AAAA,YAC3D,KAAA,EAAO,eAAe,KAAA,IAAS,SAAA;AAAA,YAC/B,KAAA,EAAO,KAAA;AAAA,YACP,OAAA,EAAS,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA;AAAK,WACvC,CAAA;AAAA,QACH;AACA,QAAA,cAAA,GAAiB,EAAE,KAAA,EAAO,EAAA,CAAG,CAAC,KAAK,SAAA,EAAU;AAC7C,QAAA,YAAA,GAAe,EAAC;AAChB,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,IAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,SAAS,SAAS,CAAA;AAAA,QAC3D,KAAA,EAAO,eAAe,KAAA,IAAS,SAAA;AAAA,QAC/B,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,KAAA,EAAoC;AAC9D,IAAA,MAAM,eAAkC,EAAC;AACzC,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC3C,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,kBAAkB,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAElD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA,IAAA,EAAO,EAAE,SAAS,CAAA,CAAE,CAAA;AAChE,QAAA,IAAI,GAAA,EAAK,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CAAqB,MAAc,EAAA,EAAoC;AAC7E,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AAEhD,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAmC;AAAA,MACvC,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,IAAA,GAAgC,YAAA;AACpC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,MAAM,QAAA,CAAS,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,GAAG,IAAA,GAAO,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,QAAA,GAAwC,QAAA;AAC5C,IAAA,IAAI,QAAQ,QAAA,CAAS,YAAY,KAAK,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACrE,MAAA,QAAA,GAAW,UAAA;AAAA,IACb,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AACrC,MAAA,QAAA,GAAW,MAAA;AAAA,IACb,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAA,EAAe,EAAE,EAAE,IAAA,EAAK;AAAA,MACrD,oBAAoB;AAAC,KACvB;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoC;AACzD,IAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,UAAA;AACnC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,cAAA;AACtC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,cAAA;AACpC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,UAAA;AACnC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,YAAA;AACrC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,QAAQ,IAAA,EAAmC;AACzC,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,QAA+B,EAAC;AAGtC,IAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACnE,IAAA,MAAM,eAAA,GAAkB,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AAC3E,IAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAEvE,IAAA,IAAI,CAAC,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,0BAA0B,CAAA;AACtD,IAAA,IAAI,CAAC,eAAA,EAAiB,IAAA,CAAK,IAAA,CAAK,8BAA8B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,qCAAqC,CAAA;AAEnE,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAK,yBAAyB,CAAA;AACnC,MAAA,WAAA,CAAY,KAAK,yDAAyD,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,cAAA,GAAiB,KAAK,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAA,CAAmB,MAAA,KAAW,CAAC,CAAA;AACxF,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,cAAA,CAAe,MAAM,CAAA,yCAAA,CAA2C,CAAA;AAC7E,MAAA,WAAA,CAAY,KAAK,uDAAuD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,kBAAA,GAAqB,KAAK,YAAA,CAAa,MAAA;AAAA,MAC3C,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS;AAAA,KAC1E;AACA,IAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,aAAa,GAAA,CAAI,EAAA;AAAA,QACjB,IAAA,EAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA,mBAAA,CAAA;AAAA,QAC9D,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAAA,MAAA,CAAA,CACrB,WAAA,GAAc,IAAI,CAAA,KAClB,eAAA,GAAkB,IAAI,CAAA,CAAA,IACtB,aAAA,GAAgB,IAAI,CAAA,CAAA,IACpB,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA,GAAI,IAAI,CAAA,CAAA,IACnC,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAChC,CAAA,GACA;AAAA,KACJ;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,YAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,YAAA,EAAc,KAAK,YAAA,CAAa,MAAA;AAAA,QAChC,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,MAAA,IAAU,CAAA;AAAA,QAC3C,SAAA,EAAW,CAAA;AAAA,QACX,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAA2C;AAClD,IAAA,MAAM,SAAyC,EAAC;AAChD,IAAA,MAAM,WAA6C,EAAC;AAEpD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,qBAAqB,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACxB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,uBAAuB,CAAA;AAAA,IACjE;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,IAAI,CAAC,GAAA,CAAI,WAAA,CAAY,IAAA,EAAK,EAAG;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,kCAAA,EAAoC,CAAA;AAAA,MAC5F;AACA,MAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AACvC,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,gCAAA,EAAkC,CAAA;AAAA,MAC5F;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACzD,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,EAAE,CAAC,CAAA;AAChF,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS,kDAAkD,EAAE,CAAA;AAAA,SAC9D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AClQO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAA6B;AAAA,EAA7B,IAAA;AAAA,EAE7B,MAAM,iBAAiB,IAAA,EAAyC;AAC9D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,WAAA,CAAY,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AAEzE,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAChE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,QAC5B,KAAA,EAAO,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QAC9B,aAAa,QAAA,CAAS,OAAA;AAAA,QACtB,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAsD;AAAA,MAC1D,UAAU,EAAC;AAAA,MACX,MAAM,EAAC;AAAA,MACP,QAAQ,EAAC;AAAA,MACT,KAAK;AAAC,KACR;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,KAAK,UAAA,CAAW,MAAA;AACtD,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,MAAM,KAAA,GAAwB,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAU,KAAK,CAAA;AAClE,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAA,CAAW,CAAC,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAAA,MACnE;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ;AAAA,QAC9C,KAAA,EAAO,oBAAA;AAAA,QACP,WAAA,EAAa,CAAA,UAAA,EAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,cAAA,CAAA;AAAA,QAClD,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,YAAA,EAAc;AACxC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,UAC5B,GAAG,IAAA;AAAA,UACH,UAAU,SAAA,CAAU;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,MAC5B,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,8CAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,MAC5B,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,8BAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,0BACN,GAAA,EACkD;AAClD,IAAA,OAAO;AAAA,MACL,OAAO,GAAA,CAAI,WAAA;AAAA,MACX,WAAA,EAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAAA,MACtC,IAAA,EAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA;AAAA,MACtC,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,mBAAmB,GAAA,CAAI,EAAA;AAAA,MACvB,IAAA,EAAM,CAAC,GAAA,CAAI,IAAA,EAAM,IAAI,QAAQ,CAAA;AAAA,MAC7B,aAAA,EAAe,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KACvC;AAAA,EACF;AAAA,EAEQ,uBACN,QAAA,EACkD;AAClD,IAAA,OAAO;AAAA,MACL,OAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAAA,MAC1C,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,CAAC,QAAA,CAAS,MAAM,CAAA;AAAA,MACtB,aAAA,EAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ;AAAA,KAClD;AAAA,EACF;AAAA,EAEQ,iBAAiB,GAAA,EAA8B;AACrD,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,WAAA,EAAa,EAAA,EAAI,eAAe,GAAA,CAAI,IAAA,EAAM,gBAAA,GAAmB,GAAA,CAAI,QAAQ,CAAA;AAE5F,IAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,0BAA0B,CAAA;AACzC,MAAA,KAAA,MAAW,SAAA,IAAa,IAAI,kBAAA,EAAoB;AAC9C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,GAAA,CAAI,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,mBAAmB,IAAA,EAAyC;AAClE,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,YAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,gBAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,IAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA,EAEQ,cAAc,GAAA,EAA8B;AAClD,IAAA,QAAQ,IAAI,QAAA;AAAU,MACpB,KAAK,UAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT;AACE,QAAA,OAAO,CAAA;AAAA;AACX,EACF;AAAA,EAEQ,oBACN,QAAA,EACQ;AACR,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,QAAA,CAAS,MAAM,KAAA,IAAS,CAAA;AAC5B,IAAA,IAAI,QAAA,CAAS,SAAS,KAAA,IAAS,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAA,CAAiB,YAAA,EAAsB,IAAA,EAAoC;AAC/E,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,YAAY,CAAA,EAAG,iBAAA;AAC3D,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,GAAA,GAAM,KAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,MAAW,SAAA,IAAa,IAAI,kBAAA,EAAoB;AAC9C,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,UAC5B,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa,WAAW,SAAS,CAAA,CAAA;AAAA,UACjC,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAN,MAA4C;AAAA,EACzC,MAAA,uBAAa,GAAA,EAAuB;AAAA,EAE5C,MAAM,UAAU,KAAA,EAAiC;AAC/C,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,KAAA,CAAM,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,UAAU,EAAA,EAAuC;AACrD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,MAAM,UAAA,GAA0E;AAC9E,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAClD,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,EAAA,EAA2B;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,EACvB;AAAA,EAEQ,WAAW,CAAA,EAAyB;AAC1C,IAAA,OAAO;AAAA,MACL,GAAG,CAAA;AAAA,MACH,KAAA,EAAO,IAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAAA,MACtB,KAAA,EAAO,CAAC,GAAG,CAAA,CAAE,KAAK,CAAA;AAAA,MAClB,SAAA,EAAW,CAAC,GAAG,CAAA,CAAE,SAAS;AAAA,KAC5B;AAAA,EACF;AACF;;;ACnJO,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;;;ACrGO,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAA6B,IAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAA2B;AAAA,EAA3B,IAAA;AAAA,EAHrB,KAAA,GAA0B,IAAA;AAAA,EAC1B,cAAgC,EAAC;AAAA,EAIzC,MAAM,WAAA,CAAY,MAAA,EAAgB,KAAA,EAAmC;AACnE,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,OAAO,EAAC;AAAA,MACR,WAAW,EAAC;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AACA,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,EAAA,EAAuC;AACrD,IAAA,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAQ,IAAA,EAAkE;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,MAAA,EAAQ,KAAK,MAAA,IAAU,SAAA;AAAA,MACvB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,OAAO,CAAA;AAExC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,EAAA,EAAY,IAAA,GAAsC,YAAA,EAAoB;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,MACpB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,IAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAChC,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,gBAAA,CAAiB,EAAA,EAAY,MAAA,EAA4B,MAAA,EAAuB;AAC9E,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,UAAA,CAAY,CAAA;AAEjD,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AAEjB,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,IAAI,MAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,MAAA,EAAQ,CAAA;AAGlE,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAA,CAAK,kBAAkB,EAAE,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,IAAA,CAAK,sBAAsB,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,QAAQ,EAAA,EAAkC;AACxC,IAAA,OAAO,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EACjC;AAAA,EAEA,WAAA,CAAY,QAAqB,IAAA,EAA6B;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AAEzB,IAAA,IAAI,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAEhD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,QAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,CAAC,MAAA,CAAO,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,KAAA;AACvE,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAC,MAAA,CAAO,SAAS,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,EAAG,OAAO,KAAA;AAC7E,QAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAC,MAAA,CAAO,KAAK,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA,CAAE,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAC/E,UAAA,OAAO,KAAA;AACT,QAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAC/E,UAAA,OAAO,KAAA;AACT,QAAA,IAAI,MAAA,CAAO,iBAAA,IAAqB,CAAA,CAAE,iBAAA,KAAsB,MAAA,CAAO,iBAAA;AAC7D,UAAA,OAAO,KAAA;AACT,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,KAAK,KAAK,CAAA;AAC3C,QAAA,OAAO,IAAA,CAAK,SAAA,KAAc,KAAA,GAAQ,GAAA,GAAM,CAAC,GAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,QAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AAAA,EACpF;AAAA,EAEA,cAAc,MAAA,EAA0B;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CACf,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,YAAY,CAAA,CAC1D,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,EACpB;AAAA,EAEA,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CACf,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,IAAU,CAAA,CAAE,SAAS,YAAY,CAAA,CACxD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,SAAS,MAAA,EAAyB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,EAAA,KAAO;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACrC,MAAA,OAAO,MAAM,MAAA,KAAW,WAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,WAAA,GAA4B;AAC1B,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,CAAA;AAAA,QACT,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB,CAAA;AAAA,QACjB,cAAA,EAAgB,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AACA,IAAA,OAAO,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,eAAe,MAAA,EAAmC;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,CAAC,GAAG,KAAK,WAAW,CAAA;AAExC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC7B;AAAA,EAEQ,kBAAkB,WAAA,EAA2B;AACnD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AACjD,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,KAAK,CAAA;AACtC,MAAA,IAAI,GAAA,EAAK,WAAW,SAAA,EAAW;AAC7B,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAChD,QAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,KAAA,CAAM,CAAC,EAAA,KAAO;AACnD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACxC,UAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,QAC7B,CAAC,CAAA;AACD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,GAAA,CAAI,MAAA,GAAS,SAAA;AACb,UAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAAA,EAAsB;AAClD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO;AACxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACxC,MAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,MAAM,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,OAAA,GAAgB;AACtB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,MAAM,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACnD,MAAA,IAAI,KAAK,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA;AAExD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,kCAAA;AAAA,UACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACjD;AAAA,IACJ,CAAC,CAAA;AAAA,EACH;AACF;AAEA,IAAM,aAAA,GAAsD;AAAA,EAC1D,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AACA,IAAM,WAAA,GAAkD;AAAA,EACtD,WAAA,EAAa,CAAA;AAAA,EACb,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAEA,SAAS,cAAA,CAAe,CAAA,EAAa,CAAA,EAAa,KAAA,EAAkC;AAClF,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,CAAA,CAAE,QAAQ,CAAA,GAAI,aAAA,CAAc,EAAE,QAAQ,CAAA;AAAA,IAC7D,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,CAAA,CAAE,MAAM,CAAA,GAAI,WAAA,CAAY,EAAE,MAAM,CAAA;AAAA,IACrD,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,IACzB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA;AAE7B;;;ACnPO,IAAM,WAAN,MAAe;AAAA,EAMpB,YAA6B,IAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACtB;AAAA,EAF6B,IAAA;AAAA,EALrB,KAAA,GAAuB,MAAA;AAAA,EACvB,IAAA,GAA6B,IAAA;AAAA,EAC7B,KAAA,GAA0B,IAAA;AAAA,EAC1B,OAAA,GAAU,KAAA;AAAA,EAMV,IAAA,CAAkC,OAAU,OAAA,EAAoC;AACtF,IAAC,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAmD,OAAO,OAAO,CAAA;AAAA,EACrF;AAAA,EAEA,MAAM,SAAS,WAAA,EAAyC;AACtD,IAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAEvB,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAEpC,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,CAAA;AAEvC,IAAA,IAAI,QAAA,CAAS,eAAe,EAAA,EAAI;AAC9B,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,QACjB,KAAA,EAAO,WAAA;AAAA,QACP,OAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,YAAY,CAAA,CAAA,CAAG;AAAA,OACxE,CAAA;AACD,MAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AACtB,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAAc,EAAE,aAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACtE,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,SAAA,CAAU,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAEvD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAmD;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAExE,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,aAAA,IAAiB,CAAA;AAEjD,IAAA,OAAO,YAAA,CAAa,MAAA,GAAS,CAAA,IAAK,CAAC,KAAK,OAAA,EAAS;AAC/C,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,CAAA,EAAG,aAAa,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,QAC5B,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,KAAK,iBAAA,CAAkB,IAAA,EAAM,GAAG,CAAC;AAAA,OACvD;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAEtB,QAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,UAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,UAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,EAAA,EAAI,QAAA,EAAU,QAAQ,OAAO,CAAA;AACrE,UAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,MAAA,EAAQ,OAAA,IAAW,SAAA,EAAW,CAAA;AACjF,UAAA,GAAA,CAAI,UAAA,GAAa,MAAM,MAAe,CAAA;AAAA,QACxC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,WAAW,CAAA;AACvD,UAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AACrE,UAAA,GAAA,CAAI,cAAA,GAAiB,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QACzC;AAEA,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AAGA,MAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,MAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AACtB,MAAA,YAAA,CAAa,IAAA,CAAK,GAAG,YAAY,CAAA;AAGjC,MAAA,IAAI,IAAA,CAAK,oBAAmB,EAAG;AAC7B,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAEpB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,QAAA,EAAmB,OAAA,EAAiC;AACnF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,UAAA,CAAY,CAAA;AAErD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,aAAa,OAAO,CAAA;AAC/D,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,MAAA,EAAQ,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,aAAA,EAAe,WAAW,gBAAgB,CAAA;AACrF,MAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEQ,SAAS,KAAA,EAA4B;AAC3C,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEQ,kBAAA,GAAiC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CACd,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA,CAC9C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,CACxE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,MAAA,MAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAChE,MAAA,OAAA,CAAQ,aAAA,CAAc,EAAE,QAAQ,CAAA,IAAK,MAAM,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAc,iBAAA,CAAkB,IAAA,EAAgB,GAAA,EAAiD;AAC/F,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,aAAa,CAAA;AACzD,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,OAAO,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEQ,kBAAA,GAA8B;AACpC,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,MAAA,OAAO,SAAS,eAAA,KAAoB,GAAA;AAAA,IACtC;AAEA,IAAA,QAAQ,UAAU,IAAA;AAAM,MACtB,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,QAAA,OAAO,QAAA,CAAS,OAAA,KAAY,CAAA,IAAK,QAAA,CAAS,UAAA,KAAe,CAAA;AAAA,MAC3D;AAAA,MACA,KAAK,YAAA;AACH,QAAA,OAAO,KAAA;AAAA;AAAA,MACT,KAAK,YAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,IAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,MACpB,SAAS,QAAA,CAAS,eAAA;AAAA,MAClB,SAAS,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,gBAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF;AAQO,IAAM,gBAAN,MAAoB;AAAA,EACjB,KAAA;AAAA,EACA,OAAA;AAAA,EACS,MAAA;AAAA,EACT,KAAA,uBAAY,GAAA,EAAsB;AAAA,EAE1C,YAAY,IAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,EAAiB;AAClC,IAAA,IAAA,CAAK,UAAU,IAAI,WAAA,CAAY,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,MAAM,UAAA,CAAW,WAAA,EAAqB,OAAA,EAAuD;AAC3F,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS;AAAA,MACxB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAE7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,QAAQ,OAAA,EAAuC;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAAA,EAC/B;AAAA,EAEA,SAAA,GAAmE;AACjE,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,MAAO;AAAA,MAC3D,EAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,QAAA,EAAS,EAAG,KAAA,IAAS,UAAA;AAAA,MACjC,KAAA,EAAO,KAAK,QAAA;AAAS,KACvB,CAAE,CAAA;AAAA,EACJ;AACF;;;ACrPA,IAAM,cAAA,GAAiB,IAAA;AAEvB,SAAS,SAAS,MAAA,EAA0C;AAC1D,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AACtC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACtD;AAEA,SAAS,QAAA,CAAS,QAAkB,CAAA,EAAmB;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACrE,EAAA,OAAO,MAAA,CAAO,GAAG,CAAA,IAAK,CAAA;AACxB;AAOO,IAAM,sBAAN,MAAiD;AAAA,EAC9C,QAAA,uBAAe,GAAA,EAAuC;AAAA,EACtD,MAAA,uBAAa,GAAA,EAAqC;AAAA,EAClD,UAAA,uBAAiB,GAAA,EAAyC;AAAA,EAElE,OAAA,CAAQ,IAAA,EAAc,KAAA,GAAQ,CAAA,EAAG,MAAA,EAA6B;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAU,IAAI,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,IAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,OAAO,CAAA,EAAE;AAC5C,IAAA,KAAA,CAAM,KAAA,IAAS,KAAA;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAc,KAAA,EAAe,MAAA,EAA6B;AAC9D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjD,IAAA,MAAA,CAAO,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG,EAAE,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,MAAA,EAA6B;AAClE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,IAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,EAAC,EAAE;AAChE,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,KAAA,EAAA;AACN,IAAA,KAAA,CAAM,GAAA,IAAO,KAAA;AACb,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,GAAM,KAAA;AACnC,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,GAAM,KAAA;AACnC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,cAAA,EAAgB;AACzC,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC1B,CAAA,MAAO;AAEL,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,MAAM,KAAK,CAAA;AAChD,MAAA,IAAI,CAAA,GAAI,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,QAAA,GAA4B;AAC1B,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,QAAA,EAAU;AAC3C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA;AAAA,UACA,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ,cAAc,GAAG,CAAA;AAAA,UACzB,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA;AAAM,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,MAAA,EAAQ;AACzC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA;AAAA,UACA,IAAA,EAAM,OAAA;AAAA,UACN,MAAA,EAAQ,cAAc,GAAG,CAAA;AAAA,UACzB,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA;AAAM,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,UAAA,EAAY;AAC7C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,QAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA;AAAA,UACA,IAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ,cAAc,GAAG,CAAA;AAAA,UACzB,MAAA,EAAQ;AAAA,YACN,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,GAAA,EAAK,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA;AAAA,YACzB,GAAA,EAAK,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,YAC1B,GAAA,EAAK,QAAA,CAAS,MAAA,EAAQ,IAAI;AAAA;AAC5B,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,IAAO,MAAA,EAAO;AAAA,EACzC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEQ,WAAA,CAAe,KAAkC,IAAA,EAA8B;AACrF,IAAA,IAAI,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAI;AACjB,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,IACtB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,cAAc,GAAA,EAA2B;AAChD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,EAAA,GAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACT;AAGO,IAAM,kBAAN,MAA6C;AAAA,EAClD,OAAA,GAAgB;AAAA,EAAC;AAAA,EACjB,KAAA,GAAc;AAAA,EAAC;AAAA,EACf,SAAA,GAAkB;AAAA,EAAC;AAAA,EACnB,QAAA,GAA4B;AAC1B,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,KAAI,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,EAC7C;AAAA,EACA,KAAA,GAAc;AAAA,EAAC;AACjB;;;AC/JA,IAAM,QAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAOO,IAAM,wBAAN,MAAsD;AAAA,EACnD,MAAA,uBAAa,GAAA,EAAyB;AAAA,EAC7B,SAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AAAA,EACrC;AAAA,EAEA,SAAS,KAAA,EAA0B;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,GAAA,GAAgC;AACpC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,KAAA,CAAM,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA,KAAM;AAChD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAClC,QAAA,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,GAAG,MAAA,EAAO;AAAA,MACnC,CAAC;AAAA,KACH;AAEA,IAAA,IAAI,MAAA,GAAuB,SAAA;AAC3B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA,WAAY,CAAA,CAAE,MAAA;AAAA,IACxD;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,QAAQ,OAAA,EAAQ;AAAA,EAC1D;AAAA,EAEA,MAAc,OAAO,KAAA,EAAgD;AACnE,IAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAA2B,CAACR,QAAAA,KAAY;AAC1D,MAAA,KAAA,GAAQ,UAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAQ,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA,EAAM,CAAA;AAAA,QAClF,IAAA,CAAK;AAAA,OACP;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,KAAA,EAAM,EAAG,OAAO,CAAC,CAAA;AAAA,IACpD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,IACzF,CAAA,SAAE;AACA,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;;;AC7DO,IAAM,aAAN,MAAmC;AAAA,EACxC,SAAA,GAAkB;AAChB,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEA,IAAM,SAAA,GAAkB;AAAA,EACtB,YAAA,GAAe;AAAA,EAAC,CAAA;AAAA,EAChB,WAAA,GAAc;AAAA,EAAC,CAAA;AAAA,EACf,GAAA,GAAM;AAAA,EAAC;AACT,CAAA;;;ACiBA,IAAM,iBAAA,GAAoB,CAAA;AAEnB,IAAM,aAAN,MAAyC;AAAA,EAC9C,YAA6B,QAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA2B;AAAA,EAA3B,QAAA;AAAA,EAE7B,SAAA,CAAU,MAAc,KAAA,EAA+D;AACrF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,EAAM,QAAQ,EAAE,UAAA,EAAY,KAAA,EAAM,GAAI,MAAS,CAAA;AACxF,IAAA,OAAO,IAAI,SAAS,QAAQ,CAAA;AAAA,EAC9B;AACF;AAEA,IAAM,WAAN,MAAqC;AAAA,EACnC,YAA6B,IAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAqB;AAAA,EAArB,IAAA;AAAA,EAE7B,YAAA,CAAa,KAAa,KAAA,EAAwC;AAChE,IAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,YAAY,GAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,IAAA,EAAM,mBAAmB,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACzE;AAAA,EAEA,GAAA,GAAY;AACV,IAAA,IAAA,CAAK,KAAK,GAAA,EAAI;AAAA,EAChB;AACF,CAAA;;;AClDO,SAAS,mBAAA,CAAoB,QAAkB,IAAA,EAA+B;AACnF,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,OAAO,EAAA,CAAG,iBAAA,EAAmB,MAAM,IAAA,CAAK,OAAA,CAAQ,wBAAwB,CAAC,CAAA;AAAA,IACzE,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,CAAA,KAAM;AAChC,MAAA,IAAA,CAAK,QAAQ,sBAAsB,CAAA;AACnC,MAAA,IAAA,CAAK,SAAA,CAAU,4BAAA,EAA8B,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAC1D,MAAA,IAAA,CAAK,SAAA,CAAU,6BAAA,EAA+B,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,IAC9D,CAAC,CAAA;AAAA,IACD,OAAO,EAAA,CAAG,iBAAA,EAAmB,MAAM,IAAA,CAAK,OAAA,CAAQ,wBAAwB,CAAC,CAAA;AAAA,IACzE,OAAO,EAAA,CAAG,qBAAA,EAAuB,MAAM,IAAA,CAAK,OAAA,CAAQ,wBAAwB,CAAC,CAAA;AAAA,IAC7E,OAAO,EAAA,CAAG,yBAAA,EAA2B,MAAM,IAAA,CAAK,OAAA,CAAQ,2BAA2B,CAAC,CAAA;AAAA,IACpF,MAAA,CAAO,EAAA,CAAG,mBAAA,EAAqB,CAAC,CAAA,KAAM;AACpC,MAAA,IAAA,CAAK,QAAQ,0BAAA,EAA4B,CAAA,EAAG,EAAE,WAAA,EAAa,CAAA,CAAE,YAAY,CAAA;AACzE,MAAA,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AACnD,MAAA,IAAA,CAAK,OAAA,CAAQ,wBAAA,EAA0B,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AACrD,MAAA,IAAI,CAAA,CAAE,MAAM,SAAA,EAAW,IAAA,CAAK,QAAQ,4BAAA,EAA8B,CAAA,CAAE,MAAM,SAAS,CAAA;AACnF,MAAA,IAAI,CAAA,CAAE,MAAM,UAAA,EAAY,IAAA,CAAK,QAAQ,6BAAA,EAA+B,CAAA,CAAE,MAAM,UAAU,CAAA;AAAA,IACxF,CAAC,CAAA;AAAA,IACD,MAAA,CAAO,EAAA;AAAA,MAAG,gBAAA;AAAA,MAAkB,CAAC,CAAA,KAC3B,IAAA,CAAK,OAAA,CAAQ,0BAA0B,CAAA,EAAG;AAAA,QACxC,UAAU,CAAA,CAAE,UAAA;AAAA,QACZ,MAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,MAAM;AAAA,OACxB;AAAA,KACH;AAAA,IACA,MAAA,CAAO,EAAA;AAAA,MAAG,gBAAA;AAAA,MAAkB,CAAC,CAAA,KAC3B,IAAA,CAAK,OAAA,CAAQ,yBAAyB,CAAA,EAAG;AAAA,QACvC,UAAU,CAAA,CAAE,UAAA;AAAA,QACZ,MAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA;AAAA,QACvB,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,SAAS;AAAA,OAC9B;AAAA,KACH;AAAA,IACA,MAAA,CAAO,EAAA,CAAG,cAAA,EAAgB,CAAC,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAA,EAAqB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IACvF,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,CAAA,KAAM;AAChC,MAAA,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA;AAC3E,MAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,CAAA,CAAE,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IACnE,CAAC,CAAA;AAAA,IACD,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,CAAC,CAAA,KAAM,KAAK,KAAA,CAAM,mBAAA,EAAqB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC3E,MAAA,CAAO,EAAA,CAAG,kBAAA,EAAoB,CAAC,CAAA,KAAM;AACnC,MAAA,IAAA,CAAK,QAAQ,wBAAwB,CAAA;AACrC,MAAA,IAAA,CAAK,SAAA,CAAU,6BAAA,EAA+B,CAAA,CAAE,MAAA,GAAS,EAAE,KAAK,CAAA;AAAA,IAClE,CAAC,CAAA;AAAA,IACD,MAAA,CAAO,EAAA;AAAA,MAAG,sBAAA;AAAA,MAAwB,CAAC,CAAA,KACjC,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,GAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM;AAAA,KAC1D;AAAA,IACA,MAAA,CAAO,EAAA;AAAA,MAAG,wBAAA;AAAA,MAA0B,CAAC,CAAA,KACnC,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB,GAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM;AAAA,KAC5D;AAAA,IACA,MAAA,CAAO,EAAA;AAAA,MAAG,yBAAA;AAAA,MAA2B,CAAC,CAAA,KACpC,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,GAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM;AAAA,KAC7D;AAAA,IACA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,CAAA,EAAG,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAC;AAAA,GACrF;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,CAAA,EAAE;AAAA,EAC5B,CAAA;AACF;;;AC7CA,IAAM,sBAAA,GAAyB,KAAA;AAE/B,SAAS,iBAAiB,CAAA,EAAmB;AAC3C,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC3E;AAEA,SAAS,aAAa,MAAA,EAAwC;AAC5D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3E,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC5B;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,sBAAA;AAChC,EAAA,OAAO,MAAA,CAAO,UAAU,CAAC,CAAA,GAAI,EAAE,QAAA,EAAS,GAAI,EAAE,QAAA,EAAS;AACzD;AAEA,SAAS,UAAA,CACP,MACA,KAAA,EACwB;AACxB,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAC7B;AAMO,SAAS,iBAAiB,QAAA,EAAmC;AAGlE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAGjB;AACF,EAAA,KAAA,MAAW,CAAA,IAAK,SAAS,MAAA,EAAQ;AAC/B,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,CAAA,GAAI,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,EAAC,EAAE;AAC7B,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IACtB;AACA,IAAA,CAAA,CAAE,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,CAAA,IAAK,MAAA,EAAQ;AAC9B,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,KAAS,WAAA,GAAc,YAAY,CAAA,CAAE,IAAA;AACxD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAEvC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,SAAS,OAAA,EAAS;AAC9C,MAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,EAAG,aAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,aAAa,GAAA,CAAI,MAAA,CAAO,KAAA,IAAS,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACxF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,QAAA,MAAM,EAAE,KAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAE,GAAI,GAAA,CAAI,MAAA;AAC9D,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,GAAG,IAAI,CAAA,EAAG,YAAA,CAAa,UAAA,CAAW,IAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,CAAC,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,SAC1F;AACA,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,GAAG,IAAI,CAAA,EAAG,YAAA,CAAa,UAAA,CAAW,IAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,SAC3F;AACA,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,GAAG,IAAI,CAAA,EAAG,YAAA,CAAa,UAAA,CAAW,IAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,SAC3F;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,CAAA;AACxE,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,MAAA,EAAS,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAGO,IAAM,uBAAA,GAA0B;AAsCvC,eAAsB,mBAAmB,IAAA,EAA0D;AACjG,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,EAAA,MAAM,QAAA,GAAW,CAAC,EAAE,GAAA,EAAK,QAAQ,GAAA,EAAK,GAAA,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,WAAA;AAC1B,EAAA,MAAMvB,MAAAA,GAAO,KAAK,IAAA,IAAQ,UAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,UAAA;AACtC,EAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAG5B,EAAA,MAAM,QAAA,GAA4B,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC9C,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,IAAO,GAAA,CAAI,WAAW,KAAA,EAAO;AACpC,MAAA,GAAA,CAAI,UAAA,GAAa,GAAA,CAAI,GAAA,GAAM,GAAA,GAAM,GAAA;AACjC,MAAA,GAAA,CAAI,GAAA,EAAI;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,IAAI,QAAQA,MAAAA,EAAM;AAChB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,MAC9C,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,2BAA2B,CAAA;AACzD,QAAA,GAAA,CAAI,GAAA,CAAI,0BAA0B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AACpF,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,uBAAuB,CAAA;AACrD,MAAA,GAAA,CAAI,IAAI,IAAI,CAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,cAAA,IAAkB,QAAQ,UAAA,EAAY;AACxC,MAAA,cAAA,CAAe,KAAI,CAAE,IAAA;AAAA,QACnB,CAAC,GAAA,KAAQ;AACP,UAAA,GAAA,CAAI,UAAA,GAAa,GAAA,CAAI,MAAA,KAAW,WAAA,GAAc,GAAA,GAAM,GAAA;AACpD,UAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,iCAAiC,CAAA;AAC/D,UAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,QACtC,CAAA;AAAA,QACA,CAAC,GAAA,KAAiB;AAChB,UAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,UAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,2BAA2B,CAAA;AACzD,UAAA,GAAA,CAAI,GAAA,CAAI,sBAAsB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,QAClF;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,IAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,2BAA2B,CAAA;AACzD,IAAA,GAAA,CAAI,IAAI,WAAW,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,OAAY,CAAA;AAClD,IAAA,MAAM,EAAE,YAAA,EAAAgC,aAAAA,EAAa,GAAI,MAAM,OAAO,IAAS,CAAA;AAC/C,IAAA,MAAA,GAAS,YAAA;AAAA,MACP,EAAE,IAAA,EAAMA,aAAAA,CAAa,GAAA,CAAI,IAAI,GAAG,GAAA,EAAKA,aAAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAE;AAAA,MAC3D;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,MAAW,CAAA;AACjD,IAAA,MAAA,GAAS,aAAa,QAAQ,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,IAAI,OAAA,CAAc,CAACT,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC9B,MAAA,MAAA,CAAO,GAAA,CAAI,aAAa,WAAW,CAAA;AACnC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAA;AACA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAC3B,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,OAAO,CAAA;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,aAAa,WAAW,CAAA;AACpC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAC/B,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,EAAA,MAAM,YAAY,OAAO,IAAA,KAAS,YAAY,IAAA,GAAO,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACtE,EAAA,MAAM,QAAA,GAAW,WAAW,OAAA,GAAU,MAAA;AACtC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK,GAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,SAAS,GAAGvB,MAAI,CAAA,CAAA;AAAA,IAC9C,OAAO,MACL,IAAI,OAAA,CAAc,CAACuB,UAAS,MAAA,KAAW;AACrC,MAAA,MAAA,CAAO,KAAA,CAAM,CAAC,GAAA,KAA4B,GAAA,GAAM,OAAO,GAAG,CAAA,GAAIA,UAAU,CAAA;AAAA,IAC1E,CAAC;AAAA,GACL;AACF;;;AChLA,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,kBAAA,GAAqB,GAAA;AAE3B,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,aAAA;AACnC;AAoCA,SAAS,cAAc,MAAA,EAAiD;AACtE,EAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,IACnD,GAAA;AAAA,IACA,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA;AAAM,GAC9B,CAAE,CAAA;AACJ;AAEA,SAAS,gBAAgB,IAAA,EAKH;AACpB,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3B,IAAA,MAAM,EAAA,GAAoB;AAAA,MACxB,UAAA,EAAY,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAAA,MAClC,cAAc,IAAA,CAAK;AAAA,KACrB;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAKxB,MAAA,EAAA,CAAG,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,GAAA,EAAK,EAAE,UAAA,EAAY,CAAC,EAAE,CAAA,EAAG,sBAAA,EAAwB,CAAA,EAAG,WAAA,EAAa,IAAA;AAAK,OACvE,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS;AAC7B,MAAA,EAAA,CAAG,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,EAAE,UAAA,EAAY,CAAC,EAAE,CAAA,EAAE,EAAG,CAAA;AAAA,IAC5D,CAAA,MAAO;AAEL,MAAA,EAAA,CAAG,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AACrC,MAAA,EAAA,CAAG,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,GAAA,IAAO,CAAA;AACzB,MAAA,EAAA,CAAG,cAAA,GAAiB;AAAA,QAClB,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,QAC1C,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,QAC3C,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAE,OAC7C;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,EAAE,UAAA,EAAY,CAAC,EAAE,CAAA,EAAE,EAAG,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB;AAAA,MACf;AAAA,QACE,UAAU,EAAE,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,kBAAkB,CAAA,EAAE;AAAA,QAC/D,YAAA,EAAc;AAAA,UACZ;AAAA,YACE,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,CAAK,SAAA,EAAU;AAAA,YAC9B;AAAA;AACF;AACF;AACF;AACF,GACF;AACF;AAMO,SAAS,uBAAA,CACd,IAAA,EACA,IAAA,GAA4E,EAAC,EAC1D;AACnB,EAAA,OAAO,eAAA,CAAgB;AAAA,IACrB,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAS,CAAE,MAAA;AAAA,IACxB,kBAAA,EAAoB,IAAA,CAAK,kBAAA,IAAsB,EAAE,gBAAgB,YAAA,EAAa;AAAA,IAC9E,SAAA,EAAW,KAAK,SAAA,IAAa,YAAA;AAAA,IAC7B,cAAc,MAAA,CAAO,MAAA,CAAO,KAAK,GAAA,EAAK,IAAI,QAAU;AAAA,GACrD,CAAA;AACH;AAMO,SAAS,yBACd,IAAA,EAC2B;AAC3B,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,mBAAA;AACtC,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AACpC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,UAAA,CAAW,KAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,KAAY,MAAM;AAAA,EAAC,CAAA,CAAA;AACxC,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,kBAAA,IAAsB,EAAE,gBAAgB,YAAA,EAAa;AACrF,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,YAAA;AAEpC,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB,kBAAA;AAAA,IAChB,GAAI,IAAA,CAAK,OAAA,IAAW;AAAC,GACvB;AACA,EAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,aAAA,GAAgB,IAAA,CAAK,aAAA;AAErD,EAAA,eAAe,QAAA,GAA0B;AACvC,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,MAAM,OAAO,eAAA,CAAgB;AAAA,MAC3B,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,CAAE,MAAA;AAAA,MAC7B,kBAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAc,MAAA,CAAO,MAAA,CAAO,KAAK,GAAA,EAAK,IAAI,QAAU;AAAA,KACrD,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,QAC/B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,QAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,MAChF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,KAAK,QAAA,EAAS;AAAA,EAChB,GAAG,UAAU,CAAA;AAGb,EAAA,MAAA,CAAO,KAAA,IAAQ;AAEf,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,MAAM,IAAA,GAAO;AACX,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,MAAM,QAAA,EAAS,CAAE,KAAA,CAAM,OAAO,CAAA;AAAA,IAChC;AAAA,GACF;AACF;ACpNA,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,sBAAA,GAAyB,CAAA;AAc/B,SAAS,IAAI,KAAA,EAAuB;AAClC,EAAA,OAAc,OAAA,CAAA,WAAA,CAAY,KAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACjD;AAEA,SAAS,KAAA,GAAgB;AAKvB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,QAAA;AAC9B;AAEA,IAAM,gBAAN,MAAoC;AAAA,EAClC,WAAA,CACmB,OACA,KAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAChB;AAAA,EAFgB,KAAA;AAAA,EACA,KAAA;AAAA,EAGnB,YAAA,CAAa,KAAa,KAAA,EAA4B;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,EAC/B;AAAA,EAEA,YAAY,GAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,EAAE,MAAM,sBAAA,EAAwB,OAAA,EAAS,IAAI,OAAA,EAAQ;AACzE,IAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,mBAAmB,CAAA,GAAI,GAAA,CAAI,OAAA;AACjD,IAAA,IAAI,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,UAAA,CAAW,gBAAgB,IAAI,GAAA,CAAI,IAAA;AAAA,EAC9D;AAAA,EAEA,GAAA,GAAY;AACV,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,KAAoB,MAAA,EAAW;AAC9C,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,KAAA,EAAM;AACnC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,sBAAA,EAAwB;AACrD,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA,GAAO,mBAAA;AAAA,IAC3B;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACvB;AACF,CAAA;AAoCA,IAAMU,oBAAAA,GAAsB,GAAA;AAC5B,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAMC,mBAAAA,GAAqB,GAAA;AAE3B,SAASC,cAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,YAAA;AACnC;AAWA,SAAS,UAAA,CAAW,KAAa,KAAA,EAAqC;AACpE,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,EAAE,KAAK,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,EAAM,EAAE;AAC1E,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA,CAAO,UAAU,KAAK,CAAA,GACzB,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA,EAAE,KACxC,EAAE,GAAA,EAAK,OAAO,EAAE,WAAA,EAAa,OAAM,EAAE;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,WAAA,EAAa,OAAM,EAAE;AAC9C;AAuBO,SAAS,sBAAA,CACd,KAAA,EACA,IAAA,GAA4E,EAAC,EAC1D;AACnB,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,kBAAA,IAAsB,EAAE,gBAAgB,YAAA,EAAa;AACrF,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,YAAA;AAEpC,EAAA,MAAM,SAAA,GAAwB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC9C,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA;AAAA,IACN,iBAAA,EAAmB,CAAA,CAAE,iBAAA,CAAkB,QAAA,EAAS;AAAA,IAChD,eAAA,EAAA,CAAkB,CAAA,CAAE,eAAA,IAAmB,CAAA,CAAE,mBAAmB,QAAA,EAAS;AAAA,IACrE,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACzE,QAAQ,CAAA,CAAE;AAAA,GACZ,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb;AAAA,QACE,QAAA,EAAU;AAAA,UACR,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,kBAAkB,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,CAAC,CAAC;AAAA,SACjF;AAAA,QACA,UAAA,EAAY,CAAC,EAAE,KAAA,EAAO,EAAE,MAAM,SAAA,EAAU,EAAG,KAAA,EAAO,SAAA,EAAW;AAAA;AAC/D;AACF,GACF;AACF;AAMO,SAAS,uBAAuB,IAAA,EAAyD;AAC9F,EAAA,MAAM,GAAA,GAAMA,aAAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAcF,oBAAAA;AACtC,EAAA,MAAM,WAAA,GAAc,KAAK,gBAAA,IAAoB,kBAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAaC,mBAAAA;AACpC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,UAAA,CAAW,KAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,KAAY,MAAM;AAAA,EAAC,CAAA,CAAA;AACxC,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,kBAAA,IAAsB,EAAE,gBAAgB,YAAA,EAAa;AACrF,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,YAAA;AAEpC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,SAAyB,EAAC;AAEhC,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB,kBAAA;AAAA,IAChB,GAAI,IAAA,CAAK,OAAA,IAAW;AAAC,GACvB;AACA,EAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,aAAA,GAAgB,IAAA,CAAK,aAAA;AAErD,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,SAAA,CAAU,MAAM,KAAA,EAAO;AACrB,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,OAAA,EAAS,IAAI,EAAE,CAAA;AAAA,QACf,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,QACb,IAAA;AAAA,QACA,mBAAmB,KAAA,EAAM;AAAA,QACzB,UAAA,EAAY,EAAE,GAAI,KAAA,IAAS,EAAC,EAAG;AAAA,QAC/B,MAAA,EAAQ,EAAE,IAAA,EAAM,sBAAA;AAAuB,OACzC;AACA,MAAA,OAAO,IAAI,aAAA,CAAc,KAAA,EAAO,CAAC,KAAA,KAAU;AACzC,QAAA,IAAI,MAAA,CAAO,MAAA,IAAU,WAAA,EAAa,MAAA,CAAO,KAAA,EAAM;AAC/C,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,eAAe,QAAA,GAA0B;AACvC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAO,MAAM,CAAA;AAC5C,IAAA,MAAM,OAAO,sBAAA,CAAuB,KAAA,EAAO,EAAE,kBAAA,EAAoB,WAAW,CAAA;AAC5E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,QAC/B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,QAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,MACvF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,EAC9B,GAAG,UAAU,CAAA;AACb,EAAA,MAAA,CAAO,KAAA,IAAQ;AAEf,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAM,IAAA,GAAO;AACX,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,MAAM,QAAA,EAAS,CAAE,KAAA,CAAM,OAAO,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,QAAA,EAAU,MAAM,CAAC,GAAG,MAAM;AAAA,GAC5B;AACF;;;AClQO,IAAM,yBAAA,GAA4B,iBAAA;AAuCzC,SAAS,cAAc,QAAA,EAA6B;AAClD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,KAAA,IAAS,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ,KAAA,IAAS,KAAK,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAAA,aAAA,IAClD,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,aAAA,EAAe;AAC1D,UAAA,KAAA,IAAS,KAAK,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,wBAAA,CACd,IAAA,GAAkC,EAAC,EACc;AACjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,yBAAA;AAAA,IACN,WAAA,EACE,mUAAA;AAAA,IAMF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,MAAM,CAAC,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,YAAY,SAAS,CAAA;AAAA,UACzD,WAAA,EAAa;AAAA,SACf;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,EAAA,EAAI;AAAA,UACF,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EACE;AAAA,SAEJ;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,QAAQ;AAAA,KACrB;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IAEV,MAAM,OAAA,CAAQ,KAAA,EAA4B,GAAA,EAA6C;AACrF,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,MAAA,MAAM,YAAA,GAAe,cAAc,QAAQ,CAAA;AAK3C,MAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAoB;AACzC,QAAA,IAAI,IAAI,KAAA,EAAO;AACb,UAAA,GAAA,CAAI,KAAA,CAAM,gBAAgB,IAAI,CAAA;AAAA,QAChC,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,MAAA,GAAS,CAAA;AAClB,UAAA,QAAA,CAAS,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA;AAEA,MAAA,QAAQ,MAAM,MAAA;AAAQ,QACpB,KAAK,OAAA,EAAS;AACZ,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,YAAA;AAAA,YACA,cAAc,QAAA,CAAS,MAAA;AAAA,YACvB,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,cACpB,UAAU,QAAA,CAAS,MAAA;AAAA,cACnB,MAAA,EAAQ,YAAA;AAAA,cACR,SAAA,EAAW,IAAI,SAAA,CAAU,IAAA;AAAA,cACzB,KAAA,EAAO,IAAI,KAAA,CAAM,MAAA;AAAA,cACjB,UAAA,EAAY,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE;AAAA,aACjE;AAAA,WACH;AAAA,QACF;AAAA,QAEA,KAAK,SAAA,EAAW;AACd,UAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,SAAA;AAAA,cACR,YAAA;AAAA,cACA,cAAc,QAAA,CAAS,MAAA;AAAA,cACvB,KAAA,EAAO;AAAA,aACT;AAAA,UACF;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,GAAG,CAAA;AAC/C,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,YAAA;AAAA,YACA,aAAa,MAAA,CAAO,KAAA;AAAA,YACpB,cAAc,QAAA,CAAS;AAAA,WACzB;AAAA,QACF;AAAA,QAEA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAA;AACzC,UAAA,IAAI,OAAO,CAAA,IAAK,EAAA,IAAM,QAAA,CAAS,MAAA,IAAU,OAAO,EAAA,EAAI;AAClD,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,OAAA;AAAA,cACR,YAAA;AAAA,cACA,cAAc,QAAA,CAAS,MAAA;AAAA,cACvB,OAAO,CAAA,eAAA,EAAkB,IAAI,KAAK,EAAE,CAAA,MAAA,EAAS,SAAS,MAAM,CAAA,UAAA;AAAA,aAC9D;AAAA,UACF;AACA,UAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAQ,CAAA;AACzB,UAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AAC/C,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,YAAA;AAAA,YACA,WAAA;AAAA,YACA,cAAc,IAAA,CAAK,MAAA;AAAA,YACnB,cAAc,OAAA,CAAQ;AAAA,WACxB;AAAA,QACF;AAAA,QAEA,KAAK,UAAA,EAAY;AACf,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,IAAQ,cAAA;AAC/B,UAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,MAAM,UAAA,IAAc,CAAA,EAAG,SAAS,MAAM,CAAA;AAChE,UAAA,MAAM,OAAA,GAAmB;AAAA,YACvB,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS,UAAU,QAAQ,CAAA,CAAA;AAAA,WAC7B;AACA,UAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAQ,CAAA;AACzB,UAAA,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA;AAChC,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,UAAA;AAAA,YACR,YAAA;AAAA,YACA,WAAA;AAAA,YACA,cAAc,IAAA,CAAK,MAAA;AAAA,YACnB,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAAA,QAEA,KAAK,SAAA,EAAW;AACd,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAA;AACzC,UAAA,IAAI,OAAO,CAAA,IAAK,EAAA,IAAM,QAAA,CAAS,MAAA,IAAU,OAAO,EAAA,EAAI;AAClD,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,SAAA;AAAA,cACR,YAAA;AAAA,cACA,cAAc,QAAA,CAAS,MAAA;AAAA,cACvB,OAAO,CAAA,eAAA,EAAkB,IAAI,KAAK,EAAE,CAAA,MAAA,EAAS,SAAS,MAAM,CAAA,UAAA;AAAA,aAC9D;AAAA,UACF;AACA,UAAA,MAAM,WAAA,GACJ,MAAM,IAAA,IAAQ,mEAAA;AAChB,UAAA,MAAM,UAAA,GAAsB;AAAA,YAC1B,IAAA,EAAM,QAAA;AAAA,YACN,SAAS,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,EAAI,EAAE,MAAM,WAAW,CAAA;AAAA,WAC9D;AACA,UAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAQ,CAAA;AACzB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,EAAA,GAAK,IAAA,GAAO,GAAG,UAAU,CAAA;AAC3C,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,YAAA;AAAA,YACA,WAAA;AAAA,YACA,cAAc,IAAA,CAAK,MAAA;AAAA,YACnB,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAAA,QAEA;AACE,UAAA,OAAO;AAAA,YACL,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,YAAA;AAAA,YACA,cAAc,QAAA,CAAS,MAAA;AAAA,YACvB,KAAA,EAAO,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,CAAA;AAAA,WACxC;AAAA;AACJ,IACF;AAAA,GACF;AACF;AAGO,IAAM,qBACX,wBAAA;;;AC3OK,IAAM,mBAAmB,OAAwB;AAAA,EACtD,IAAA,EAAM,YAAA;AAAA,EACN,WAAA,EAAa,mEAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,yCAAA,EAA2C,GAAG,CAAA;AAAA,EAC3D,UAAA,EAAY;AACd,CAAA;AAGO,IAAM,eAAe,OAAwB;AAAA,EAClD,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EACE,gGAAA;AAAA,EACF,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,qCAAqC,CAAA;AAAA,EAClD,KAAK,EAAE,4BAAA,EAA8B,OAAA,CAAQ,GAAA,CAAI,gCAAgC,EAAA,EAAG;AAAA,EACpF,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,iBAAiB,OAAwB;AAAA,EACpD,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAa,oDAAA;AAAA,EACb,SAAA,EAAW,iBAAA;AAAA,EACX,GAAA,EAAK,gCAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAA;AAOO,IAAM,oBAAoB,OAAwB;AAAA,EACvD,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EAAa,qFAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,2CAA2C,CAAA;AAAA,EACxD,KAAK,EAAE,oBAAA,EAAsB,OAAA,CAAQ,GAAA,CAAI,wBAAwB,EAAA,EAAG;AAAA,EACpE,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,cAAc,OAAwB;AAAA,EACjD,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAa,qDAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,oCAAoC,CAAA;AAAA,EACjD,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,gBAAgB,OAAwB;AAAA,EACnD,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,yDAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,sCAAsC,CAAA;AAAA,EACnD,KAAK,EAAE,eAAA,EAAiB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,EAAA,EAAG;AAAA,EAC1D,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,cAAc,OAAwB;AAAA,EACjD,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAa,oFAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,oCAAoC,CAAA;AAAA,EACjD,GAAA,EAAK;AAAA,IACH,eAAA,EAAiB,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AAAA,IAChD,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB;AAAA,GAC9C;AAAA,EACA,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,YAAY,OAAwB;AAAA,EAC/C,IAAA,EAAM,KAAA;AAAA,EACN,WAAA,EAAa,kFAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,kCAAkC,CAAA;AAAA,EAC/C,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,mBAAmB,OAAwB;AAAA,EACtD,IAAA,EAAM,aAAA;AAAA,EACN,WAAA,EAAa,gFAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,IAAA,EAAM,CAAC,IAAA,EAAM,0CAA0C,CAAA;AAAA,EACvD,KAAK,EAAE,mBAAA,EAAqB,OAAA,CAAQ,GAAA,CAAI,uBAAuB,EAAA,EAAG;AAAA,EAClE,UAAA,EAAY;AACd,CAAA;AAGO,IAAM,iBAAiB,OAAwB;AAAA,EACpD,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAa,4CAAA;AAAA,EACb,SAAA,EAAW,iBAAA;AAAA,EACX,GAAA,EAAK,yBAAA;AAAA,EACL,UAAA,EAAY;AAAA;AACd,CAAA;AAGO,IAAM,aAAa,OAAwC;AAAA,EAChE,YAAY,EAAE,GAAG,gBAAA,EAAiB,EAAG,SAAS,KAAA,EAAM;AAAA,EACpD,QAAQ,EAAE,GAAG,YAAA,EAAa,EAAG,SAAS,KAAA,EAAM;AAAA,EAC5C,UAAU,EAAE,GAAG,cAAA,EAAe,EAAG,SAAS,KAAA,EAAM;AAAA,EAChD,gBAAgB,EAAE,GAAG,iBAAA,EAAkB,EAAG,SAAS,KAAA,EAAM;AAAA,EACzD,OAAO,EAAE,GAAG,WAAA,EAAY,EAAG,SAAS,KAAA,EAAM;AAAA,EAC1C,SAAS,EAAE,GAAG,aAAA,EAAc,EAAG,SAAS,KAAA,EAAM;AAAA,EAC9C,OAAO,EAAE,GAAG,WAAA,EAAY,EAAG,SAAS,KAAA,EAAM;AAAA,EAC1C,KAAK,EAAE,GAAG,SAAA,EAAU,EAAG,SAAS,KAAA,EAAM;AAAA,EACtC,eAAe,EAAE,GAAG,gBAAA,EAAiB,EAAG,SAAS,KAAA,EAAM;AAAA,EACvD,UAAU,EAAE,GAAG,cAAA,EAAe,EAAG,SAAS,KAAA;AAC5C,CAAA","file":"index.js","sourcesContent":["const isColorTty = (): boolean => {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return Boolean(process.stdout?.isTTY);\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(\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape regex\n /\\x1b\\[[0-9;]*[A-Za-z]/g,\n '',\n );\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { LogLevel, Logger } from '../types/logger.js';\nimport { color } from '../utils/color.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\nexport interface DefaultLoggerOptions {\n level?: LogLevel;\n file?: string;\n pretty?: boolean;\n bindings?: Record<string, unknown>;\n}\n\nexport class DefaultLogger implements Logger {\n level: LogLevel;\n private readonly file?: string;\n private readonly bindings: Record<string, unknown>;\n private readonly pretty: boolean;\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? (process.env.WRONGSTACK_LOG_LEVEL as LogLevel) ?? 'info';\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.pretty = opts.pretty ?? true;\n if (this.file) {\n try {\n fs.mkdirSync(path.dirname(this.file), { recursive: true });\n } catch {\n // best-effort\n }\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 return new DefaultLogger({\n level: this.level,\n file: this.file,\n pretty: this.pretty,\n bindings: { ...this.bindings, ...bindings },\n });\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\n if (this.file) {\n try {\n fs.appendFileSync(this.file, `${JSON.stringify(entry)}\\n`);\n } catch {\n // ignore\n }\n }\n // Stderr: pretty or json\n if (r <= LEVEL_RANK.warn || this.level === 'debug' || this.level === 'trace') {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n process.stderr.write(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n process.stderr.write(`${head}\\n`);\n }\n }\n }\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","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;\n encoding?: BufferEncoding;\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 fs.rename(tmp, targetPath);\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","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n await ensureDir(this.dir);\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\n // vs ENOSPC etc. instead of substring-matching the error message.\n throw new Error(\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\n {\n cause: err,\n },\n );\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, { dir: this.dir, filePath: file });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const data = await this.load(id);\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n { resumed: true, dir: this.dir, filePath: file },\n );\n return { writer, data };\n }\n\n async load(id: string): Promise<SessionData> {\n const file = path.join(this.dir, `${id}.jsonl`);\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n // Session JSONL is on-disk user-writable state; downstream replay\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\n // shape. Validate the discriminator + timestamp before pushing.\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n // else: skip — a hand-edited file with a partial object should not\n // crash replay, just lose that one event.\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const files = await fsp.readdir(this.dir);\n const ids = files.filter((f) => f.endsWith('.jsonl')).map((f) => f.replace(/\\.jsonl$/, ''));\n // Read all manifests in parallel; fall back to full load only for\n // sessions that haven't been closed cleanly (or predate the manifest).\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n // Equal timestamps — use id as tiebreaker for stable sort\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = path.join(this.dir, `${id}.summary.json`);\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n // Manifest missing/corrupt — fall back to a full parse and backfill\n // the manifest so the next `list()` hits the fast path.\n const full = path.join(this.dir, `${id}.jsonl`);\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await fsp\n .writeFile(manifest, JSON.stringify(summary), { mode: 0o600 })\n .catch((err) => {\n // Best-effort manifest write — list() falls back to full parse\n // on next invocation, so surface the error for diagnostics but\n // don't fail the listing.\n console.warn(\n `[session-store] Failed to write manifest for \"${id}\":`,\n err instanceof Error ? err.message : String(err),\n );\n });\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n };\n }\n\n private replay(\n events: SessionEvent[],\n sessionId = 'unknown',\n ): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n // Orphan tool_result: tool_use was never seen. Skip to avoid\n // corrupting the replayed message sequence.\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n // Convert string content to blocks and append\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `${openToolUses.size} tool_use blocks without matching results — replay truncated`,\n });\n // Return what we could replay instead of throwing — a damaged session\n // should not block the entire session-listing or resume path.\n return { messages, usage };\n }\n return { messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n\n constructor(\n public readonly id: string,\n private readonly handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n // Session start is written lazily on first append to avoid sync I/O\n // in constructor and eliminate reliance on FileHandle.fd private property.\n }\n\n private async writeSessionStart(): Promise<void> {\n if (this.initDone || this.closed) return;\n this.initDone = true;\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort; session will still be usable without the start event logged\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n await this.writeSessionStart();\n }\n this.observeForSummary(event);\n try {\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\n } catch (err) {\n // A persistent failure (full disk, broken pipe) would otherwise log\n // once per appended event — which for a chatty agent run is a lot.\n // Debounce to one log per 5 s and surface the suppressed count.\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n /**\n * Watch events as they're appended and keep the summary state hot, so\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\n * the JSONL. `list()` reads only manifests, turning a per-session full\n * parse into a single stat+read.\n */\n private observeForSummary(event: SessionEvent): void {\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n // session_end usage is the canonical total — prefer it if non-zero.\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await fsp.writeFile(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort; list() falls back to full load.\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content.slice(0, 60);\n const text = content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` where kind is `pasted` / `image` / `file`. Unknown\n * placeholders are passed through as-is so users can write that literal\n * text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n await fsp.writeFile(spooledPath, input.data, input.kind === 'image' ? 'base64' : 'utf8');\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n const ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data =\n att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n *\n * The chain tracks only the last pending write. If a write fails, its\n * error is caught and swallowed (line 43) so the chain stays alive for\n * subsequent calls. A crash between atomicWrite() and backup copy leaves\n * the file at its new content with no backup — acceptable for an optional\n * backup whose worst case is losing a memory consolidation pass.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Swallow prior errors here so one failed write doesn't poison the\n // chain — the failed call has already rejected to its own caller.\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next);\n try {\n return await next;\n } finally {\n // Clear the chain reference once this call finishes so memory doesn't\n // grow unboundedly across long-lived processes. If another call\n // queued behind us, it's already captured in next; the map entry\n // serves only as the \"what should the next caller wait on\" pointer.\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup BEFORE the write so a crash leaves the original intact and\n // the backup reflects the pre-consolidation state. Best-effort so\n // ENOENT (new file) or permission errors don't block consolidation.\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // best-effort\n }\n try {\n await atomicWrite(file, next);\n } catch {\n // If the write fails, the original file is untouched (atomicWrite\n // does write-to-temp + rename). We still keep the backup.\n return;\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(structuredClone({ ...this.current, ...partial })) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v1:<base64-iv>:<base64-tag>:<base64-ciphertext>`. Plaintext strings\n * (those that do not match this prefix) are passed through unchanged so that\n * existing configs and env-var-derived values keep working.\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}\n\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n","import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.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\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 */\nexport class DefaultSecretVault implements SecretVault {\n private readonly keyFile: string;\n private key?: Buffer;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\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 return `${ENCRYPTED_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 const rest = value.slice(ENCRYPTED_PREFIX.length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new Error('SecretVault: malformed encrypted value');\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 Error('SecretVault: bad IV length');\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\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 private loadOrCreateKey(): Buffer {\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\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 // 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, key, { 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 (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n }\n this.key = key;\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 */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\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 console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): 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 unknown as T;\n }\n const out: Record<string, unknown> = {};\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\nfunction 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 await fsp.writeFile(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\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): 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 await fsp.writeFile(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n return { migrated: counter.n, file: configPath };\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 unknown as T;\n }\n const out: Record<string, unknown> = {};\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. */\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...a };\n for (const [k, v] of Object.entries(b)) {\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\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 out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","import * as fs from 'node:fs/promises';\nimport { decryptConfigSecrets } from '../security/secret-vault.js';\nimport type { Config, ConfigLoader } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: 10,\n eliseThreshold: 2000,\n },\n tools: {\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & {\n providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }>;\n};\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? (keys.find((k) => k.label === activeLabel) ?? keys[0])\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error('Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.');\n }\n }\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: {\n message: string;\n fromVersion: number;\n targetVersion: number;\n missingStep: number | null;\n }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Overwrites any existing lock\n * — the caller should have already handled abandonment (via\n * `checkAbandoned`) before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // Atomic write: write to .tmp and rename. Important on Windows\n // where a partial write of `active.json` would be readable.\n const tmp = `${this.file}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(lock), { mode: 0o600 });\n await fsp.rename(tmp, this.file);\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\nimport type {\n DefaultSessionReaderOptions,\n SessionExportOptions,\n SessionQuery,\n SessionReader,\n SessionSearchHit,\n SessionSearchQuery,\n SessionSummaryLite,\n} from '../types/session-reader.js';\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\n\n/**\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\n * and export helpers. Implemented on top of the public `SessionStore`\n * surface so any concrete store can be inspected without re-implementation.\n *\n * The heavy operations re-parse the JSONL stream on every call — fine for\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\n */\nexport class DefaultSessionReader implements SessionReader {\n private readonly store: SessionStore;\n\n constructor(opts: DefaultSessionReaderOptions) {\n this.store = opts.store;\n }\n\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\n const titleNeedle = q.titleContains?.toLowerCase();\n const filtered = raw.filter((s) => {\n if (q.since && s.startedAt < q.since) return false;\n if (q.until && s.startedAt > q.until) return false;\n if (q.provider && s.provider !== q.provider) return false;\n if (q.model && s.model !== q.model) return false;\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\n return true;\n });\n const out: SessionSummaryLite[] = filtered.map((s) => ({\n id: s.id,\n title: s.title,\n startedAt: s.startedAt,\n provider: s.provider,\n model: s.model,\n tokenTotal: s.tokenTotal,\n }));\n return q.limit ? out.slice(0, q.limit) : out;\n }\n\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\n const data = await this.store.load(sessionId);\n for (const e of data.events) yield e;\n }\n\n async search(q: SessionSearchQuery, sessionId?: string): Promise<SessionSearchHit[]> {\n const limit = q.limit ?? 100;\n const matcher = buildMatcher(q);\n const allowedTypes = q.types ? new Set(q.types) : null;\n\n const ids = sessionId ? [sessionId] : (await this.store.list(1000)).map((s) => s.id);\n const hits: SessionSearchHit[] = [];\n for (const id of ids) {\n let data;\n try {\n data = await this.store.load(id);\n } catch {\n continue;\n }\n for (let i = 0; i < data.events.length; i++) {\n const ev = data.events[i]!;\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\n const text = eventText(ev);\n if (text === null) continue;\n const hit = matcher(text);\n if (!hit) continue;\n hits.push({\n sessionId: id,\n eventIndex: i,\n ts: ev.ts,\n type: ev.type,\n snippet: snippetOf(text, hit.start, hit.end),\n });\n if (hits.length >= limit) return hits;\n }\n }\n return hits;\n }\n\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\n const data = await this.store.load(sessionId);\n const includeTools = opts.includeTools ?? true;\n const includeDiagnostics = opts.includeDiagnostics ?? true;\n\n const filtered = data.events.filter((e) => {\n if (\n !includeTools &&\n (e.type === 'tool_use' ||\n e.type === 'tool_result' ||\n e.type === 'tool_call_start' ||\n e.type === 'tool_call_end')\n ) {\n return false;\n }\n if (\n !includeDiagnostics &&\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\n ) {\n return false;\n }\n return true;\n });\n\n if (opts.format === 'json') {\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\n }\n if (opts.format === 'text') {\n return renderPlainText(data.metadata, filtered);\n }\n return renderMarkdown(data.metadata, filtered);\n }\n\n async metadata(sessionId: string): Promise<SessionMetadata> {\n const data = await this.store.load(sessionId);\n return data.metadata;\n }\n}\n\nfunction buildMatcher(\n q: SessionSearchQuery,\n): (text: string) => { start: number; end: number } | null {\n const ci = q.caseInsensitive ?? true;\n if (q.regex) {\n const flags = ci ? 'i' : '';\n const re = new RegExp(q.query, flags);\n return (text) => {\n const m = re.exec(text);\n return m ? { start: m.index, end: m.index + m[0].length } : null;\n };\n }\n const needle = ci ? q.query.toLowerCase() : q.query;\n return (text) => {\n const hay = ci ? text.toLowerCase() : text;\n const idx = hay.indexOf(needle);\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\n };\n}\n\nfunction eventText(e: SessionEvent): string | null {\n switch (e.type) {\n case 'user_input':\n return contentToString(e.content);\n case 'llm_response':\n return contentToString(e.content);\n case 'tool_use':\n return `${e.name} ${JSON.stringify(e.input)}`;\n case 'tool_result':\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\n case 'error':\n return `${e.phase}: ${e.message}`;\n case 'session_start':\n case 'session_resumed':\n return `${e.model}/${e.provider}`;\n case 'task_created':\n case 'task_completed':\n return e.title;\n case 'task_failed':\n return `${e.title}: ${e.error}`;\n case 'skill_activated':\n case 'skill_deactivated':\n return e.skillName;\n default:\n return null;\n }\n}\n\nfunction contentToString(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .map((b) => {\n switch (b.type) {\n case 'text':\n return b.text;\n case 'tool_use':\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\n case 'tool_result':\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n default:\n return '';\n }\n })\n .join('\\n');\n}\n\nconst SNIPPET_RADIUS = 60;\n\nfunction snippetOf(text: string, start: number, end: number): string {\n const from = Math.max(0, start - SNIPPET_RADIUS);\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\n const prefix = from > 0 ? '…' : '';\n const suffix = to < text.length ? '…' : '';\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\n}\n\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`# Session ${meta.id}`);\n lines.push('');\n if (meta.model || meta.provider) {\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\n }\n lines.push(`- **Started:** ${meta.startedAt}`);\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n for (const e of events) {\n switch (e.type) {\n case 'user_input': {\n lines.push(`## User — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n }\n case 'llm_response': {\n lines.push(`## Assistant — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n if (e.stopReason && e.stopReason !== 'end_turn') {\n lines.push('');\n lines.push(`*stop: ${e.stopReason}*`);\n }\n lines.push('');\n break;\n }\n case 'tool_use': {\n lines.push(`### Tool call: \\`${e.name}\\``);\n lines.push('');\n lines.push('```json');\n lines.push(JSON.stringify(e.input, null, 2));\n lines.push('```');\n lines.push('');\n break;\n }\n case 'tool_result': {\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\n lines.push('');\n lines.push('```');\n lines.push(body);\n lines.push('```');\n lines.push('');\n break;\n }\n case 'error': {\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\n lines.push('');\n break;\n }\n case 'compaction': {\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\n lines.push('');\n break;\n }\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\n );\n lines.push(''.padEnd(72, '-'));\n for (const e of events) {\n switch (e.type) {\n case 'user_input':\n lines.push(`[${e.ts}] USER`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'llm_response':\n lines.push(`[${e.ts}] ASSISTANT`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'tool_use':\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\n break;\n case 'tool_result':\n lines.push(\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\n }`,\n );\n break;\n case 'error':\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\n break;\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n","import type { SessionEvent } from '../types/session.js';\n\nexport interface QueryFilter {\n eventTypes?: string[];\n toolNames?: string[];\n timeRange?: { start: string; end: string };\n}\n\nexport interface ToolInvocation {\n ts: string;\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport interface SessionError {\n ts: string;\n phase: string;\n message: string;\n}\n\nexport interface ModeChange {\n ts: string;\n from: string;\n to: string;\n}\n\nexport interface TaskSummary {\n taskId: string;\n title: string;\n status: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface SessionAnalysis {\n sessionId: string;\n totalDuration: number;\n toolUsageCount: Record<string, number>;\n errorCount: number;\n modeChanges: ModeChange[];\n tasks: TaskSummary[];\n}\n\nexport class SessionAnalyzer {\n analyze(events: SessionEvent[]): SessionAnalysis {\n const toolUsageCount: Record<string, number> = {};\n const errors: SessionError[] = [];\n const modeChanges: ModeChange[] = [];\n const tasksById = new Map<string, TaskSummary>();\n let sessionId = '';\n\n for (const event of events) {\n // sessionId comes from session_start / session_resumed.\n if (event.type === 'session_start' || event.type === 'session_resumed') {\n if (!sessionId) sessionId = event.id;\n }\n if (event.type === 'tool_use') {\n toolUsageCount[event.name] = (toolUsageCount[event.name] ?? 0) + 1;\n }\n if (event.type === 'error') {\n errors.push({ ts: event.ts, phase: event.phase, message: event.message });\n }\n if (event.type === 'mode_changed') {\n modeChanges.push({ ts: event.ts, from: event.from, to: event.to });\n }\n if (event.type === 'task_created') {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'created',\n createdAt: event.ts,\n });\n }\n if (event.type === 'task_updated') {\n const t = tasksById.get(event.taskId);\n if (t) t.status = event.status;\n }\n if (event.type === 'task_completed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'completed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'completed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n if (event.type === 'task_failed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'failed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'failed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n }\n\n return {\n sessionId,\n totalDuration: this.calcDuration(events),\n toolUsageCount,\n errorCount: errors.length,\n modeChanges,\n tasks: Array.from(tasksById.values()),\n };\n }\n\n query(events: SessionEvent[], filter: QueryFilter): SessionEvent[] {\n return events.filter((e) => {\n if (filter.eventTypes?.length && !filter.eventTypes.includes(e.type)) return false;\n if (filter.toolNames?.length && e.type === 'tool_use') {\n const toolEvent = e as { type: 'tool_use'; name: string };\n if (!filter.toolNames.includes(toolEvent.name)) return false;\n }\n if (filter.timeRange) {\n const ts = new Date(e.ts).getTime();\n const start = new Date(filter.timeRange.start).getTime();\n const end = new Date(filter.timeRange.end).getTime();\n if (ts < start || ts > end) return false;\n }\n return true;\n });\n }\n\n private calcDuration(events: SessionEvent[]): number {\n if (events.length < 2) return 0;\n const first = new Date(events[0]!.ts).getTime();\n const last = new Date(events[events.length - 1]!.ts).getTime();\n return last - first;\n }\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 { type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g },\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 {\n type: 'bearer_token',\n regex: /(?<![A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{20,}=*(?![A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Value-side word boundary + length gate to avoid matching short random strings\n regex:\n /\\b([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,})['\"]?(?!\\s*[A-Za-z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))/g,\n },\n];\n\n/**\n * Per-chunk cap. The `high_entropy_env` and `bearer_token` patterns use\n * negative lookahead/lookbehind which are theoretically backtracking-prone\n * on adversarial input. Real scrub() inputs (LLM responses, tool outputs)\n * are typically much smaller, but defense-in-depth: split very long inputs\n * into smaller chunks and scrub each independently.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\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 let out = text;\n for (const p of PATTERNS) {\n out = out.replace(p.regex, (_match, group1, group2) => {\n if (p.type === 'high_entropy_env' && group1 && group2) {\n return `${group1}=[REDACTED:${p.type}]`;\n }\n return `[REDACTED:${p.type}]`;\n });\n }\n return out;\n }\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","/**\n * Minimal glob matcher for trust patterns.\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\n *\n * Compiled regexes are cached so repeated calls with the same pattern\n * avoid recompilation overhead.\n */\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n}\n\n// Module-level cache to avoid recompiling the same pattern on every call.\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\nconst CACHE_MAX_SIZE = 2000;\n\nfunction getCachedGlob(pattern: string): RegExp {\n const cached = COMPILED_GLOB_CACHE.get(pattern);\n if (cached) return cached;\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\n // Evict oldest 25% when at capacity\n const keys = [...COMPILED_GLOB_CACHE.keys()];\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\n COMPILED_GLOB_CACHE.delete(keys[i]!);\n }\n }\n const re = compileGlob(pattern);\n COMPILED_GLOB_CACHE.set(pattern, re);\n return re;\n}\n\nexport function compileGlob(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pattern.length) {\n const c = pattern[i];\n if (c === '*') {\n if (pattern[i + 1] === '*') {\n // ** matches any number of chars including /\n re += '.*';\n i += 2;\n // Skip trailing slash so '**/x' matches 'x'\n if (pattern[i] === '/') i++;\n } else {\n // single * matches any chars except /\n re += '[^/]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pattern[i] === '!' || pattern[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pattern.length && pattern[i] !== ']') {\n const ch = pattern[i] ?? '';\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\n // escaping. We've already consumed the leading `^`; the rest are\n // literal. Escape `\\` defensively and pass the rest through verbatim\n // so ranges like `a-z` continue to work.\n if (ch === '\\\\') {\n cls += '\\\\\\\\';\n } else if (ch === ']' || ch === '^') {\n cls += `\\\\${ch}`;\n } else {\n cls += ch;\n }\n i++;\n }\n cls += ']';\n re += cls;\n i++; // skip closing ]\n } else {\n re += escapeRegex(c ?? '');\n i++;\n }\n }\n re += '$';\n return new RegExp(re);\n}\n\nexport function matchGlob(pattern: string, input: string): boolean {\n return getCachedGlob(pattern).test(input);\n}\n\nexport function matchAny(patterns: string[], input: string): boolean {\n return patterns.some((p) => matchGlob(p, input));\n}\n","import * as fs from 'node:fs/promises';\nimport type { Context } from '../core/context.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { PermissionDecision, PermissionPolicy, TrustPolicy } from '../types/permission.js';\nimport type { Tool } from '../types/tool.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { matchAny, matchGlob } from '../utils/glob-match.js';\nimport { safeParse } from '../utils/safe-json.js';\n\nexport interface PermissionPolicyOptions {\n trustFile: string;\n yolo?: boolean;\n promptDelegate?: (\n tool: Tool,\n input: unknown,\n suggestedPattern: string,\n ) => Promise<'yes' | 'no' | 'always' | 'deny'>;\n inputReader?: InputReader;\n}\n\nexport class DefaultPermissionPolicy implements PermissionPolicy {\n private policy: TrustPolicy = {};\n private loaded = false;\n private readonly trustFile: string;\n private readonly yolo: boolean;\n private readonly promptDelegate?: PermissionPolicyOptions['promptDelegate'];\n\n constructor(opts: PermissionPolicyOptions) {\n this.trustFile = opts.trustFile;\n this.yolo = opts.yolo ?? false;\n this.promptDelegate = opts.promptDelegate;\n }\n\n async reload(): Promise<void> {\n try {\n const raw = await fs.readFile(this.trustFile, 'utf8');\n const parsed = safeParse<TrustPolicy>(raw);\n if (parsed.ok && parsed.value) this.policy = parsed.value;\n } catch {\n this.policy = {};\n }\n this.loaded = true;\n }\n\n async evaluate(tool: Tool, input: unknown, _ctx: Context): Promise<PermissionDecision> {\n if (!this.loaded) await this.reload();\n\n // 1. Tool-namespace matching (mcp__server__* etc.)\n const namespaceEntry = this.findNamespaceEntry(tool.name);\n\n // 2. Tool-name entry\n const entry = this.policy[tool.name] ?? namespaceEntry;\n\n // 3. Compute subject (the thing being matched)\n const subject = this.subjectFor(tool.name, input, tool.subjectKey);\n\n // 4. Deny — absolute\n if (entry?.deny && subject && matchAny(entry.deny, subject)) {\n return { permission: 'deny', source: 'deny', reason: 'matched deny pattern' };\n }\n if (tool.permission === 'deny') {\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\n }\n\n // 5. Allow\n if (entry?.allow && subject && matchAny(entry.allow, subject)) {\n return { permission: 'auto', source: 'trust', reason: 'matched allow pattern' };\n }\n if (entry?.auto) {\n return { permission: 'auto', source: 'trust' };\n }\n\n // 6. YOLO\n if (this.yolo) {\n return { permission: 'auto', source: 'yolo' };\n }\n\n // 7. Tool default\n if (tool.permission === 'auto') {\n return { permission: 'auto', source: 'default' };\n }\n\n // 8. Confirm — delegate to prompt\n if (this.promptDelegate) {\n const decision = await this.promptDelegate(tool, input, subject ?? tool.name);\n if (decision === 'always') {\n await this.trust({ tool: tool.name, pattern: subject ?? tool.name });\n return { permission: 'auto', source: 'user', reason: 'user always-allowed' };\n }\n if (decision === 'deny') {\n return { permission: 'deny', source: 'user', reason: 'user denied' };\n }\n return { permission: decision === 'yes' ? 'auto' : 'deny', source: 'user' };\n }\n return { permission: 'confirm', source: 'default' };\n }\n\n async trust(rule: { tool: string; pattern: string }): Promise<void> {\n if (!this.loaded) await this.reload();\n const entry = this.policy[rule.tool] ?? {};\n entry.allow = Array.from(new Set([...(entry.allow ?? []), rule.pattern]));\n this.policy[rule.tool] = entry;\n try {\n await atomicWrite(this.trustFile, JSON.stringify(this.policy, null, 2));\n } catch (err) {\n // Revert in-memory state since disk write failed\n const existing = this.policy[rule.tool];\n if (existing?.allow) {\n const idx = existing.allow.indexOf(rule.pattern);\n if (idx !== -1) existing.allow.splice(idx, 1);\n }\n throw err;\n }\n }\n\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n // Glob metacharacters are dangerous: a crafted subject like \"**\" or \"foo/**/bar\"\n // can match too broadly in the allow/deny pattern match. Escape them so the\n // matching is done on the literal string.\n const globChars = /[*?\\[\\]]/g;\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\n\n // 1. Explicit subjectKey on the tool wins — eliminates the cross-tool\n // collision where e.g. an HTTP tool's `path` field meant \"request\n // path\" but was matched against filesystem-path trust rules.\n if (subjectKey) {\n const v = obj[subjectKey];\n if (typeof v === 'string') {\n // Heuristic: path-like keys get backslash normalization for glob\n // matching on Windows; everything else is treated as opaque.\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\n ? normalizePath(v)\n : escapeGlob(v);\n }\n // subjectKey was declared but the runtime value isn't a string —\n // fall through to the legacy heuristic so the policy still has a\n // chance to match on something sensible.\n }\n\n // 2. Legacy heuristic — preserved for tools that haven't migrated.\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlob(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePath(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlob(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlob(obj.name);\n }\n return undefined;\n }\n\n private findNamespaceEntry(toolName: string): TrustPolicy[string] | undefined {\n for (const key of Object.keys(this.policy)) {\n if (key.includes('*') && matchGlob(key, toolName)) {\n return this.policy[key];\n }\n }\n return undefined;\n }\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\nexport type ErrorCode =\n // Provider\n | 'PROVIDER_RATE_LIMITED'\n | 'PROVIDER_AUTH_FAILED'\n | 'PROVIDER_OVERLOADED'\n | 'PROVIDER_INVALID_REQUEST'\n | 'PROVIDER_SERVER_ERROR'\n | 'PROVIDER_NETWORK_ERROR'\n | 'PROVIDER_CONTEXT_OVERFLOW'\n // Tool\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n // Config\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_PARSE_FAILED'\n | 'CONFIG_MIGRATION_NEEDED'\n // Plugin\n | 'PLUGIN_LOAD_FAILED'\n | 'PLUGIN_API_MISMATCH'\n | 'PLUGIN_MISSING_DEPENDENCY'\n // Agent\n | 'AGENT_ITERATION_LIMIT'\n | 'AGENT_CONTEXT_OVERFLOW'\n | 'AGENT_ABORTED'\n | 'AGENT_RUN_FAILED'\n // Session\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CORRUPTED'\n | 'SESSION_WRITE_FAILED'\n // Container / Registry\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\n | 'CONTAINER_TOKEN_NOT_BOUND'\n | 'REGISTRY_DUPLICATE'\n | 'REGISTRY_NOT_FOUND'\n // General\n | 'UNKNOWN';\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\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>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\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;\n context?: Record<string, unknown>;\n cause?: unknown;\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>;\n cause?: unknown;\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>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === '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;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === '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'> = 'AGENT_RUN_FAILED',\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? '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;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\n recoverable: opts.code !== '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// ── 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","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.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 interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\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 maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\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;\n name?: string;\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;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\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;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\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\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\n return 'PROVIDER_INVALID_REQUEST';\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n private static readonly NETWORK_ERR_RE =\n /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\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 = DefaultRetryPolicy.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 >= 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","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\n\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.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;\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/i;\nconst NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/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;\n modelsRegistry?: ModelsRegistry;\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 && !CONTEXT_OVERFLOW_RE.test(err.message)) 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.max(1_000, Math.min(delayMs, 60_000));\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 candidates = provider.models.filter((m) => {\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\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 || CONTEXT_OVERFLOW_RE.test(err.message)) {\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 * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger =\n firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : (desc.trim().split('\\n')[0] ?? '');\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!\n .replace(/[·•]/g, ',')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string): number => Math.max(1, Math.ceil(text.length / 4));\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\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => 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 quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\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 const key = JSON.stringify(input);\n return getCachedEstimate(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 const key = JSON.stringify(content);\n return getCachedEstimate(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","import type { Context } from '../core/context.js';\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 10;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.estimator = opts.estimator ?? estimateTextTokens;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateMessages(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx);\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\n\n // Phase 2: summary (placeholder; in production calls sub-LLM)\n if (opts.aggressive) {\n const phase2Saved = this.collapseAncientTurns(ctx);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n // Walk backwards counting (user + assistant) pairs to determine where\n // the preservation window really starts. This is more accurate than\n // the fixed multiplier which assumes every turn is 1 message pair.\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens removed. Call the tool again if needed.]`,\n is_error: b.is_error,\n };\n return elided;\n });\n // Check whether any block actually changed by reference equality\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private collapseAncientTurns(ctx: Context): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - this.preserveK * 2);\n if (cutTarget <= 0) return 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 0;\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateMessages(removed);\n\n const summary: Message[] = [\n {\n role: 'user',\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\n },\n { role: 'assistant', content: 'Continuing from compacted context.' },\n ];\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([...summary, ...tail]);\n return Math.max(0, removedTokens - this.estimateMessages(summary));\n }\n\n private estimateMessages(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.estimator(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.estimator(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 }\n }\n }\n return total;\n }\n}\n\nfunction 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","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\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;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\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;\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 { Context } from '../core/context.js';\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\n/**\n * Options for IntelligentCompactor.\n */\nexport interface IntelligentCompactorOptions {\n /** Provider to use for LLM-assisted summarization. Required. */\n provider: Provider;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used only for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** System prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n /**\n * Model ID to use for summarization. When not set, the same model as the\n * agent is used (which risks cascading failure on context overflow). Set to\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\n */\n summarizerModel?: string;\n}\n\n/**\n * An importance label for a message or message range.\n */\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\n\n/**\n * Result of importance analysis.\n */\nexport interface ImportanceAnalysis {\n messages: Array<{ index: number; importance: Importance; reason: string }>;\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\n}\n\n/**\n * IntelligentCompactor uses an LLM to:\n * - Analyze message importance and preserve critical context\n * - Generate semantic summaries for old message ranges\n * - Make intelligent decisions about what to compact\n *\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\n */\nexport class IntelligentCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerPrompt: string;\n private readonly summarizerModel?: string;\n\n constructor(opts: IntelligentCompactorOptions) {\n this.provider = opts.provider;\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\n this.summarizerModel = opts.summarizerModel;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n // Past hardThreshold, force aggressive regardless of caller preference —\n // the alternative (lightweight elision) is unlikely to recover enough.\n const aggressive =\n load >= this.hardThreshold ? true : (opts.aggressive ?? load >= this.softThreshold);\n\n // Phase 1: always run elision (preserves recent K pairs)\n const saved1 = this.eliseOldToolResults(ctx);\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\n\n // Phase 2: LLM summarization of ancient turns\n if (aggressive) {\n const saved2 = await this.summarizeAncientTurns(ctx);\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\n } else if (load >= this.warnThreshold) {\n // Non-aggressive: do lightweight summarization via direct analysis\n const saved2 = this.lightweightCompact(ctx);\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\n }\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\n const messages = ctx.messages;\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\n if (cutoff <= 2) return 0;\n\n // Find the best boundary in the ancient region\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\n if (boundary <= 1) return 0;\n\n const toSummarize = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(toSummarize);\n\n let summaryText: string;\n try {\n summaryText = await this.callSummarizer(toSummarize, ctx);\n } catch {\n // Fallback: generic placeholder if summarizer fails\n summaryText = `[${toSummarize.length} earlier turns omitted — key decisions and file states preserved in context]`;\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_summary: ${summaryText}]`,\n };\n const summaryTokens = this.estimateTokens([summaryMsg]);\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 Math.max(0, removedTokens - summaryTokens);\n }\n\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\n // Find the nearest user message with text content at or after `to`\n // and walk backwards to find a safe cut point.\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && this.hasTextContent(m)) {\n // Ensure we don't cut inside a multi-message exchange\n // by finding the start of this exchange.\n return this.findExchangeStart(messages, i);\n }\n }\n return -1;\n }\n\n private findExchangeStart(messages: Message[], userIndex: number): number {\n // Walk backwards from userIndex to find where this logical exchange began.\n // An exchange starts after the last assistant message that had no tool calls.\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) {\n // This assistant msg had no tool calls — it's a boundary\n return i + 1;\n }\n } else if (m.role !== 'user') {\n // system or other — skip\n } else {\n // another user msg — boundary\n return i;\n }\n }\n return 0;\n }\n\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\n const prompt: TextBlock[] = [\n { type: 'text', text: this.summarizerPrompt },\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\n ...this.messagesToText(messages),\n ];\n\n const req: Request = {\n model: this.summarizerModel ?? ctx.model,\n system: prompt,\n messages: [],\n maxTokens: 1024,\n };\n\n // Use abort signal from context if available.\n // Fall back to a fresh controller only if ctx.signal is absent — this\n // avoids leaking AbortControllers on every summarizer call (the original\n // `?? new AbortController().signal` created a controller that was never\n // connected to anything, making cancellation a no-op).\n const ac = ctx.signal ? undefined : new AbortController();\n const signal = ctx.signal ?? ac!.signal;\n const res = await this.provider.complete(req, { signal });\n\n const textBlocks = res.content.filter(isTextBlock);\n return (\n textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty summary)'\n );\n }\n\n private messagesToText(messages: Message[]): TextBlock[] {\n const lines: string[] = [];\n for (const m of messages) {\n const role = m.role.padEnd(10, ' ');\n if (typeof m.content === 'string') {\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\n } else if (Array.isArray(m.content)) {\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\n if (textParts.length > 0) {\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\n }\n }\n }\n return [{ type: 'text', text: lines.join('\\n') }];\n }\n\n private lightweightCompact(ctx: Context): number {\n // Lightweight: just elide very large tool results without full summarization\n return this.eliseOldToolResults(ctx);\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // Check by reference equality whether any block actually changed\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private 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 private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += estimateTextTokens(m.content);\n } else {\n for (const b of m.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 }\n }\n }\n return total;\n }\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n","import type { Context } from '../core/context.js';\nimport { LLMSelector } from '../models/llm-selector.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\n/**\n * Options for SelectiveCompactor — the most configurable compactor.\n */\nexport interface SelectiveCompactorOptions {\n /** Provider for LLM calls (selector + summarizer). Required. */\n provider: Provider;\n /** Selector for LLM-driven importance analysis. */\n selector?: MessageSelector;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** Model for selector LLM calls (default: same as provider default). */\n selectorModel?: string;\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\n summarizerModel?: string;\n /** Prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n}\n\n/**\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\n * surgical decisions about which message ranges to keep vs collapse.\n *\n * Compared to HybridCompactor / IntelligentCompactor:\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\n * - IntelligentCompactor: LLM summarization but no structured selection\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\n */\nexport class SelectiveCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly selector: MessageSelector;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerModel: string;\n private readonly summarizerPrompt: string;\n\n constructor(opts: SelectiveCompactorOptions) {\n this.provider = opts.provider;\n this.selector =\n opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\n\n if (!shouldCompact) {\n // Only do lightweight elision if below warn threshold\n const saved = this.eliseOldToolResults(ctx);\n if (saved > 0) reductions.push({ phase: 'elision', saved });\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n // Phase 1: elision — always run first to get a baseline reduction\n const savedElision = this.eliseOldToolResults(ctx);\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\n\n // Phase 2: LLM-driven selective compaction\n const afterPhase1 = this.estimateTokens(ctx.messages);\n const targetBudget = this.computeTargetBudget(load);\n\n if (afterPhase1 > targetBudget) {\n const savedSelective = await this.runSelector(ctx, targetBudget);\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\n }\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n /**\n * Run the LLM selector to decide what to keep vs collapse.\n * Returns the token savings achieved.\n */\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\n const before = this.estimateTokens(ctx.messages);\n\n let result: SelectorResult;\n try {\n result = await this.selector.select(ctx.messages, targetBudget);\n } catch {\n // Fallback to aggressive recency preservation\n return this.aggressiveRecencyTrim(ctx);\n }\n\n // Execute the selector's plan\n await this.executePlan(ctx, result);\n\n const after = this.estimateTokens(ctx.messages);\n return Math.max(0, before - after);\n }\n\n /**\n * Execute a SelectorResult plan: collapse/remove ranges and\n * insert summaries where the selector provided them.\n */\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\n if (ctx.messages.length === 0) return;\n\n // Process collapsed ranges in reverse order to preserve indices. We work\n // on a local copy and commit through `ctx.state.replaceMessages` at the\n // end so subscribers see a single state change for the whole rewrite.\n const messages = [...ctx.messages];\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\n\n for (const range of sortedCollapsed) {\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\n\n let summary = range.summary;\n if (!summary) {\n const toSummarize = messages.slice(range.from, range.to + 1);\n summary = await this.summarizeRange(toSummarize, ctx);\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\n };\n\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\n }\n\n ctx.state.replaceMessages(messages);\n }\n\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\n\n const req: Request = {\n model: this.summarizerModel,\n system: [{ type: 'text', text: systemText }],\n messages: [{ role: 'user', content: body }],\n maxTokens: 512,\n };\n\n try {\n const res = await this.provider.complete(req, {\n signal: ctx.signal ?? new AbortController().signal,\n });\n return (\n res.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty)'\n );\n } catch {\n return `[${messages.length} earlier turns omitted]`;\n }\n }\n\n private messagePreview(m: Message): string {\n if (typeof m.content === 'string') return m.content.slice(0, 300);\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ')\n .slice(0, 300);\n }\n\n /**\n * Fallback when selector fails: aggressively trim from the oldest end\n * until we hit targetBudget.\n */\n private aggressiveRecencyTrim(ctx: Context): number {\n const messages = ctx.messages;\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\n\n if (preserveIdx <= 0) return 0;\n\n // Find safe boundary near preserveIdx\n let boundary = preserveIdx;\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\n const m = messages[i]!;\n if (m.role === 'user' && this.hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(removed);\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\n };\n const tail = messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\n }\n\n private computeTargetBudget(load: number): number {\n if (load >= this.hardThreshold) {\n return Math.floor(this.maxContext * 0.5); // keep only 50%\n }\n if (load >= this.softThreshold) {\n return Math.floor(this.maxContext * 0.65); // keep 65%\n }\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const tokens = this.roughTokenEstimate(text);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // map() preserves length, so only block ref-equality matters here.\n if (newContent.every((b, idx) => b === msg.content[idx])) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private 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 private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.roughTokenEstimate(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\n else if (b.type === 'tool_result') {\n total += this.roughTokenEstimate(\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\n );\n }\n }\n }\n }\n return total;\n }\n\n private roughTokenEstimate(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n }\n}\n","import type { Context } from '../core/context.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { MiddlewareHandler } from '../kernel/pipeline.js';\nimport type { Compactor } from '../types/compactor.js';\nimport { AgentError } from '../types/errors.js';\n\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\n\nexport interface AutoCompactionOptions {\n aggressiveOn?: 'hard' | 'soft' | 'warn';\n events?: EventBus;\n failureMode?: CompactionFailureMode;\n}\n\n/**\n * Pipeline middleware that monitors context token load and automatically\n * triggers compaction when the warn/soft/hard thresholds are crossed.\n * Runs before the next agent iteration.\n */\nexport class AutoCompactionMiddleware {\n readonly name = 'AutoCompaction';\n\n private readonly compactor: Compactor;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly estimator: (ctx: Context) => number;\n private readonly aggressiveOn: 'hard' | 'soft' | 'warn';\n private readonly events?: EventBus;\n private readonly failureMode: CompactionFailureMode;\n\n /**\n * @param compactor Compactor to use for compaction.\n * @param maxContext Provider's max context window in tokens.\n * @param estimator Token estimation function.\n * @param thresholds Threshold fractions (0-1) of maxContext.\n * @param opts Optional behavior. By default, failures at the\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\n * the agent does not continue into a likely\n * provider context overflow. Warn/soft failures\n * still emit compaction.failed and continue.\n */\n constructor(\n compactor: Compactor,\n maxContext: number,\n estimator: (ctx: Context) => number,\n thresholds: { warn: number; soft: number; hard: number },\n optsOrAggressiveOn: AutoCompactionOptions | 'hard' | 'soft' | 'warn' = {},\n events?: EventBus,\n ) {\n const opts =\n typeof optsOrAggressiveOn === 'string'\n ? { aggressiveOn: optsOrAggressiveOn, events }\n : optsOrAggressiveOn;\n this.compactor = compactor;\n this.maxContext = maxContext;\n this.estimator = estimator;\n this.warnThreshold = thresholds.warn;\n this.softThreshold = thresholds.soft;\n this.hardThreshold = thresholds.hard;\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\n this.events = opts.events;\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\n }\n\n handler(): MiddlewareHandler<Context> {\n return async (ctx, next) => {\n const tokens = this.estimator(ctx);\n const load = tokens / this.maxContext;\n\n if (load >= this.hardThreshold) {\n await this.compact(ctx, true, { level: 'hard', tokens, load });\n } else if (load >= this.softThreshold) {\n await this.compact(ctx, this.aggressiveOn !== 'hard', { level: 'soft', tokens, load });\n } else if (load >= this.warnThreshold) {\n await this.compact(ctx, false, { level: 'warn', tokens, load });\n }\n\n return next(ctx);\n };\n }\n\n private async compact(\n ctx: Context,\n aggressive: boolean,\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\n ): Promise<void> {\n try {\n await this.compactor.compact(ctx, { aggressive });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const fatal =\n this.failureMode === 'throw' ||\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\n this.events?.emit('compaction.failed', {\n err: error,\n aggressive,\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n load: pressure.load,\n fatal,\n });\n if (fatal) {\n throw new AgentError({\n message: `Auto-compaction failed at ${pressure.level} threshold`,\n code: 'AGENT_CONTEXT_OVERFLOW',\n recoverable: true,\n context: {\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n },\n cause: err,\n });\n }\n }\n }\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;\n estimator?: (text: string) => number;\n}\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown): 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(serialize).join('\\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","import type { Context } from '../core/context.js';\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type {\n ToolBatchResult,\n ToolConfirmPendingResult,\n ToolExecutionOutput,\n ToolExecutorOptions,\n ToolExecutorStrategy,\n} from '../types/tool-executor.js';\nimport type { Tool } from '../types/tool.js';\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\n\nexport class ToolExecutor {\n private readonly serializer;\n private readonly iterationTimeoutMs: number;\n\n constructor(\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\n private readonly opts: ToolExecutorOptions,\n ) {\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.serializer = createToolOutputSerializer({\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\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 (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\n const start = Date.now();\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.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\n\n if (decision.permission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (decision.permission === '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.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n // fall through to execute\n } else {\n const suggestedPattern =\n this.subjectFor(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 // permission === 'auto'\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 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 });\n try {\n const result = await this.executeTool(tool, use, ctx, budget);\n budget = this.decrementBudget(result, budget);\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 = err instanceof Error ? err.message : String(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\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.decrementBudget(result, budget);\n if (err instanceof Error) span?.recordError(err);\n span?.setAttribute('tool.is_error', true);\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 = err instanceof Error ? err.message : String(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\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.decrementBudget(result, budget);\n return { result, tool: this.registry.get(use.name), 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<ToolResultBlock> {\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);\n const scrubbed = this.opts.secretScrubber.scrub(text);\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n name: tool.name,\n content: capped,\n is_error: false,\n };\n }\n\n private async runWithTimeout(\n tool: Tool,\n input: unknown,\n parentSignal: AbortSignal,\n ctx: Context,\n toolUseId?: string,\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 = tool.timeoutMs ?? this.iterationTimeoutMs;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\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 if (typeof tool.executeStream === 'function') {\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\n }\n return await tool.execute(input, ctx, { signal: combined });\n } catch (err) {\n if (combined.aborted && typeof tool.cleanup === 'function') {\n // Best-effort cleanup; never let it mask the original error.\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n throw err;\n } finally {\n clearTimeout(timer);\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 const stream = tool.executeStream!(input, ctx, { signal });\n for await (const ev of stream) {\n if (ev.type === 'final') {\n finalOutput = ev.output;\n sawFinal = true;\n // Drain whatever the iterator wants to surface after final, but the\n // result is locked in. Most tools won't yield more.\n break;\n }\n this.opts.events?.emit('tool.progress', {\n name: tool.name,\n id: toolUseId ?? '<unknown>',\n event: ev,\n });\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 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 decrementBudget(result: ToolResultBlock, budget: number): number {\n const contentBytes =\n typeof result.content === 'string'\n ? Buffer.byteLength(result.content, 'utf8')\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\n return Math.max(0, budget - contentBytes);\n }\n\n /**\n * Compute the suggestedPattern string for a tool+input pair.\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\n * same subject that the trust file would use.\n */\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const globChars = /[*?\\[\\]]/g;\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\n\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\n if (subjectKey) {\n const v = obj[subjectKey];\n if (typeof v === 'string') {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\n ? normalizePath(v)\n : escapeGlob(v);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlob(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePath(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlob(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlob(obj.name);\n }\n return undefined;\n }\n}\n","import type { Agent, RunResult } from '../core/agent.js';\nimport type { Context } from '../core/context.js';\nimport { toWrongStackError } from '../types/errors.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\n\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\n\nexport interface DoneCheckResult {\n done: boolean;\n reason?: string;\n iterations: number;\n toolCalls: number;\n}\n\nexport class DoneConditionChecker {\n private readonly compiledRegex: RegExp | null;\n\n constructor(private readonly condition: DoneCondition) {\n this.compiledRegex =\n condition.type === 'output_match' && condition.pattern ? new RegExp(condition.pattern) : null;\n }\n\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\n switch (this.condition.type) {\n case 'iterations':\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\n return {\n done: true,\n reason: `max iterations (${this.condition.maxIterations}) reached`,\n ...state,\n };\n }\n break;\n\n case 'tool_calls':\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\n return {\n done: true,\n reason: `max tool calls (${this.condition.maxToolCalls}) reached`,\n ...state,\n };\n }\n break;\n\n case 'output_match':\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\n return {\n done: true,\n reason: `output matched pattern \"${this.condition.pattern}\"`,\n ...state,\n };\n }\n break;\n\n case 'custom':\n // Reserved for future extension\n break;\n }\n\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\n }\n}\n\nexport interface AutonomousRunnerOptions {\n agent: Agent;\n context: Context;\n doneCondition: DoneCondition;\n iterationTimeoutMs?: number;\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\n onDone?: (result: AutonomousResult) => void;\n}\n\nexport class AutonomousRunner {\n private iterations = 0;\n private toolCalls = 0;\n private lastOutput?: string;\n private stopped = false;\n private readonly doneChecker: DoneConditionChecker;\n\n constructor(private readonly opts: AutonomousRunnerOptions) {\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\n }\n\n async run(): Promise<AutonomousResult> {\n // Subscribe to `tool.executed` so the per-tool budget (`tool_calls`\n // done-condition) actually counts each tool invocation rather than\n // each `agent.run()` call. Without this, a single iteration that\n // fires 5 tools only bumps the counter once, and a `maxToolCalls: 3`\n // budget would fire after 3 iterations (typically 3×N tools) instead\n // of after 3 tools. Unsubscribed in the `finally` so the listener\n // doesn't outlive this run instance. Mock agents in tests may pass\n // null/undefined for `events`; gracefully skip when missing — those\n // tests don't exercise the tool-count budget path.\n const offToolExecuted = this.opts.agent.events?.on?.('tool.executed', () => {\n this.toolCalls++;\n });\n try {\n return await this.runLoop();\n } finally {\n offToolExecuted?.();\n }\n }\n\n private async runLoop(): Promise<AutonomousResult> {\n while (!this.stopped) {\n const check = this.doneChecker.check({\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n lastOutput: this.lastOutput,\n });\n\n if (check.done) {\n const result: AutonomousResult = {\n status: 'done',\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: check.reason,\n };\n this.opts.onDone?.(result);\n return result;\n }\n\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\n\n const ctrl = new AbortController();\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\n\n try {\n const result = await this.opts.agent.run('', {\n signal: ctrl.signal,\n maxIterations: 1,\n executionStrategy: 'sequential',\n });\n\n this.iterations++;\n // Only access finalText when the run actually succeeded. Failed/aborted\n // runs may have undefined finalText — accessing it unconditionally would\n // produce garbage output for the done-condition matchers.\n if (result.status === 'done') {\n this.lastOutput = result.finalText;\n }\n // `toolCalls` is bumped by the `tool.executed` listener installed\n // in run() — no manual increment here.\n\n if (result.status === 'failed' || result.status === 'aborted') {\n const failedResult: AutonomousResult = {\n status: result.status,\n error: result.error,\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n };\n this.opts.onDone?.(failedResult);\n return failedResult;\n }\n } catch (e) {\n // Be precise about what constitutes a timeout error — matching on\n // 'timeout' substring is too loose (an error message containing\n // \"timeout exceeded\" from the LLM is not the same as an abort).\n const isAbort =\n (e instanceof DOMException && e.name === 'AbortError') ||\n (e instanceof Error && e.name === 'AbortError') ||\n (e instanceof Error && e.message.includes('iteration timeout'));\n if (isAbort) {\n const timeoutResult: AutonomousResult = {\n status: 'failed',\n error: toWrongStackError(e),\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: 'iteration timeout',\n };\n this.opts.onDone?.(timeoutResult);\n return timeoutResult;\n }\n // Any other throw (TypeError, tool crash propagation, etc.) must\n // stop the loop — silently continuing would spin forever on the\n // same error and burn provider tokens with no progress.\n this.stopped = true;\n const failedResult: AutonomousResult = {\n status: 'failed',\n error: toWrongStackError(e),\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: e instanceof Error ? e.message : String(e),\n };\n this.opts.onDone?.(failedResult);\n return failedResult;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n return {\n status: 'aborted',\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: 'stopped externally',\n };\n }\n\n stop(): void {\n this.stopped = true;\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 { 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\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.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 Error('Bridge is stopped');\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 Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\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 }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\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,\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","/**\n * System-prompt composition helpers for the Director ecosystem.\n *\n * Two callers need composed prompts:\n *\n * 1. The **leader** (the director's own Agent) — needs a preamble that\n * explains the fleet protocol: when to spawn, when to await, how to\n * roll up, and the eight orchestration tools it owns.\n *\n * 2. Each **subagent** — needs a baseline that explains it has a parent\n * it can call via the bridge, a role-specific block, the task brief,\n * and finally any per-spawn `systemPromptOverride` from `SubagentConfig`.\n *\n * Both composers are pure functions: feed them parts, they return a string.\n * No I/O, no side effects, no implicit defaults beyond the ones exported\n * here. Callers (CLI multi-agent factory, Director itself) decide which\n * parts to fill in — that keeps the composition seam visible and testable.\n */\n\n/**\n * Default fleet-protocol preamble injected at the **front** of the\n * director-agent's system prompt. Kept deliberately short — long preambles\n * crowd out the user's leader prompt and the LLM stops attending. The tool\n * descriptions live on the tool definitions themselves; this preamble only\n * teaches *when* to reach for them.\n */\nexport const DEFAULT_DIRECTOR_PREAMBLE = `\\\nYou are the Director of a multi-agent fleet. You orchestrate worker\nsubagents by spawning them, assigning tasks, awaiting completions, and\nrolling up their outputs into your next decision.\n\nCore fleet tools available to you:\n - spawn_subagent — create a worker with a chosen provider / model / role\n - assign_task — hand a piece of work to a specific subagent\n - await_tasks — block until named task ids complete (parallel-safe)\n - ask_subagent — synchronously query a running subagent via the bridge\n - roll_up — aggregate finished tasks into a markdown/json summary\n - terminate_subagent — abort a stuck worker (use sparingly)\n - fleet_status — snapshot of all subagents and pending tasks\n - fleet_usage — token + cost breakdown per subagent and total\n\nWorking rules:\n 1. Decompose first. Before spawning, decide which sub-tasks are\n independent and can run in parallel. Sequential work doesn't need a\n subagent — do it yourself.\n 2. Match worker to job. Cheap/fast model for triage, capable model for\n synthesis. Different providers per sibling is allowed and encouraged.\n 3. Always pair an assign with an await. Don't fire-and-forget; you owe\n the user a single coherent answer at the end.\n 4. Roll up before deciding. After await_tasks resolves, call roll_up so\n the results are folded back into your context in a compact form.\n 5. Budget is real. Check fleet_usage periodically. If a subagent is\n thrashing, terminate it rather than letting cost climb silently.\n 6. Never claim a subagent's work as your own without verifying it. If a\n result looks wrong, ask_subagent for clarification before passing it\n to the user.\\\n`;\n\n/**\n * Default baseline prepended to every subagent's system prompt. Tells the\n * subagent its place in the hierarchy and the bridge contract — without\n * this, a subagent has no way to know it *can* ask the parent for\n * clarification, and it will hallucinate answers when context is missing.\n *\n * Bridge contract: subagents may `send` progress and `request` answers, but\n * MAY NOT exfiltrate the parent's full system prompt or tools list. The\n * baseline reinforces this in plain text — the actual enforcement is at\n * the bridge transport layer.\n */\nexport const DEFAULT_SUBAGENT_BASELINE = `\\\nYou are a subagent operating under a Director. You were spawned to handle\na specific slice of a larger plan — do that slice well and report back.\n\nBridge contract:\n - You have a parent (the Director). You may call \\`request\\` on the\n parent bridge to ask a clarifying question. Use this sparingly; the\n parent is also working.\n - You MAY NOT request the parent's system prompt, tool list, or other\n subagents' context. Those are not yours to read.\n - Your final task output is what the Director sees. Be concise,\n structured, and self-contained — assume the Director will paste your\n output into its own context.\\\n`;\n\n/** Parts the leader-prompt composer accepts. All optional. */\nexport interface DirectorPromptParts {\n /** The user's existing leader system prompt — typically what was passed\n * via `MultiAgentConfig.leaderSystemPrompt`. */\n basePrompt?: string;\n /** Override the built-in fleet preamble. Pass empty string to suppress. */\n directorPreamble?: string;\n /** Optional roster summary block — a short list of pre-configured roles\n * the director can spawn (e.g. \"researcher, coder, reviewer\"). Helps\n * small models discover the available shapes without scanning tools. */\n rosterSummary?: string;\n}\n\n/**\n * Compose the leader/director's system prompt. Order:\n * 1. Director preamble (fleet protocol)\n * 2. Roster summary (optional, when provided)\n * 3. User base prompt (the per-project leader prompt)\n *\n * Sections are separated by a blank line. Empty parts are skipped so the\n * output never contains stray blank-line runs.\n */\nexport function composeDirectorPrompt(parts: DirectorPromptParts = {}): string {\n const sections: string[] = [];\n const preamble = parts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n if (preamble && preamble.trim().length > 0) sections.push(preamble.trim());\n if (parts.rosterSummary && parts.rosterSummary.trim().length > 0) {\n sections.push(`Available roles you can spawn:\\n${parts.rosterSummary.trim()}`);\n }\n if (parts.basePrompt && parts.basePrompt.trim().length > 0) {\n sections.push(parts.basePrompt.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/** Parts the subagent-prompt composer accepts. Layered from generic to\n * specific; later layers override earlier ones when they conflict. */\nexport interface SubagentPromptParts {\n /** Base persona/identity for *every* subagent. Defaults to the bridge\n * contract baseline. Pass empty string to suppress. */\n baseline?: string;\n /** Role-specific block, e.g. \"You are a code reviewer. Focus on…\". */\n role?: string;\n /** Task brief — usually the same string the runner passes as user input,\n * but exposed here in case the factory wants it duplicated in the\n * system prompt for reinforcement. */\n task?: string;\n /**\n * Absolute path to a shared scratchpad directory the whole fleet can\n * read/write. When set, the composer adds a \"Shared notes\" block that\n * tells the subagent where to drop findings and where to look for\n * sibling output. This is the cheap fleet-coordination channel —\n * agents don't need each other's transcripts, just each other's\n * conclusions. Falls between `task` and `override` so the override\n * can still narrow or replace it.\n */\n sharedScratchpad?: string;\n /** Final per-spawn override from `SubagentConfig.systemPromptOverride`.\n * Added last so it wins on conflict — that's by design: the spawn site\n * knows the most about what this specific subagent should do. */\n override?: string;\n}\n\n/**\n * Compose a subagent's system prompt. Order:\n * 1. Baseline (bridge contract)\n * 2. Role\n * 3. Task brief\n * 4. Per-spawn override\n *\n * Same blank-line-separated joining as the director composer.\n *\n * Layering rationale: the baseline never needs to change between\n * subagents; the role is the \"what kind of worker is this\"; the task is\n * the \"what should you do *now*\"; the override is the spawn-site escape\n * hatch (\"…and respond only in JSON\"). Putting override last means it\n * never gets squashed by something earlier in the chain.\n */\nexport function composeSubagentPrompt(parts: SubagentPromptParts = {}): string {\n const sections: string[] = [];\n const baseline = parts.baseline ?? DEFAULT_SUBAGENT_BASELINE;\n if (baseline && baseline.trim().length > 0) sections.push(baseline.trim());\n if (parts.role && parts.role.trim().length > 0) {\n sections.push(`Role:\\n${parts.role.trim()}`);\n }\n if (parts.task && parts.task.trim().length > 0) {\n sections.push(`Task:\\n${parts.task.trim()}`);\n }\n if (parts.sharedScratchpad && parts.sharedScratchpad.trim().length > 0) {\n sections.push(\n `Shared notes:\\n` +\n `A scratchpad shared with the rest of the fleet is mounted at \\`${parts.sharedScratchpad.trim()}\\`.\\n` +\n `- Write your final findings as markdown files there (e.g. \\`findings.md\\`, \\`security.md\\`).\\n` +\n `- Before starting, list the directory and read any sibling files relevant to your task — ` +\n `they may already contain context you can build on.\\n` +\n `- Use stable filenames (one file per concern); overwrite instead of appending so the ` +\n `Director sees the latest state.`,\n );\n }\n if (parts.override && parts.override.trim().length > 0) {\n sections.push(parts.override.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/**\n * Render a short bullet list summarising a roster — useful for stuffing\n * into `composeDirectorPrompt({ rosterSummary })` so the director model\n * can see available roles without scanning tool descriptions.\n *\n * Each entry: `- <role-id>: <name>[ (provider/model)] — <prompt-headline>`\n * The prompt headline is the first non-empty line of `config.prompt`,\n * truncated to 80 chars. Skipped entirely when the role has no prompt.\n */\nexport function rosterSummaryFromConfigs(\n roster: Record<\n string,\n { name: string; provider?: string; model?: string; prompt?: string; role?: string }\n >,\n): string {\n const lines: string[] = [];\n for (const [roleId, cfg] of Object.entries(roster)) {\n const tag = cfg.provider && cfg.model ? ` (${cfg.provider}/${cfg.model})` : '';\n const headline = cfg.prompt\n ? (cfg.prompt.split('\\n').find((l) => l.trim().length > 0) ?? '').trim().slice(0, 80)\n : '';\n const tail = headline ? ` — ${headline}` : '';\n lines.push(`- ${roleId}: ${cfg.name}${tag}${tail}`);\n }\n return lines.join('\\n');\n}\n","import type { EventBus } from '../kernel/events.js';\n\n/**\n * Single fleet-wide event with subagent attribution. Whatever a child\n * agent emits on its own EventBus gets re-published here, prefixed with\n * `subagentId` so a single subscriber can multiplex across the fleet.\n *\n * The director uses `FleetBus.filter('tool.executed', …)` to see every\n * tool call across the fleet; the TUI uses\n * `FleetBus.subscribe(id, handler)` to render a per-subagent panel.\n */\nexport interface FleetEvent {\n subagentId: string;\n taskId?: string;\n ts: number;\n type: string;\n payload: unknown;\n}\n\nexport type FleetHandler = (event: FleetEvent) => void;\n\n/**\n * Fan-in for per-subagent EventBuses. Each subagent's bus is plugged in\n * via `attach()`; the FleetBus re-emits every event with subagent\n * attribution. Detachment is automatic via the returned disposer — call\n * it when a subagent terminates so we don't leak listeners.\n *\n * The bus exposes two subscription modes: by `subagentId` (everything\n * from one child) and by `type` (one event-type across the fleet). They\n * compose — if you need a per-subagent + per-type slice, subscribe by\n * type and filter on `event.subagentId` in your handler.\n */\nexport class FleetBus {\n private readonly byId = new Map<string, Set<FleetHandler>>();\n private readonly byType = new Map<string, Set<FleetHandler>>();\n private readonly any = new Set<FleetHandler>();\n\n /**\n * Hook a subagent's EventBus into the fleet. EventBus is strongly\n * typed and doesn't expose an `onAny` hook, so we subscribe to the\n * canonical set of event types a subagent emits during a run. New\n * event types added to the kernel must be added here too — but the\n * cost is a tiny single line per type, and the explicit list keeps\n * the wire format clear.\n *\n * Returns a disposer that detaches every subscription; call on\n * subagent teardown so the listeners don't outlive the run.\n */\n attach(subagentId: string, bus: EventBus, taskId?: string): () => void {\n const FORWARDED_TYPES = [\n 'tool.started',\n 'tool.executed',\n 'tool.progress',\n 'tool.confirm_needed',\n 'iteration.started',\n 'iteration.completed',\n 'provider.text_delta',\n 'provider.response',\n 'provider.retry',\n 'provider.error',\n 'session.started',\n 'session.ended',\n 'session.damaged',\n 'compaction.fired',\n 'compaction.failed',\n 'token.threshold',\n ] as const;\n const offs: Array<() => void> = [];\n for (const t of FORWARDED_TYPES) {\n offs.push(\n bus.on(t, (payload: unknown) => {\n this.emit({ subagentId, taskId, ts: Date.now(), type: t, payload });\n }),\n );\n }\n return () => {\n for (const off of offs) off();\n };\n }\n\n /** Subscribe to every event from one subagent. */\n subscribe(subagentId: string, handler: FleetHandler): () => void {\n let set = this.byId.get(subagentId);\n if (!set) {\n set = new Set();\n this.byId.set(subagentId, set);\n }\n set.add(handler);\n return () => {\n set!.delete(handler);\n };\n }\n\n /** Subscribe to one event type across all subagents. */\n filter(type: string, handler: FleetHandler): () => void {\n let set = this.byType.get(type);\n if (!set) {\n set = new Set();\n this.byType.set(type, set);\n }\n set.add(handler);\n return () => {\n set!.delete(handler);\n };\n }\n\n /** Subscribe to literally everything. The fleet roll-up uses this. */\n onAny(handler: FleetHandler): () => void {\n this.any.add(handler);\n return () => {\n this.any.delete(handler);\n };\n }\n\n emit(event: FleetEvent): void {\n // Each fan-out is best-effort — a misbehaving handler must not\n // bring down the bus or other handlers. Errors are swallowed\n // (matching the rest of the project's listener-error policy).\n const byId = this.byId.get(event.subagentId);\n if (byId)\n for (const h of byId) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n const byType = this.byType.get(event.type);\n if (byType)\n for (const h of byType) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n for (const h of this.any) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n }\n}\n\n/**\n * Roll-up of token usage + cost across an entire director run. The\n * director's `fleet_status` tool returns this so the model can reason\n * about budget in its next turn (\"the researcher already burned $0.40,\n * lean on summaries for the next task\").\n */\nexport interface FleetUsage {\n total: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n };\n perSubagent: Record<string, SubagentUsageSnapshot>;\n}\n\nexport interface SubagentUsageSnapshot {\n subagentId: string;\n provider?: string;\n model?: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n toolCalls: number;\n iterations: number;\n startedAt: number;\n lastEventAt: number;\n}\n\n/**\n * Aggregates provider.response + tool.executed events from the FleetBus\n * into a live `FleetUsage` snapshot. Costs are computed by the caller\n * via a `priceLookup(subagentId)` so we don't bake provider-pricing\n * coupling into core; the CLI/tests supply a function that resolves\n * each subagent's per-token rates from the models registry.\n */\nexport class FleetUsageAggregator {\n private readonly perSubagent = new Map<string, SubagentUsageSnapshot>();\n private readonly total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n\n constructor(\n private readonly bus: FleetBus,\n private readonly priceLookup?: (\n subagentId: string,\n ) => { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } | undefined,\n private readonly metaLookup?: (\n subagentId: string,\n ) => { provider?: string; model?: string } | undefined,\n ) {\n bus.filter('provider.response', (e) => this.onProviderResponse(e));\n bus.filter('tool.executed', (e) => this.onToolExecuted(e));\n bus.filter('iteration.started', (e) => this.onIterationStarted(e));\n }\n\n /** Live snapshot — safe to call from a tool's execute() body. */\n snapshot(): FleetUsage {\n return {\n total: { ...this.total },\n perSubagent: Object.fromEntries(\n Array.from(this.perSubagent.entries()).map(([k, v]) => [k, { ...v }]),\n ),\n };\n }\n\n private ensure(subagentId: string): SubagentUsageSnapshot {\n let snap = this.perSubagent.get(subagentId);\n if (!snap) {\n const meta = this.metaLookup?.(subagentId);\n snap = {\n subagentId,\n provider: meta?.provider,\n model: meta?.model,\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: 0,\n toolCalls: 0,\n iterations: 0,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n };\n this.perSubagent.set(subagentId, snap);\n }\n return snap;\n }\n\n private onProviderResponse(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n const p = e.payload as {\n usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n };\n const usage = p?.usage;\n if (!usage) return;\n snap.input += usage.input ?? 0;\n snap.output += usage.output ?? 0;\n snap.cacheRead += usage.cacheRead ?? 0;\n snap.cacheWrite += usage.cacheWrite ?? 0;\n this.total.input += usage.input ?? 0;\n this.total.output += usage.output ?? 0;\n this.total.cacheRead += usage.cacheRead ?? 0;\n this.total.cacheWrite += usage.cacheWrite ?? 0;\n const price = this.priceLookup?.(e.subagentId);\n if (price) {\n const delta =\n ((usage.input ?? 0) / 1_000_000) * (price.input ?? 0) +\n ((usage.output ?? 0) / 1_000_000) * (price.output ?? 0) +\n ((usage.cacheRead ?? 0) / 1_000_000) * (price.cacheRead ?? 0) +\n ((usage.cacheWrite ?? 0) / 1_000_000) * (price.cacheWrite ?? 0);\n snap.cost += delta;\n this.total.cost += delta;\n }\n snap.lastEventAt = e.ts;\n }\n\n private onToolExecuted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.toolCalls += 1;\n snap.lastEventAt = e.ts;\n }\n\n private onIterationStarted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.iterations += 1;\n snap.lastEventAt = e.ts;\n }\n}\n","import type { Usage } from '../types/provider.js';\n\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\n\nexport class BudgetExceededError extends Error {\n readonly kind: BudgetKind;\n readonly limit: number;\n readonly observed: number;\n\n constructor(kind: BudgetKind, limit: number, observed: number) {\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\n this.name = 'BudgetExceededError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport interface BudgetLimits {\n maxIterations?: number;\n maxToolCalls?: number;\n maxTokens?: number;\n /** Estimated USD cost ceiling. */\n maxCostUsd?: number;\n /** Wall-clock timeout from start() to checkTimeout(). */\n timeoutMs?: number;\n}\n\nexport interface BudgetUsage {\n iterations: number;\n toolCalls: number;\n tokens: { input: number; output: number; total: number };\n costUsd: number;\n elapsedMs: number;\n}\n\n/**\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\n * methods are O(1) and safe to call from hot paths.\n *\n * Behavior: `record*` methods throw `BudgetExceededError` synchronously the\n * moment a limit is crossed. The caller (runner/coordinator) catches this and\n * marks the task as 'failed' with the budget kind, so the operator can see\n * exactly which ceiling tripped.\n *\n * Timeout note: `checkTimeout()` is a cooperative guard called by the\n * runner on each iteration loop. The coordinator additionally enforces a\n * hard wall-clock deadline via `Promise.race` in `executeWithTimeout`.\n * Both mechanisms throw `BudgetExceededError` ('timeout') — the runner's\n * check is best-effort (catches cases where the runner loop doesn't call it)\n * and the coordinator's race is the authoritative cutoff. The two are\n * intentionally independent; they converge on the same error type so\n * `runDispatched` handles both identically.\n */\nexport class SubagentBudget {\n readonly limits: Readonly<BudgetLimits>;\n private iterations = 0;\n private toolCalls = 0;\n private tokenInput = 0;\n private tokenOutput = 0;\n private costUsd = 0;\n private startTime: number | null = null;\n\n constructor(limits: BudgetLimits = {}) {\n this.limits = Object.freeze({ ...limits });\n }\n\n start(): void {\n this.startTime = Date.now();\n }\n\n recordIteration(): void {\n this.iterations++;\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\n throw new BudgetExceededError('iterations', this.limits.maxIterations, this.iterations);\n }\n }\n\n recordToolCall(): void {\n this.toolCalls++;\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n throw new BudgetExceededError('tool_calls', this.limits.maxToolCalls, this.toolCalls);\n }\n }\n\n recordUsage(usage: Usage, costUsd = 0): void {\n this.tokenInput += usage.input;\n this.tokenOutput += usage.output;\n this.costUsd += costUsd;\n\n const totalTokens = this.tokenInput + this.tokenOutput;\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\n throw new BudgetExceededError('tokens', this.limits.maxTokens, totalTokens);\n }\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\n throw new BudgetExceededError('cost', this.limits.maxCostUsd, this.costUsd);\n }\n }\n\n /**\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\n * loop so a hung tool can't keep a subagent running past its deadline.\n */\n checkTimeout(): void {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.limits.timeoutMs) {\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\n }\n }\n\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\n isTimedOut(): boolean {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\n return Date.now() - this.startTime > this.limits.timeoutMs;\n }\n\n usage(): BudgetUsage {\n return {\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n tokens: {\n input: this.tokenInput,\n output: this.tokenOutput,\n total: this.tokenInput + this.tokenOutput,\n },\n costUsd: this.costUsd,\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\nimport type {\n CoordinatorStatus,\n MultiAgentConfig,\n MultiAgentCoordinator,\n SpawnResult,\n SubagentConfig,\n SubagentContext,\n SubagentRunContext,\n SubagentRunner,\n TaskResult,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\n\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\n\ninterface SubagentEntry {\n config: SubagentConfig;\n context: SubagentContext;\n status: SubagentStatus;\n currentTask?: string;\n abortController: AbortController;\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\n activeBudget?: SubagentBudget;\n}\n\nexport interface MultiAgentCoordinatorOptions {\n /**\n * Callback that executes a task on behalf of a subagent. Required for\n * `assign()` to actually run anything — without it, tasks queue forever.\n * The coordinator provides per-subagent isolation (own budget, own signal,\n * own bridge) and enforces timeout + concurrency.\n */\n runner?: SubagentRunner;\n}\n\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\n readonly coordinatorId: string;\n readonly config: MultiAgentConfig;\n private readonly runner?: SubagentRunner;\n\n private readonly subagents = new Map<string, SubagentEntry>();\n\n private pendingTasks: TaskSpec[] = [];\n private completedResults: TaskResult[] = [];\n private totalIterations = 0;\n private inFlight = 0;\n\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\n super();\n this.coordinatorId = config.coordinatorId;\n this.config = config;\n this.runner = options.runner;\n }\n\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\n const id = subagent.id || randomUUID();\n const context: SubagentContext = {\n subagentId: id,\n tasks: [],\n // Wired later by the caller via setSubagentBridge() once the\n // bidirectional bridge is created. Readers must null-check / use\n // hasParentBridge() — the type now reflects this.\n parentBridge: null,\n doneCondition: this.config.doneCondition,\n maxConcurrent: this.config.maxConcurrent ?? 4,\n };\n\n this.subagents.set(id, {\n config: { ...subagent, id },\n context,\n status: 'idle',\n abortController: new AbortController(),\n });\n\n this.emit('subagent.started', { subagent: { ...subagent, id } });\n\n return { subagentId: id, agentId: id };\n }\n\n async assign(task: TaskSpec): Promise<void> {\n this.pendingTasks.push(task);\n this.tryDispatchNext();\n }\n\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\n const subagent = this.subagents.get(to);\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\n if (!subagent.context.parentBridge) {\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\n }\n await subagent.context.parentBridge.send(msg);\n }\n\n /**\n * Wire up the communication bridge for a subagent. Call after spawn() once\n * the caller has created the bidirectional connection.\n */\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\n subagent.context.parentBridge = bridge;\n }\n\n async stop(subagentId: string): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n\n // Abort any in-flight run, then sever the bridge so further messages fail\n // fast instead of silently queueing on a dead subagent.\n subagent.abortController.abort();\n subagent.status = 'stopped';\n subagent.currentTask = undefined;\n subagent.context.parentBridge = null;\n\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\n }\n\n async stopAll(): Promise<void> {\n // allSettled so one failure doesn't leave other subagents un-stopped.\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\n }\n\n getStatus(): CoordinatorStatus {\n return {\n coordinatorId: this.coordinatorId,\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\n id,\n name: s.config.name,\n status: s.status,\n currentTask: s.currentTask,\n })),\n pendingTasks: this.pendingTasks.length,\n completedTasks: this.completedResults.length,\n totalIterations: this.totalIterations,\n done: this.isDone(),\n };\n }\n\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\n results(): readonly TaskResult[] {\n return this.completedResults;\n }\n\n /**\n * Manual completion — for callers that drive subagents without a runner\n * (e.g. external orchestrators). When a runner is configured the coordinator\n * calls this itself.\n */\n completeTask(result: TaskResult): void {\n this.recordCompletion(result);\n }\n\n // --- internal dispatching ---------------------------------------------\n\n private tryDispatchNext(): void {\n while (this.canDispatch()) {\n const subagentId = this.findIdleSubagent();\n if (!subagentId) return;\n const task = this.pendingTasks.shift();\n if (!task) return;\n // Attach a catch so a synchronous throw inside runDispatched (rare —\n // e.g. provider misconfiguration before the first await) becomes a\n // visible failed task instead of an unhandled rejection that leaves\n // `inFlight` permanently elevated.\n this.runDispatched(subagentId, task).catch((err) => {\n this.recordCompletion({\n subagentId,\n taskId: task.id,\n status: 'failed',\n error: err instanceof Error ? err.message : String(err),\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n });\n });\n }\n }\n\n private canDispatch(): boolean {\n const max = this.config.maxConcurrent ?? 4;\n return this.inFlight < max && this.pendingTasks.length > 0;\n }\n\n private findIdleSubagent(): string | null {\n for (const [id, s] of this.subagents) {\n if (s.status === 'idle') return id;\n }\n return null;\n }\n\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n\n subagent.status = 'running';\n subagent.currentTask = task.id;\n task.subagentId = subagentId;\n subagent.context.tasks.push(task);\n\n this.emit('task.assigned', { task, subagentId });\n\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\n // Precedence: task > subagent > coordinator default.\n const budget = new SubagentBudget({\n maxIterations: subagent.config.maxIterations ?? this.config.defaultBudget?.maxIterations,\n maxToolCalls:\n task.maxToolCalls ??\n subagent.config.maxToolCalls ??\n this.config.defaultBudget?.maxToolCalls,\n maxTokens: subagent.config.maxTokens ?? this.config.defaultBudget?.maxTokens,\n maxCostUsd: subagent.config.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\n timeoutMs:\n task.timeoutMs ?? subagent.config.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\n });\n subagent.activeBudget = budget;\n\n if (!this.runner) {\n // No runner wired — caller drives execution via completeTask(). Status\n // reverts when the caller reports. We intentionally don't bump\n // `inFlight` here: `completeTask` → `recordCompletion` would then\n // decrement an inFlight that runDispatched never incremented, masking\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\n // check still settles correctly once the caller reports.\n return;\n }\n\n // Only count inFlight when we actually own the execution lifecycle.\n this.inFlight++;\n\n const startTime = Date.now();\n const runCtx: SubagentRunContext = {\n subagentId,\n config: subagent.config,\n budget,\n signal: subagent.abortController.signal,\n bridge: subagent.context.parentBridge || null,\n };\n\n let result: TaskResult;\n\n budget.start();\n try {\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\n result = {\n subagentId,\n taskId: task.id,\n status: 'success',\n result: outcome.result,\n iterations: outcome.iterations,\n toolCalls: outcome.toolCalls,\n durationMs: Date.now() - startTime,\n };\n } catch (err) {\n // Order matters: a timeout calls abort() to signal cooperative runners,\n // which also flips `signal.aborted=true`. Inspect the error first so we\n // surface 'timeout' rather than masking it as 'stopped'.\n const status: TaskResult['status'] =\n err instanceof BudgetExceededError && err.kind === 'timeout'\n ? 'timeout'\n : subagent.abortController.signal.aborted\n ? 'stopped'\n : 'failed';\n const usage = budget.usage();\n result = {\n subagentId,\n taskId: task.id,\n status,\n error: err instanceof Error ? err.message : String(err),\n iterations: usage.iterations,\n toolCalls: usage.toolCalls,\n durationMs: Date.now() - startTime,\n };\n }\n\n this.recordCompletion(result);\n }\n\n private async executeWithTimeout(\n runner: SubagentRunner,\n task: TaskSpec,\n ctx: SubagentRunContext,\n budget: SubagentBudget,\n ) {\n const timeoutMs = budget.limits.timeoutMs;\n if (timeoutMs === undefined) return runner(task, ctx);\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n // Abort the subagent's signal so cooperative runners can clean up.\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(new BudgetExceededError('timeout', timeoutMs, Date.now()));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([runner(task, ctx), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private recordCompletion(result: TaskResult): void {\n this.completedResults.push(result);\n this.totalIterations += result.iterations;\n if (this.inFlight > 0) {\n this.inFlight--;\n } else if (this.runner) {\n // Runner-driven path completed without an outstanding inFlight slot —\n // shouldn't happen unless completeTask was called externally.\n this.emit('warning', {\n type: 'inFlight_underflow',\n taskId: result.taskId,\n subagentId: result.subagentId,\n });\n return;\n }\n\n const subagent = this.subagents.get(result.subagentId);\n if (subagent && subagent.status !== 'stopped') {\n const failed = result.status === 'failed' || result.status === 'timeout';\n subagent.status = failed ? 'error' : 'idle';\n subagent.currentTask = undefined;\n // If the run aborted (timeout or explicit stop), the subagent's\n // signal is now permanently aborted — recycling the controller lets\n // the next dispatched task start with a fresh cancellation scope.\n if (subagent.abortController.signal.aborted) {\n subagent.abortController = new AbortController();\n }\n // Reset error state on next assignment so a transient failure doesn't\n // permanently sideline the subagent.\n if (subagent.status === 'error') {\n queueMicrotask(() => {\n if (subagent.status === 'error') subagent.status = 'idle';\n this.tryDispatchNext();\n });\n }\n }\n\n this.emit('task.completed', {\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\n result,\n });\n\n this.tryDispatchNext();\n\n if (this.isDone()) {\n this.emit('done', {\n results: this.completedResults,\n totalIterations: this.totalIterations,\n });\n }\n }\n\n private isDone(): boolean {\n if (this.config.doneCondition.type === 'all_tasks_done') {\n return this.pendingTasks.length === 0 && this.inFlight === 0;\n }\n if (\n this.config.doneCondition.maxIterations !== undefined &&\n this.totalIterations >= this.config.doneCondition.maxIterations\n ) {\n return true;\n }\n return false;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { BridgeMessage } from '../types/agent-bridge.js';\nimport type {\n CoordinatorStatus,\n MultiAgentConfig,\n SubagentConfig,\n SubagentRunner,\n TaskResult,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport type { JSONSchema, Tool } from '../types/tool.js';\nimport { InMemoryAgentBridge } from './agent-bridge.js';\nimport {\n DEFAULT_DIRECTOR_PREAMBLE,\n DEFAULT_SUBAGENT_BASELINE,\n composeDirectorPrompt,\n composeSubagentPrompt,\n rosterSummaryFromConfigs,\n} from './director-prompts.js';\nimport { FleetBus, type FleetUsage, FleetUsageAggregator } from './fleet-bus.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\nimport { DefaultMultiAgentCoordinator } from './multi-agent-coordinator.js';\n\n/**\n * Director — high-level orchestrator that owns a `MultiAgentCoordinator`,\n * a `FleetBus`, and a `FleetUsageAggregator`. Exposes a small imperative\n * API (`spawn`, `assign`, `awaitTasks`, `terminate`, `status`, `usage`)\n * that's easy to test, and a `tools()` factory that wraps the same API\n * as agent-callable `Tool`s so an LLM can drive the orchestration.\n *\n * This class is intentionally *not* an `Agent`. It's a coordinator +\n * observability surface. To make it LLM-driven, construct an Agent\n * with `director.tools()` registered. That keeps the construction\n * symmetric with how other agents are built and avoids smuggling a\n * heavy LLM dependency into core just for the director path.\n */\nexport interface DirectorOptions {\n config: MultiAgentConfig;\n runner?: SubagentRunner;\n /**\n * When set, the director writes a `fleet.json` manifest to this path\n * recording every spawned subagent (id, provider, model, role, task\n * ids). Used by `wstack replay <runId>` to rehydrate a fleet. Pass an\n * absolute file path — the directory must already exist (the\n * director-session factory creates it when used together).\n */\n manifestPath?: string;\n /**\n * Optional roster used by `leaderSystemPrompt()` to render a roles\n * summary into the leader's preamble. Same shape as the roster passed\n * to `tools()` — typically the same value.\n */\n roster?: Record<string, SubagentConfig>;\n /**\n * Override the built-in fleet preamble (see `DEFAULT_DIRECTOR_PREAMBLE`).\n * Pass an empty string to suppress the preamble entirely.\n */\n directorPreamble?: string;\n /**\n * Override the built-in subagent baseline (see\n * `DEFAULT_SUBAGENT_BASELINE`). Pass an empty string to suppress.\n */\n subagentBaseline?: string;\n /**\n * Absolute path to a directory the fleet can use as a shared scratchpad\n * (read + write by every subagent). When set, the director creates it on\n * construction and `subagentSystemPrompt()` automatically injects a\n * \"Shared notes\" block telling subagents where to drop their findings.\n * This is the cheap fleet-coordination channel — agents don't need each\n * other's transcripts, just each other's conclusions.\n *\n * Convention: under a fleet run rooted at `<sessionsRoot>/<runId>/`,\n * pass `<sessionsRoot>/<runId>/shared/` here.\n */\n sharedScratchpadPath?: string;\n /**\n * Maximum number of spawns this director can perform across its\n * lifetime. Default: unlimited. Acts as a hard fleet-wide cost cap —\n * a runaway leader that keeps spawning workers gets cut off cleanly\n * instead of burning provider tokens until the user kills the\n * process. The N+1-th spawn call rejects with a `DirectorBudgetError`.\n */\n maxSpawns?: number;\n /**\n * Maximum nesting depth for spawns. The director constructed by the\n * user is at depth `spawnDepth` (default 0); any subagent that itself\n * acts as a director would construct its own `Director` with\n * `spawnDepth: parent.spawnDepth + 1`. When `spawnDepth >= maxSpawnDepth`,\n * `spawn()` rejects. Default: 2 (root director can spawn workers; a\n * worker that becomes a sub-director cannot itself spawn further).\n * This stops infinite recursive director chains from a hostile or\n * confused prompt.\n */\n maxSpawnDepth?: number;\n /**\n * Current spawn-chain depth for this director instance. Defaults to 0.\n * A nested director should pass `parent.spawnDepth + 1`. Together with\n * `maxSpawnDepth` this bounds the chain.\n */\n spawnDepth?: number;\n}\n\n/**\n * Thrown by `Director.spawn()` when a configured spawn cap (`maxSpawns`,\n * `maxSpawnDepth`) is hit. Distinct error class so callers — including\n * the `spawn_subagent` tool surface — can recognize the budget case and\n * report it cleanly instead of treating it like an unexpected failure.\n */\nexport class DirectorBudgetError extends Error {\n readonly kind: 'max_spawns' | 'max_spawn_depth';\n readonly limit: number;\n readonly observed: number;\n constructor(kind: 'max_spawns' | 'max_spawn_depth', limit: number, observed: number) {\n super(\n kind === 'max_spawns'\n ? `Director spawn budget exceeded: tried to spawn #${observed} but maxSpawns is ${limit}`\n : `Director spawn depth budget exceeded: this director is at depth ${observed} and maxSpawnDepth is ${limit}`,\n );\n this.name = 'DirectorBudgetError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport class Director {\n readonly id: string;\n readonly fleet: FleetBus;\n readonly usage: FleetUsageAggregator;\n /**\n * Director-side bridge endpoint. Subagents are wired to the same\n * in-memory transport so the director can `ask()` them synchronously\n * and they can `send()` progress back. Exposed so external code (e.g.\n * the TUI) can subscribe to inbound messages.\n */\n readonly bridge: InMemoryAgentBridge;\n private readonly transport: InMemoryBridgeTransport;\n private readonly coordinator: DefaultMultiAgentCoordinator;\n /** Resolves with the matching `TaskResult` the first time the\n * coordinator emits `task.completed` for a given task id. Each entry\n * is created lazily on first poll/await and cleared once consumed. */\n private readonly taskWaiters = new Map<\n string,\n {\n promise: Promise<TaskResult>;\n resolve: (r: TaskResult) => void;\n }\n >();\n /** Cache of completed results in case the consumer asks AFTER the\n * coordinator already fired the event — `awaitTasks(['t-1'])` after\n * t-1 finished should resolve immediately, not hang. */\n private readonly completed = new Map<string, TaskResult>();\n /** Per-subagent provider/model metadata, captured at spawn time so the\n * FleetUsageAggregator's metaLookup can surface readable rows. */\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\n private readonly priceLookups = new Map<\n string,\n { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }\n >();\n /** Bridge endpoints we created per subagent (so we can `stop()` them\n * on shutdown and free transport subscriptions). */\n private readonly subagentBridges = new Map<string, InMemoryAgentBridge>();\n /** Tracks per-spawn config + assigned task ids for manifest writing. */\n private readonly manifestEntries = new Map<\n string,\n {\n subagentId: string;\n name: string;\n role?: string;\n provider?: string;\n model?: string;\n taskIds: string[];\n }\n >();\n private readonly manifestPath?: string;\n private readonly roster?: Record<string, SubagentConfig>;\n private readonly directorPreamble: string;\n private readonly subagentBaseline: string;\n /** Absolute path to the fleet's shared scratchpad directory, or null\n * when none was configured. Exposed as a readonly getter for callers\n * that need to surface the path to the user (e.g. the CLI logging\n * the location after `--director` boots). */\n readonly sharedScratchpadPath: string | null;\n /** Spawn cap (lifetime total). Infinity means unlimited. */\n readonly maxSpawns: number;\n /** Nesting cap. The N-th director in a chain has `spawnDepth = N-1`. */\n readonly maxSpawnDepth: number;\n /** This director's position in a director chain. Root director = 0. */\n readonly spawnDepth: number;\n /** Live spawn counter for `maxSpawns` enforcement. */\n private spawnCount = 0;\n\n constructor(opts: DirectorOptions) {\n this.id = opts.config.coordinatorId || randomUUID();\n this.manifestPath = opts.manifestPath;\n this.roster = opts.roster;\n this.directorPreamble = opts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n this.subagentBaseline = opts.subagentBaseline ?? DEFAULT_SUBAGENT_BASELINE;\n this.sharedScratchpadPath = opts.sharedScratchpadPath ?? null;\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\n this.spawnDepth = opts.spawnDepth ?? 0;\n if (this.sharedScratchpadPath) {\n // Create the directory eagerly so subagents that try to write\n // there on first iteration don't trip on ENOENT. Fire-and-forget;\n // any failure surfaces later when an agent actually writes.\n void fsp.mkdir(this.sharedScratchpadPath, { recursive: true }).catch(() => undefined);\n }\n this.transport = new InMemoryBridgeTransport();\n this.bridge = new InMemoryAgentBridge(\n { agentId: this.id, coordinatorId: this.id },\n this.transport,\n );\n this.fleet = new FleetBus();\n this.usage = new FleetUsageAggregator(\n this.fleet,\n (id) => this.priceLookups.get(id),\n (id) => this.subagentMeta.get(id),\n );\n this.coordinator = new DefaultMultiAgentCoordinator(\n { ...opts.config, coordinatorId: this.id },\n { runner: opts.runner },\n );\n // Mirror coordinator completion events into the waiter table. This\n // lets `awaitTasks([...])` resolve on the *next* completion event\n // without polling — and the `completed` cache covers the case where\n // a caller asks after the fact.\n this.coordinator.on('task.completed', (payload: { task: TaskSpec; result: TaskResult }) => {\n const r = payload.result;\n this.completed.set(r.taskId, r);\n const waiter = this.taskWaiters.get(r.taskId);\n if (waiter) {\n waiter.resolve(r);\n this.taskWaiters.delete(r.taskId);\n }\n });\n }\n\n /**\n * Spawn a subagent. Identical to the coordinator's `spawn()` but\n * captures provider/model metadata for the usage aggregator and\n * lets the FleetBus attach to the runner's EventBus when the task\n * actually runs (see `attachSubagentBus`).\n *\n * Caller-supplied `priceLookup` is optional but recommended — without\n * it the `cost` column in `usage.snapshot()` stays at 0.\n */\n async spawn(\n config: SubagentConfig,\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\n ): Promise<string> {\n // Enforce safety caps BEFORE touching the coordinator — a refused\n // spawn must not leak partial state into the manifest or fleet bus.\n if (this.spawnDepth >= this.maxSpawnDepth) {\n throw new DirectorBudgetError('max_spawn_depth', this.maxSpawnDepth, this.spawnDepth);\n }\n if (this.spawnCount >= this.maxSpawns) {\n throw new DirectorBudgetError('max_spawns', this.maxSpawns, this.spawnCount + 1);\n }\n this.spawnCount += 1;\n const result = await this.coordinator.spawn(config);\n this.subagentMeta.set(result.subagentId, {\n provider: config.provider,\n model: config.model,\n });\n if (priceLookup) this.priceLookups.set(result.subagentId, priceLookup);\n // Auto-wire a bridge per spawn — same transport as the director, so\n // `director.ask(subagentId, …)` and the subagent's own `bridge.send()`\n // round-trip without the caller having to plumb anything. Runners\n // grab their bridge from `ctx.bridge` (already populated by the\n // coordinator from `subagent.context.parentBridge`).\n const subagentBridge = new InMemoryAgentBridge(\n { agentId: result.subagentId, coordinatorId: this.id },\n this.transport,\n );\n this.coordinator.setSubagentBridge(result.subagentId, subagentBridge);\n this.subagentBridges.set(result.subagentId, subagentBridge);\n // Record for manifest. Task ids attach as they're assigned via\n // `assign()` below.\n this.manifestEntries.set(result.subagentId, {\n subagentId: result.subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n taskIds: [],\n });\n return result.subagentId;\n }\n\n /**\n * Synchronously ask a subagent something via the bridge. Sends a\n * `task` message addressed to the subagent and awaits a matching\n * reply (matched by message id). Subagent runners that handle these\n * requests subscribe to `ctx.bridge` and reply with a message whose\n * `id` equals the incoming request's id (see `InMemoryAgentBridge`'s\n * `request<T>` implementation).\n *\n * Returns the response payload directly (the bridge wrapper is\n * unwrapped for ergonomics). Times out after `timeoutMs` (default\n * matches the bridge's own default of 30s) — surface those rejections\n * to the caller as actionable errors instead of letting tools hang.\n */\n async ask<T = unknown>(subagentId: string, payload: unknown, timeoutMs?: number): Promise<T> {\n if (!this.subagentBridges.has(subagentId)) {\n throw new Error(\n `ask: unknown subagent \"${subagentId}\" (spawn() it first; current fleet: ${Array.from(this.subagentBridges.keys()).join(', ') || '(empty)'})`,\n );\n }\n const msg: BridgeMessage = {\n id: randomUUID(),\n type: 'task',\n from: this.id,\n to: subagentId,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n const reply = await this.bridge.request<T>(msg, timeoutMs);\n return reply.payload;\n }\n\n /**\n * Read completed task results and format them as a structured text\n * block the director's LLM can paste into its own context. The\n * Director keeps every completed `TaskResult` in `completed` so this\n * is a pure read — no bridge round-trip, cheap to call.\n *\n * The returned string is intentionally markdown-flavored: headers per\n * subagent, a one-line meta row (iter / tools / ms), and the task's\n * result text. Pass `style: 'json'` for a programmatic shape instead\n * (useful when the director model is doing structured-output work).\n */\n rollUp(taskIds: string[], style: 'markdown' | 'json' = 'markdown'): string {\n const rows = taskIds.map((id) => this.completed.get(id)).filter((r): r is TaskResult => !!r);\n if (style === 'json') {\n return JSON.stringify(\n rows.map((r) => ({\n taskId: r.taskId,\n subagentId: r.subagentId,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n result: r.result,\n error: r.error,\n })),\n null,\n 2,\n );\n }\n if (rows.length === 0) {\n return '_No completed tasks for the requested ids — try waiting first._';\n }\n const lines: string[] = [];\n for (const r of rows) {\n const meta = this.subagentMeta.get(r.subagentId);\n const tag = meta?.provider && meta?.model ? ` · ${meta.provider}/${meta.model}` : '';\n lines.push(`### ${r.subagentId}${tag}`);\n lines.push(`_${r.status} — ${r.iterations} iter · ${r.toolCalls} tools · ${r.durationMs}ms_`);\n lines.push('');\n if (r.error) lines.push(`**Error:** ${r.error}`);\n else if (typeof r.result === 'string') lines.push(r.result);\n else if (r.result !== undefined)\n lines.push('```json\\n' + JSON.stringify(r.result, null, 2) + '\\n```');\n else lines.push('_(no output)_');\n lines.push('');\n }\n return lines.join('\\n').trimEnd();\n }\n\n /**\n * Write the fleet manifest to `manifestPath`. Returns the path written\n * or null when no path was configured. Captures every spawn + its\n * assigned tasks — paired with per-subagent JSONLs, this is enough to\n * replay an entire director run.\n */\n async writeManifest(): Promise<string | null> {\n if (!this.manifestPath) return null;\n const manifest = {\n directorRunId: this.id,\n writtenAt: new Date().toISOString(),\n children: Array.from(this.manifestEntries.values()).map((e) => ({\n ...e,\n // Surface final status from `completed` when available — manifest\n // becomes much more useful for replay when it carries the\n // success/failure state.\n results: e.taskIds.map((tid) => {\n const r = this.completed.get(tid);\n return r\n ? {\n taskId: tid,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n }\n : { taskId: tid, status: 'pending' as const };\n }),\n })),\n usage: this.usage.snapshot(),\n };\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\n await fsp.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\n return this.manifestPath;\n }\n\n /**\n * Tear down the director: stop every subagent, close every bridge\n * endpoint, and (when configured) write the final manifest. Idempotent\n * — calling shutdown twice is a no-op on the second invocation.\n */\n async shutdown(): Promise<void> {\n await this.coordinator.stopAll();\n for (const b of this.subagentBridges.values()) {\n await b.stop().catch(() => undefined);\n }\n this.subagentBridges.clear();\n await this.bridge.stop().catch(() => undefined);\n if (this.manifestPath) await this.writeManifest().catch(() => undefined);\n }\n\n /**\n * Hand a task to the coordinator. Returns the assigned task id so\n * callers can wait on it via `awaitTasks([id])`. The coordinator's\n * concurrency limit applies — the task may queue before running.\n */\n async assign(task: TaskSpec): Promise<string> {\n const taskWithId: TaskSpec = task.id ? task : { ...task, id: randomUUID() };\n if (task.subagentId) {\n const entry = this.manifestEntries.get(task.subagentId);\n if (entry) entry.taskIds.push(taskWithId.id);\n }\n await this.coordinator.assign(taskWithId);\n return taskWithId.id;\n }\n\n /**\n * Block until every task id resolves. Returns results in the same\n * order as the input. If any task hasn't completed by the time this\n * is called, the promise hangs until it does — pair with a timeout\n * at the caller if that's a concern. Resolves immediately for ids\n * whose results were already cached.\n */\n awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\n return Promise.all(\n taskIds.map((id) => {\n const cached = this.completed.get(id);\n if (cached) return cached;\n const existing = this.taskWaiters.get(id);\n if (existing) return existing.promise;\n let resolve!: (r: TaskResult) => void;\n const promise = new Promise<TaskResult>((res) => {\n resolve = res;\n });\n this.taskWaiters.set(id, { promise, resolve });\n return promise;\n }),\n );\n }\n\n async terminate(subagentId: string): Promise<void> {\n await this.coordinator.stop(subagentId);\n }\n\n async terminateAll(): Promise<void> {\n await this.coordinator.stopAll();\n }\n\n status(): CoordinatorStatus {\n return this.coordinator.getStatus();\n }\n\n /**\n * Subscribe to coordinator events. Currently only `task.completed` is\n * exposed (the others are internal lifecycle). Returns an unsubscribe\n * function. External callers (e.g. the CLI's `MultiAgentHost`) use this\n * to drive their own pending/results tracking without poking the\n * coordinator directly.\n */\n on(\n event: 'task.completed',\n handler: (payload: { task: TaskSpec; result: TaskResult }) => void,\n ): () => void {\n // EventEmitter.on returns `this`; wrap so callers get a stable\n // unsubscribe closure (matches the rest of our event API).\n this.coordinator.on(event, handler);\n return () => {\n this.coordinator.off(event, handler);\n };\n }\n\n /**\n * Snapshot of every task that has resolved (success, failed, timeout,\n * stopped) since the director started. Returned in completion order\n * via the internal map's iteration order. Used by `/fleet status` to\n * paint the completed table without reaching into private state.\n */\n completedResults(): TaskResult[] {\n return Array.from(this.completed.values());\n }\n\n snapshot(): FleetUsage {\n return this.usage.snapshot();\n }\n\n /**\n * Compose the leader/director-agent system prompt: fleet preamble +\n * (optional) roster summary + user base prompt. Pass the result to your\n * leader Agent's `ctx.systemPrompt` when constructing it.\n *\n * `basePrompt` defaults to `config.leaderSystemPrompt` so callers can\n * use the no-arg form when the multi-agent config already carries it.\n */\n leaderSystemPrompt(basePrompt?: string): string {\n return composeDirectorPrompt({\n basePrompt: basePrompt ?? this.coordinator.config.leaderSystemPrompt,\n directorPreamble: this.directorPreamble,\n rosterSummary: this.roster ? rosterSummaryFromConfigs(this.roster) : undefined,\n });\n }\n\n /**\n * Compose a subagent's system prompt for a given `SubagentConfig`:\n * baseline + role + task + per-spawn override. Returned by value — does\n * not mutate the config. Factories (the user-supplied `AgentFactory`)\n * should call this when building each subagent's Agent so the bridge\n * contract, role context, and override are all surfaced.\n *\n * When `taskBrief` is omitted the Task section is dropped. Pass the\n * actual task description here to reinforce it in the system prompt\n * (the runner already passes it as user input — duplicating in the\n * system prompt is optional but improves anchoring on small models).\n */\n subagentSystemPrompt(config: SubagentConfig, taskBrief?: string): string {\n return composeSubagentPrompt({\n baseline: this.subagentBaseline,\n role: config.prompt,\n task: taskBrief,\n sharedScratchpad: this.sharedScratchpadPath ?? undefined,\n override: config.systemPromptOverride,\n });\n }\n\n /**\n * Build the tool set the LLM-driven director uses to orchestrate.\n * Returns an array of `Tool` definitions; register these on the\n * director's `Agent` to expose `spawn_subagent`, `assign_task`, etc.\n * Each tool's `execute()` delegates straight to the matching method\n * above.\n *\n * Tools all carry `permission: 'auto'` — the *user* has already\n * approved running the director when they kicked off the run, so\n * gating individual orchestration calls behind a confirm prompt\n * would just be noise. The actual subagent tools they spawn are\n * still permission-checked normally.\n */\n tools(roster?: Record<string, SubagentConfig>): Tool[] {\n const t: Tool[] = [\n makeSpawnTool(this, roster),\n makeAssignTool(this),\n makeAwaitTasksTool(this),\n makeAskTool(this),\n makeRollUpTool(this),\n makeTerminateTool(this),\n makeFleetStatusTool(this),\n makeFleetUsageTool(this),\n ];\n return t;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Director-facing tool factories.\n//\n// Each tool's input schema is intentionally minimal — the director model\n// reads the descriptions and gets clean structured shapes. We avoid deep\n// nested schemas because they confuse smaller models.\n\nfunction makeSpawnTool(director: Director, roster?: Record<string, SubagentConfig>): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n role: {\n type: 'string',\n description:\n 'Roster role id (preferred). When set, the spawn uses the matching config from the roster and ignores other fields.',\n },\n name: {\n type: 'string',\n description: 'Display name for the subagent. Required when not using roster.',\n },\n provider: {\n type: 'string',\n description:\n 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the leader provider when omitted.',\n },\n model: {\n type: 'string',\n description: 'Model id within the provider. Defaults to the leader model when omitted.',\n },\n systemPromptOverride: {\n type: 'string',\n description: 'Extra prompt text appended after the role-base prompt.',\n },\n maxIterations: { type: 'number' },\n maxToolCalls: { type: 'number' },\n maxCostUsd: { type: 'number' },\n },\n required: [],\n };\n return {\n name: 'spawn_subagent',\n description:\n 'Create a new subagent under this director. Returns the subagent id. Use this when you need a worker with a specific provider, model, or role to handle a piece of the plan.',\n usageHint:\n 'Either pass `role` (matches the roster) OR pass `name` + optional `provider`/`model`. Returns `{ subagentId }`.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = (input ?? {}) as Record<string, unknown>;\n const role = typeof i.role === 'string' ? i.role : undefined;\n const base: SubagentConfig | undefined = role && roster ? roster[role] : undefined;\n if (role && !base) {\n return {\n error: `unknown role \"${role}\". roster has: ${roster ? Object.keys(roster).join(', ') : '(empty)'}`,\n };\n }\n const cfg: SubagentConfig = {\n ...(base ?? { name: (i.name as string) ?? 'subagent' }),\n };\n if (typeof i.name === 'string') cfg.name = i.name;\n if (typeof i.provider === 'string') cfg.provider = i.provider;\n if (typeof i.model === 'string') cfg.model = i.model;\n if (typeof i.systemPromptOverride === 'string')\n cfg.systemPromptOverride = i.systemPromptOverride;\n if (typeof i.maxIterations === 'number') cfg.maxIterations = i.maxIterations;\n if (typeof i.maxToolCalls === 'number') cfg.maxToolCalls = i.maxToolCalls;\n if (typeof i.maxCostUsd === 'number') cfg.maxCostUsd = i.maxCostUsd;\n try {\n const subagentId = await director.spawn(cfg);\n return { subagentId, provider: cfg.provider, model: cfg.model, name: cfg.name };\n } catch (err) {\n // Surface DirectorBudgetError (and any other spawn failure) as a\n // structured `{ error, kind }` payload so the leader model can\n // read the cap and replan — throwing would tear down the whole\n // tool call and give the model no signal to recover from.\n if (err instanceof DirectorBudgetError) {\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\n }\n return { error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeAssignTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Target subagent id. Required.' },\n description: {\n type: 'string',\n description: 'The task in natural language — what you want this subagent to do.',\n },\n maxToolCalls: { type: 'number', description: 'Optional per-task tool-call budget override.' },\n timeoutMs: { type: 'number', description: 'Optional per-task timeout in ms.' },\n },\n required: ['subagentId', 'description'],\n };\n return {\n name: 'assign_task',\n description:\n 'Hand a task to a previously spawned subagent. Returns the task id — pass it to `await_tasks` to block on completion.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as {\n subagentId: string;\n description: string;\n maxToolCalls?: number;\n timeoutMs?: number;\n };\n const task: TaskSpec = {\n id: randomUUID(),\n description: i.description,\n subagentId: i.subagentId,\n maxToolCalls: i.maxToolCalls,\n timeoutMs: i.timeoutMs,\n };\n const taskId = await director.assign(task);\n return { taskId, subagentId: i.subagentId };\n },\n };\n}\n\nfunction makeAwaitTasksTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'One or more task ids returned by `assign_task`. The call blocks until every id resolves.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'await_tasks',\n description:\n 'Block until every named task completes. Returns the array of TaskResult — use this to gather subagent output before deciding the next step.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[] };\n const results = await director.awaitTasks(i.taskIds);\n return { results };\n },\n };\n}\n\nfunction makeAskTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: {\n type: 'string',\n description: 'Subagent to ask. Must be a previously spawned id.',\n },\n question: {\n type: 'string',\n description: 'The question or instruction. Sent as the bridge message payload.',\n },\n timeoutMs: { type: 'number', description: 'Optional timeout in ms (default 30s).' },\n },\n required: ['subagentId', 'question'],\n };\n return {\n name: 'ask_subagent',\n description:\n 'Synchronously ask a subagent a question. Blocks until the subagent replies via the bridge (or the timeout fires). Use this when you need a one-shot answer without spawning a fresh task.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string; question: string; timeoutMs?: number };\n try {\n const answer = await director.ask(i.subagentId, { question: i.question }, i.timeoutMs);\n return { ok: true, answer };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeRollUpTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Completed task ids to aggregate. Pass the ids returned by previous `assign_task` calls.',\n },\n style: {\n type: 'string',\n enum: ['markdown', 'json'],\n description:\n 'Output flavor — markdown (default) for in-prompt summarization, json for structured downstream processing.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'roll_up',\n description:\n \"Aggregate completed task results into a single formatted summary. Use this after `await_tasks` to fold subagent outputs back into the director's context before deciding the next step.\",\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[]; style?: 'markdown' | 'json' };\n const summary = director.rollUp(i.taskIds, i.style ?? 'markdown');\n return { summary, count: i.taskIds.length };\n },\n };\n}\n\nfunction makeTerminateTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Subagent to abort.' },\n },\n required: ['subagentId'],\n };\n return {\n name: 'terminate_subagent',\n description:\n 'Forcibly abort a subagent. Use sparingly — prefer waiting on the natural budget to expire. The current task (if any) ends with status \"stopped\".',\n permission: 'auto',\n mutating: true,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string };\n await director.terminate(i.subagentId);\n return { ok: true };\n },\n };\n}\n\nfunction makeFleetStatusTool(director: Director): Tool {\n return {\n name: 'fleet_status',\n description:\n \"Snapshot of the fleet — every subagent's current status, pending vs. completed task counts, and the running total iteration count. Cheap; call freely.\",\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.status();\n },\n };\n}\n\nfunction makeFleetUsageTool(director: Director): Tool {\n return {\n name: 'fleet_usage',\n description:\n 'Token + cost breakdown across the fleet, per-subagent and totals. Use this to reason about which workers to assign costly tasks to or when to wrap up to stay within budget.',\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.snapshot();\n },\n };\n}\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n SubagentConfig,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { BudgetExceededError } from './subagent-budget.js';\n\n/**\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\n * The factory MUST construct a fresh `Context` per call — sharing context\n * between subagents defeats isolation. Each Agent should also use either\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\n * attributed correctly.\n */\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\n\nexport interface AgentFactoryResult {\n agent: Agent;\n /** Event bus the factory wired to this agent — required for budget hookup. */\n events: EventBus;\n}\n\nexport interface AgentRunnerOptions {\n factory: AgentFactory;\n /**\n * Format a TaskSpec into the user input the agent will receive. Defaults\n * to `task.description ?? ''`. Override when subagents expect structured\n * input (e.g. JSON contracts, role-prefixed prompts).\n */\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\n}\n\n/**\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\n * the coordinator's budget and abort signal. This is the production adapter —\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\n *\n * Lifecycle per task:\n * 1. factory(config) → fresh Agent + EventBus.\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\n * 5. Unsubscribe and let the factory's resources be GC'd.\n *\n * The budget is checked synchronously from event handlers — a runaway agent\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\n * coordinator surfaces as `status: 'failed'` on the task result.\n */\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\n\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\n const { agent, events } = await opts.factory(ctx.config);\n\n // Hook budget into the agent's event stream. We capture errors thrown by\n // recordToolCall/recordUsage so the budget can short-circuit the run by\n // aborting the controller — the agent then unwinds cooperatively.\n const aborter = new AbortController();\n let budgetError: BudgetExceededError | null = null;\n\n const onBudgetError = (err: unknown) => {\n // Any error from a budget operation (BudgetExceededError, TypeError from\n // a malformed event payload, etc.) must abort the run. EventBus.emit()\n // swallows listener throws, so we can't re-throw — set budgetError and\n // abort the controller so the agent unwinds cooperatively.\n aborter.abort();\n budgetError =\n err instanceof BudgetExceededError\n ? err\n : new BudgetExceededError(\n 'tool_calls',\n 0,\n 0,\n );\n // Attach the real error detail so the task result surfaces\n // something actionable instead of a generic budget message.\n if (budgetError !== err && err instanceof Error) {\n budgetError.message += ` (caused by: ${err.message})`;\n }\n };\n\n const unsub: Array<() => void> = [];\n unsub.push(\n events.on('tool.started', () => {\n try {\n ctx.budget.recordToolCall();\n } catch (e) {\n onBudgetError(e);\n }\n }),\n events.on('provider.response', (e) => {\n try {\n ctx.budget.recordUsage(e.usage);\n } catch (e2) {\n onBudgetError(e2);\n }\n }),\n events.on('iteration.started', () => {\n try {\n ctx.budget.recordIteration();\n ctx.budget.checkTimeout();\n } catch (e) {\n onBudgetError(e);\n }\n }),\n );\n\n // Forward the coordinator signal so stop() from outside also aborts.\n const onParentAbort = () => aborter.abort();\n ctx.signal.addEventListener('abort', onParentAbort);\n\n let result: RunResult;\n try {\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\n } finally {\n ctx.signal.removeEventListener('abort', onParentAbort);\n for (const u of unsub) u();\n }\n\n // A budget violation is the signal — surface it so the coordinator can\n // tag the task with the right failure kind ('failed' for budget; the\n // coordinator separately recognises 'timeout' from BudgetExceededError).\n if (budgetError) throw budgetError;\n\n if (result.status === 'failed') {\n throw result.error instanceof Error\n ? result.error\n : new Error(String(result.error ?? 'agent failed'));\n }\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\n // classify them. When the parent signal was aborted, coordinator marks\n // the task 'stopped' (matched against subagent.abortController.aborted).\n if (result.status === 'aborted') {\n throw new Error('agent aborted');\n }\n if (result.status === 'max_iterations') {\n throw new Error('agent exhausted iteration limit');\n }\n\n const usage = ctx.budget.usage();\n return {\n result: result.finalText,\n iterations: result.iterations,\n toolCalls: usage.toolCalls,\n };\n };\n}\n\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\n return task.description ?? '';\n}\n","import * as path from 'node:path';\nimport { DefaultSessionStore } from '../storage/session-store.js';\nimport type { SessionStore, SessionWriter } from '../types/session.js';\n\n/**\n * Per-subagent session factory.\n *\n * Director runs produce many parallel transcripts — one per spawned\n * subagent — and we want them all rooted under the same director-run\n * directory so a future `wstack replay <runId>` can rehydrate the whole\n * fleet from a single tree.\n *\n * The factory builds (or accepts) a `SessionStore` whose `dir` points at\n * `<sessionsRoot>/<directorRunId>/`, and returns a small `create()`\n * function that the orchestration layer calls per-spawn. Each call\n * yields a fresh `SessionWriter` whose JSONL file lives in that\n * directory, named by either the caller-supplied `subagentId` (preferred,\n * so the file name is human-readable) or a derived id.\n *\n * **Why a thin factory instead of plumbing options through every spawn\n * site?** Because the director is the only caller that needs this\n * isolation pattern, and shoving `sessionStore` options into\n * `SubagentConfig` would leak storage details into a config shape that\n * agents and the coordinator have no business knowing about.\n */\nexport interface DirectorSessionFactoryOptions {\n /**\n * Either a parent directory where `<directorRunId>/` will be created,\n * or a pre-built `SessionStore` whose `dir` already points at the\n * director run directory. Tests pass an in-memory store for isolation;\n * production code passes the path under `~/.wrongstack/sessions/`.\n */\n store?: SessionStore;\n sessionsRoot?: string;\n /**\n * Director run id — namespaces all subagent JSONLs under one folder.\n * Defaults to a timestamped id; supplied explicitly when resuming a\n * prior fleet manifest.\n */\n directorRunId?: string;\n}\n\nexport interface DirectorSessionFactory {\n /** Absolute directory where this director run's transcripts live. */\n readonly dir: string;\n /** The director run id used to namespace the directory. */\n readonly directorRunId: string;\n /**\n * Create a fresh `SessionWriter` for the named subagent. Each\n * subagent gets its own JSONL file. The writer's `id` matches the\n * supplied `subagentId` so disk paths line up with in-memory ids.\n */\n createSubagentSession(args: {\n subagentId: string;\n provider?: string;\n model?: string;\n title?: string;\n }): Promise<SessionWriter>;\n}\n\n/**\n * Build a `DirectorSessionFactory`. Pass either a pre-configured\n * `SessionStore` (tests) or a `sessionsRoot` path (production). When\n * neither is supplied the factory throws — there's no sane default for\n * \"where do these JSONLs live\".\n */\nexport function makeDirectorSessionFactory(\n opts: DirectorSessionFactoryOptions,\n): DirectorSessionFactory {\n const runId = opts.directorRunId ?? `${new Date().toISOString().replace(/[:.]/g, '-')}-director`;\n\n let store: SessionStore;\n let dir: string;\n if (opts.store) {\n // The caller wired its own store — we trust them on where the\n // files land. We can't introspect a `SessionStore`'s directory\n // without a typed accessor, so we report the run id and let the\n // caller record the path separately if needed.\n store = opts.store;\n dir = opts.sessionsRoot ? path.join(opts.sessionsRoot, runId) : '(caller-managed)';\n } else if (opts.sessionsRoot) {\n dir = path.join(opts.sessionsRoot, runId);\n store = new DefaultSessionStore({ dir });\n } else {\n throw new Error('makeDirectorSessionFactory requires either `store` or `sessionsRoot`');\n }\n\n return {\n dir,\n directorRunId: runId,\n async createSubagentSession({ subagentId, provider, model, title }) {\n // Per-subagent JSONL — DefaultSessionStore generates the file name\n // from the metadata `id`, so we pass `subagentId` directly to\n // keep disk artifacts human-readable.\n return store.create({\n id: subagentId,\n title: title ?? subagentId,\n provider: provider ?? 'unknown',\n model: model ?? 'unknown',\n });\n },\n };\n}\n","/**\n * Pre-built subagent role configurations for the WrongStack fleet.\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\n * for the director's roster.\n */\nimport type { SubagentConfig } from '../types/multi-agent.js';\n\n/**\n * Audit Log Agent — analyzes session logs, event streams, and traces.\n * Use for: post-mortems, trend analysis, operational insights.\n */\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\nsession logs and produce actionable markdown reports.\n\nScope:\n- Parse session logs (iteration counts, tool calls, errors, usage)\n- Detect repeated failure patterns across multiple runs\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\n- Track token consumption trends\n- Generate structured audit reports with severity ratings\n\nInput format you accept:\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\n\nOutput: Markdown audit report with sections:\n- ## Summary (totals, error rate)\n- ## Top Errors (count + context)\n- ## Tool Usage (table with calls, failures, avg duration)\n- ## Anomalies (pattern → severity)\n\nWorking rules:\n- Never fabricate numbers — read the actual logs first\n- Always include file:line references for errors\n- If sessionPath is missing, ask the director to provide it\n- Report confidence level: high (>90% accuracy), medium, low`,\n\n maxIterations: 50,\n maxToolCalls: 200,\n timeoutMs: 120_000,\n};\n\n/**\n * Bug Hunter Agent — systematic bug and code smell detection.\n * Use for: pre-refactoring health checks, code review, regression prevention.\n */\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\nsource code for bugs, anti-patterns, and code smells using pattern matching\nand heuristics. Output a prioritized hit list with file:line references.\n\nScope:\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\n- Identify anti-patterns (callback hell, God objects, circular deps)\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\n- Rank findings: critical > high > medium > low\n\nInput format you accept:\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\n\nOutput: Markdown bug hunt report:\n- ## Critical (must fix first)\n- ## High (should fix)\n- ## Medium\n- ## Low (consider)\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\n\nBug pattern reference you know:\n| Pattern | Regex hint | Severity |\n|---------|------------|----------|\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\n| Event leak | on\\\\( without off/removeListener | high |\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\n| unsafe any | : any\\\\b or <any> | medium |\n| innerHTML | innerHTML\\\\s*= | high |\n\nWorking rules:\n- Never scan node_modules — it's noise\n- Always include file:line for every finding\n- If >30% of findings are false positives, note the confidence level\n- Ask director for clarification if paths are ambiguous`,\n\n maxIterations: 80,\n maxToolCalls: 300,\n timeoutMs: 180_000,\n};\n\n/**\n * Refactor Planner Agent — structured refactoring planning.\n * Use for: large rewrites, technical debt reduction, architecture improvements.\n */\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\nstructure and produce a concrete, phased refactoring plan with risk\nassessment, dependency ordering, and rollback strategy.\n\nScope:\n- Map module-level dependencies (import graph)\n- Identify coupling hotspots (high fan-in/out modules)\n- Assess refactoring risk by complexity and test coverage\n- Generate phased plans with checkpoint milestones\n- Produce diff-friendly task lists (one task = one concern)\n\nInput format you accept:\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\n\nOutput: Markdown refactor plan:\n- ## Phase 1: Low Risk / High Payoff (do first)\n Table: | # | Task | Module | Risk | Est. Time |\n- ## Phase 2: Medium Risk\n- ## Phase 3: High Risk (requires full regression)\n- ## Dependency Graph (abbreviated ASCII)\n- ## Rollback Strategy\n- ## Exit Criteria (checkbox list)\n\nRisk scoring criteria:\n| Factor | Low | Medium | High |\n|--------|-----|--------|------|\n| Cyclomatic complexity | <10 | 10-20 | >20 |\n| Test coverage | >80% | 50-80% | <50% |\n| Fan-out (imports) | <5 | 5-15 | >15 |\n\nWorking rules:\n- Always include rollback strategy — every refactor can fail\n- Merge tasks that take <1h into a single phase\n- Respect team constraints (reviewer availability, parallelization)\n- Never plan without analyzing the actual code first`,\n\n maxIterations: 60,\n maxToolCalls: 250,\n timeoutMs: 150_000,\n};\n\n/**\n * Security Scanner Agent — vulnerability and secret detection.\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\n */\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n prompt: `You are the Security Scanner agent. Your job is to scan code,\nconfigs, and dependencies for security issues from hardcoded secrets to\nsupply chain risks.\n\nScope:\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\n- Scan dependencies for known CVEs (via npm/pnpm audit)\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\n\nInput format you accept:\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\n\nOutput: Markdown security report:\n- ## CRITICAL: Secrets Found (with code snippets)\n- ## HIGH: Injection Vectors\n- ## MEDIUM: Insecure Patterns\n- ## Dependency Issues (CVE list)\n- ## Summary table (severity → count)\n- ## Remediation Checklist (with checkboxes)\n\nSecret patterns you detect:\n| Pattern | Example | Severity |\n|---------|---------|----------|\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\n\nInjection patterns:\n| Construct | Safe alternative |\n|-----------|-----------------|\n| eval(str) | new Function() or parse |\n| innerHTML = x | textContent or sanitize |\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\n\nWorking rules:\n- Never scan node_modules — use npm audit instead\n- Always provide remediation steps, not just findings\n- Verify regex-based secrets before flagging (false positive risk)\n- When in doubt, flag as medium rather than ignoring potential issues`,\n\n maxIterations: 70,\n maxToolCalls: 280,\n timeoutMs: 160_000,\n};\n\n/** All pre-built agents in a map for easy lookup by role. */\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\n 'audit-log': AUDIT_LOG_AGENT,\n 'bug-hunter': BUG_HUNTER_AGENT,\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\n 'security-scanner': SECURITY_SCANNER_AGENT,\n};\n\n/** Quick-access list for spawning all at once. */\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\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';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string;\n ttlSeconds?: number;\n fetchImpl?: typeof fetch;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload;\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;\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/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 private payload?: ModelsDevPayload;\n private fetchedAt?: Date;\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;\n private readonly maxStaleAgeMs: number;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? 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 }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n if (!opts.force) {\n const cached = await this.readCache();\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refresh();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCache();\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n throw err;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\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.payload = json;\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 }\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 ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\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.readCache();\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 readCache(): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(this.cacheFile, '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","export 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[];\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[];\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string;\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: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look forSOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n },\n];\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Mode, ModeConfig, ModeManifest, ModeStore } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n await fs.writeFile(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n 'utf8',\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string;\n userModesDir?: string;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}\n","import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number;\n tags?: string[];\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n });\n }\n }\n\n // Test tasks\n this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n });\n\n // Documentation tasks\n this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n });\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string;\n estimateHours?: number;\n actualHours?: number;\n tags?: string[];\n specRequirementId?: string;\n parentId?: string;\n children?: string[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[];\n priority?: TaskPriority[];\n type?: TaskType[];\n assignee?: string[];\n tags?: string[];\n specRequirementId?: string;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n let actualHours = 0;\n for (const n of graph.nodes.values()) {\n switch (n.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += n.estimateHours ?? 0;\n actualHours += n.actualHours ?? 0;\n }\n const total = graph.nodes.size;\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string): void {\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\n if (inStack.has(id)) return;\n if (visited.has(id)) return;\n if (!graph.nodes.has(id)) return;\n\n visited.add(id);\n inStack.add(id);\n\n for (const edge of graph.edges) {\n if (edge.from === id) visit(edge.to);\n }\n\n inStack.delete(id);\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\n}\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (err: unknown) => void;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string;\n}\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new Error('No graph loaded');\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new Error(`Node ${id} not found`);\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n return node?.status === 'completed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(taskId?: string): TaskTransition[] {\n if (!taskId) return [...this.transitions];\n // Would need taskId tracking per transition\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status !== 'completed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * rejects, the configured `onPersistError` is invoked so failures are\n * surfaced instead of swallowed by an unhandled promise rejection.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n if (this.opts.onPersistError) this.opts.onPersistError(err);\n else\n console.warn(\n '[task-tracker] saveGraph failed:',\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n}\n\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority':\n return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status':\n return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt':\n return a.createdAt - b.createdAt;\n case 'updatedAt':\n return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition;\n maxConcurrent?: number;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\n onTaskFail?: (task: TaskNode, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n this.emit('error', {\n phase: 'analyzing',\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\n });\n this.setPhase('failed');\n throw new Error('Spec too incomplete');\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import type {\n MetricLabels,\n MetricSeries,\n MetricsSink,\n MetricsSnapshot,\n} from '../types/observability.js';\n\ninterface CounterState {\n value: number;\n}\n\ninterface GaugeState {\n value: number;\n}\n\ninterface HistogramState {\n count: number;\n sum: number;\n min: number;\n max: number;\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\n // on p99 for typical agent workloads — small memory footprint, no exporter\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\n samples: number[];\n}\n\nconst RESERVOIR_SIZE = 1024;\n\nfunction labelKey(labels: MetricLabels | undefined): string {\n if (!labels) return '';\n const keys = Object.keys(labels).sort();\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\n return sorted[idx] ?? 0;\n}\n\n/**\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\n * scrape over HTTP. For production push-based pipelines, write an adapter\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\n */\nexport class InMemoryMetricsSink implements MetricsSink {\n private counters = new Map<string, Map<string, CounterState>>();\n private gauges = new Map<string, Map<string, GaugeState>>();\n private histograms = new Map<string, Map<string, HistogramState>>();\n\n counter(name: string, value = 1, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.counters, name);\n const key = labelKey(labels);\n const state = series.get(key) ?? { value: 0 };\n state.value += value;\n series.set(key, state);\n }\n\n gauge(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.gauges, name);\n series.set(labelKey(labels), { value });\n }\n\n histogram(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.histograms, name);\n const key = labelKey(labels);\n let state = series.get(key);\n if (!state) {\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\n series.set(key, state);\n }\n state.count++;\n state.sum += value;\n if (value < state.min) state.min = value;\n if (value > state.max) state.max = value;\n if (state.samples.length < RESERVOIR_SIZE) {\n state.samples.push(value);\n } else {\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\n const r = Math.floor(Math.random() * state.count);\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\n }\n }\n\n snapshot(): MetricsSnapshot {\n const series: MetricSeries[] = [];\n\n for (const [name, byLabel] of this.counters) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'counter',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.gauges) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'gauge',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.histograms) {\n for (const [key, state] of byLabel) {\n const sorted = [...state.samples].sort((a, b) => a - b);\n series.push({\n name,\n type: 'histogram',\n labels: parseLabelKey(key),\n values: {\n count: state.count,\n sum: state.sum,\n min: state.min,\n max: state.max,\n p50: quantile(sorted, 0.5),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n });\n }\n }\n\n return { timestamp: Date.now(), series };\n }\n\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n private getOrCreate<V>(bag: Map<string, Map<string, V>>, name: string): Map<string, V> {\n let series = bag.get(name);\n if (!series) {\n series = new Map();\n bag.set(name, series);\n }\n return series;\n }\n}\n\nfunction parseLabelKey(key: string): MetricLabels {\n if (!key) return {};\n const labels: MetricLabels = {};\n for (const pair of key.split(',')) {\n const eq = pair.indexOf('=');\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return labels;\n}\n\n/** Cheap noop sink — drop-in default when observability is not configured. */\nexport class NoopMetricsSink implements MetricsSink {\n counter(): void {}\n gauge(): void {}\n histogram(): void {}\n snapshot(): MetricsSnapshot {\n return { timestamp: Date.now(), series: [] };\n }\n reset(): void {}\n}\n","import type {\n AggregateHealth,\n HealthCheck,\n HealthCheckResult,\n HealthRegistry,\n HealthStatus,\n} from '../types/observability.js';\n\nconst SEVERITY: Record<HealthStatus, number> = {\n healthy: 0,\n degraded: 1,\n unhealthy: 2,\n};\n\n/**\n * Aggregates registered health checks. Worst status wins — one unhealthy check\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\n * the response.\n */\nexport class DefaultHealthRegistry implements HealthRegistry {\n private checks = new Map<string, HealthCheck>();\n private readonly timeoutMs: number;\n\n constructor(opts: { timeoutMs?: number } = {}) {\n this.timeoutMs = opts.timeoutMs ?? 5_000;\n }\n\n register(check: HealthCheck): void {\n this.checks.set(check.name, check);\n }\n\n unregister(name: string): void {\n this.checks.delete(name);\n }\n\n async run(): Promise<AggregateHealth> {\n const results = await Promise.all(\n Array.from(this.checks.values()).map(async (c) => {\n const result = await this.runOne(c);\n return { name: c.name, ...result };\n }),\n );\n\n let status: HealthStatus = 'healthy';\n for (const r of results) {\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\n }\n\n return { status, timestamp: Date.now(), checks: results };\n }\n\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<HealthCheckResult>((resolve) => {\n timer = setTimeout(\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\n this.timeoutMs,\n );\n });\n try {\n return await Promise.race([check.check(), timeout]);\n } catch (err) {\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n","import type { Span, Tracer } from '../types/observability.js';\n\n/**\n * Default tracer is a noop — zero overhead when observability is not wired up.\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\n */\nexport class NoopTracer implements Tracer {\n startSpan(): Span {\n return NOOP_SPAN;\n }\n}\n\nconst NOOP_SPAN: Span = {\n setAttribute() {},\n recordError() {},\n end() {},\n};\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string; name?: string }): unknown;\n setStatus?(status: { code: number; message?: string }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { MetricsSink } from '../types/observability.js';\n\n/**\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\n * that detaches all listeners. This is the single integration point between\n * the agent's event stream and the observability layer — no metric calls\n * leak into core call sites.\n */\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\n const unsubs: Array<() => void> = [];\n\n unsubs.push(\n events.on('session.started', () => sink.counter('agent.sessions.started')),\n events.on('session.ended', (e) => {\n sink.counter('agent.sessions.ended');\n sink.histogram('agent.session.tokens.input', e.usage.input);\n sink.histogram('agent.session.tokens.output', e.usage.output);\n }),\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\n events.on('provider.response', (e) => {\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\n sink.counter('provider.tokens.input', e.usage.input);\n sink.counter('provider.tokens.output', e.usage.output);\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\n }),\n events.on('provider.retry', (e) =>\n sink.counter('provider.retries.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n }),\n ),\n events.on('provider.error', (e) =>\n sink.counter('provider.errors.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n retryable: String(e.retryable),\n }),\n ),\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\n events.on('tool.executed', (e) => {\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\n }),\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\n events.on('compaction.fired', (e) => {\n sink.counter('compaction.fired.total');\n sink.histogram('compaction.reduction_tokens', e.before - e.after);\n }),\n events.on('mcp.server.connected', (e) =>\n sink.counter('mcp.connects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.reconnected', (e) =>\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.disconnected', (e) =>\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\n ),\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\n );\n\n return () => {\n for (const u of unsubs) u();\n };\n}\n","import type { HealthRegistry, MetricsSink, MetricsSnapshot } from '../types/observability.js';\n\n/** TLS options for HTTPS metrics endpoint. */\nexport interface MetricsTlsOptions {\n cert: string;\n key: string;\n}\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<\n string,\n { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }\n >();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string;\n /** Enable HTTPS by providing TLS key/cert. Both required. */\n tls?: MetricsTlsOptions;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const tls = opts.tls;\n const useHttps = !!(tls?.cert && tls?.key);\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n type RequestListener = (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => void;\n const listener: RequestListener = (req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n if (healthRegistry && url === healthPath) {\n healthRegistry.run().then(\n (agg) => {\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n };\n\n let server: import('node:http').Server;\n if (useHttps && tls) {\n const { createServer } = await import('node:https');\n const { readFileSync } = await import('node:fs');\n server = createServer(\n { cert: readFileSync(tls.cert), key: readFileSync(tls.key) },\n listener,\n );\n } else {\n const { createServer } = await import('node:http');\n server = createServer(listener);\n }\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n const protocol = useHttps ? 'https' : 'http';\n return {\n port: boundPort,\n url: `${protocol}://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number;\n asInt?: string;\n count?: string;\n sum?: number;\n quantileValues?: { quantile: number; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string;\n unit?: string;\n sum?: { dataPoints: OtlpDataPoint[]; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] };\n summary?: { dataPoints: OtlpDataPoint[] };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number;\n /** Authorization header. */\n authorization?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch;\n /** Called on push failure. Defaults to silent. */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) => encodeAttr(k, v)),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(opts: OtlpTraceExporterOptions): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n","import type { Context } from '../core/context.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Tool } from '../types/tool.js';\n\n/**\n * Context introspection and management tool.\n * Allows the model to:\n * - \"check\" → see token budget and message counts\n * - \"summary\" → summarize and replace a range of messages\n * - \"prune\" → remove specific message indices\n * - \"add_note\" → inject a summary note at a specific point\n * - \"compact\" → run compaction via the injected compactor\n */\nexport const CONTEXT_MANAGER_TOOL_NAME = 'context_manager';\n\nexport type ContextManagerAction = 'check' | 'summary' | 'prune' | 'add_note' | 'compact';\n\nexport interface ContextManagerInput {\n action: ContextManagerAction;\n /** 0-based message indices for prune/summary (inclusive). */\n from?: number;\n to?: number;\n /** Text for add_note / summary actions. For summary, this is the LLM-provided summary text. */\n text?: string;\n /** Inject after which index (for add_note). Defaults to prepend (0). */\n afterIndex?: number;\n}\n\nexport interface ContextManagerResult {\n action: ContextManagerAction;\n beforeTokens: number;\n afterTokens?: number;\n removedCount?: number;\n messageCount: number;\n summary?: string;\n notes?: string;\n}\n\n/**\n * Options for creating a context manager tool.\n * `compactor` is required for the \"compact\" action; without it the action returns an error.\n */\nexport interface ContextManagerToolOptions {\n compactor?: Compactor;\n /**\n * Optional sub-LLM summarizer. When provided, the \"summary\" action calls this\n * to produce real summaries of message ranges instead of placeholder text.\n * (signature matches Provider.complete — return the summary text in result.content[0].text)\n */\n summarizer?: (messages: Message[]) => Promise<string>;\n}\n\nfunction roughEstimate(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\n total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n }\n return total;\n}\n\nexport function createContextManagerTool(\n opts: ContextManagerToolOptions = {},\n): Tool<ContextManagerInput, ContextManagerResult> {\n return {\n name: CONTEXT_MANAGER_TOOL_NAME,\n description:\n 'Inspect or reorganize the conversation context window. ' +\n 'Use \"check\" to see token budget. ' +\n 'Use \"summary\" to collapse a message range into a concise note (provide \"text\" for custom summary). ' +\n 'Use \"prune\" to remove specific messages by index. ' +\n 'Use \"add_note\" to inject a summary note. ' +\n 'Use \"compact\" to run aggressive compaction.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['check', 'summary', 'prune', 'add_note', 'compact'],\n description: 'The context operation to perform.',\n },\n from: {\n type: 'number',\n description: 'Start index (inclusive) for summary/prune operations.',\n },\n to: {\n type: 'number',\n description: 'End index (inclusive) for summary/prune operations.',\n },\n text: {\n type: 'string',\n description:\n 'Summary or note text. For \"summary\": the model-provided summary of the removed range. ' +\n 'For \"add_note\": the note to inject.',\n },\n afterIndex: {\n type: 'number',\n description: 'Insert after this index (for add_note). Defaults to prepend (0).',\n },\n },\n required: ['action'],\n },\n permission: 'auto',\n mutating: true,\n\n async execute(input: ContextManagerInput, ctx: Context): Promise<ContextManagerResult> {\n const messages = ctx.messages;\n const beforeTokens = roughEstimate(messages);\n\n // When ctx.state is available, route mutations through the observer\n // layer so subscribers stay in sync. Fall back to direct splice for\n // tests and environments that haven't wired ConversationState.\n const applyMessages = (next: Message[]) => {\n if (ctx.state) {\n ctx.state.replaceMessages(next);\n } else {\n messages.length = 0;\n messages.splice(0, 0, ...next);\n }\n };\n\n switch (input.action) {\n case 'check': {\n return {\n action: 'check',\n beforeTokens,\n messageCount: messages.length,\n notes: JSON.stringify({\n messages: messages.length,\n tokens: beforeTokens,\n readFiles: ctx.readFiles.size,\n todos: ctx.todos.length,\n inProgress: ctx.todos.filter((t) => t.status === 'in_progress').length,\n }),\n };\n }\n\n case 'compact': {\n if (!opts.compactor) {\n return {\n action: 'compact',\n beforeTokens,\n messageCount: messages.length,\n notes: 'No compactor registered. Use /compact aggressive via slash command instead.',\n };\n }\n const report = await opts.compactor.compact(ctx);\n return {\n action: 'compact',\n beforeTokens,\n afterTokens: report.after,\n messageCount: messages.length,\n };\n }\n\n case 'prune': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'prune',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const copy = [...messages];\n const removed = copy.splice(from, to - from + 1);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'prune',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n removedCount: removed.length,\n };\n }\n\n case 'add_note': {\n const noteText = input.text ?? '(no summary)';\n const afterIdx = Math.min(input.afterIndex ?? 0, messages.length);\n const noteMsg: Message = {\n role: 'system',\n content: `[note: ${noteText}]`,\n };\n const copy = [...messages];\n copy.splice(afterIdx, 0, noteMsg);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'add_note',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n summary: noteText,\n };\n }\n\n case 'summary': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'summary',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const summaryText =\n input.text ?? '[summary placeholder — provide \"text\" to record the summary]';\n const summaryMsg: Message = {\n role: 'system',\n content: `[summary of messages ${from}–${to}]: ${summaryText}`,\n };\n const copy = [...messages];\n copy.splice(from, to - from + 1, summaryMsg);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'summary',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n summary: summaryText,\n };\n }\n\n default:\n return {\n action: input.action,\n beforeTokens,\n messageCount: messages.length,\n notes: `Unknown action: ${input.action}`,\n };\n }\n },\n };\n}\n\n/** Pre-built instance with no compactor — compact action will return an error. */\nexport const contextManagerTool: Tool<ContextManagerInput, ContextManagerResult> =\n createContextManagerTool();\n","import type { MCPServerConfig } from '../types/config.js';\n\n/**\n * Built-in MCP server presets available to all WrongStack users out of the box.\n * These servers must be explicitly enabled in config (disabled by default).\n *\n * To enable: set `mcpServers: { serverName: { enabled: true } }` in your config.\n *\n * Some servers require environment variables or additional config — see notes below.\n *\n * Transport types:\n * stdio — spawns a local npm package binary via child_process\n * sse — HTTP SSE endpoint (client POSTs requests)\n * streamable-http — session-based HTTP with NDJSON responses\n */\n\n/** Filesystem access: read, write, list, search, tree. Good for exploring projects. */\nexport const filesystemServer = (): MCPServerConfig => ({\n name: 'filesystem',\n description: 'Read, write, and navigate the local filesystem (read-heavy tools)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],\n permission: 'confirm',\n});\n\n/** GitHub API: issues, PRs, repos, search, file operations. Requires GITHUB_PERSONAL_ACCESS_TOKEN. */\nexport const githubServer = (): MCPServerConfig => ({\n name: 'github',\n description:\n 'GitHub API — issues, PRs, repos, search, file ops (requires GITHUB_PERSONAL_ACCESS_TOKEN)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: { GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Context7 — codebase-aware documentation and Q&A using context from your code.\n * Live documentation for any library, grounded in your actual versions.\n */\nexport const context7Server = (): MCPServerConfig => ({\n name: 'context7',\n description: 'Codebase-aware documentation and Q&A (context7.ai)',\n transport: 'streamable-http',\n url: 'https://server.context7.ai/mcp',\n permission: 'confirm',\n});\n\n/**\n * Brave Search — web search via Brave Browser's API.\n * Requires BRAVE_SEARCH_API_KEY. Free tier: 2,000 queries/month.\n * Sign up at https://api.search.brave.com/\n */\nexport const braveSearchServer = (): MCPServerConfig => ({\n name: 'brave-search',\n description: 'Web search (Brave). Requires BRAVE_SEARCH_API_KEY — free tier 2k queries/month',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-brave-search'],\n env: { BRAVE_SEARCH_API_KEY: process.env.BRAVE_SEARCH_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Block (Block, Inc.) — Postgres database access via SQL.\n * Useful for running queries against a connected database during development.\n */\nexport const blockServer = (): MCPServerConfig => ({\n name: 'block',\n description: 'Postgres database access via SQL (Block MCP server)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-block'],\n permission: 'confirm',\n});\n\n/**\n * EverArt — AI image generation via various providers.\n * Requires EVERART_API_KEY.\n */\nexport const everArtServer = (): MCPServerConfig => ({\n name: 'everart',\n description: 'AI image generation (EverArt). Requires EVERART_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-everart'],\n env: { EVERART_API_KEY: process.env.EVERART_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Slack — messaging, channels, search.\n * Requires SLACK_BOT_TOKEN and either SLACK_TEAM_ID or SLACK_USER_TOKEN.\n */\nexport const slackServer = (): MCPServerConfig => ({\n name: 'slack',\n description: 'Slack — messaging, channels, search. Requires SLACK_BOT_TOKEN + SLACK_TEAM_ID',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: {\n SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN ?? '',\n SLACK_TEAM_ID: process.env.SLACK_TEAM_ID ?? '',\n },\n permission: 'confirm',\n});\n\n/**\n * AWS knowledge base — EC2, S3, Lambda, IAM, CloudFormation, cost management.\n * Requires AWS access key + secret in environment.\n */\nexport const awsServer = (): MCPServerConfig => ({\n name: 'aws',\n description: 'AWS — EC2, S3, Lambda, IAM, CloudFormation, costs. Requires AWS credentials',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-aws'],\n permission: 'confirm',\n});\n\n/**\n * Google Maps — directions, distance matrix, geocoding, places.\n * Requires GOOGLE_MAPS_API_KEY.\n */\nexport const googleMapsServer = (): MCPServerConfig => ({\n name: 'google-maps',\n description: 'Google Maps — directions, geocoding, places. Requires GOOGLE_MAPS_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-maps'],\n env: { GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/** Sentinel — security vulnerability scanning (sentinel-labs). */\nexport const sentinelServer = (): MCPServerConfig => ({\n name: 'sentinel',\n description: 'Security vulnerability scanning (Sentinel)',\n transport: 'streamable-http',\n url: 'https://mcp.sentinel.ai',\n permission: 'deny', // security tool — require explicit confirmation\n});\n\n/** Everything bundled — full set of built-in servers. Useful for `wstack mcp add --all`. */\nexport const allServers = (): Record<string, MCPServerConfig> => ({\n filesystem: { ...filesystemServer(), enabled: false },\n github: { ...githubServer(), enabled: false },\n context7: { ...context7Server(), enabled: false },\n 'brave-search': { ...braveSearchServer(), enabled: false },\n block: { ...blockServer(), enabled: false },\n everart: { ...everArtServer(), enabled: false },\n slack: { ...slackServer(), enabled: false },\n aws: { ...awsServer(), enabled: false },\n 'google-maps': { ...googleMapsServer(), enabled: false },\n sentinel: { ...sentinelServer(), enabled: false },\n});\n"]}
1
+ {"version":3,"sources":["../../src/utils/color.ts","../../src/infrastructure/logger.ts","../../src/utils/atomic-write.ts","../../src/storage/session-store.ts","../../src/storage/queue-store.ts","../../src/storage/attachment-store.ts","../../src/storage/memory-store.ts","../../src/storage/config-store.ts","../../src/types/secret-vault.ts","../../src/security/secret-vault.ts","../../src/utils/safe-json.ts","../../src/storage/config-loader.ts","../../src/storage/config-migration.ts","../../src/storage/recovery-lock.ts","../../src/storage/session-reader.ts","../../src/storage/session-analyzer.ts","../../src/storage/todos-checkpoint.ts","../../src/storage/plan-store.ts","../../src/storage/director-state.ts","../../src/security/secret-scrubber.ts","../../src/utils/glob-match.ts","../../src/security/permission-policy.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/execution/retry-policy.ts","../../src/execution/error-handler.ts","../../src/execution/skill-loader.ts","../../src/core/streaming-response-builder.ts","../../src/core/provider-runner.ts","../../src/execution/provider-runner-impl.ts","../../src/utils/token-estimate.ts","../../src/execution/compactor.ts","../../src/types/blocks.ts","../../src/execution/intelligent-compactor.ts","../../src/models/llm-selector.ts","../../src/execution/selective-compactor.ts","../../src/execution/auto-compaction-middleware.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/execution/autonomous-runner.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/coordination/director-prompts.ts","../../src/coordination/fleet-bus.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/coordination/director.ts","../../src/coordination/delegate-tool.ts","../../src/coordination/agent-subagent-runner.ts","../../src/coordination/director-session.ts","../../src/coordination/fleet.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/models/mode-store.ts","../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/observability/metrics.ts","../../src/observability/health.ts","../../src/observability/tracer.ts","../../src/observability/otel-tracer.ts","../../src/observability/event-bridge.ts","../../src/observability/prometheus.ts","../../src/observability/otlp-metrics.ts","../../src/observability/otlp-traces.ts","../../src/infrastructure/context-manager.ts","../../src/infrastructure/mcp-servers.ts"],"names":["open","fs","path","path2","fs2","stat","resolve","randomBytes","path4","fsp2","fsp3","path5","fs3","path6","path7","fsp4","FORBIDDEN_PROTO_KEYS","deepMerge","fs5","path8","fsp5","fsp6","fsp7","randomUUID","fsp8","fs6","fs7","path9","afterTokens","handlers","fsp9","path10","partial","path11","fsp10","path12","fs8","path13","path14","fs9","readFileSync","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["const isColorTty = (): boolean => {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return Boolean(process.stdout?.isTTY);\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(\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape regex\n /\\x1b\\[[0-9;]*[A-Za-z]/g,\n '',\n );\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { LogLevel, Logger } from '../types/logger.js';\nimport { color } from '../utils/color.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\nexport interface DefaultLoggerOptions {\n level?: LogLevel;\n file?: string;\n pretty?: boolean;\n bindings?: Record<string, unknown>;\n}\n\nexport class DefaultLogger implements Logger {\n level: LogLevel;\n private readonly file?: string;\n private readonly bindings: Record<string, unknown>;\n private readonly pretty: boolean;\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? (process.env.WRONGSTACK_LOG_LEVEL as LogLevel) ?? 'info';\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.pretty = opts.pretty ?? true;\n if (this.file) {\n try {\n fs.mkdirSync(path.dirname(this.file), { recursive: true });\n } catch {\n // best-effort\n }\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 return new DefaultLogger({\n level: this.level,\n file: this.file,\n pretty: this.pretty,\n bindings: { ...this.bindings, ...bindings },\n });\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\n if (this.file) {\n try {\n fs.appendFileSync(this.file, `${JSON.stringify(entry)}\\n`);\n } catch {\n // ignore\n }\n }\n // Stderr: pretty or json\n if (r <= LEVEL_RANK.warn || this.level === 'debug' || this.level === 'trace') {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n process.stderr.write(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n process.stderr.write(`${head}\\n`);\n }\n }\n }\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","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;\n encoding?: BufferEncoding;\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 } 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\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","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n await ensureDir(this.dir);\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\n // vs ENOSPC etc. instead of substring-matching the error message.\n throw new Error(\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\n {\n cause: err,\n },\n );\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, { dir: this.dir, filePath: file });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const data = await this.load(id);\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n { resumed: true, dir: this.dir, filePath: file },\n );\n return { writer, data };\n }\n\n async load(id: string): Promise<SessionData> {\n const file = path.join(this.dir, `${id}.jsonl`);\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n // Session JSONL is on-disk user-writable state; downstream replay\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\n // shape. Validate the discriminator + timestamp before pushing.\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n // else: skip — a hand-edited file with a partial object should not\n // crash replay, just lose that one event.\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const files = await fsp.readdir(this.dir);\n const ids = files.filter((f) => f.endsWith('.jsonl')).map((f) => f.replace(/\\.jsonl$/, ''));\n // Read all manifests in parallel; fall back to full load only for\n // sessions that haven't been closed cleanly (or predate the manifest).\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n // Equal timestamps — use id as tiebreaker for stable sort\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = path.join(this.dir, `${id}.summary.json`);\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n // Manifest missing/corrupt — fall back to a full parse and backfill\n // the manifest so the next `list()` hits the fast path.\n const full = path.join(this.dir, `${id}.jsonl`);\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await fsp\n .writeFile(manifest, JSON.stringify(summary), { mode: 0o600 })\n .catch((err) => {\n // Best-effort manifest write — list() falls back to full parse\n // on next invocation, so surface the error for diagnostics but\n // don't fail the listing.\n console.warn(\n `[session-store] Failed to write manifest for \"${id}\":`,\n err instanceof Error ? err.message : String(err),\n );\n });\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n };\n }\n\n private replay(\n events: SessionEvent[],\n sessionId = 'unknown',\n ): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n // Orphan tool_result: tool_use was never seen. Skip to avoid\n // corrupting the replayed message sequence.\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n // Convert string content to blocks and append\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `${openToolUses.size} tool_use blocks without matching results — replay truncated`,\n });\n // Return what we could replay instead of throwing — a damaged session\n // should not block the entire session-listing or resume path.\n return { messages, usage };\n }\n return { messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n /** Public accessor for the JSONL path — required by SessionWriter so\n * observability surfaces (`/fleet log`, FleetPanel) can locate the\n * transcript without recomputing the path from session metadata. */\n get transcriptPath(): string | undefined {\n return this.filePath || undefined;\n }\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n\n constructor(\n public readonly id: string,\n private readonly handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n // Session start is written lazily on first append to avoid sync I/O\n // in constructor and eliminate reliance on FileHandle.fd private property.\n }\n\n private async writeSessionStart(): Promise<void> {\n if (this.initDone || this.closed) return;\n this.initDone = true;\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort; session will still be usable without the start event logged\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n await this.writeSessionStart();\n }\n this.observeForSummary(event);\n try {\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\n } catch (err) {\n // A persistent failure (full disk, broken pipe) would otherwise log\n // once per appended event — which for a chatty agent run is a lot.\n // Debounce to one log per 5 s and surface the suppressed count.\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n /**\n * Watch events as they're appended and keep the summary state hot, so\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\n * the JSONL. `list()` reads only manifests, turning a per-session full\n * parse into a single stat+read.\n */\n private observeForSummary(event: SessionEvent): void {\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n // session_end usage is the canonical total — prefer it if non-zero.\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await fsp.writeFile(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort; list() falls back to full load.\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content.slice(0, 60);\n const text = content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` where kind is `pasted` / `image` / `file`. Unknown\n * placeholders are passed through as-is so users can write that literal\n * text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n await fsp.writeFile(spooledPath, input.data, input.kind === 'image' ? 'base64' : 'utf8');\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n const ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data =\n att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n *\n * The chain tracks only the last pending write. If a write fails, its\n * error is caught and swallowed (line 43) so the chain stays alive for\n * subsequent calls. A crash between atomicWrite() and backup copy leaves\n * the file at its new content with no backup — acceptable for an optional\n * backup whose worst case is losing a memory consolidation pass.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Swallow prior errors here so one failed write doesn't poison the\n // chain — the failed call has already rejected to its own caller.\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next);\n try {\n return await next;\n } finally {\n // Clear the chain reference once this call finishes so memory doesn't\n // grow unboundedly across long-lived processes. If another call\n // queued behind us, it's already captured in next; the map entry\n // serves only as the \"what should the next caller wait on\" pointer.\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup BEFORE the write so a crash leaves the original intact and\n // the backup reflects the pre-consolidation state. Best-effort so\n // ENOENT (new file) or permission errors don't block consolidation.\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // best-effort\n }\n try {\n await atomicWrite(file, next);\n } catch {\n // If the write fails, the original file is untouched (atomicWrite\n // does write-to-temp + rename). We still keep the backup.\n return;\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(structuredClone({ ...this.current, ...partial })) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v1:<base64-iv>:<base64-tag>:<base64-ciphertext>`. Plaintext strings\n * (those that do not match this prefix) are passed through unchanged so that\n * existing configs and env-var-derived values keep working.\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}\n\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n","import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.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\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 */\nexport class DefaultSecretVault implements SecretVault {\n private readonly keyFile: string;\n private key?: Buffer;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\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 return `${ENCRYPTED_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 const rest = value.slice(ENCRYPTED_PREFIX.length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new Error('SecretVault: malformed encrypted value');\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 Error('SecretVault: bad IV length');\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\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 private loadOrCreateKey(): Buffer {\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\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 // 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, key, { 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 (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n }\n this.key = key;\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 */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\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 console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): 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 unknown as T;\n }\n const out: Record<string, unknown> = {};\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\nfunction 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 await fsp.writeFile(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\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): 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 await fsp.writeFile(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n return { migrated: counter.n, file: configPath };\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 unknown as T;\n }\n const out: Record<string, unknown> = {};\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. */\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...a };\n for (const [k, v] of Object.entries(b)) {\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\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 out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","import * as fs from 'node:fs/promises';\nimport { decryptConfigSecrets } from '../security/secret-vault.js';\nimport type { Config, ConfigLoader } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: 10,\n eliseThreshold: 2000,\n },\n tools: {\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & {\n providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }>;\n};\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? (keys.find((k) => k.label === activeLabel) ?? keys[0])\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error('Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.');\n }\n }\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: {\n message: string;\n fromVersion: number;\n targetVersion: number;\n missingStep: number | null;\n }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Overwrites any existing lock\n * — the caller should have already handled abandonment (via\n * `checkAbandoned`) before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // Atomic write: write to .tmp and rename. Important on Windows\n // where a partial write of `active.json` would be readable.\n const tmp = `${this.file}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(lock), { mode: 0o600 });\n await fsp.rename(tmp, this.file);\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\nimport type {\n DefaultSessionReaderOptions,\n SessionExportOptions,\n SessionQuery,\n SessionReader,\n SessionSearchHit,\n SessionSearchQuery,\n SessionSummaryLite,\n} from '../types/session-reader.js';\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\n\n/**\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\n * and export helpers. Implemented on top of the public `SessionStore`\n * surface so any concrete store can be inspected without re-implementation.\n *\n * The heavy operations re-parse the JSONL stream on every call — fine for\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\n */\nexport class DefaultSessionReader implements SessionReader {\n private readonly store: SessionStore;\n\n constructor(opts: DefaultSessionReaderOptions) {\n this.store = opts.store;\n }\n\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\n const titleNeedle = q.titleContains?.toLowerCase();\n const filtered = raw.filter((s) => {\n if (q.since && s.startedAt < q.since) return false;\n if (q.until && s.startedAt > q.until) return false;\n if (q.provider && s.provider !== q.provider) return false;\n if (q.model && s.model !== q.model) return false;\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\n return true;\n });\n const out: SessionSummaryLite[] = filtered.map((s) => ({\n id: s.id,\n title: s.title,\n startedAt: s.startedAt,\n provider: s.provider,\n model: s.model,\n tokenTotal: s.tokenTotal,\n }));\n return q.limit ? out.slice(0, q.limit) : out;\n }\n\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\n const data = await this.store.load(sessionId);\n for (const e of data.events) yield e;\n }\n\n async search(q: SessionSearchQuery, sessionId?: string): Promise<SessionSearchHit[]> {\n const limit = q.limit ?? 100;\n const matcher = buildMatcher(q);\n const allowedTypes = q.types ? new Set(q.types) : null;\n\n const ids = sessionId ? [sessionId] : (await this.store.list(1000)).map((s) => s.id);\n const hits: SessionSearchHit[] = [];\n for (const id of ids) {\n let data;\n try {\n data = await this.store.load(id);\n } catch {\n continue;\n }\n for (let i = 0; i < data.events.length; i++) {\n const ev = data.events[i]!;\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\n const text = eventText(ev);\n if (text === null) continue;\n const hit = matcher(text);\n if (!hit) continue;\n hits.push({\n sessionId: id,\n eventIndex: i,\n ts: ev.ts,\n type: ev.type,\n snippet: snippetOf(text, hit.start, hit.end),\n });\n if (hits.length >= limit) return hits;\n }\n }\n return hits;\n }\n\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\n const data = await this.store.load(sessionId);\n const includeTools = opts.includeTools ?? true;\n const includeDiagnostics = opts.includeDiagnostics ?? true;\n\n const filtered = data.events.filter((e) => {\n if (\n !includeTools &&\n (e.type === 'tool_use' ||\n e.type === 'tool_result' ||\n e.type === 'tool_call_start' ||\n e.type === 'tool_call_end')\n ) {\n return false;\n }\n if (\n !includeDiagnostics &&\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\n ) {\n return false;\n }\n return true;\n });\n\n if (opts.format === 'json') {\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\n }\n if (opts.format === 'text') {\n return renderPlainText(data.metadata, filtered);\n }\n return renderMarkdown(data.metadata, filtered);\n }\n\n async metadata(sessionId: string): Promise<SessionMetadata> {\n const data = await this.store.load(sessionId);\n return data.metadata;\n }\n}\n\nfunction buildMatcher(\n q: SessionSearchQuery,\n): (text: string) => { start: number; end: number } | null {\n const ci = q.caseInsensitive ?? true;\n if (q.regex) {\n const flags = ci ? 'i' : '';\n const re = new RegExp(q.query, flags);\n return (text) => {\n const m = re.exec(text);\n return m ? { start: m.index, end: m.index + m[0].length } : null;\n };\n }\n const needle = ci ? q.query.toLowerCase() : q.query;\n return (text) => {\n const hay = ci ? text.toLowerCase() : text;\n const idx = hay.indexOf(needle);\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\n };\n}\n\nfunction eventText(e: SessionEvent): string | null {\n switch (e.type) {\n case 'user_input':\n return contentToString(e.content);\n case 'llm_response':\n return contentToString(e.content);\n case 'tool_use':\n return `${e.name} ${JSON.stringify(e.input)}`;\n case 'tool_result':\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\n case 'error':\n return `${e.phase}: ${e.message}`;\n case 'session_start':\n case 'session_resumed':\n return `${e.model}/${e.provider}`;\n case 'task_created':\n case 'task_completed':\n return e.title;\n case 'task_failed':\n return `${e.title}: ${e.error}`;\n case 'skill_activated':\n case 'skill_deactivated':\n return e.skillName;\n default:\n return null;\n }\n}\n\nfunction contentToString(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .map((b) => {\n switch (b.type) {\n case 'text':\n return b.text;\n case 'tool_use':\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\n case 'tool_result':\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n default:\n return '';\n }\n })\n .join('\\n');\n}\n\nconst SNIPPET_RADIUS = 60;\n\nfunction snippetOf(text: string, start: number, end: number): string {\n const from = Math.max(0, start - SNIPPET_RADIUS);\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\n const prefix = from > 0 ? '…' : '';\n const suffix = to < text.length ? '…' : '';\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\n}\n\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`# Session ${meta.id}`);\n lines.push('');\n if (meta.model || meta.provider) {\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\n }\n lines.push(`- **Started:** ${meta.startedAt}`);\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n for (const e of events) {\n switch (e.type) {\n case 'user_input': {\n lines.push(`## User — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n }\n case 'llm_response': {\n lines.push(`## Assistant — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n if (e.stopReason && e.stopReason !== 'end_turn') {\n lines.push('');\n lines.push(`*stop: ${e.stopReason}*`);\n }\n lines.push('');\n break;\n }\n case 'tool_use': {\n lines.push(`### Tool call: \\`${e.name}\\``);\n lines.push('');\n lines.push('```json');\n lines.push(JSON.stringify(e.input, null, 2));\n lines.push('```');\n lines.push('');\n break;\n }\n case 'tool_result': {\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\n lines.push('');\n lines.push('```');\n lines.push(body);\n lines.push('```');\n lines.push('');\n break;\n }\n case 'error': {\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\n lines.push('');\n break;\n }\n case 'compaction': {\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\n lines.push('');\n break;\n }\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\n );\n lines.push(''.padEnd(72, '-'));\n for (const e of events) {\n switch (e.type) {\n case 'user_input':\n lines.push(`[${e.ts}] USER`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'llm_response':\n lines.push(`[${e.ts}] ASSISTANT`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'tool_use':\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\n break;\n case 'tool_result':\n lines.push(\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\n }`,\n );\n break;\n case 'error':\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\n break;\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n","import type { SessionEvent } from '../types/session.js';\n\nexport interface QueryFilter {\n eventTypes?: string[];\n toolNames?: string[];\n timeRange?: { start: string; end: string };\n}\n\nexport interface ToolInvocation {\n ts: string;\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport interface SessionError {\n ts: string;\n phase: string;\n message: string;\n}\n\nexport interface ModeChange {\n ts: string;\n from: string;\n to: string;\n}\n\nexport interface TaskSummary {\n taskId: string;\n title: string;\n status: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface SessionAnalysis {\n sessionId: string;\n totalDuration: number;\n toolUsageCount: Record<string, number>;\n errorCount: number;\n modeChanges: ModeChange[];\n tasks: TaskSummary[];\n}\n\nexport class SessionAnalyzer {\n analyze(events: SessionEvent[]): SessionAnalysis {\n const toolUsageCount: Record<string, number> = {};\n const errors: SessionError[] = [];\n const modeChanges: ModeChange[] = [];\n const tasksById = new Map<string, TaskSummary>();\n let sessionId = '';\n\n for (const event of events) {\n // sessionId comes from session_start / session_resumed.\n if (event.type === 'session_start' || event.type === 'session_resumed') {\n if (!sessionId) sessionId = event.id;\n }\n if (event.type === 'tool_use') {\n toolUsageCount[event.name] = (toolUsageCount[event.name] ?? 0) + 1;\n }\n if (event.type === 'error') {\n errors.push({ ts: event.ts, phase: event.phase, message: event.message });\n }\n if (event.type === 'mode_changed') {\n modeChanges.push({ ts: event.ts, from: event.from, to: event.to });\n }\n if (event.type === 'task_created') {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'created',\n createdAt: event.ts,\n });\n }\n if (event.type === 'task_updated') {\n const t = tasksById.get(event.taskId);\n if (t) t.status = event.status;\n }\n if (event.type === 'task_completed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'completed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'completed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n if (event.type === 'task_failed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'failed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'failed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n }\n\n return {\n sessionId,\n totalDuration: this.calcDuration(events),\n toolUsageCount,\n errorCount: errors.length,\n modeChanges,\n tasks: Array.from(tasksById.values()),\n };\n }\n\n query(events: SessionEvent[], filter: QueryFilter): SessionEvent[] {\n return events.filter((e) => {\n if (filter.eventTypes?.length && !filter.eventTypes.includes(e.type)) return false;\n if (filter.toolNames?.length && e.type === 'tool_use') {\n const toolEvent = e as { type: 'tool_use'; name: string };\n if (!filter.toolNames.includes(toolEvent.name)) return false;\n }\n if (filter.timeRange) {\n const ts = new Date(e.ts).getTime();\n const start = new Date(filter.timeRange.start).getTime();\n const end = new Date(filter.timeRange.end).getTime();\n if (ts < start || ts > end) return false;\n }\n return true;\n });\n }\n\n private calcDuration(events: SessionEvent[]): number {\n if (events.length < 2) return 0;\n const first = new Date(events[0]!.ts).getTime();\n const last = new Date(events[events.length - 1]!.ts).getTime();\n return last - first;\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport type { TodoItem } from '../core/context.js';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * On-disk checkpoint for `ctx.todos`. Written atomically every time the\n * todo list changes, read once on session resume. This is the missing\n * piece that lets `wstack resume <id>` rehydrate where the previous run\n * stopped instead of starting with an empty board.\n *\n * Schema is intentionally small — a single JSON object so a future\n * format bump is easy. The `version` field is the only contract; the\n * shape under `todos` mirrors `TodoItem` so reading is a straight assign.\n */\nexport interface TodosCheckpointFile {\n version: 1;\n sessionId: string;\n updatedAt: string;\n todos: TodoItem[];\n}\n\n/** Read a checkpoint from disk. Returns null when the file doesn't\n * exist or is corrupt — callers treat both cases as \"no prior state\".\n */\nexport async function loadTodosCheckpoint(filePath: string): Promise<TodoItem[] | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as TodosCheckpointFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.todos)) return null;\n return parsed.todos.filter(\n (t): t is TodoItem =>\n !!t && typeof t.id === 'string' && typeof t.content === 'string' && typeof t.status === 'string',\n );\n } catch {\n return null;\n }\n}\n\n/** Write the checkpoint atomically. Best-effort: a write failure is\n * logged but does not throw — losing one checkpoint shouldn't bring\n * down the agent run.\n */\nexport async function saveTodosCheckpoint(\n filePath: string,\n sessionId: string,\n todos: readonly TodoItem[],\n): Promise<void> {\n const payload: TodosCheckpointFile = {\n version: 1,\n sessionId,\n updatedAt: new Date().toISOString(),\n todos: [...todos],\n };\n try {\n await atomicWrite(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[todos-checkpoint] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/**\n * Subscribe a `ConversationState` so every `todos_replaced` mutation\n * triggers an atomic write to disk. Returns the unsubscribe function.\n *\n * Writes are debounced by 150ms so a flurry of edits (e.g. the LLM\n * marking three items done in the same tool call) coalesces into one\n * disk hit.\n */\nexport function attachTodosCheckpoint(\n state: ConversationState,\n filePath: string,\n sessionId: string,\n): () => void {\n let timer: NodeJS.Timeout | null = null;\n let pending: readonly TodoItem[] | null = null;\n const flush = () => {\n timer = null;\n if (pending) {\n void saveTodosCheckpoint(filePath, sessionId, pending);\n pending = null;\n }\n };\n const unsubscribe = state.onChange((change) => {\n if (change.kind !== 'todos_replaced') return;\n pending = change.todos;\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, 150);\n });\n return () => {\n unsubscribe();\n if (timer) {\n clearTimeout(timer);\n // Flush any pending write before detach so callers can safely\n // unsubscribe at shutdown without losing the last update.\n flush();\n }\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Plan items are the strategic counterpart to todos. Where `ctx.todos`\n * is the moment-to-moment task board the LLM mutates per-turn, a plan\n * captures the higher-level approach — the steps the user (or LLM)\n * laid out before any work began.\n *\n * Plans persist by default (per session) so a resumed session can show\n * \"you were on step 3 of 5\". Todos are derived/transient. Both can\n * coexist: think roadmap (plan) vs. sprint board (todos).\n */\nexport interface PlanItem {\n id: string;\n title: string;\n /** Optional longer-form context or rationale. */\n details?: string;\n status: 'open' | 'in_progress' | 'done';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface PlanFile {\n version: 1;\n sessionId: string;\n title?: string;\n updatedAt: string;\n items: PlanItem[];\n}\n\nexport async function loadPlan(filePath: string): Promise<PlanFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as PlanFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.items)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport async function savePlan(filePath: string, plan: PlanFile): Promise<void> {\n try {\n await atomicWrite(filePath, JSON.stringify(plan, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[plan-store] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/** Create a new PlanFile when none exists on disk. */\nexport function emptyPlan(sessionId: string, title?: string): PlanFile {\n return {\n version: 1,\n sessionId,\n title,\n updatedAt: new Date().toISOString(),\n items: [],\n };\n}\n\nexport function addPlanItem(\n plan: PlanFile,\n title: string,\n details?: string,\n): { plan: PlanFile; item: PlanItem } {\n const now = new Date().toISOString();\n const item: PlanItem = {\n id: `plan_${Date.now()}_${randomUUID().slice(0, 6)}`,\n title,\n details,\n status: 'open',\n createdAt: now,\n updatedAt: now,\n };\n return {\n plan: { ...plan, items: [...plan.items, item], updatedAt: now },\n item,\n };\n}\n\nexport function removePlanItem(plan: PlanFile, idOrIndex: string): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n return {\n ...plan,\n items: plan.items.filter((_, i) => i !== idx),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function setPlanItemStatus(\n plan: PlanFile,\n idOrIndex: string,\n status: PlanItem['status'],\n): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n const now = new Date().toISOString();\n const items = plan.items.map((it, i) =>\n i === idx ? { ...it, status, updatedAt: now } : it,\n );\n return { ...plan, items, updatedAt: now };\n}\n\nexport function clearPlan(plan: PlanFile): PlanFile {\n return { ...plan, items: [], updatedAt: new Date().toISOString() };\n}\n\n/** Render the plan as a short markdown-ish string suitable for slash output. */\nexport function formatPlan(plan: PlanFile): string {\n if (plan.items.length === 0) return 'Plan is empty.';\n const lines: string[] = [];\n if (plan.title) lines.push(`# ${plan.title}`);\n plan.items.forEach((it, i) => {\n const mark = it.status === 'done' ? '[x]' : it.status === 'in_progress' ? '[~]' : '[ ]';\n lines.push(`${i + 1}. ${mark} ${it.title}`);\n if (it.details) {\n for (const line of it.details.split('\\n')) lines.push(` ${line}`);\n }\n });\n return lines.join('\\n');\n}\n\nfunction matchIndex(plan: PlanFile, idOrIndex: string): number {\n const asNum = Number.parseInt(idOrIndex, 10);\n if (!Number.isNaN(asNum) && asNum >= 1 && asNum <= plan.items.length) return asNum - 1;\n const byId = plan.items.findIndex((it) => it.id === idOrIndex);\n if (byId !== -1) return byId;\n const lower = idOrIndex.toLowerCase();\n return plan.items.findIndex((it) => it.title.toLowerCase().includes(lower));\n}\n\n/**\n * Optional: attach a state-listener so meta operations (storing a plan\n * id on ctx.meta) trigger a save. Currently a stub — plans don't live\n * on Context, but this keeps the API surface symmetric with the todos\n * checkpoint so future refactors can flip plans into Context if needed.\n */\nexport function attachPlanCheckpoint(\n _state: ConversationState,\n _filePath: string,\n _sessionId: string,\n): () => void {\n return () => undefined;\n}\n","import * as fsp from 'node:fs/promises';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Director state checkpoint — written incrementally throughout a fleet\n * run so a crashed director can be inspected (and eventually resumed)\n * instead of leaving only a final `fleet.json` manifest after `shutdown()`.\n *\n * Schema is JSON-friendly and deliberately denormalized. Each mutation\n * triggers an atomic-write of the whole file — small payloads (typically\n * < 10 KB even with dozens of subagents) make this cheap.\n */\nexport interface DirectorSubagentState {\n id: string;\n name?: string;\n role?: string;\n provider?: string;\n model?: string;\n spawnedAt: string;\n}\n\nexport interface DirectorTaskState {\n taskId: string;\n subagentId?: string;\n description?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'stopped' | 'timeout';\n assignedAt?: string;\n completedAt?: string;\n iterations?: number;\n toolCalls?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface DirectorStateSnapshot {\n version: 1;\n directorRunId: string;\n updatedAt: string;\n spawnCount: number;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n subagents: DirectorSubagentState[];\n tasks: DirectorTaskState[];\n /** Aggregated usage snapshot. Optional — populated by the Director on save when available. */\n usage?: unknown;\n}\n\nexport async function loadDirectorState(filePath: string): Promise<DirectorStateSnapshot | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as DirectorStateSnapshot;\n if (parsed?.version !== 1) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * In-memory accumulator with atomic-write checkpoint. The Director keeps\n * an instance, mutates it on every spawn/assign/complete/fail event, and\n * the instance debounces writes so a burst of activity collapses into a\n * single disk hit.\n */\nexport class DirectorStateCheckpoint {\n private snapshot: DirectorStateSnapshot;\n private readonly filePath: string;\n private timer: NodeJS.Timeout | null = null;\n private readonly debounceMs: number;\n private writing = false;\n private rewriteRequested = false;\n\n constructor(\n filePath: string,\n init: {\n directorRunId: string;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n },\n debounceMs = 250,\n ) {\n this.filePath = filePath;\n this.debounceMs = debounceMs;\n this.snapshot = {\n version: 1,\n directorRunId: init.directorRunId,\n updatedAt: new Date().toISOString(),\n spawnCount: 0,\n maxSpawns: init.maxSpawns,\n spawnDepth: init.spawnDepth,\n maxSpawnDepth: init.maxSpawnDepth,\n subagents: [],\n tasks: [],\n };\n }\n\n current(): DirectorStateSnapshot {\n return this.snapshot;\n }\n\n recordSpawn(sub: DirectorSubagentState, spawnCount: number): void {\n this.snapshot = {\n ...this.snapshot,\n spawnCount,\n subagents: [...this.snapshot.subagents.filter((s) => s.id !== sub.id), sub],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskAssigned(task: DirectorTaskState): void {\n const exists = this.snapshot.tasks.some((t) => t.taskId === task.taskId);\n this.snapshot = {\n ...this.snapshot,\n tasks: exists\n ? this.snapshot.tasks.map((t) => (t.taskId === task.taskId ? { ...t, ...task } : t))\n : [...this.snapshot.tasks, task],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskStatus(\n taskId: string,\n patch: Partial<DirectorTaskState> & { status: DirectorTaskState['status'] },\n ): void {\n this.snapshot = {\n ...this.snapshot,\n tasks: this.snapshot.tasks.map((t) =>\n t.taskId === taskId ? { ...t, ...patch } : t,\n ),\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n setUsage(usage: unknown): void {\n this.snapshot = { ...this.snapshot, usage };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n /** Force a synchronous flush — used by Director.shutdown(). */\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.persist();\n }\n\n private bumpUpdatedAt(): void {\n this.snapshot = { ...this.snapshot, updatedAt: new Date().toISOString() };\n }\n\n private schedule(): void {\n if (this.timer) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.persist();\n }, this.debounceMs);\n }\n\n private async persist(): Promise<void> {\n if (this.writing) {\n // A write is already in flight — defer to a follow-up flush so the\n // most recent state still lands. Without this guard, simultaneous\n // burst mutations can drop the latest snapshot if rename races.\n this.rewriteRequested = true;\n return;\n }\n this.writing = true;\n try {\n await atomicWrite(this.filePath, JSON.stringify(this.snapshot, null, 2), {\n mode: 0o600,\n });\n } catch (err) {\n console.warn(\n '[director-state] checkpoint write failed:',\n err instanceof Error ? err.message : String(err),\n );\n } finally {\n this.writing = false;\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n this.schedule();\n }\n }\n }\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 { type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g },\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 {\n type: 'bearer_token',\n regex: /(?<![A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{20,}=*(?![A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Value-side word boundary + length gate to avoid matching short random strings\n regex:\n /\\b([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,})['\"]?(?!\\s*[A-Za-z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))/g,\n },\n];\n\n/**\n * Per-chunk cap. The `high_entropy_env` and `bearer_token` patterns use\n * negative lookahead/lookbehind which are theoretically backtracking-prone\n * on adversarial input. Real scrub() inputs (LLM responses, tool outputs)\n * are typically much smaller, but defense-in-depth: split very long inputs\n * into smaller chunks and scrub each independently.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\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 let out = text;\n for (const p of PATTERNS) {\n out = out.replace(p.regex, (_match, group1, group2) => {\n if (p.type === 'high_entropy_env' && group1 && group2) {\n return `${group1}=[REDACTED:${p.type}]`;\n }\n return `[REDACTED:${p.type}]`;\n });\n }\n return out;\n }\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","/**\n * Minimal glob matcher for trust patterns.\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\n *\n * Compiled regexes are cached so repeated calls with the same pattern\n * avoid recompilation overhead.\n */\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n}\n\n// Module-level cache to avoid recompiling the same pattern on every call.\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\nconst CACHE_MAX_SIZE = 2000;\n\nfunction getCachedGlob(pattern: string): RegExp {\n const cached = COMPILED_GLOB_CACHE.get(pattern);\n if (cached) return cached;\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\n // Evict oldest 25% when at capacity\n const keys = [...COMPILED_GLOB_CACHE.keys()];\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\n COMPILED_GLOB_CACHE.delete(keys[i]!);\n }\n }\n const re = compileGlob(pattern);\n COMPILED_GLOB_CACHE.set(pattern, re);\n return re;\n}\n\nexport function compileGlob(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pattern.length) {\n const c = pattern[i];\n if (c === '*') {\n if (pattern[i + 1] === '*') {\n // ** matches any number of chars including /\n re += '.*';\n i += 2;\n // Skip trailing slash so '**/x' matches 'x'\n if (pattern[i] === '/') i++;\n } else {\n // single * matches any chars except /\n re += '[^/]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pattern[i] === '!' || pattern[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pattern.length && pattern[i] !== ']') {\n const ch = pattern[i] ?? '';\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\n // escaping. We've already consumed the leading `^`; the rest are\n // literal. Escape `\\` defensively and pass the rest through verbatim\n // so ranges like `a-z` continue to work.\n if (ch === '\\\\') {\n cls += '\\\\\\\\';\n } else if (ch === ']' || ch === '^') {\n cls += `\\\\${ch}`;\n } else {\n cls += ch;\n }\n i++;\n }\n cls += ']';\n re += cls;\n i++; // skip closing ]\n } else {\n re += escapeRegex(c ?? '');\n i++;\n }\n }\n re += '$';\n return new RegExp(re);\n}\n\nexport function matchGlob(pattern: string, input: string): boolean {\n return getCachedGlob(pattern).test(input);\n}\n\nexport function matchAny(patterns: string[], input: string): boolean {\n return patterns.some((p) => matchGlob(p, input));\n}\n","import * as fs from 'node:fs/promises';\nimport type { Context } from '../core/context.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { PermissionDecision, PermissionPolicy, TrustPolicy } from '../types/permission.js';\nimport type { Tool } from '../types/tool.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { matchAny, matchGlob } from '../utils/glob-match.js';\nimport { safeParse } from '../utils/safe-json.js';\n\nexport interface PermissionPolicyOptions {\n trustFile: string;\n yolo?: boolean;\n promptDelegate?: (\n tool: Tool,\n input: unknown,\n suggestedPattern: string,\n ) => Promise<'yes' | 'no' | 'always' | 'deny'>;\n inputReader?: InputReader;\n}\n\nexport class DefaultPermissionPolicy implements PermissionPolicy {\n private policy: TrustPolicy = {};\n private loaded = false;\n private readonly trustFile: string;\n private readonly yolo: boolean;\n private readonly promptDelegate?: PermissionPolicyOptions['promptDelegate'];\n\n constructor(opts: PermissionPolicyOptions) {\n this.trustFile = opts.trustFile;\n this.yolo = opts.yolo ?? false;\n this.promptDelegate = opts.promptDelegate;\n }\n\n async reload(): Promise<void> {\n try {\n const raw = await fs.readFile(this.trustFile, 'utf8');\n const parsed = safeParse<TrustPolicy>(raw);\n if (parsed.ok && parsed.value) this.policy = parsed.value;\n } catch {\n this.policy = {};\n }\n this.loaded = true;\n }\n\n async evaluate(tool: Tool, input: unknown, _ctx: Context): Promise<PermissionDecision> {\n if (!this.loaded) await this.reload();\n\n // 1. Tool-namespace matching (mcp__server__* etc.)\n const namespaceEntry = this.findNamespaceEntry(tool.name);\n\n // 2. Tool-name entry\n const entry = this.policy[tool.name] ?? namespaceEntry;\n\n // 3. Compute subject (the thing being matched)\n const subject = this.subjectFor(tool.name, input, tool.subjectKey);\n\n // 4. Deny — absolute\n if (entry?.deny && subject && matchAny(entry.deny, subject)) {\n return { permission: 'deny', source: 'deny', reason: 'matched deny pattern' };\n }\n if (tool.permission === 'deny') {\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\n }\n\n // 5. Allow\n if (entry?.allow && subject && matchAny(entry.allow, subject)) {\n return { permission: 'auto', source: 'trust', reason: 'matched allow pattern' };\n }\n if (entry?.auto) {\n return { permission: 'auto', source: 'trust' };\n }\n\n // 6. YOLO\n if (this.yolo) {\n return { permission: 'auto', source: 'yolo' };\n }\n\n // 7. Tool default\n if (tool.permission === 'auto') {\n return { permission: 'auto', source: 'default' };\n }\n\n // 8. Confirm — delegate to prompt\n if (this.promptDelegate) {\n const decision = await this.promptDelegate(tool, input, subject ?? tool.name);\n if (decision === 'always') {\n await this.trust({ tool: tool.name, pattern: subject ?? tool.name });\n return { permission: 'auto', source: 'user', reason: 'user always-allowed' };\n }\n if (decision === 'deny') {\n return { permission: 'deny', source: 'user', reason: 'user denied' };\n }\n return { permission: decision === 'yes' ? 'auto' : 'deny', source: 'user' };\n }\n return { permission: 'confirm', source: 'default' };\n }\n\n async trust(rule: { tool: string; pattern: string }): Promise<void> {\n if (!this.loaded) await this.reload();\n const entry = this.policy[rule.tool] ?? {};\n entry.allow = Array.from(new Set([...(entry.allow ?? []), rule.pattern]));\n this.policy[rule.tool] = entry;\n try {\n await atomicWrite(this.trustFile, JSON.stringify(this.policy, null, 2));\n } catch (err) {\n // Revert in-memory state since disk write failed\n const existing = this.policy[rule.tool];\n if (existing?.allow) {\n const idx = existing.allow.indexOf(rule.pattern);\n if (idx !== -1) existing.allow.splice(idx, 1);\n }\n throw err;\n }\n }\n\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n // Glob metacharacters are dangerous: a crafted subject like \"**\" or \"foo/**/bar\"\n // can match too broadly in the allow/deny pattern match. Escape them so the\n // matching is done on the literal string.\n const globChars = /[*?\\[\\]]/g;\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\n\n // 1. Explicit subjectKey on the tool wins — eliminates the cross-tool\n // collision where e.g. an HTTP tool's `path` field meant \"request\n // path\" but was matched against filesystem-path trust rules.\n if (subjectKey) {\n const v = obj[subjectKey];\n if (typeof v === 'string') {\n // Heuristic: path-like keys get backslash normalization for glob\n // matching on Windows; everything else is treated as opaque.\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\n ? normalizePath(v)\n : escapeGlob(v);\n }\n // subjectKey was declared but the runtime value isn't a string —\n // fall through to the legacy heuristic so the policy still has a\n // chance to match on something sensible.\n }\n\n // 2. Legacy heuristic — preserved for tools that haven't migrated.\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlob(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePath(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlob(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlob(obj.name);\n }\n return undefined;\n }\n\n private findNamespaceEntry(toolName: string): TrustPolicy[string] | undefined {\n for (const key of Object.keys(this.policy)) {\n if (key.includes('*') && matchGlob(key, toolName)) {\n return this.policy[key];\n }\n }\n return undefined;\n }\n}\n\n/**\n * Auto-approving PermissionPolicy used for subagents. Subagents run\n * non-interactively under a director — they cannot answer permission\n * prompts, so a non-YOLO policy on the leader would silently hang the\n * delegated run on the first sensitive tool call. The user already\n * authorized the delegation when they invoked the leader; subagents\n * inherit that authorization automatically.\n *\n * Tool defaults of `permission: 'deny'` are still honored (this is a\n * subagent capability override, not a deny-bypass).\n */\nexport class AutoApprovePermissionPolicy implements PermissionPolicy {\n async evaluate(tool: Tool): Promise<PermissionDecision> {\n if (tool.permission === 'deny') {\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\n }\n return { permission: 'auto', source: 'yolo' };\n }\n async trust(): Promise<void> {\n // No-op: subagent permission decisions are ephemeral and must not\n // pollute the leader's persisted trust file.\n }\n async reload(): Promise<void> {\n // No-op: nothing to load.\n }\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\nexport type ErrorCode =\n // Provider\n | 'PROVIDER_RATE_LIMITED'\n | 'PROVIDER_AUTH_FAILED'\n | 'PROVIDER_OVERLOADED'\n | 'PROVIDER_INVALID_REQUEST'\n | 'PROVIDER_SERVER_ERROR'\n | 'PROVIDER_NETWORK_ERROR'\n | 'PROVIDER_CONTEXT_OVERFLOW'\n // Tool\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n // Config\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_PARSE_FAILED'\n | 'CONFIG_MIGRATION_NEEDED'\n // Plugin\n | 'PLUGIN_LOAD_FAILED'\n | 'PLUGIN_API_MISMATCH'\n | 'PLUGIN_MISSING_DEPENDENCY'\n // Agent\n | 'AGENT_ITERATION_LIMIT'\n | 'AGENT_CONTEXT_OVERFLOW'\n | 'AGENT_ABORTED'\n | 'AGENT_RUN_FAILED'\n // Session\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CORRUPTED'\n | 'SESSION_WRITE_FAILED'\n // Container / Registry\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\n | 'CONTAINER_TOKEN_NOT_BOUND'\n | 'REGISTRY_DUPLICATE'\n | 'REGISTRY_NOT_FOUND'\n // General\n | 'UNKNOWN';\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\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>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\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;\n context?: Record<string, unknown>;\n cause?: unknown;\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>;\n cause?: unknown;\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>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === '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;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === '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'> = 'AGENT_RUN_FAILED',\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? '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;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\n recoverable: opts.code !== '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// ── 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","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.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 interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\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 maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\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;\n name?: string;\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;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\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;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\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\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\n return 'PROVIDER_INVALID_REQUEST';\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n private static readonly NETWORK_ERR_RE =\n /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\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 = DefaultRetryPolicy.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 >= 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","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\n\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.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;\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/i;\nconst NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/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;\n modelsRegistry?: ModelsRegistry;\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 && !CONTEXT_OVERFLOW_RE.test(err.message)) 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.max(1_000, Math.min(delayMs, 60_000));\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 candidates = provider.models.filter((m) => {\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\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 || CONTEXT_OVERFLOW_RE.test(err.message)) {\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 * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger =\n firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : (desc.trim().split('\\n')[0] ?? '');\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!\n .replace(/[·•]/g, ',')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock, ThinkingBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Provider, Request, Response } from '../types/provider.js';\nimport type { Context } from './context.js';\n\ninterface ThinkingEntry {\n textBuf: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n}\n\ninterface StreamingState {\n model: string;\n stopReason: Response['stopReason'];\n usage: Response['usage'];\n textBuffers: string[];\n currentTextIndex: number;\n tools: Map<\n string,\n { name: string; partial: string; input?: unknown; providerMeta?: Record<string, unknown> }\n >;\n thinking: ThinkingEntry[];\n currentThinkingIndex: number;\n blockOrder: Array<\n { kind: 'text'; idx: number } | { kind: 'tool'; id: string } | { kind: 'thinking'; idx: number }\n >;\n}\n\nexport function buildResponse(state: StreamingState): Response {\n const content: ContentBlock[] = [];\n for (const b of state.blockOrder) {\n if (b.kind === 'text') {\n const txt = state.textBuffers[b.idx] ?? '';\n if (txt) content.push({ type: 'text', text: txt });\n } else if (b.kind === 'thinking') {\n const t = state.thinking[b.idx];\n // Skip blocks with no thinking text AND no signature — emitting an\n // empty {type:'thinking', thinking:''} block makes Anthropic 400\n // (\"content[].thinking.thinking: cannot be empty\").\n if (!t) continue;\n if (!t.textBuf && !t.signature) continue;\n const block: ThinkingBlock = { type: 'thinking', thinking: t.textBuf };\n if (t.signature) block.signature = t.signature;\n if (t.providerMeta && Object.keys(t.providerMeta).length > 0) {\n block.providerMeta = t.providerMeta;\n }\n content.push(block);\n } else {\n const tb = state.tools.get(b.id);\n if (tb) {\n const block: ToolUseBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input: (tb.input as Record<string, unknown>) ?? {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n block.providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n return { content, stopReason: state.stopReason, usage: state.usage, model: state.model };\n}\n\nexport function createStreamingState(model: string): StreamingState {\n return {\n model,\n stopReason: 'end_turn',\n usage: { input: 0, output: 0 },\n textBuffers: [],\n currentTextIndex: -1,\n tools: new Map(),\n thinking: [],\n currentThinkingIndex: -1,\n blockOrder: [],\n };\n}\n\nexport function handleMessageStart(state: StreamingState, model: string): void {\n state.model = model;\n}\n\nexport function handleContentBlockStart(\n state: StreamingState,\n ev: { kind?: string; id?: string; name?: string; providerMeta?: Record<string, unknown> },\n): void {\n const kind = ev.kind ?? 'text';\n if (kind === 'text') {\n state.currentTextIndex = state.textBuffers.length;\n state.textBuffers.push('');\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\n } else if (kind === 'tool_use') {\n const id = ev.id ?? crypto.randomUUID();\n state.tools.set(id, { name: ev.name ?? 'unknown', partial: '' });\n state.blockOrder.push({ kind: 'tool', id });\n state.currentTextIndex = -1;\n } else if (kind === 'thinking') {\n state.currentThinkingIndex = state.thinking.length;\n state.thinking.push({\n textBuf: '',\n ...(ev.providerMeta ? { providerMeta: ev.providerMeta } : {}),\n });\n state.blockOrder.push({ kind: 'thinking', idx: state.currentThinkingIndex });\n state.currentTextIndex = -1;\n }\n}\n\nexport function handleContentBlockStop(state: StreamingState, ev: { index?: number }): void {\n // No-op for now, but tracks block boundaries for providers that need it\n void state;\n void ev;\n}\n\nexport function handleTextDelta(state: StreamingState, text: string): void {\n if (state.currentTextIndex === -1) {\n // No open text block — create one and track it.\n state.currentTextIndex = state.textBuffers.length;\n state.textBuffers.push('');\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\n }\n state.textBuffers[state.currentTextIndex] =\n (state.textBuffers[state.currentTextIndex] ?? '') + text;\n}\n\nexport function handleToolUseStart(state: StreamingState, ev: { id: string; name: string }): void {\n state.currentTextIndex = -1;\n state.tools.set(ev.id, { name: ev.name, partial: '' });\n state.blockOrder.push({ kind: 'tool', id: ev.id });\n}\n\nexport function handleToolUseInputDelta(\n state: StreamingState,\n ev: { id: string; partial: string },\n): void {\n const t = state.tools.get(ev.id);\n if (t) t.partial += ev.partial;\n}\n\nexport function safeJsonOrRaw(s: string): unknown {\n if (!s) return {};\n try {\n return JSON.parse(s);\n } catch {\n return { _raw: s };\n }\n}\n\nexport function handleToolUseStop(\n state: StreamingState,\n ev: { id: string; input?: unknown; providerMeta?: Record<string, unknown> },\n): void {\n const t = state.tools.get(ev.id);\n if (t) {\n t.input = ev.input !== undefined ? ev.input : safeJsonOrRaw(t.partial);\n if (ev.providerMeta) t.providerMeta = ev.providerMeta;\n }\n state.currentTextIndex = -1;\n}\n\n/**\n * Open a fresh thinking block. Providers that don't pre-announce blocks\n * (e.g. OpenAI/DeepSeek) can call this lazily on the first reasoning delta.\n */\nexport function handleThinkingStart(\n state: StreamingState,\n ev: { providerMeta?: Record<string, unknown> },\n): void {\n state.currentThinkingIndex = state.thinking.length;\n state.thinking.push({\n textBuf: '',\n ...(ev.providerMeta ? { providerMeta: ev.providerMeta } : {}),\n });\n state.blockOrder.push({ kind: 'thinking', idx: state.currentThinkingIndex });\n state.currentTextIndex = -1;\n}\n\nexport function handleThinkingDelta(state: StreamingState, text: string): void {\n if (state.currentThinkingIndex === -1) {\n handleThinkingStart(state, {});\n }\n const t = state.thinking[state.currentThinkingIndex];\n if (t) t.textBuf += text;\n}\n\nexport function handleThinkingSignature(state: StreamingState, signature: string): void {\n if (state.currentThinkingIndex === -1) {\n handleThinkingStart(state, {});\n }\n const t = state.thinking[state.currentThinkingIndex];\n if (t) t.signature = signature;\n}\n\nexport function handleThinkingStop(state: StreamingState): void {\n state.currentThinkingIndex = -1;\n}\n\nexport function handleMessageStop(\n state: StreamingState,\n ev: { stopReason?: Response['stopReason']; usage?: Response['usage'] },\n): void {\n state.stopReason = ev.stopReason ?? 'end_turn';\n state.usage = ev.usage ?? { input: 0, output: 0 };\n}\n\nexport async function streamProviderToResponse(\n provider: Provider,\n req: Request,\n signal: AbortSignal,\n ctx: Context,\n events: EventBus,\n): Promise<Response> {\n const state = createStreamingState(req.model);\n\n const iter = provider.stream(req, { signal })[Symbol.asyncIterator]();\n try {\n for (;;) {\n const next = await iter.next();\n if (next.done) break;\n const ev = next.value;\n switch (ev.type) {\n case 'message_start':\n handleMessageStart(state, ev.model);\n break;\n case 'content_block_start':\n handleContentBlockStart(state, ev as Parameters<typeof handleContentBlockStart>[1]);\n break;\n case 'content_block_stop':\n handleContentBlockStop(state, ev as Parameters<typeof handleContentBlockStop>[1]);\n break;\n case 'text_delta':\n handleTextDelta(state, ev.text);\n events.emit('provider.text_delta', { ctx, text: ev.text });\n break;\n case 'tool_use_start':\n handleToolUseStart(state, ev as Parameters<typeof handleToolUseStart>[1]);\n events.emit('provider.tool_use_start', { ctx, id: ev.id, name: ev.name });\n break;\n case 'tool_use_input_delta':\n handleToolUseInputDelta(state, ev as Parameters<typeof handleToolUseInputDelta>[1]);\n break;\n case 'tool_use_stop':\n handleToolUseStop(state, ev as Parameters<typeof handleToolUseStop>[1]);\n events.emit('provider.tool_use_stop', { ctx, id: ev.id });\n break;\n case 'thinking_start':\n handleThinkingStart(state, ev as Parameters<typeof handleThinkingStart>[1]);\n break;\n case 'thinking_delta':\n handleThinkingDelta(state, ev.text);\n events.emit('provider.thinking_delta', { ctx, text: ev.text });\n break;\n case 'thinking_signature':\n handleThinkingSignature(state, ev.signature);\n break;\n case 'thinking_stop':\n handleThinkingStop(state);\n break;\n case 'message_stop':\n handleMessageStop(state, ev as Parameters<typeof handleMessageStop>[1]);\n break;\n }\n }\n } catch (err) {\n if (signal.aborted) {\n // Preserve partial state so the agent can persist what was already\n // streamed before honoring the abort. The agent's outer loop checks\n // `controller.signal.aborted` after consuming this response and\n // returns `status: 'aborted'` with the finalText we built here.\n //\n // The stop reason `end_turn` is the most accurate of the available\n // StopReason values — the stream simply ended early, it was NOT a\n // token-budget hit (the previous code mis-attributed this as\n // `max_tokens`, which corrupted telemetry and broke retry logic\n // that branches on max_tokens specifically).\n state.stopReason = 'end_turn';\n return buildResponse(state);\n }\n throw err;\n } finally {\n try {\n // Race the drain against a short deadline so a non-cooperative\n // provider stream can't pin shutdown.\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\n try {\n await Promise.race([\n Promise.resolve(iter.return?.()),\n new Promise<void>((resolve) => {\n drainTimer = setTimeout(resolve, 500);\n }),\n ]);\n } finally {\n if (drainTimer) clearTimeout(drainTimer);\n }\n } catch {\n // best-effort\n }\n }\n return buildResponse(state);\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { Logger } from '../types/logger.js';\nimport type { Tracer } from '../types/observability.js';\nimport type { Provider, Request, Response } from '../types/provider.js';\nimport { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { Context } from './context.js';\nimport { streamProviderToResponse } from './streaming-response-builder.js';\n\nexport interface RunProviderOptions {\n provider: Provider;\n request: Request;\n signal: AbortSignal;\n ctx: Context;\n events: EventBus;\n retry: RetryPolicy;\n logger: Logger;\n tracer?: Tracer;\n}\n\n/**\n * Call a provider with the retry policy applied. Emits `provider.retry`\n * before each retry and `provider.error` once when the retries are\n * exhausted. Streaming providers route through the streaming-response\n * builder so deltas reach the renderer.\n */\nexport async function runProviderWithRetry(opts: RunProviderOptions): Promise<Response> {\n const { provider, request, signal, ctx, events, retry, logger, tracer } = opts;\n let attempt = 0;\n for (;;) {\n const span = tracer?.startSpan('provider.complete', {\n 'provider.id': provider.id,\n 'provider.model': request.model,\n 'provider.streaming': provider.capabilities.streaming,\n 'provider.attempt': attempt,\n });\n try {\n const res = provider.capabilities.streaming\n ? await streamProviderToResponse(provider, request, signal, ctx, events)\n : await provider.complete(request, { signal });\n span?.setAttribute('provider.stopReason', res.stopReason);\n span?.setAttribute('provider.usage_in', res.usage.input);\n span?.setAttribute('provider.usage_out', res.usage.output);\n span?.end();\n return res;\n } catch (err) {\n if (err instanceof Error) span?.recordError(err);\n span?.end();\n if (signal.aborted) throw err;\n const isProviderErr = err instanceof ProviderError;\n const errAsErr = err instanceof Error ? err : new Error(String(err));\n const canRetry = retry.shouldRetry(isProviderErr ? err : errAsErr, attempt);\n const description = isProviderErr ? (err as ProviderError).describe() : errAsErr.message;\n if (!canRetry) {\n if (isProviderErr) {\n events.emit('provider.error', {\n providerId: (err as ProviderError).providerId,\n status: (err as ProviderError).status,\n description,\n retryable: false,\n });\n }\n throw err;\n }\n const delay = Math.round(retry.delayMs(attempt));\n const attemptNum = attempt + 1;\n logger.warn(`Provider retry ${attemptNum} in ${delay}ms — ${description}`);\n if (isProviderErr) {\n events.emit('provider.retry', {\n providerId: (err as ProviderError).providerId,\n attempt: attemptNum,\n delayMs: delay,\n status: (err as ProviderError).status,\n description,\n });\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const onAbort = () => {\n if (settled) return;\n settled = true;\n clearTimeout(t);\n reject(new Error('aborted'));\n };\n const t = setTimeout(() => {\n if (settled) return;\n settled = true;\n clearTimeout(t);\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, delay);\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n });\n attempt++;\n }\n }\n}\n","import type { ProviderRunner, RunProviderOptions } from '../types/provider-runner.js';\nimport { runProviderWithRetry } from '../core/provider-runner.js';\nimport type { Response } from '../types/provider.js';\n\n/**\n * Default ProviderRunner — thin adapter over `runProviderWithRetry`.\n *\n * This is bound to `TOKENS.ProviderRunner` by the CLI at boot.\n * Consumers that want to replace the provider calling layer entirely\n * can bind a different implementation to the same token before\n * `Agent.run()`.\n */\nexport class DefaultProviderRunner implements ProviderRunner {\n async run(opts: RunProviderOptions): Promise<Response> {\n return runProviderWithRetry(opts);\n }\n}\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string): number => Math.max(1, Math.ceil(text.length / 4));\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\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => 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 quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\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 const key = JSON.stringify(input);\n return getCachedEstimate(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 const key = JSON.stringify(content);\n return getCachedEstimate(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","import type { Context } from '../core/context.js';\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 10;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.estimator = opts.estimator ?? estimateTextTokens;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateMessages(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx);\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\n\n // Phase 2: summary (placeholder; in production calls sub-LLM)\n if (opts.aggressive) {\n const phase2Saved = this.collapseAncientTurns(ctx);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n // Walk backwards counting (user + assistant) pairs to determine where\n // the preservation window really starts. This is more accurate than\n // the fixed multiplier which assumes every turn is 1 message pair.\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens removed. Call the tool again if needed.]`,\n is_error: b.is_error,\n };\n return elided;\n });\n // Check whether any block actually changed by reference equality\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private collapseAncientTurns(ctx: Context): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - this.preserveK * 2);\n if (cutTarget <= 0) return 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 0;\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateMessages(removed);\n\n const summary: Message[] = [\n {\n role: 'user',\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\n },\n { role: 'assistant', content: 'Continuing from compacted context.' },\n ];\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([...summary, ...tail]);\n return Math.max(0, removedTokens - this.estimateMessages(summary));\n }\n\n private estimateMessages(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.estimator(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.estimator(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 }\n }\n }\n return total;\n }\n}\n\nfunction 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","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\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;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\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;\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 { Context } from '../core/context.js';\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\n\n/**\n * Options for IntelligentCompactor.\n */\nexport interface IntelligentCompactorOptions {\n /** Provider to use for LLM-assisted summarization. Required. */\n provider: Provider;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used only for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** System prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n /**\n * Model ID to use for summarization. When not set, the same model as the\n * agent is used (which risks cascading failure on context overflow). Set to\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\n */\n summarizerModel?: string;\n}\n\n/**\n * An importance label for a message or message range.\n */\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\n\n/**\n * Result of importance analysis.\n */\nexport interface ImportanceAnalysis {\n messages: Array<{ index: number; importance: Importance; reason: string }>;\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\n}\n\n/**\n * IntelligentCompactor uses an LLM to:\n * - Analyze message importance and preserve critical context\n * - Generate semantic summaries for old message ranges\n * - Make intelligent decisions about what to compact\n *\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\n */\nexport class IntelligentCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerPrompt: string;\n private readonly summarizerModel?: string;\n\n constructor(opts: IntelligentCompactorOptions) {\n this.provider = opts.provider;\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\n this.summarizerModel = opts.summarizerModel;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n // Past hardThreshold, force aggressive regardless of caller preference —\n // the alternative (lightweight elision) is unlikely to recover enough.\n const aggressive =\n load >= this.hardThreshold ? true : (opts.aggressive ?? load >= this.softThreshold);\n\n // Phase 1: always run elision (preserves recent K pairs)\n const saved1 = this.eliseOldToolResults(ctx);\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\n\n // Phase 2: LLM summarization of ancient turns\n if (aggressive) {\n const saved2 = await this.summarizeAncientTurns(ctx);\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\n } else if (load >= this.warnThreshold) {\n // Non-aggressive: do lightweight summarization via direct analysis\n const saved2 = this.lightweightCompact(ctx);\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\n }\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\n const messages = ctx.messages;\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\n if (cutoff <= 2) return 0;\n\n // Find the best boundary in the ancient region\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\n if (boundary <= 1) return 0;\n\n const toSummarize = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(toSummarize);\n\n let summaryText: string;\n try {\n summaryText = await this.callSummarizer(toSummarize, ctx);\n } catch {\n // Fallback: generic placeholder if summarizer fails\n summaryText = `[${toSummarize.length} earlier turns omitted — key decisions and file states preserved in context]`;\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_summary: ${summaryText}]`,\n };\n const summaryTokens = this.estimateTokens([summaryMsg]);\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 Math.max(0, removedTokens - summaryTokens);\n }\n\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\n // Find the nearest user message with text content at or after `to`\n // and walk backwards to find a safe cut point.\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && this.hasTextContent(m)) {\n // Ensure we don't cut inside a multi-message exchange\n // by finding the start of this exchange.\n return this.findExchangeStart(messages, i);\n }\n }\n return -1;\n }\n\n private findExchangeStart(messages: Message[], userIndex: number): number {\n // Walk backwards from userIndex to find where this logical exchange began.\n // An exchange starts after the last assistant message that had no tool calls.\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) {\n // This assistant msg had no tool calls — it's a boundary\n return i + 1;\n }\n } else if (m.role !== 'user') {\n // system or other — skip\n } else {\n // another user msg — boundary\n return i;\n }\n }\n return 0;\n }\n\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\n const prompt: TextBlock[] = [\n { type: 'text', text: this.summarizerPrompt },\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\n ...this.messagesToText(messages),\n ];\n\n const req: Request = {\n model: this.summarizerModel ?? ctx.model,\n system: prompt,\n messages: [],\n maxTokens: 1024,\n };\n\n // Use abort signal from context if available.\n // Fall back to a fresh controller only if ctx.signal is absent — this\n // avoids leaking AbortControllers on every summarizer call (the original\n // `?? new AbortController().signal` created a controller that was never\n // connected to anything, making cancellation a no-op).\n const ac = ctx.signal ? undefined : new AbortController();\n const signal = ctx.signal ?? ac!.signal;\n const res = await this.provider.complete(req, { signal });\n\n const textBlocks = res.content.filter(isTextBlock);\n return (\n textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty summary)'\n );\n }\n\n private messagesToText(messages: Message[]): TextBlock[] {\n const lines: string[] = [];\n for (const m of messages) {\n const role = m.role.padEnd(10, ' ');\n if (typeof m.content === 'string') {\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\n } else if (Array.isArray(m.content)) {\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\n if (textParts.length > 0) {\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\n }\n }\n }\n return [{ type: 'text', text: lines.join('\\n') }];\n }\n\n private lightweightCompact(ctx: Context): number {\n // Lightweight: just elide very large tool results without full summarization\n return this.eliseOldToolResults(ctx);\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // Check by reference equality whether any block actually changed\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private 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 private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += estimateTextTokens(m.content);\n } else {\n for (const b of m.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 }\n }\n }\n return total;\n }\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n","import type { Context } from '../core/context.js';\nimport { LLMSelector } from '../models/llm-selector.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\n/**\n * Options for SelectiveCompactor — the most configurable compactor.\n */\nexport interface SelectiveCompactorOptions {\n /** Provider for LLM calls (selector + summarizer). Required. */\n provider: Provider;\n /** Selector for LLM-driven importance analysis. */\n selector?: MessageSelector;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** Model for selector LLM calls (default: same as provider default). */\n selectorModel?: string;\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\n summarizerModel?: string;\n /** Prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n}\n\n/**\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\n * surgical decisions about which message ranges to keep vs collapse.\n *\n * Compared to HybridCompactor / IntelligentCompactor:\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\n * - IntelligentCompactor: LLM summarization but no structured selection\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\n */\nexport class SelectiveCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly selector: MessageSelector;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerModel: string;\n private readonly summarizerPrompt: string;\n\n constructor(opts: SelectiveCompactorOptions) {\n this.provider = opts.provider;\n this.selector =\n opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\n\n if (!shouldCompact) {\n // Only do lightweight elision if below warn threshold\n const saved = this.eliseOldToolResults(ctx);\n if (saved > 0) reductions.push({ phase: 'elision', saved });\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n // Phase 1: elision — always run first to get a baseline reduction\n const savedElision = this.eliseOldToolResults(ctx);\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\n\n // Phase 2: LLM-driven selective compaction\n const afterPhase1 = this.estimateTokens(ctx.messages);\n const targetBudget = this.computeTargetBudget(load);\n\n if (afterPhase1 > targetBudget) {\n const savedSelective = await this.runSelector(ctx, targetBudget);\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\n }\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions };\n }\n\n /**\n * Run the LLM selector to decide what to keep vs collapse.\n * Returns the token savings achieved.\n */\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\n const before = this.estimateTokens(ctx.messages);\n\n let result: SelectorResult;\n try {\n result = await this.selector.select(ctx.messages, targetBudget);\n } catch {\n // Fallback to aggressive recency preservation\n return this.aggressiveRecencyTrim(ctx);\n }\n\n // Execute the selector's plan\n await this.executePlan(ctx, result);\n\n const after = this.estimateTokens(ctx.messages);\n return Math.max(0, before - after);\n }\n\n /**\n * Execute a SelectorResult plan: collapse/remove ranges and\n * insert summaries where the selector provided them.\n */\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\n if (ctx.messages.length === 0) return;\n\n // Process collapsed ranges in reverse order to preserve indices. We work\n // on a local copy and commit through `ctx.state.replaceMessages` at the\n // end so subscribers see a single state change for the whole rewrite.\n const messages = [...ctx.messages];\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\n\n for (const range of sortedCollapsed) {\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\n\n let summary = range.summary;\n if (!summary) {\n const toSummarize = messages.slice(range.from, range.to + 1);\n summary = await this.summarizeRange(toSummarize, ctx);\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\n };\n\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\n }\n\n ctx.state.replaceMessages(messages);\n }\n\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\n\n const req: Request = {\n model: this.summarizerModel,\n system: [{ type: 'text', text: systemText }],\n messages: [{ role: 'user', content: body }],\n maxTokens: 512,\n };\n\n try {\n const res = await this.provider.complete(req, {\n signal: ctx.signal ?? new AbortController().signal,\n });\n return (\n res.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty)'\n );\n } catch {\n return `[${messages.length} earlier turns omitted]`;\n }\n }\n\n private messagePreview(m: Message): string {\n if (typeof m.content === 'string') return m.content.slice(0, 300);\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ')\n .slice(0, 300);\n }\n\n /**\n * Fallback when selector fails: aggressively trim from the oldest end\n * until we hit targetBudget.\n */\n private aggressiveRecencyTrim(ctx: Context): number {\n const messages = ctx.messages;\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\n\n if (preserveIdx <= 0) return 0;\n\n // Find safe boundary near preserveIdx\n let boundary = preserveIdx;\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\n const m = messages[i]!;\n if (m.role === 'user' && this.hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(removed);\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\n };\n const tail = messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\n }\n\n private computeTargetBudget(load: number): number {\n if (load >= this.hardThreshold) {\n return Math.floor(this.maxContext * 0.5); // keep only 50%\n }\n if (load >= this.softThreshold) {\n return Math.floor(this.maxContext * 0.65); // keep 65%\n }\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.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 let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const tokens = this.roughTokenEstimate(text);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // map() preserves length, so only block ref-equality matters here.\n if (newContent.every((b, idx) => b === msg.content[idx])) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private 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 private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.roughTokenEstimate(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\n else if (b.type === 'tool_result') {\n total += this.roughTokenEstimate(\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\n );\n }\n }\n }\n }\n return total;\n }\n\n private roughTokenEstimate(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n }\n}\n","import type { Context } from '../core/context.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { MiddlewareHandler } from '../kernel/pipeline.js';\nimport type { Compactor } from '../types/compactor.js';\nimport { AgentError } from '../types/errors.js';\n\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\n\nexport interface AutoCompactionOptions {\n aggressiveOn?: 'hard' | 'soft' | 'warn';\n events?: EventBus;\n failureMode?: CompactionFailureMode;\n}\n\n/**\n * Pipeline middleware that monitors context token load and automatically\n * triggers compaction when the warn/soft/hard thresholds are crossed.\n * Runs before the next agent iteration.\n */\nexport class AutoCompactionMiddleware {\n readonly name = 'AutoCompaction';\n\n private readonly compactor: Compactor;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly estimator: (ctx: Context) => number;\n private readonly aggressiveOn: 'hard' | 'soft' | 'warn';\n private readonly events?: EventBus;\n private readonly failureMode: CompactionFailureMode;\n\n /**\n * @param compactor Compactor to use for compaction.\n * @param maxContext Provider's max context window in tokens.\n * @param estimator Token estimation function.\n * @param thresholds Threshold fractions (0-1) of maxContext.\n * @param opts Optional behavior. By default, failures at the\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\n * the agent does not continue into a likely\n * provider context overflow. Warn/soft failures\n * still emit compaction.failed and continue.\n */\n constructor(\n compactor: Compactor,\n maxContext: number,\n estimator: (ctx: Context) => number,\n thresholds: { warn: number; soft: number; hard: number },\n optsOrAggressiveOn: AutoCompactionOptions | 'hard' | 'soft' | 'warn' = {},\n events?: EventBus,\n ) {\n const opts =\n typeof optsOrAggressiveOn === 'string'\n ? { aggressiveOn: optsOrAggressiveOn, events }\n : optsOrAggressiveOn;\n this.compactor = compactor;\n this.maxContext = maxContext;\n this.estimator = estimator;\n this.warnThreshold = thresholds.warn;\n this.softThreshold = thresholds.soft;\n this.hardThreshold = thresholds.hard;\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\n this.events = opts.events;\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\n }\n\n handler(): MiddlewareHandler<Context> {\n return async (ctx, next) => {\n const tokens = this.estimator(ctx);\n const load = tokens / this.maxContext;\n\n if (load >= this.hardThreshold) {\n await this.compact(ctx, true, { level: 'hard', tokens, load });\n } else if (load >= this.softThreshold) {\n await this.compact(ctx, this.aggressiveOn !== 'hard', { level: 'soft', tokens, load });\n } else if (load >= this.warnThreshold) {\n await this.compact(ctx, false, { level: 'warn', tokens, load });\n }\n\n return next(ctx);\n };\n }\n\n private async compact(\n ctx: Context,\n aggressive: boolean,\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\n ): Promise<void> {\n try {\n await this.compactor.compact(ctx, { aggressive });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const fatal =\n this.failureMode === 'throw' ||\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\n this.events?.emit('compaction.failed', {\n err: error,\n aggressive,\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n load: pressure.load,\n fatal,\n });\n if (fatal) {\n throw new AgentError({\n message: `Auto-compaction failed at ${pressure.level} threshold`,\n code: 'AGENT_CONTEXT_OVERFLOW',\n recoverable: true,\n context: {\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n },\n cause: err,\n });\n }\n }\n }\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;\n estimator?: (text: string) => number;\n}\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown): 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(serialize).join('\\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","import type { Context } from '../core/context.js';\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type {\n ToolBatchResult,\n ToolConfirmPendingResult,\n ToolExecutionOutput,\n ToolExecutorOptions,\n ToolExecutorStrategy,\n} from '../types/tool-executor.js';\nimport type { Tool } from '../types/tool.js';\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\n\nexport class ToolExecutor {\n private readonly serializer;\n private readonly iterationTimeoutMs: number;\n\n constructor(\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\n private readonly opts: ToolExecutorOptions,\n ) {\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.serializer = createToolOutputSerializer({\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\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 (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\n const start = Date.now();\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.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\n\n if (decision.permission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (decision.permission === '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.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n // fall through to execute\n } else {\n const suggestedPattern =\n this.subjectFor(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 // permission === 'auto'\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 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 });\n try {\n const result = await this.executeTool(tool, use, ctx, budget);\n budget = this.decrementBudget(result, budget);\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 = err instanceof Error ? err.message : String(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\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.decrementBudget(result, budget);\n if (err instanceof Error) span?.recordError(err);\n span?.setAttribute('tool.is_error', true);\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 = err instanceof Error ? err.message : String(err);\n const scrubbed = this.opts.secretScrubber.scrub(msg);\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.decrementBudget(result, budget);\n return { result, tool: this.registry.get(use.name), 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<ToolResultBlock> {\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);\n const scrubbed = this.opts.secretScrubber.scrub(text);\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n name: tool.name,\n content: capped,\n is_error: false,\n };\n }\n\n private async runWithTimeout(\n tool: Tool,\n input: unknown,\n parentSignal: AbortSignal,\n ctx: Context,\n toolUseId?: string,\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 = tool.timeoutMs ?? this.iterationTimeoutMs;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\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 if (typeof tool.executeStream === 'function') {\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\n }\n return await tool.execute(input, ctx, { signal: combined });\n } catch (err) {\n if (combined.aborted && typeof tool.cleanup === 'function') {\n // Best-effort cleanup; never let it mask the original error.\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n throw err;\n } finally {\n clearTimeout(timer);\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 const stream = tool.executeStream!(input, ctx, { signal });\n for await (const ev of stream) {\n if (ev.type === 'final') {\n finalOutput = ev.output;\n sawFinal = true;\n // Drain whatever the iterator wants to surface after final, but the\n // result is locked in. Most tools won't yield more.\n break;\n }\n this.opts.events?.emit('tool.progress', {\n name: tool.name,\n id: toolUseId ?? '<unknown>',\n event: ev,\n });\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 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 decrementBudget(result: ToolResultBlock, budget: number): number {\n const contentBytes =\n typeof result.content === 'string'\n ? Buffer.byteLength(result.content, 'utf8')\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\n return Math.max(0, budget - contentBytes);\n }\n\n /**\n * Compute the suggestedPattern string for a tool+input pair.\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\n * same subject that the trust file would use.\n */\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const globChars = /[*?\\[\\]]/g;\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\n\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\n if (subjectKey) {\n const v = obj[subjectKey];\n if (typeof v === 'string') {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\n ? normalizePath(v)\n : escapeGlob(v);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlob(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePath(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlob(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlob(obj.name);\n }\n return undefined;\n }\n}\n","import type { Agent, RunResult } from '../core/agent.js';\nimport type { Context } from '../core/context.js';\nimport { toWrongStackError } from '../types/errors.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\n\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\n\nexport interface DoneCheckResult {\n done: boolean;\n reason?: string;\n iterations: number;\n toolCalls: number;\n}\n\nexport class DoneConditionChecker {\n private readonly compiledRegex: RegExp | null;\n\n constructor(private readonly condition: DoneCondition) {\n this.compiledRegex =\n condition.type === 'output_match' && condition.pattern ? new RegExp(condition.pattern) : null;\n }\n\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\n switch (this.condition.type) {\n case 'iterations':\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\n return {\n done: true,\n reason: `max iterations (${this.condition.maxIterations}) reached`,\n ...state,\n };\n }\n break;\n\n case 'tool_calls':\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\n return {\n done: true,\n reason: `max tool calls (${this.condition.maxToolCalls}) reached`,\n ...state,\n };\n }\n break;\n\n case 'output_match':\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\n return {\n done: true,\n reason: `output matched pattern \"${this.condition.pattern}\"`,\n ...state,\n };\n }\n break;\n\n case 'custom':\n // Reserved for future extension\n break;\n }\n\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\n }\n}\n\nexport interface AutonomousRunnerOptions {\n agent: Agent;\n context: Context;\n doneCondition: DoneCondition;\n iterationTimeoutMs?: number;\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\n onDone?: (result: AutonomousResult) => void;\n}\n\nexport class AutonomousRunner {\n private iterations = 0;\n private toolCalls = 0;\n private lastOutput?: string;\n private stopped = false;\n private readonly doneChecker: DoneConditionChecker;\n\n constructor(private readonly opts: AutonomousRunnerOptions) {\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\n }\n\n async run(): Promise<AutonomousResult> {\n // Subscribe to `tool.executed` so the per-tool budget (`tool_calls`\n // done-condition) actually counts each tool invocation rather than\n // each `agent.run()` call. Without this, a single iteration that\n // fires 5 tools only bumps the counter once, and a `maxToolCalls: 3`\n // budget would fire after 3 iterations (typically 3×N tools) instead\n // of after 3 tools. Unsubscribed in the `finally` so the listener\n // doesn't outlive this run instance. Mock agents in tests may pass\n // null/undefined for `events`; gracefully skip when missing — those\n // tests don't exercise the tool-count budget path.\n const offToolExecuted = this.opts.agent.events?.on?.('tool.executed', () => {\n this.toolCalls++;\n });\n try {\n return await this.runLoop();\n } finally {\n offToolExecuted?.();\n }\n }\n\n private async runLoop(): Promise<AutonomousResult> {\n while (!this.stopped) {\n const check = this.doneChecker.check({\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n lastOutput: this.lastOutput,\n });\n\n if (check.done) {\n const result: AutonomousResult = {\n status: 'done',\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: check.reason,\n };\n this.opts.onDone?.(result);\n return result;\n }\n\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\n\n const ctrl = new AbortController();\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\n\n try {\n const result = await this.opts.agent.run('', {\n signal: ctrl.signal,\n maxIterations: 1,\n executionStrategy: 'sequential',\n });\n\n this.iterations++;\n // Only access finalText when the run actually succeeded. Failed/aborted\n // runs may have undefined finalText — accessing it unconditionally would\n // produce garbage output for the done-condition matchers.\n if (result.status === 'done') {\n this.lastOutput = result.finalText;\n }\n // `toolCalls` is bumped by the `tool.executed` listener installed\n // in run() — no manual increment here.\n\n if (result.status === 'failed' || result.status === 'aborted') {\n const failedResult: AutonomousResult = {\n status: result.status,\n error: result.error,\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n };\n this.opts.onDone?.(failedResult);\n return failedResult;\n }\n } catch (e) {\n // Be precise about what constitutes a timeout error — matching on\n // 'timeout' substring is too loose (an error message containing\n // \"timeout exceeded\" from the LLM is not the same as an abort).\n const isAbort =\n (e instanceof DOMException && e.name === 'AbortError') ||\n (e instanceof Error && e.name === 'AbortError') ||\n (e instanceof Error && e.message.includes('iteration timeout'));\n if (isAbort) {\n const timeoutResult: AutonomousResult = {\n status: 'failed',\n error: toWrongStackError(e),\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: 'iteration timeout',\n };\n this.opts.onDone?.(timeoutResult);\n return timeoutResult;\n }\n // Any other throw (TypeError, tool crash propagation, etc.) must\n // stop the loop — silently continuing would spin forever on the\n // same error and burn provider tokens with no progress.\n this.stopped = true;\n const failedResult: AutonomousResult = {\n status: 'failed',\n error: toWrongStackError(e),\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: e instanceof Error ? e.message : String(e),\n };\n this.opts.onDone?.(failedResult);\n return failedResult;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n return {\n status: 'aborted',\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n reason: 'stopped externally',\n };\n }\n\n stop(): void {\n this.stopped = true;\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 { 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\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.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 Error('Bridge is stopped');\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 Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\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 }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\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,\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","/**\n * System-prompt composition helpers for the Director ecosystem.\n *\n * Two callers need composed prompts:\n *\n * 1. The **leader** (the director's own Agent) — needs a preamble that\n * explains the fleet protocol: when to spawn, when to await, how to\n * roll up, and the eight orchestration tools it owns.\n *\n * 2. Each **subagent** — needs a baseline that explains it has a parent\n * it can call via the bridge, a role-specific block, the task brief,\n * and finally any per-spawn `systemPromptOverride` from `SubagentConfig`.\n *\n * Both composers are pure functions: feed them parts, they return a string.\n * No I/O, no side effects, no implicit defaults beyond the ones exported\n * here. Callers (CLI multi-agent factory, Director itself) decide which\n * parts to fill in — that keeps the composition seam visible and testable.\n */\n\n/**\n * Default fleet-protocol preamble injected at the **front** of the\n * director-agent's system prompt. Kept deliberately short — long preambles\n * crowd out the user's leader prompt and the LLM stops attending. The tool\n * descriptions live on the tool definitions themselves; this preamble only\n * teaches *when* to reach for them.\n */\nexport const DEFAULT_DIRECTOR_PREAMBLE = `\\\nYou are the Director of a multi-agent fleet. You orchestrate worker\nsubagents by spawning them, assigning tasks, awaiting completions, and\nrolling up their outputs into your next decision.\n\nCore fleet tools available to you:\n - spawn_subagent — create a worker with a chosen provider / model / role\n - assign_task — hand a piece of work to a specific subagent\n - await_tasks — block until named task ids complete (parallel-safe)\n - ask_subagent — synchronously query a running subagent via the bridge\n - roll_up — aggregate finished tasks into a markdown/json summary\n - terminate_subagent — abort a stuck worker (use sparingly)\n - fleet_status — snapshot of all subagents and pending tasks\n - fleet_usage — token + cost breakdown per subagent and total\n\nWorking rules:\n 1. Decompose first. Before spawning, decide which sub-tasks are\n independent and can run in parallel. Sequential work doesn't need a\n subagent — do it yourself.\n 2. Match worker to job. Cheap/fast model for triage, capable model for\n synthesis. Different providers per sibling is allowed and encouraged.\n 3. Always pair an assign with an await. Don't fire-and-forget; you owe\n the user a single coherent answer at the end.\n 4. Roll up before deciding. After await_tasks resolves, call roll_up so\n the results are folded back into your context in a compact form.\n 5. Budget is real. Check fleet_usage periodically. If a subagent is\n thrashing, terminate it rather than letting cost climb silently.\n 6. Never claim a subagent's work as your own without verifying it. If a\n result looks wrong, ask_subagent for clarification before passing it\n to the user.\\\n`;\n\n/**\n * Default baseline prepended to every subagent's system prompt. Tells the\n * subagent its place in the hierarchy and the bridge contract — without\n * this, a subagent has no way to know it *can* ask the parent for\n * clarification, and it will hallucinate answers when context is missing.\n *\n * Bridge contract: subagents may `send` progress and `request` answers, but\n * MAY NOT exfiltrate the parent's full system prompt or tools list. The\n * baseline reinforces this in plain text — the actual enforcement is at\n * the bridge transport layer.\n */\nexport const DEFAULT_SUBAGENT_BASELINE = `\\\nYou are a subagent operating under a Director. You were spawned to handle\na specific slice of a larger plan — do that slice well and report back.\n\nBridge contract:\n - You have a parent (the Director). You may call \\`request\\` on the\n parent bridge to ask a clarifying question. Use this sparingly; the\n parent is also working.\n - You MAY NOT request the parent's system prompt, tool list, or other\n subagents' context. Those are not yours to read.\n - Your final task output is what the Director sees. Be concise,\n structured, and self-contained — assume the Director will paste your\n output into its own context.\\\n`;\n\n/** Parts the leader-prompt composer accepts. All optional. */\nexport interface DirectorPromptParts {\n /** The user's existing leader system prompt — typically what was passed\n * via `MultiAgentConfig.leaderSystemPrompt`. */\n basePrompt?: string;\n /** Override the built-in fleet preamble. Pass empty string to suppress. */\n directorPreamble?: string;\n /** Optional roster summary block — a short list of pre-configured roles\n * the director can spawn (e.g. \"researcher, coder, reviewer\"). Helps\n * small models discover the available shapes without scanning tools. */\n rosterSummary?: string;\n}\n\n/**\n * Compose the leader/director's system prompt. Order:\n * 1. Director preamble (fleet protocol)\n * 2. Roster summary (optional, when provided)\n * 3. User base prompt (the per-project leader prompt)\n *\n * Sections are separated by a blank line. Empty parts are skipped so the\n * output never contains stray blank-line runs.\n */\nexport function composeDirectorPrompt(parts: DirectorPromptParts = {}): string {\n const sections: string[] = [];\n const preamble = parts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n if (preamble && preamble.trim().length > 0) sections.push(preamble.trim());\n if (parts.rosterSummary && parts.rosterSummary.trim().length > 0) {\n sections.push(`Available roles you can spawn:\\n${parts.rosterSummary.trim()}`);\n }\n if (parts.basePrompt && parts.basePrompt.trim().length > 0) {\n sections.push(parts.basePrompt.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/** Parts the subagent-prompt composer accepts. Layered from generic to\n * specific; later layers override earlier ones when they conflict. */\nexport interface SubagentPromptParts {\n /** Base persona/identity for *every* subagent. Defaults to the bridge\n * contract baseline. Pass empty string to suppress. */\n baseline?: string;\n /** Role-specific block, e.g. \"You are a code reviewer. Focus on…\". */\n role?: string;\n /** Task brief — usually the same string the runner passes as user input,\n * but exposed here in case the factory wants it duplicated in the\n * system prompt for reinforcement. */\n task?: string;\n /**\n * Absolute path to a shared scratchpad directory the whole fleet can\n * read/write. When set, the composer adds a \"Shared notes\" block that\n * tells the subagent where to drop findings and where to look for\n * sibling output. This is the cheap fleet-coordination channel —\n * agents don't need each other's transcripts, just each other's\n * conclusions. Falls between `task` and `override` so the override\n * can still narrow or replace it.\n */\n sharedScratchpad?: string;\n /** Final per-spawn override from `SubagentConfig.systemPromptOverride`.\n * Added last so it wins on conflict — that's by design: the spawn site\n * knows the most about what this specific subagent should do. */\n override?: string;\n}\n\n/**\n * Compose a subagent's system prompt. Order:\n * 1. Baseline (bridge contract)\n * 2. Role\n * 3. Task brief\n * 4. Per-spawn override\n *\n * Same blank-line-separated joining as the director composer.\n *\n * Layering rationale: the baseline never needs to change between\n * subagents; the role is the \"what kind of worker is this\"; the task is\n * the \"what should you do *now*\"; the override is the spawn-site escape\n * hatch (\"…and respond only in JSON\"). Putting override last means it\n * never gets squashed by something earlier in the chain.\n */\nexport function composeSubagentPrompt(parts: SubagentPromptParts = {}): string {\n const sections: string[] = [];\n const baseline = parts.baseline ?? DEFAULT_SUBAGENT_BASELINE;\n if (baseline && baseline.trim().length > 0) sections.push(baseline.trim());\n if (parts.role && parts.role.trim().length > 0) {\n sections.push(`Role:\\n${parts.role.trim()}`);\n }\n if (parts.task && parts.task.trim().length > 0) {\n sections.push(`Task:\\n${parts.task.trim()}`);\n }\n if (parts.sharedScratchpad && parts.sharedScratchpad.trim().length > 0) {\n sections.push(\n `Shared notes:\\n` +\n `A scratchpad shared with the rest of the fleet is mounted at \\`${parts.sharedScratchpad.trim()}\\`.\\n` +\n `- Write your final findings as markdown files there (e.g. \\`findings.md\\`, \\`security.md\\`).\\n` +\n `- Before starting, list the directory and read any sibling files relevant to your task — ` +\n `they may already contain context you can build on.\\n` +\n `- Use stable filenames (one file per concern); overwrite instead of appending so the ` +\n `Director sees the latest state.`,\n );\n }\n if (parts.override && parts.override.trim().length > 0) {\n sections.push(parts.override.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/**\n * Render a short bullet list summarising a roster — useful for stuffing\n * into `composeDirectorPrompt({ rosterSummary })` so the director model\n * can see available roles without scanning tool descriptions.\n *\n * Each entry: `- <role-id>: <name>[ (provider/model)] — <prompt-headline>`\n * The prompt headline is the first non-empty line of `config.prompt`,\n * truncated to 80 chars. Skipped entirely when the role has no prompt.\n */\nexport function rosterSummaryFromConfigs(\n roster: Record<\n string,\n { name: string; provider?: string; model?: string; prompt?: string; role?: string }\n >,\n): string {\n const lines: string[] = [];\n for (const [roleId, cfg] of Object.entries(roster)) {\n const tag = cfg.provider && cfg.model ? ` (${cfg.provider}/${cfg.model})` : '';\n const headline = cfg.prompt\n ? (cfg.prompt.split('\\n').find((l) => l.trim().length > 0) ?? '').trim().slice(0, 80)\n : '';\n const tail = headline ? ` — ${headline}` : '';\n lines.push(`- ${roleId}: ${cfg.name}${tag}${tail}`);\n }\n return lines.join('\\n');\n}\n","import type { EventBus } from '../kernel/events.js';\n\n/**\n * Single fleet-wide event with subagent attribution. Whatever a child\n * agent emits on its own EventBus gets re-published here, prefixed with\n * `subagentId` so a single subscriber can multiplex across the fleet.\n *\n * The director uses `FleetBus.filter('tool.executed', …)` to see every\n * tool call across the fleet; the TUI uses\n * `FleetBus.subscribe(id, handler)` to render a per-subagent panel.\n */\nexport interface FleetEvent {\n subagentId: string;\n taskId?: string;\n ts: number;\n type: string;\n payload: unknown;\n}\n\nexport type FleetHandler = (event: FleetEvent) => void;\n\n/**\n * Fan-in for per-subagent EventBuses. Each subagent's bus is plugged in\n * via `attach()`; the FleetBus re-emits every event with subagent\n * attribution. Detachment is automatic via the returned disposer — call\n * it when a subagent terminates so we don't leak listeners.\n *\n * The bus exposes two subscription modes: by `subagentId` (everything\n * from one child) and by `type` (one event-type across the fleet). They\n * compose — if you need a per-subagent + per-type slice, subscribe by\n * type and filter on `event.subagentId` in your handler.\n */\nexport class FleetBus {\n private readonly byId = new Map<string, Set<FleetHandler>>();\n private readonly byType = new Map<string, Set<FleetHandler>>();\n private readonly any = new Set<FleetHandler>();\n\n /**\n * Hook a subagent's EventBus into the fleet. EventBus is strongly\n * typed and doesn't expose an `onAny` hook, so we subscribe to the\n * canonical set of event types a subagent emits during a run. New\n * event types added to the kernel must be added here too — but the\n * cost is a tiny single line per type, and the explicit list keeps\n * the wire format clear.\n *\n * Returns a disposer that detaches every subscription; call on\n * subagent teardown so the listeners don't outlive the run.\n */\n attach(subagentId: string, bus: EventBus, taskId?: string): () => void {\n const FORWARDED_TYPES = [\n 'tool.started',\n 'tool.executed',\n 'tool.progress',\n 'tool.confirm_needed',\n 'iteration.started',\n 'iteration.completed',\n 'provider.text_delta',\n // Subagent extended-thinking output. Forwarded so the FleetPanel /\n // /fleet log can surface \"the planner is thinking…\" instead of a\n // silent gap between iteration.started and the first text_delta.\n 'provider.thinking_delta',\n 'provider.response',\n 'provider.retry',\n 'provider.error',\n 'session.started',\n 'session.ended',\n 'session.damaged',\n 'compaction.fired',\n 'compaction.failed',\n 'token.threshold',\n ] as const;\n const offs: Array<() => void> = [];\n for (const t of FORWARDED_TYPES) {\n offs.push(\n bus.on(t, (payload: unknown) => {\n this.emit({ subagentId, taskId, ts: Date.now(), type: t, payload });\n }),\n );\n }\n return () => {\n for (const off of offs) off();\n };\n }\n\n /** Subscribe to every event from one subagent. */\n subscribe(subagentId: string, handler: FleetHandler): () => void {\n let set = this.byId.get(subagentId);\n if (!set) {\n set = new Set();\n this.byId.set(subagentId, set);\n }\n set.add(handler);\n return () => {\n set!.delete(handler);\n };\n }\n\n /** Subscribe to one event type across all subagents. */\n filter(type: string, handler: FleetHandler): () => void {\n let set = this.byType.get(type);\n if (!set) {\n set = new Set();\n this.byType.set(type, set);\n }\n set.add(handler);\n return () => {\n set!.delete(handler);\n };\n }\n\n /** Subscribe to literally everything. The fleet roll-up uses this. */\n onAny(handler: FleetHandler): () => void {\n this.any.add(handler);\n return () => {\n this.any.delete(handler);\n };\n }\n\n emit(event: FleetEvent): void {\n // Each fan-out is best-effort — a misbehaving handler must not\n // bring down the bus or other handlers. Errors are swallowed\n // (matching the rest of the project's listener-error policy).\n const byId = this.byId.get(event.subagentId);\n if (byId)\n for (const h of byId) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n const byType = this.byType.get(event.type);\n if (byType)\n for (const h of byType) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n for (const h of this.any) {\n try {\n h(event);\n } catch {\n /* ignore */\n }\n }\n }\n}\n\n/**\n * Roll-up of token usage + cost across an entire director run. The\n * director's `fleet_status` tool returns this so the model can reason\n * about budget in its next turn (\"the researcher already burned $0.40,\n * lean on summaries for the next task\").\n */\nexport interface FleetUsage {\n total: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n };\n perSubagent: Record<string, SubagentUsageSnapshot>;\n}\n\nexport interface SubagentUsageSnapshot {\n subagentId: string;\n provider?: string;\n model?: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n toolCalls: number;\n iterations: number;\n startedAt: number;\n lastEventAt: number;\n}\n\n/**\n * Aggregates provider.response + tool.executed events from the FleetBus\n * into a live `FleetUsage` snapshot. Costs are computed by the caller\n * via a `priceLookup(subagentId)` so we don't bake provider-pricing\n * coupling into core; the CLI/tests supply a function that resolves\n * each subagent's per-token rates from the models registry.\n */\nexport class FleetUsageAggregator {\n private readonly perSubagent = new Map<string, SubagentUsageSnapshot>();\n private readonly total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n\n constructor(\n private readonly bus: FleetBus,\n private readonly priceLookup?: (\n subagentId: string,\n ) => { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } | undefined,\n private readonly metaLookup?: (\n subagentId: string,\n ) => { provider?: string; model?: string } | undefined,\n ) {\n bus.filter('provider.response', (e) => this.onProviderResponse(e));\n bus.filter('tool.executed', (e) => this.onToolExecuted(e));\n bus.filter('iteration.started', (e) => this.onIterationStarted(e));\n }\n\n /** Live snapshot — safe to call from a tool's execute() body. */\n snapshot(): FleetUsage {\n return {\n total: { ...this.total },\n perSubagent: Object.fromEntries(\n Array.from(this.perSubagent.entries()).map(([k, v]) => [k, { ...v }]),\n ),\n };\n }\n\n private ensure(subagentId: string): SubagentUsageSnapshot {\n let snap = this.perSubagent.get(subagentId);\n if (!snap) {\n const meta = this.metaLookup?.(subagentId);\n snap = {\n subagentId,\n provider: meta?.provider,\n model: meta?.model,\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: 0,\n toolCalls: 0,\n iterations: 0,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n };\n this.perSubagent.set(subagentId, snap);\n }\n return snap;\n }\n\n private onProviderResponse(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n const p = e.payload as {\n usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n };\n const usage = p?.usage;\n if (!usage) return;\n snap.input += usage.input ?? 0;\n snap.output += usage.output ?? 0;\n snap.cacheRead += usage.cacheRead ?? 0;\n snap.cacheWrite += usage.cacheWrite ?? 0;\n this.total.input += usage.input ?? 0;\n this.total.output += usage.output ?? 0;\n this.total.cacheRead += usage.cacheRead ?? 0;\n this.total.cacheWrite += usage.cacheWrite ?? 0;\n const price = this.priceLookup?.(e.subagentId);\n if (price) {\n const delta =\n ((usage.input ?? 0) / 1_000_000) * (price.input ?? 0) +\n ((usage.output ?? 0) / 1_000_000) * (price.output ?? 0) +\n ((usage.cacheRead ?? 0) / 1_000_000) * (price.cacheRead ?? 0) +\n ((usage.cacheWrite ?? 0) / 1_000_000) * (price.cacheWrite ?? 0);\n snap.cost += delta;\n this.total.cost += delta;\n }\n snap.lastEventAt = e.ts;\n }\n\n private onToolExecuted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.toolCalls += 1;\n snap.lastEventAt = e.ts;\n }\n\n private onIterationStarted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.iterations += 1;\n snap.lastEventAt = e.ts;\n }\n}\n","import type { Usage } from '../types/provider.js';\n\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\n\nexport class BudgetExceededError extends Error {\n readonly kind: BudgetKind;\n readonly limit: number;\n readonly observed: number;\n\n constructor(kind: BudgetKind, limit: number, observed: number) {\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\n this.name = 'BudgetExceededError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport interface BudgetLimits {\n maxIterations?: number;\n maxToolCalls?: number;\n maxTokens?: number;\n /** Estimated USD cost ceiling. */\n maxCostUsd?: number;\n /** Wall-clock timeout from start() to checkTimeout(). */\n timeoutMs?: number;\n}\n\nexport interface BudgetUsage {\n iterations: number;\n toolCalls: number;\n tokens: { input: number; output: number; total: number };\n costUsd: number;\n elapsedMs: number;\n}\n\n/**\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\n * methods are O(1) and safe to call from hot paths.\n *\n * Behavior: `record*` methods throw `BudgetExceededError` synchronously the\n * moment a limit is crossed. The caller (runner/coordinator) catches this and\n * marks the task as 'failed' with the budget kind, so the operator can see\n * exactly which ceiling tripped.\n *\n * Timeout note: `checkTimeout()` is a cooperative guard called by the\n * runner on each iteration loop. The coordinator additionally enforces a\n * hard wall-clock deadline via `Promise.race` in `executeWithTimeout`.\n * Both mechanisms throw `BudgetExceededError` ('timeout') — the runner's\n * check is best-effort (catches cases where the runner loop doesn't call it)\n * and the coordinator's race is the authoritative cutoff. The two are\n * intentionally independent; they converge on the same error type so\n * `runDispatched` handles both identically.\n */\nexport class SubagentBudget {\n readonly limits: Readonly<BudgetLimits>;\n private iterations = 0;\n private toolCalls = 0;\n private tokenInput = 0;\n private tokenOutput = 0;\n private costUsd = 0;\n private startTime: number | null = null;\n\n constructor(limits: BudgetLimits = {}) {\n this.limits = Object.freeze({ ...limits });\n }\n\n start(): void {\n this.startTime = Date.now();\n }\n\n recordIteration(): void {\n this.iterations++;\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\n throw new BudgetExceededError('iterations', this.limits.maxIterations, this.iterations);\n }\n }\n\n recordToolCall(): void {\n this.toolCalls++;\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n throw new BudgetExceededError('tool_calls', this.limits.maxToolCalls, this.toolCalls);\n }\n }\n\n recordUsage(usage: Usage, costUsd = 0): void {\n this.tokenInput += usage.input;\n this.tokenOutput += usage.output;\n this.costUsd += costUsd;\n\n const totalTokens = this.tokenInput + this.tokenOutput;\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\n throw new BudgetExceededError('tokens', this.limits.maxTokens, totalTokens);\n }\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\n throw new BudgetExceededError('cost', this.limits.maxCostUsd, this.costUsd);\n }\n }\n\n /**\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\n * loop so a hung tool can't keep a subagent running past its deadline.\n */\n checkTimeout(): void {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.limits.timeoutMs) {\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\n }\n }\n\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\n isTimedOut(): boolean {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\n return Date.now() - this.startTime > this.limits.timeoutMs;\n }\n\n usage(): BudgetUsage {\n return {\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n tokens: {\n input: this.tokenInput,\n output: this.tokenOutput,\n total: this.tokenInput + this.tokenOutput,\n },\n costUsd: this.costUsd,\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\nimport type {\n CoordinatorStatus,\n MultiAgentConfig,\n MultiAgentCoordinator,\n SpawnResult,\n SubagentConfig,\n SubagentContext,\n SubagentError,\n SubagentErrorKind,\n SubagentRunContext,\n SubagentRunner,\n TaskResult,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { ProviderError } from '../types/provider.js';\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\n\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\n\ninterface SubagentEntry {\n config: SubagentConfig;\n context: SubagentContext;\n status: SubagentStatus;\n currentTask?: string;\n abortController: AbortController;\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\n activeBudget?: SubagentBudget;\n}\n\nexport interface MultiAgentCoordinatorOptions {\n /**\n * Callback that executes a task on behalf of a subagent. Required for\n * `assign()` to actually run anything — without it, tasks queue forever.\n * The coordinator provides per-subagent isolation (own budget, own signal,\n * own bridge) and enforces timeout + concurrency.\n */\n runner?: SubagentRunner;\n}\n\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\n readonly coordinatorId: string;\n readonly config: MultiAgentConfig;\n private runner?: SubagentRunner;\n\n private readonly subagents = new Map<string, SubagentEntry>();\n\n private pendingTasks: TaskSpec[] = [];\n private completedResults: TaskResult[] = [];\n private totalIterations = 0;\n private inFlight = 0;\n /**\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\n * once `recordCompletion` lands the terminal TaskResult. Used by\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\n * to a subagent the caller has already asked to terminate — closes the\n * assign+terminate race where a fresh task could land on a worker that\n * was about to be killed.\n */\n private readonly terminating = new Set<string>();\n\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\n super();\n this.coordinatorId = config.coordinatorId;\n this.config = config;\n this.runner = options.runner;\n }\n\n /**\n * Replace the runner after construction. Used when the runner depends\n * on infrastructure (e.g. FleetBus) that isn't available until after\n * the coordinator's owning Director is built.\n */\n setRunner(runner: SubagentRunner): void {\n this.runner = runner;\n }\n\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\n const id = subagent.id || randomUUID();\n // Duplicate-id guard. Previously a second spawn({id}) with the\n // same id silently overwrote the existing entry — orphaning the\n // first subagent's AbortController, Context, and any in-flight\n // task referencing it. Two spawns with the same id are almost\n // always a bug at the caller; refuse and let them surface it.\n if (this.subagents.has(id)) {\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\n }\n const context: SubagentContext = {\n subagentId: id,\n tasks: [],\n // Wired later by the caller via setSubagentBridge() once the\n // bidirectional bridge is created. Readers must null-check / use\n // hasParentBridge() — the type now reflects this.\n parentBridge: null,\n doneCondition: this.config.doneCondition,\n maxConcurrent: this.config.maxConcurrent ?? 4,\n };\n\n this.subagents.set(id, {\n config: { ...subagent, id },\n context,\n status: 'idle',\n abortController: new AbortController(),\n });\n\n this.emit('subagent.started', { subagent: { ...subagent, id } });\n\n return { subagentId: id, agentId: id };\n }\n\n async assign(task: TaskSpec): Promise<void> {\n this.pendingTasks.push(task);\n this.tryDispatchNext();\n }\n\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\n const subagent = this.subagents.get(to);\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\n if (!subagent.context.parentBridge) {\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\n }\n await subagent.context.parentBridge.send(msg);\n }\n\n /**\n * Wire up the communication bridge for a subagent. Call after spawn() once\n * the caller has created the bidirectional connection.\n */\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\n subagent.context.parentBridge = bridge;\n }\n\n async stop(subagentId: string): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\n // observation in another callback path sees the intent and skips\n // this subagent. Cleared by recordCompletion once the runner's\n // catch block lands the terminal TaskResult.\n this.terminating.add(subagentId);\n\n // Abort any in-flight run, then sever the bridge so further messages fail\n // fast instead of silently queueing on a dead subagent.\n subagent.abortController.abort();\n subagent.status = 'stopped';\n subagent.currentTask = undefined;\n subagent.context.parentBridge = null;\n\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\n }\n\n async stopAll(): Promise<void> {\n // Clear the queue FIRST so no new tasks land on subagents while\n // we're tearing them down. Each dropped task gets a synthetic\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\n // delegate tool's awaitTasks) resolves instead of hanging.\n //\n // Pending tasks never reached `inFlight`, so we cannot route them\n // through `recordCompletion` — its underflow guard would short-\n // circuit on the second pending task and emit a warning instead\n // of the completion event. The shared helper inline-emits.\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\n // allSettled so one failure doesn't leave other subagents un-stopped.\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\n }\n\n getStatus(): CoordinatorStatus {\n return {\n coordinatorId: this.coordinatorId,\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\n id,\n name: s.config.name,\n status: s.status,\n currentTask: s.currentTask,\n })),\n pendingTasks: this.pendingTasks.length,\n completedTasks: this.completedResults.length,\n totalIterations: this.totalIterations,\n done: this.isDone(),\n };\n }\n\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\n results(): readonly TaskResult[] {\n return this.completedResults;\n }\n\n /**\n * Manual completion — for callers that drive subagents without a runner\n * (e.g. external orchestrators). When a runner is configured the coordinator\n * calls this itself.\n */\n completeTask(result: TaskResult): void {\n this.recordCompletion(result);\n }\n\n // --- internal dispatching ---------------------------------------------\n\n private tryDispatchNext(): void {\n while (this.canDispatch()) {\n const subagentId = this.findIdleSubagent();\n if (!subagentId) {\n // No idle worker right now. If every spawned subagent is\n // stopped or mid-termination, the pending queue is dead —\n // a pending task can never start, so synthetic-complete it\n // as `aborted_by_parent`. Without this, an `assign()` after\n // `stop()` would hang forever waiting for `task.completed`.\n // We DO NOT drain when subagents are busy (status='running'):\n // those will free up and accept the work normally.\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\n this.drainPendingAsAborted(\n 'No live subagent available — all stopped or mid-termination',\n );\n }\n return;\n }\n const task = this.pendingTasks.shift();\n if (!task) return;\n // Attach a catch so a synchronous throw inside runDispatched (rare —\n // e.g. provider misconfiguration before the first await) becomes a\n // visible failed task instead of an unhandled rejection that leaves\n // `inFlight` permanently elevated.\n this.runDispatched(subagentId, task).catch((err) => {\n this.recordCompletion({\n subagentId,\n taskId: task.id,\n status: 'failed',\n error: classifySubagentError(err),\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n });\n });\n }\n }\n\n private canDispatch(): boolean {\n const max = this.config.maxConcurrent ?? 4;\n return this.inFlight < max && this.pendingTasks.length > 0;\n }\n\n private findIdleSubagent(): string | null {\n for (const [id, s] of this.subagents) {\n // Skip subagents that are mid-termination — `stop()` set the\n // `terminating` flag and aborted the controller, but the\n // status mutation happens synchronously after; checking both\n // is belt-and-suspenders against any race where status is\n // transiently still 'idle' while termination is in flight.\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\n }\n return null;\n }\n\n /**\n * Returns true iff at least one spawned subagent could still\n * process a task. A \"live\" subagent is one that is not stopped\n * AND not mid-termination — `running` workers count because they\n * will eventually finish and become idle.\n *\n * When no subagent has ever been spawned, returns `true` so a\n * pre-spawn `assign()` simply queues (legacy behaviour). The\n * dead-end detection only fires after `stop()` has retired every\n * spawned worker.\n *\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\n */\n private hasLiveSubagent(): boolean {\n if (this.subagents.size === 0) return true;\n for (const [id, s] of this.subagents) {\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\n }\n return false;\n }\n\n /**\n * Drain every pending task with a synthetic `aborted_by_parent`\n * completion event. Same shape as the `stopAll()` drain — we go\n * around `recordCompletion` because pending tasks were never\n * counted in `inFlight` and routing them through would trip the\n * underflow guard on every task after the first.\n */\n private drainPendingAsAborted(message: string): void {\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\n for (const t of dropped) {\n const synthetic: TaskResult = {\n subagentId: t.subagentId ?? 'unassigned',\n taskId: t.id,\n status: 'stopped',\n error: {\n kind: 'aborted_by_parent',\n message,\n retryable: false,\n },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n };\n this.completedResults.push(synthetic);\n this.emit('task.completed', { task: t, result: synthetic });\n }\n }\n\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n // Final race guard: if `stop(subagentId)` ran between dispatch\n // and us arriving here, refuse to start the task and surface it\n // as `aborted_by_parent` so any caller awaiting the task id\n // unblocks. Without this, the task would be marked 'running',\n // collide with the just-completed 'stopped' state, and leak\n // inFlight by 1 because no recordCompletion path covers it.\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\n this.recordCompletion({\n subagentId,\n taskId: task.id,\n status: 'stopped',\n error: {\n kind: 'aborted_by_parent',\n message: 'Subagent was terminated before task could start',\n retryable: false,\n },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n });\n return;\n }\n\n subagent.status = 'running';\n subagent.currentTask = task.id;\n task.subagentId = subagentId;\n subagent.context.tasks.push(task);\n\n this.emit('task.assigned', { task, subagentId });\n\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\n // Precedence: task > subagent > coordinator default.\n const budget = new SubagentBudget({\n maxIterations: subagent.config.maxIterations ?? this.config.defaultBudget?.maxIterations,\n maxToolCalls:\n task.maxToolCalls ??\n subagent.config.maxToolCalls ??\n this.config.defaultBudget?.maxToolCalls,\n maxTokens: subagent.config.maxTokens ?? this.config.defaultBudget?.maxTokens,\n maxCostUsd: subagent.config.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\n timeoutMs:\n task.timeoutMs ?? subagent.config.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\n });\n subagent.activeBudget = budget;\n\n if (!this.runner) {\n // No runner wired — caller drives execution via completeTask(). Status\n // reverts when the caller reports. We intentionally don't bump\n // `inFlight` here: `completeTask` → `recordCompletion` would then\n // decrement an inFlight that runDispatched never incremented, masking\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\n // check still settles correctly once the caller reports.\n return;\n }\n\n // Only count inFlight when we actually own the execution lifecycle.\n this.inFlight++;\n\n const startTime = Date.now();\n const runCtx: SubagentRunContext = {\n subagentId,\n config: subagent.config,\n budget,\n signal: subagent.abortController.signal,\n bridge: subagent.context.parentBridge || null,\n };\n\n let result: TaskResult;\n\n budget.start();\n try {\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\n result = {\n subagentId,\n taskId: task.id,\n status: 'success',\n result: outcome.result,\n iterations: outcome.iterations,\n toolCalls: outcome.toolCalls,\n durationMs: Date.now() - startTime,\n };\n } catch (err) {\n // Order matters: a timeout calls abort() to signal cooperative runners,\n // which also flips `signal.aborted=true`. Inspect the error first so we\n // surface 'timeout' rather than masking it as 'stopped'.\n const status: TaskResult['status'] =\n err instanceof BudgetExceededError && err.kind === 'timeout'\n ? 'timeout'\n : subagent.abortController.signal.aborted\n ? 'stopped'\n : 'failed';\n const usage = budget.usage();\n result = {\n subagentId,\n taskId: task.id,\n status,\n error: classifySubagentError(err, {\n parentAborted: subagent.abortController.signal.aborted,\n }),\n iterations: usage.iterations,\n toolCalls: usage.toolCalls,\n durationMs: Date.now() - startTime,\n };\n }\n\n this.recordCompletion(result);\n }\n\n private async executeWithTimeout(\n runner: SubagentRunner,\n task: TaskSpec,\n ctx: SubagentRunContext,\n budget: SubagentBudget,\n ) {\n const timeoutMs = budget.limits.timeoutMs;\n if (timeoutMs === undefined) return runner(task, ctx);\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n // Abort the subagent's signal so cooperative runners can clean up.\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(new BudgetExceededError('timeout', timeoutMs, Date.now()));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([runner(task, ctx), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private recordCompletion(result: TaskResult): void {\n this.completedResults.push(result);\n this.totalIterations += result.iterations;\n if (this.inFlight > 0) {\n this.inFlight--;\n } else if (this.runner) {\n // Runner-driven path completed without an outstanding inFlight slot —\n // shouldn't happen unless completeTask was called externally.\n this.emit('warning', {\n type: 'inFlight_underflow',\n taskId: result.taskId,\n subagentId: result.subagentId,\n });\n return;\n }\n\n const subagent = this.subagents.get(result.subagentId);\n if (subagent && subagent.status !== 'stopped') {\n const failed = result.status === 'failed' || result.status === 'timeout';\n // Synchronously reset the worker to idle after either a clean\n // finish or a transient failure. The previous code parked the\n // subagent in 'error' and used a `queueMicrotask` to flip it\n // back to 'idle' — that opened a window where `assign()` +\n // `tryDispatchNext` could race the microtask, leaving the\n // worker stuck in 'running' state while actually idle. By\n // resetting now, no async gap can leak the state machine.\n subagent.status = 'idle';\n void failed; // kept for future telemetry hooks\n subagent.currentTask = undefined;\n // If the run aborted (timeout or explicit stop), the subagent's\n // signal is now permanently aborted — recycling the controller lets\n // the next dispatched task start with a fresh cancellation scope.\n if (subagent.abortController.signal.aborted) {\n subagent.abortController = new AbortController();\n }\n }\n // Clear the terminating flag now that the worker has a terminal\n // TaskResult on record. Subsequent stop() calls re-add it; new\n // assign() calls can flow normally.\n this.terminating.delete(result.subagentId);\n\n this.emit('task.completed', {\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\n result,\n });\n\n this.tryDispatchNext();\n\n if (this.isDone()) {\n this.emit('done', {\n results: this.completedResults,\n totalIterations: this.totalIterations,\n });\n }\n }\n\n private isDone(): boolean {\n if (this.config.doneCondition.type === 'all_tasks_done') {\n return this.pendingTasks.length === 0 && this.inFlight === 0;\n }\n if (\n this.config.doneCondition.maxIterations !== undefined &&\n this.totalIterations >= this.config.doneCondition.maxIterations\n ) {\n return true;\n }\n return false;\n }\n}\n\n/**\n * Map any raw exception thrown out of a subagent's runner into a\n * structured `SubagentError`. This is the single point where the\n * coordinator decides \"what kind of failure was that\" — so callers\n * (delegate tool output, /agents UI, retry policies) branch on\n * `kind` instead of substring-matching `error.message`.\n *\n * The classification order matters:\n * 1. Provider errors first (their `status` + `retryable` are\n * already structured, just translate to our enum).\n * 2. Budget errors next (BudgetExceededError carries a discrete\n * `kind` we can lift directly).\n * 3. Parent-abort if the subagent's signal was aborted and we\n * didn't recognize the error otherwise — distinguishes user\n * Ctrl+C from a tool throwing.\n * 4. Substring sniffing for stable error markers (\"agent\n * aborted\" from agent-subagent-runner, \"Bridge transport\"\n * from agent-bridge).\n * 5. Fallback to `unknown` so callers know we couldn't classify.\n *\n * The `cause` field is always populated when `err` is an Error so\n * diagnostics survive even when `kind === 'unknown'` — no info is\n * dropped, the classifier just refused to commit.\n *\n * Exported because tests and CLI surfaces want to assert on the\n * classification without instantiating a coordinator.\n */\nexport function classifySubagentError(\n err: unknown,\n hints: { parentAborted?: boolean } = {},\n): SubagentError {\n const cause = err instanceof Error\n ? { name: err.name, message: err.message, stack: err.stack }\n : undefined;\n const baseMessage = err instanceof Error ? err.message : String(err);\n\n if (err instanceof ProviderError) {\n return providerErrorToSubagentError(err, baseMessage, cause);\n }\n\n if (err instanceof BudgetExceededError) {\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\n iterations: 'budget_iterations',\n tool_calls: 'budget_tool_calls',\n tokens: 'budget_tokens',\n cost: 'budget_cost',\n timeout: 'budget_timeout',\n };\n return {\n kind: map[err.kind],\n message: baseMessage,\n // Budgets are user-configured ceilings, not transient failures —\n // retrying with the same budget will hit the same ceiling. The\n // orchestrator must raise the budget or narrow the task first.\n retryable: false,\n cause,\n };\n }\n\n // Distinguish parent-aborted from real failures BEFORE substring\n // sniffing — if the parent signal is aborted, the most common\n // exception is \"agent aborted\" thrown by agent-subagent-runner.\n if (hints.parentAborted) {\n return {\n kind: 'aborted_by_parent',\n message: baseMessage,\n retryable: false,\n cause,\n };\n }\n\n // Stable markers — these strings live in our own code and are\n // checked here intentionally so callers can react without\n // exception-type imports.\n const lower = baseMessage.toLowerCase();\n if (/agent aborted$/i.test(baseMessage)) {\n return {\n kind: 'aborted_by_parent',\n message: baseMessage,\n retryable: false,\n cause,\n };\n }\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\n }\n if (/empty response$/i.test(baseMessage)) {\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\n }\n // The runner throws `Error('tool failed: <name>')` when an executed tool\n // returned `ok:false` and the agent ultimately ended without recovering\n // (or aborted). Surface as `tool_failed` so callers don't conflate a\n // failed tool with a thrown tool — both are useful but mean different\n // things at the LLM layer.\n if (/^tool failed: /i.test(baseMessage)) {\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\n }\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\n }\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\n }\n\n // Final fallback — preserve cause so diagnostics aren't lost.\n return {\n kind: 'unknown',\n message: baseMessage,\n retryable: false,\n cause,\n };\n}\n\nfunction providerErrorToSubagentError(\n err: ProviderError,\n message: string,\n cause: SubagentError['cause'],\n): SubagentError {\n const status = err.status;\n // Read suggested retry-after from the provider body when present so\n // the orchestrator doesn't have to invent a backoff. Most providers\n // include retry-after as a header / body field which our provider\n // layer normalises into `body.message` — we cannot trust a numeric\n // field exists, so we leave backoffMs unset when unknown.\n if (status === 429 || err.body?.type === 'rate_limit_error') {\n return {\n kind: 'provider_rate_limit',\n message,\n retryable: true,\n // Conservative default: 5s. Provider-specific code can override\n // by emitting an error whose body carries an explicit hint.\n backoffMs: 5_000,\n cause,\n };\n }\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\n return { kind: 'provider_auth', message, retryable: false, cause };\n }\n if (status === 408 || status === 0) {\n return { kind: 'provider_timeout', message, retryable: true, cause };\n }\n if (status >= 500 && status < 600) {\n return {\n kind: 'provider_5xx',\n message,\n retryable: true,\n backoffMs: 3_000,\n cause,\n };\n }\n // Other provider errors (400 invalid request, 404 not found, etc.)\n // are not retryable as-is and don't have a dedicated kind — surface\n // as 'unknown' so the orchestrator treats them as terminal.\n return { kind: 'unknown', message, retryable: err.retryable, cause };\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { DirectorStateCheckpoint } from '../storage/director-state.js';\nimport type { BridgeMessage } from '../types/agent-bridge.js';\nimport type {\n CoordinatorStatus,\n MultiAgentConfig,\n SubagentConfig,\n SubagentRunner,\n TaskResult,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport type { SessionWriter } from '../types/session.js';\nimport type { JSONSchema, Tool } from '../types/tool.js';\nimport { InMemoryAgentBridge } from './agent-bridge.js';\nimport {\n DEFAULT_DIRECTOR_PREAMBLE,\n DEFAULT_SUBAGENT_BASELINE,\n composeDirectorPrompt,\n composeSubagentPrompt,\n rosterSummaryFromConfigs,\n} from './director-prompts.js';\nimport { FleetBus, type FleetUsage, FleetUsageAggregator } from './fleet-bus.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\nimport { DefaultMultiAgentCoordinator } from './multi-agent-coordinator.js';\n\n/**\n * Director — high-level orchestrator that owns a `MultiAgentCoordinator`,\n * a `FleetBus`, and a `FleetUsageAggregator`. Exposes a small imperative\n * API (`spawn`, `assign`, `awaitTasks`, `terminate`, `status`, `usage`)\n * that's easy to test, and a `tools()` factory that wraps the same API\n * as agent-callable `Tool`s so an LLM can drive the orchestration.\n *\n * This class is intentionally *not* an `Agent`. It's a coordinator +\n * observability surface. To make it LLM-driven, construct an Agent\n * with `director.tools()` registered. That keeps the construction\n * symmetric with how other agents are built and avoids smuggling a\n * heavy LLM dependency into core just for the director path.\n */\nexport interface DirectorOptions {\n config: MultiAgentConfig;\n runner?: SubagentRunner;\n /**\n * When set, the director writes a `fleet.json` manifest to this path\n * recording every spawned subagent (id, provider, model, role, task\n * ids). Used by `wstack replay <runId>` to rehydrate a fleet. Pass an\n * absolute file path — the directory must already exist (the\n * director-session factory creates it when used together).\n */\n manifestPath?: string;\n /**\n * Optional roster used by `leaderSystemPrompt()` to render a roles\n * summary into the leader's preamble. Same shape as the roster passed\n * to `tools()` — typically the same value.\n */\n roster?: Record<string, SubagentConfig>;\n /**\n * Override the built-in fleet preamble (see `DEFAULT_DIRECTOR_PREAMBLE`).\n * Pass an empty string to suppress the preamble entirely.\n */\n directorPreamble?: string;\n /**\n * Override the built-in subagent baseline (see\n * `DEFAULT_SUBAGENT_BASELINE`). Pass an empty string to suppress.\n */\n subagentBaseline?: string;\n /**\n * Absolute path to a directory the fleet can use as a shared scratchpad\n * (read + write by every subagent). When set, the director creates it on\n * construction and `subagentSystemPrompt()` automatically injects a\n * \"Shared notes\" block telling subagents where to drop their findings.\n * This is the cheap fleet-coordination channel — agents don't need each\n * other's transcripts, just each other's conclusions.\n *\n * Convention: under a fleet run rooted at `<sessionsRoot>/<runId>/`,\n * pass `<sessionsRoot>/<runId>/shared/` here.\n */\n sharedScratchpadPath?: string;\n /**\n * Maximum number of spawns this director can perform across its\n * lifetime. Default: unlimited. Acts as a hard fleet-wide cost cap —\n * a runaway leader that keeps spawning workers gets cut off cleanly\n * instead of burning provider tokens until the user kills the\n * process. The N+1-th spawn call rejects with a `DirectorBudgetError`.\n */\n maxSpawns?: number;\n /**\n * Maximum nesting depth for spawns. The director constructed by the\n * user is at depth `spawnDepth` (default 0); any subagent that itself\n * acts as a director would construct its own `Director` with\n * `spawnDepth: parent.spawnDepth + 1`. When `spawnDepth >= maxSpawnDepth`,\n * `spawn()` rejects. Default: 2 (root director can spawn workers; a\n * worker that becomes a sub-director cannot itself spawn further).\n * This stops infinite recursive director chains from a hostile or\n * confused prompt.\n */\n maxSpawnDepth?: number;\n /**\n * Current spawn-chain depth for this director instance. Defaults to 0.\n * A nested director should pass `parent.spawnDepth + 1`. Together with\n * `maxSpawnDepth` this bounds the chain.\n */\n spawnDepth?: number;\n /**\n * Absolute path to a director-state checkpoint file. When set, the\n * director writes an incremental snapshot of pending/running/completed\n * tasks + spawned subagents on every state mutation. Distinct from\n * `manifestPath`: the manifest is a final record written on shutdown,\n * the checkpoint is a live mirror useful for crash recovery and the\n * `wstack resume` \"you had N tasks in flight\" banner.\n */\n stateCheckpointPath?: string;\n /**\n * Session writer the director should forward task lifecycle events to\n * (`agent_spawned`, `task_created`, `task_completed`, `task_failed`).\n * When omitted these events stay in-memory only — useful for tests but\n * lossy in production. Production callers (the CLI) pass the same\n * writer the host Agent uses so all events land in a single JSONL.\n */\n sessionWriter?: SessionWriter;\n /**\n * Debounce window for periodic manifest writes triggered by spawn/\n * assign/complete events. Default: 2000ms. Pass 0 to disable periodic\n * writes (the manifest will then only be written on `shutdown()`).\n */\n manifestDebounceMs?: number;\n}\n\n/**\n * Thrown by `Director.spawn()` when a configured spawn cap (`maxSpawns`,\n * `maxSpawnDepth`) is hit. Distinct error class so callers — including\n * the `spawn_subagent` tool surface — can recognize the budget case and\n * report it cleanly instead of treating it like an unexpected failure.\n */\nexport class DirectorBudgetError extends Error {\n readonly kind: 'max_spawns' | 'max_spawn_depth';\n readonly limit: number;\n readonly observed: number;\n constructor(kind: 'max_spawns' | 'max_spawn_depth', limit: number, observed: number) {\n super(\n kind === 'max_spawns'\n ? `Director spawn budget exceeded: tried to spawn #${observed} but maxSpawns is ${limit}`\n : `Director spawn depth budget exceeded: this director is at depth ${observed} and maxSpawnDepth is ${limit}`,\n );\n this.name = 'DirectorBudgetError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport class Director {\n readonly id: string;\n readonly fleet: FleetBus;\n readonly usage: FleetUsageAggregator;\n /**\n * Director-side bridge endpoint. Subagents are wired to the same\n * in-memory transport so the director can `ask()` them synchronously\n * and they can `send()` progress back. Exposed so external code (e.g.\n * the TUI) can subscribe to inbound messages.\n */\n readonly bridge: InMemoryAgentBridge;\n private readonly transport: InMemoryBridgeTransport;\n private readonly coordinator: DefaultMultiAgentCoordinator;\n /** Resolves with the matching `TaskResult` the first time the\n * coordinator emits `task.completed` for a given task id. Each entry\n * is created lazily on first poll/await and cleared once consumed. */\n private readonly taskWaiters = new Map<\n string,\n {\n promise: Promise<TaskResult>;\n resolve: (r: TaskResult) => void;\n }\n >();\n /** Cache of completed results in case the consumer asks AFTER the\n * coordinator already fired the event — `awaitTasks(['t-1'])` after\n * t-1 finished should resolve immediately, not hang. */\n private readonly completed = new Map<string, TaskResult>();\n /** Per-subagent provider/model metadata, captured at spawn time so the\n * FleetUsageAggregator's metaLookup can surface readable rows. */\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\n private readonly priceLookups = new Map<\n string,\n { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }\n >();\n /** Bridge endpoints we created per subagent (so we can `stop()` them\n * on shutdown and free transport subscriptions). */\n private readonly subagentBridges = new Map<string, InMemoryAgentBridge>();\n /** Tracks per-spawn config + assigned task ids for manifest writing. */\n private readonly manifestEntries = new Map<\n string,\n {\n subagentId: string;\n name: string;\n role?: string;\n provider?: string;\n model?: string;\n taskIds: string[];\n }\n >();\n private readonly manifestPath?: string;\n private readonly roster?: Record<string, SubagentConfig>;\n private readonly directorPreamble: string;\n private readonly subagentBaseline: string;\n /** Absolute path to the fleet's shared scratchpad directory, or null\n * when none was configured. Exposed as a readonly getter for callers\n * that need to surface the path to the user (e.g. the CLI logging\n * the location after `--director` boots). */\n readonly sharedScratchpadPath: string | null;\n /** Spawn cap (lifetime total). Infinity means unlimited. */\n readonly maxSpawns: number;\n /** Nesting cap. The N-th director in a chain has `spawnDepth = N-1`. */\n readonly maxSpawnDepth: number;\n /** This director's position in a director chain. Root director = 0. */\n readonly spawnDepth: number;\n /** Live spawn counter for `maxSpawns` enforcement. */\n private spawnCount = 0;\n /** Optional checkpoint mirror — writes the live task graph + roster to disk. */\n private readonly stateCheckpoint: DirectorStateCheckpoint | null;\n /** Optional session writer for emitting task_* / agent_* lifecycle events. */\n private readonly sessionWriter: SessionWriter | null;\n /** Debounce timer for periodic manifest writes. */\n private manifestTimer: NodeJS.Timeout | null = null;\n private readonly manifestDebounceMs: number;\n /** Resolves task descriptions back from `assign()` so completion events\n * can also carry a human-readable title. */\n private readonly taskDescriptions = new Map<string, string>();\n /** Snapshot of which subagent owns each task — drives state-checkpoint\n * status updates without re-walking the manifest. */\n private readonly taskOwners = new Map<string, string>();\n /**\n * Handle to the coordinator-side `task.completed` listener so we can\n * unsubscribe in `shutdown()`. Without this, repeated Director\n * construction (e.g. tests, hot reloads) accumulates listeners on a\n * cached coordinator and slowly drifts the EventEmitter past its\n * default cap.\n */\n private taskCompletedListener: ((payload: { task: TaskSpec; result: TaskResult }) => void) | null = null;\n\n constructor(opts: DirectorOptions) {\n this.id = opts.config.coordinatorId || randomUUID();\n this.manifestPath = opts.manifestPath;\n this.roster = opts.roster;\n this.directorPreamble = opts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n this.subagentBaseline = opts.subagentBaseline ?? DEFAULT_SUBAGENT_BASELINE;\n this.sharedScratchpadPath = opts.sharedScratchpadPath ?? null;\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\n this.spawnDepth = opts.spawnDepth ?? 0;\n this.sessionWriter = opts.sessionWriter ?? null;\n this.manifestDebounceMs = opts.manifestDebounceMs ?? 2000;\n this.stateCheckpoint = opts.stateCheckpointPath\n ? new DirectorStateCheckpoint(opts.stateCheckpointPath, {\n directorRunId: this.id,\n maxSpawns: opts.maxSpawns,\n spawnDepth: this.spawnDepth,\n maxSpawnDepth: this.maxSpawnDepth,\n })\n : null;\n if (this.sharedScratchpadPath) {\n // Create the directory eagerly so subagents that try to write\n // there on first iteration don't trip on ENOENT. Fire-and-forget;\n // any failure surfaces later when an agent actually writes.\n void fsp.mkdir(this.sharedScratchpadPath, { recursive: true }).catch(() => undefined);\n }\n this.transport = new InMemoryBridgeTransport();\n this.bridge = new InMemoryAgentBridge(\n { agentId: this.id, coordinatorId: this.id },\n this.transport,\n );\n this.fleet = new FleetBus();\n this.usage = new FleetUsageAggregator(\n this.fleet,\n (id) => this.priceLookups.get(id),\n (id) => this.subagentMeta.get(id),\n );\n this.coordinator = new DefaultMultiAgentCoordinator(\n { ...opts.config, coordinatorId: this.id },\n { runner: opts.runner },\n );\n // Mirror coordinator completion events into the waiter table. This\n // lets `awaitTasks([...])` resolve on the *next* completion event\n // without polling — and the `completed` cache covers the case where\n // a caller asks after the fact.\n //\n // The listener is captured in a field (`taskCompletedListener`) so\n // `shutdown()` can `coordinator.off(...)` it cleanly — otherwise\n // repeated Director construction against a cached coordinator\n // (tests, hot reloads) leaks listeners and eventually trips\n // EventEmitter's max-listener warning.\n this.taskCompletedListener = (payload: { task: TaskSpec; result: TaskResult }) => {\n const r = payload.result;\n this.completed.set(r.taskId, r);\n const waiter = this.taskWaiters.get(r.taskId);\n if (waiter) {\n waiter.resolve(r);\n this.taskWaiters.delete(r.taskId);\n }\n // Mirror into the on-disk checkpoint + session event stream so a\n // crashed director leaves a complete picture of which tasks landed.\n const title = this.taskDescriptions.get(r.taskId) ?? payload.task.description ?? r.taskId;\n const failed = r.status !== 'success';\n // Disk-side state-checkpoint and session JSONL both store `error`\n // as a string for historical reasons. The structured SubagentError\n // envelope carries `kind`, `message`, `retryable`, etc. — flatten\n // to a `kind: message` string here so old readers stay valid and\n // grep-friendly. The full envelope is still available live via\n // the EventBus / TaskResult to in-process consumers.\n const errorString = r.error\n ? `${r.error.kind}: ${r.error.message}`\n : undefined;\n this.stateCheckpoint?.recordTaskStatus(r.taskId, {\n status: failed ? (r.status as 'failed' | 'timeout' | 'stopped') : 'completed',\n completedAt: new Date().toISOString(),\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n error: errorString,\n });\n this.stateCheckpoint?.setUsage(this.usage.snapshot());\n void this.appendSessionEvent(\n failed\n ? {\n type: 'task_failed',\n ts: new Date().toISOString(),\n taskId: r.taskId,\n title,\n error: errorString ?? r.status,\n }\n : {\n type: 'task_completed',\n ts: new Date().toISOString(),\n taskId: r.taskId,\n title,\n },\n );\n this.scheduleManifest();\n };\n this.coordinator.on('task.completed', this.taskCompletedListener);\n }\n\n /** Best-effort session-writer append. Swallows failures — the director\n * must not break a fleet run because the session JSONL handle closed. */\n private async appendSessionEvent(event: Parameters<SessionWriter['append']>[0]): Promise<void> {\n if (!this.sessionWriter) return;\n try {\n await this.sessionWriter.append(event);\n } catch {\n // ignore\n }\n }\n\n /** Debounced manifest writer. A burst of spawn/assign/complete events\n * collapses into one write. Set `manifestDebounceMs` to 0 to disable. */\n private scheduleManifest(): void {\n if (!this.manifestPath || this.manifestDebounceMs <= 0) return;\n if (this.manifestTimer) return;\n this.manifestTimer = setTimeout(() => {\n this.manifestTimer = null;\n void this.writeManifest().catch(() => undefined);\n }, this.manifestDebounceMs);\n }\n\n /**\n * Spawn a subagent. Identical to the coordinator's `spawn()` but\n * captures provider/model metadata for the usage aggregator and\n * lets the FleetBus attach to the runner's EventBus when the task\n * actually runs (see `attachSubagentBus`).\n *\n * Caller-supplied `priceLookup` is optional but recommended — without\n * it the `cost` column in `usage.snapshot()` stays at 0.\n */\n async spawn(\n config: SubagentConfig,\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\n ): Promise<string> {\n // Enforce safety caps BEFORE touching the coordinator — a refused\n // spawn must not leak partial state into the manifest or fleet bus.\n if (this.spawnDepth >= this.maxSpawnDepth) {\n throw new DirectorBudgetError('max_spawn_depth', this.maxSpawnDepth, this.spawnDepth);\n }\n if (this.spawnCount >= this.maxSpawns) {\n throw new DirectorBudgetError('max_spawns', this.maxSpawns, this.spawnCount + 1);\n }\n this.spawnCount += 1;\n const result = await this.coordinator.spawn(config);\n this.subagentMeta.set(result.subagentId, {\n provider: config.provider,\n model: config.model,\n });\n if (priceLookup) this.priceLookups.set(result.subagentId, priceLookup);\n // Auto-wire a bridge per spawn — same transport as the director, so\n // `director.ask(subagentId, …)` and the subagent's own `bridge.send()`\n // round-trip without the caller having to plumb anything. Runners\n // grab their bridge from `ctx.bridge` (already populated by the\n // coordinator from `subagent.context.parentBridge`).\n const subagentBridge = new InMemoryAgentBridge(\n { agentId: result.subagentId, coordinatorId: this.id },\n this.transport,\n );\n this.coordinator.setSubagentBridge(result.subagentId, subagentBridge);\n this.subagentBridges.set(result.subagentId, subagentBridge);\n // Record for manifest. Task ids attach as they're assigned via\n // `assign()` below.\n this.manifestEntries.set(result.subagentId, {\n subagentId: result.subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n taskIds: [],\n });\n // Live state checkpoint + session event so crash recovery and the\n // resume banner both see this spawn even before any task is assigned.\n const spawnedAt = new Date().toISOString();\n this.stateCheckpoint?.recordSpawn(\n {\n id: result.subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n spawnedAt,\n },\n this.spawnCount,\n );\n void this.appendSessionEvent({\n type: 'agent_spawned',\n ts: spawnedAt,\n agentId: result.subagentId,\n role: config.role ?? config.name,\n });\n this.scheduleManifest();\n return result.subagentId;\n }\n\n /**\n * Synchronously ask a subagent something via the bridge. Sends a\n * `task` message addressed to the subagent and awaits a matching\n * reply (matched by message id). Subagent runners that handle these\n * requests subscribe to `ctx.bridge` and reply with a message whose\n * `id` equals the incoming request's id (see `InMemoryAgentBridge`'s\n * `request<T>` implementation).\n *\n * Returns the response payload directly (the bridge wrapper is\n * unwrapped for ergonomics). Times out after `timeoutMs` (default\n * matches the bridge's own default of 30s) — surface those rejections\n * to the caller as actionable errors instead of letting tools hang.\n */\n async ask<T = unknown>(subagentId: string, payload: unknown, timeoutMs?: number): Promise<T> {\n if (!this.subagentBridges.has(subagentId)) {\n throw new Error(\n `ask: unknown subagent \"${subagentId}\" (spawn() it first; current fleet: ${Array.from(this.subagentBridges.keys()).join(', ') || '(empty)'})`,\n );\n }\n const msg: BridgeMessage = {\n id: randomUUID(),\n type: 'task',\n from: this.id,\n to: subagentId,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n const reply = await this.bridge.request<T>(msg, timeoutMs);\n return reply.payload;\n }\n\n /**\n * Read completed task results and format them as a structured text\n * block the director's LLM can paste into its own context. The\n * Director keeps every completed `TaskResult` in `completed` so this\n * is a pure read — no bridge round-trip, cheap to call.\n *\n * The returned string is intentionally markdown-flavored: headers per\n * subagent, a one-line meta row (iter / tools / ms), and the task's\n * result text. Pass `style: 'json'` for a programmatic shape instead\n * (useful when the director model is doing structured-output work).\n */\n rollUp(taskIds: string[], style: 'markdown' | 'json' = 'markdown'): string {\n const rows = taskIds.map((id) => this.completed.get(id)).filter((r): r is TaskResult => !!r);\n if (style === 'json') {\n return JSON.stringify(\n rows.map((r) => ({\n taskId: r.taskId,\n subagentId: r.subagentId,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n result: r.result,\n error: r.error,\n })),\n null,\n 2,\n );\n }\n if (rows.length === 0) {\n return '_No completed tasks for the requested ids — try waiting first._';\n }\n const lines: string[] = [];\n for (const r of rows) {\n const meta = this.subagentMeta.get(r.subagentId);\n const tag = meta?.provider && meta?.model ? ` · ${meta.provider}/${meta.model}` : '';\n lines.push(`### ${r.subagentId}${tag}`);\n lines.push(`_${r.status} — ${r.iterations} iter · ${r.toolCalls} tools · ${r.durationMs}ms_`);\n lines.push('');\n if (r.error) lines.push(`**Error:** ${r.error}`);\n else if (typeof r.result === 'string') lines.push(r.result);\n else if (r.result !== undefined)\n lines.push('```json\\n' + JSON.stringify(r.result, null, 2) + '\\n```');\n else lines.push('_(no output)_');\n lines.push('');\n }\n return lines.join('\\n').trimEnd();\n }\n\n /**\n * Write the fleet manifest to `manifestPath`. Returns the path written\n * or null when no path was configured. Captures every spawn + its\n * assigned tasks — paired with per-subagent JSONLs, this is enough to\n * replay an entire director run.\n */\n async writeManifest(): Promise<string | null> {\n if (!this.manifestPath) return null;\n const manifest = {\n directorRunId: this.id,\n writtenAt: new Date().toISOString(),\n children: Array.from(this.manifestEntries.values()).map((e) => ({\n ...e,\n // Surface final status from `completed` when available — manifest\n // becomes much more useful for replay when it carries the\n // success/failure state.\n results: e.taskIds.map((tid) => {\n const r = this.completed.get(tid);\n return r\n ? {\n taskId: tid,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n }\n : { taskId: tid, status: 'pending' as const };\n }),\n })),\n usage: this.usage.snapshot(),\n };\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\n await fsp.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\n return this.manifestPath;\n }\n\n /**\n * Tear down the director: stop every subagent, close every bridge\n * endpoint, and (when configured) write the final manifest. Idempotent\n * — calling shutdown twice is a no-op on the second invocation.\n */\n async shutdown(): Promise<void> {\n if (this.manifestTimer) {\n clearTimeout(this.manifestTimer);\n this.manifestTimer = null;\n }\n // Detach the coordinator-side task.completed listener so a Director\n // that lives shorter than its coordinator (rare but possible in\n // tests + delegate auto-promotion) doesn't leak the closure on\n // the EventEmitter for the coordinator's remaining lifetime.\n if (this.taskCompletedListener) {\n this.coordinator.off('task.completed', this.taskCompletedListener);\n this.taskCompletedListener = null;\n }\n await this.coordinator.stopAll();\n for (const b of this.subagentBridges.values()) {\n await b.stop().catch((err) => this.logShutdownError('subagent_bridge_stop', err));\n }\n this.subagentBridges.clear();\n await this.bridge.stop().catch((err) => this.logShutdownError('director_bridge_stop', err));\n if (this.manifestPath)\n await this.writeManifest().catch((err) => this.logShutdownError('manifest_write', err));\n if (this.stateCheckpoint) {\n this.stateCheckpoint.setUsage(this.usage.snapshot());\n await this.stateCheckpoint\n .flush()\n .catch((err) => this.logShutdownError('state_checkpoint_flush', err));\n }\n }\n\n /**\n * Funnel for shutdown-phase errors. We can't throw — `shutdown()` is\n * called from process-exit paths where an uncaught throw would lose\n * the manifest write that comes after. But we MUST NOT silently\n * swallow either — a persistent bridge-close failure would otherwise\n * mask a real bug. `process.emitWarning` is the right tier:\n * surfaces on stderr by default, lets the host plug a warning\n * listener for structured collection, and never affects exit code.\n */\n private logShutdownError(phase: string, err: unknown): void {\n const detail = err instanceof Error ? err.message : String(err);\n process.emitWarning(\n `Director shutdown phase \"${phase}\" failed: ${detail}`,\n 'DirectorShutdownWarning',\n );\n }\n\n /**\n * Hand a task to the coordinator. Returns the assigned task id so\n * callers can wait on it via `awaitTasks([id])`. The coordinator's\n * concurrency limit applies — the task may queue before running.\n */\n async assign(task: TaskSpec): Promise<string> {\n const taskWithId: TaskSpec = task.id ? task : { ...task, id: randomUUID() };\n if (task.subagentId) {\n const entry = this.manifestEntries.get(task.subagentId);\n if (entry) entry.taskIds.push(taskWithId.id);\n }\n await this.coordinator.assign(taskWithId);\n // Snapshot task metadata for completion-event titles + state checkpoint\n // bookkeeping. Done AFTER coordinator.assign() so we don't checkpoint a\n // task the coordinator rejected.\n this.taskDescriptions.set(taskWithId.id, taskWithId.description);\n if (taskWithId.subagentId) this.taskOwners.set(taskWithId.id, taskWithId.subagentId);\n const assignedAt = new Date().toISOString();\n this.stateCheckpoint?.recordTaskAssigned({\n taskId: taskWithId.id,\n subagentId: taskWithId.subagentId,\n description: taskWithId.description,\n status: 'running',\n assignedAt,\n });\n void this.appendSessionEvent({\n type: 'task_created',\n ts: assignedAt,\n taskId: taskWithId.id,\n title: taskWithId.description,\n });\n this.scheduleManifest();\n return taskWithId.id;\n }\n\n /**\n * Block until every task id resolves. Returns results in the same\n * order as the input. If any task hasn't completed by the time this\n * is called, the promise hangs until it does — pair with a timeout\n * at the caller if that's a concern. Resolves immediately for ids\n * whose results were already cached.\n */\n awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\n return Promise.all(\n taskIds.map((id) => {\n const cached = this.completed.get(id);\n if (cached) return cached;\n const existing = this.taskWaiters.get(id);\n if (existing) return existing.promise;\n let resolve!: (r: TaskResult) => void;\n const promise = new Promise<TaskResult>((res) => {\n resolve = res;\n });\n this.taskWaiters.set(id, { promise, resolve });\n return promise;\n }),\n );\n }\n\n async terminate(subagentId: string): Promise<void> {\n await this.coordinator.stop(subagentId);\n }\n\n async terminateAll(): Promise<void> {\n await this.coordinator.stopAll();\n }\n\n status(): CoordinatorStatus {\n return this.coordinator.getStatus();\n }\n\n /**\n * Subscribe to coordinator events. Currently only `task.completed` is\n * exposed (the others are internal lifecycle). Returns an unsubscribe\n * function. External callers (e.g. the CLI's `MultiAgentHost`) use this\n * to drive their own pending/results tracking without poking the\n * coordinator directly.\n */\n on(\n event: 'task.completed',\n handler: (payload: { task: TaskSpec; result: TaskResult }) => void,\n ): () => void {\n // EventEmitter.on returns `this`; wrap so callers get a stable\n // unsubscribe closure (matches the rest of our event API).\n this.coordinator.on(event, handler);\n return () => {\n this.coordinator.off(event, handler);\n };\n }\n\n /**\n * Snapshot of every task that has resolved (success, failed, timeout,\n * stopped) since the director started. Returned in completion order\n * via the internal map's iteration order. Used by `/fleet status` to\n * paint the completed table without reaching into private state.\n */\n completedResults(): TaskResult[] {\n return Array.from(this.completed.values());\n }\n\n snapshot(): FleetUsage {\n return this.usage.snapshot();\n }\n\n /**\n * Look up provider/model metadata for a spawned subagent. Returns\n * undefined when the subagent id is unknown (not yet spawned, or\n * already torn down). Callers — notably the TUI fleet panel — use\n * this to render human-readable provider/model tags next to each\n * subagent row without reaching into private state.\n */\n getSubagentMeta(id: string): { provider?: string; model?: string; name?: string } | undefined {\n const usage = this.subagentMeta.get(id);\n const manifest = this.manifestEntries.get(id);\n if (!usage && !manifest) return undefined;\n return {\n provider: usage?.provider ?? manifest?.provider,\n model: usage?.model ?? manifest?.model,\n name: manifest?.name,\n };\n }\n\n /**\n * Compose the leader/director-agent system prompt: fleet preamble +\n * (optional) roster summary + user base prompt. Pass the result to your\n * leader Agent's `ctx.systemPrompt` when constructing it.\n *\n * `basePrompt` defaults to `config.leaderSystemPrompt` so callers can\n * use the no-arg form when the multi-agent config already carries it.\n */\n leaderSystemPrompt(basePrompt?: string): string {\n return composeDirectorPrompt({\n basePrompt: basePrompt ?? this.coordinator.config.leaderSystemPrompt,\n directorPreamble: this.directorPreamble,\n rosterSummary: this.roster ? rosterSummaryFromConfigs(this.roster) : undefined,\n });\n }\n\n /**\n * Compose a subagent's system prompt for a given `SubagentConfig`:\n * baseline + role + task + per-spawn override. Returned by value — does\n * not mutate the config. Factories (the user-supplied `AgentFactory`)\n * should call this when building each subagent's Agent so the bridge\n * contract, role context, and override are all surfaced.\n *\n * When `taskBrief` is omitted the Task section is dropped. Pass the\n * actual task description here to reinforce it in the system prompt\n * (the runner already passes it as user input — duplicating in the\n * system prompt is optional but improves anchoring on small models).\n */\n subagentSystemPrompt(config: SubagentConfig, taskBrief?: string): string {\n return composeSubagentPrompt({\n baseline: this.subagentBaseline,\n role: config.prompt,\n task: taskBrief,\n sharedScratchpad: this.sharedScratchpadPath ?? undefined,\n override: config.systemPromptOverride,\n });\n }\n\n /**\n * Build the tool set the LLM-driven director uses to orchestrate.\n * Returns an array of `Tool` definitions; register these on the\n * director's `Agent` to expose `spawn_subagent`, `assign_task`, etc.\n * Each tool's `execute()` delegates straight to the matching method\n * above.\n *\n * Tools all carry `permission: 'auto'` — the *user* has already\n * approved running the director when they kicked off the run, so\n * gating individual orchestration calls behind a confirm prompt\n * would just be noise. The actual subagent tools they spawn are\n * still permission-checked normally.\n */\n tools(roster?: Record<string, SubagentConfig>): Tool[] {\n const t: Tool[] = [\n makeSpawnTool(this, roster),\n makeAssignTool(this),\n makeAwaitTasksTool(this),\n makeAskTool(this),\n makeRollUpTool(this),\n makeTerminateTool(this),\n makeFleetStatusTool(this),\n makeFleetUsageTool(this),\n ];\n return t;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Director-facing tool factories.\n//\n// Each tool's input schema is intentionally minimal — the director model\n// reads the descriptions and gets clean structured shapes. We avoid deep\n// nested schemas because they confuse smaller models.\n\nfunction makeSpawnTool(director: Director, roster?: Record<string, SubagentConfig>): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n role: {\n type: 'string',\n description:\n 'Roster role id (preferred). When set, the spawn uses the matching config from the roster and ignores other fields.',\n },\n name: {\n type: 'string',\n description: 'Display name for the subagent. Required when not using roster.',\n },\n provider: {\n type: 'string',\n description:\n 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the leader provider when omitted.',\n },\n model: {\n type: 'string',\n description: 'Model id within the provider. Defaults to the leader model when omitted.',\n },\n systemPromptOverride: {\n type: 'string',\n description: 'Extra prompt text appended after the role-base prompt.',\n },\n maxIterations: { type: 'number' },\n maxToolCalls: { type: 'number' },\n maxCostUsd: { type: 'number' },\n },\n required: [],\n };\n return {\n name: 'spawn_subagent',\n description:\n 'Create a new subagent under this director. Returns the subagent id. Use this when you need a worker with a specific provider, model, or role to handle a piece of the plan.',\n usageHint:\n 'Either pass `role` (matches the roster) OR pass `name` + optional `provider`/`model`. Returns `{ subagentId }`.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = (input ?? {}) as Record<string, unknown>;\n const role = typeof i.role === 'string' ? i.role : undefined;\n const base: SubagentConfig | undefined = role && roster ? roster[role] : undefined;\n if (role && !base) {\n return {\n error: `unknown role \"${role}\". roster has: ${roster ? Object.keys(roster).join(', ') : '(empty)'}`,\n };\n }\n const cfg: SubagentConfig = {\n ...(base ?? { name: (i.name as string) ?? 'subagent' }),\n };\n if (typeof i.name === 'string') cfg.name = i.name;\n if (typeof i.provider === 'string') cfg.provider = i.provider;\n if (typeof i.model === 'string') cfg.model = i.model;\n if (typeof i.systemPromptOverride === 'string')\n cfg.systemPromptOverride = i.systemPromptOverride;\n if (typeof i.maxIterations === 'number') cfg.maxIterations = i.maxIterations;\n if (typeof i.maxToolCalls === 'number') cfg.maxToolCalls = i.maxToolCalls;\n if (typeof i.maxCostUsd === 'number') cfg.maxCostUsd = i.maxCostUsd;\n try {\n const subagentId = await director.spawn(cfg);\n return { subagentId, provider: cfg.provider, model: cfg.model, name: cfg.name };\n } catch (err) {\n // Surface DirectorBudgetError (and any other spawn failure) as a\n // structured `{ error, kind }` payload so the leader model can\n // read the cap and replan — throwing would tear down the whole\n // tool call and give the model no signal to recover from.\n if (err instanceof DirectorBudgetError) {\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\n }\n return { error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeAssignTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Target subagent id. Required.' },\n description: {\n type: 'string',\n description: 'The task in natural language — what you want this subagent to do.',\n },\n maxToolCalls: { type: 'number', description: 'Optional per-task tool-call budget override.' },\n timeoutMs: { type: 'number', description: 'Optional per-task timeout in ms.' },\n },\n required: ['subagentId', 'description'],\n };\n return {\n name: 'assign_task',\n description:\n 'Hand a task to a previously spawned subagent. Returns the task id — pass it to `await_tasks` to block on completion.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as {\n subagentId: string;\n description: string;\n maxToolCalls?: number;\n timeoutMs?: number;\n };\n const task: TaskSpec = {\n id: randomUUID(),\n description: i.description,\n subagentId: i.subagentId,\n maxToolCalls: i.maxToolCalls,\n timeoutMs: i.timeoutMs,\n };\n const taskId = await director.assign(task);\n return { taskId, subagentId: i.subagentId };\n },\n };\n}\n\nfunction makeAwaitTasksTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'One or more task ids returned by `assign_task`. The call blocks until every id resolves.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'await_tasks',\n description:\n 'Block until every named task completes. Returns the array of TaskResult — use this to gather subagent output before deciding the next step.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[] };\n const results = await director.awaitTasks(i.taskIds);\n return { results };\n },\n };\n}\n\nfunction makeAskTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: {\n type: 'string',\n description: 'Subagent to ask. Must be a previously spawned id.',\n },\n question: {\n type: 'string',\n description: 'The question or instruction. Sent as the bridge message payload.',\n },\n timeoutMs: { type: 'number', description: 'Optional timeout in ms (default 30s).' },\n },\n required: ['subagentId', 'question'],\n };\n return {\n name: 'ask_subagent',\n description:\n 'Synchronously ask a subagent a question. Blocks until the subagent replies via the bridge (or the timeout fires). Use this when you need a one-shot answer without spawning a fresh task.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string; question: string; timeoutMs?: number };\n try {\n const answer = await director.ask(i.subagentId, { question: i.question }, i.timeoutMs);\n return { ok: true, answer };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeRollUpTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Completed task ids to aggregate. Pass the ids returned by previous `assign_task` calls.',\n },\n style: {\n type: 'string',\n enum: ['markdown', 'json'],\n description:\n 'Output flavor — markdown (default) for in-prompt summarization, json for structured downstream processing.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'roll_up',\n description:\n \"Aggregate completed task results into a single formatted summary. Use this after `await_tasks` to fold subagent outputs back into the director's context before deciding the next step.\",\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[]; style?: 'markdown' | 'json' };\n const summary = director.rollUp(i.taskIds, i.style ?? 'markdown');\n return { summary, count: i.taskIds.length };\n },\n };\n}\n\nfunction makeTerminateTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Subagent to abort.' },\n },\n required: ['subagentId'],\n };\n return {\n name: 'terminate_subagent',\n description:\n 'Forcibly abort a subagent. Use sparingly — prefer waiting on the natural budget to expire. The current task (if any) ends with status \"stopped\".',\n permission: 'auto',\n mutating: true,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string };\n await director.terminate(i.subagentId);\n return { ok: true };\n },\n };\n}\n\nfunction makeFleetStatusTool(director: Director): Tool {\n return {\n name: 'fleet_status',\n description:\n \"Snapshot of the fleet — every subagent's current status, pending vs. completed task counts, and the running total iteration count. Cheap; call freely.\",\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.status();\n },\n };\n}\n\nfunction makeFleetUsageTool(director: Director): Tool {\n return {\n name: 'fleet_usage',\n description:\n 'Token + cost breakdown across the fleet, per-subagent and totals. Use this to reason about which workers to assign costly tasks to or when to wrap up to stay within budget.',\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.snapshot();\n },\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\nimport type { JSONSchema, Tool } from '../types/tool.js';\nimport type { Director } from './director.js';\n\n/**\n * Opaque host interface so this factory doesn't have to depend on the\n * CLI's `MultiAgentHost`. Any caller that exposes the same three\n * methods can wire `delegate` — including test doubles.\n */\nexport interface DelegateHost {\n /** True if a Director is already attached and running. */\n isDirectorMode(): boolean;\n /** Build (or return the cached) Director when director mode is on. */\n ensureDirector(): Promise<Director | null>;\n /**\n * Force-promote a non-director session into director mode at runtime.\n * Returns the Director, or null when promotion is impossible (e.g. a\n * non-director coordinator has already spawned subagents in the\n * legacy code path).\n */\n promoteToDirector(): Promise<Director | null>;\n /**\n * Optional: when promotion fails, return the human-readable reason.\n * Used to render an actionable error to the calling model instead of\n * the prior opaque \"Director could not be activated\" message.\n * Implementations may return null when they don't track the reason.\n */\n getPromotionBlockReason?(): string | null;\n}\n\nexport interface CreateDelegateToolOptions {\n host: DelegateHost;\n /**\n * Roster used to resolve `role` strings into full `SubagentConfig`s.\n * Typically `FLEET_ROSTER`. When omitted, `delegate({ role })` calls\n * fail and only the explicit `name + provider + model` path works.\n */\n roster?: Record<string, SubagentConfig>;\n /**\n * Default await timeout in milliseconds. `delegate` blocks until the\n * subagent's task resolves; without a cap, a stuck worker would hang\n * the host indefinitely. Set generously (default: 4 hours) so the\n * orchestrator can run multi-step refactors / monorepo audits\n * without being killed for being slow — the orchestrator must\n * decide per-call when a task needs to be cut short.\n */\n defaultTimeoutMs?: number;\n /**\n * Absolute directory under which per-subagent JSONL transcripts live —\n * matches `MultiAgentHostOptions.sessionsRoot`. When set, the delegate\n * tool reads the subagent's transcript on timeout / budget-exhaustion\n * to extract partial output, so the host LLM gets *something* useful\n * back instead of just an error.\n */\n sessionsRoot?: string;\n /**\n * The directorRunId used to namespace transcripts (typically the host\n * session id). Combined with `sessionsRoot` to locate per-subagent\n * JSONLs at `<sessionsRoot>/<runId>/<subagentId>.jsonl`.\n */\n directorRunId?: string;\n}\n\n/**\n * `delegate` — the only multi-agent tool a regular (non-director) agent\n * ever needs. It bundles spawn + assign + await into a single call and\n * transparently auto-promotes the host into director mode on first use.\n *\n * The model never has to ask \"are we in director mode?\" — it just calls\n * `delegate({ role, task })` and gets back a `TaskResult`. The cost of\n * that ergonomic packaging is that `delegate` cannot be used for\n * parallel work as-is; the model must fire multiple `delegate` calls in\n * parallel through the provider's parallel-tool-call surface, or escalate\n * to the explicit `spawn_subagent` + `assign_task` + `await_tasks` flow\n * when it wants fan-out it controls itself.\n */\nexport function createDelegateTool(opts: CreateDelegateToolOptions): Tool {\n // 4 hours by default. The previous 5-minute default killed any\n // non-trivial fan-out (monorepo audits, multi-file refactors) and\n // forced the orchestrator to constantly pass an explicit timeoutMs.\n // The right model here: the orchestrator should pick a tight value\n // only when it knows the work is small; otherwise let it run.\n const defaultTimeoutMs = opts.defaultTimeoutMs ?? 4 * 60 * 60 * 1000;\n const rosterIds = opts.roster ? Object.keys(opts.roster) : [];\n\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n task: {\n type: 'string',\n description:\n 'What the subagent should do — natural language, complete sentence(s). The subagent has its own tool slice, its own LLM call, and returns when its task is done.',\n },\n role: {\n type: 'string',\n description:\n rosterIds.length > 0\n ? `Roster role (preferred). One of: ${rosterIds.join(', ')}. Picks a pre-tuned config (prompt, budgets, tools) for that role.`\n : 'No roster is configured — pass `name` instead.',\n enum: rosterIds.length > 0 ? rosterIds : undefined,\n },\n name: {\n type: 'string',\n description:\n 'Display name for the subagent when not using a roster role. Required when `role` is omitted.',\n },\n provider: {\n type: 'string',\n description:\n 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the host provider when omitted.',\n },\n model: {\n type: 'string',\n description: 'Model id within the provider. Defaults to the host model when omitted.',\n },\n systemPromptOverride: {\n type: 'string',\n description: 'Optional extra prompt text appended to the role baseline.',\n },\n timeoutMs: {\n type: 'number',\n description: `Wall-clock budget for this delegate in milliseconds. No hard cap — set as high as the task realistically needs (a monorepo audit can take hours, a single-file lint takes seconds). Default ${Math.round(defaultTimeoutMs / 1000 / 60)} minutes.`,\n },\n maxIterations: {\n type: 'number',\n description:\n 'Maximum LLM iterations the subagent may take. Unset = use the role/coordinator default. Raise this for tasks with many tool-think-tool cycles (deep code analysis, multi-file refactors).',\n },\n maxToolCalls: {\n type: 'number',\n description:\n 'Maximum number of tool invocations the subagent may make. Unset = use the role/coordinator default. Raise this for tasks that touch many files (large grep + read + report).',\n },\n },\n required: ['task'],\n };\n\n return {\n name: 'delegate',\n description:\n \"Hand a discrete piece of work to a dedicated subagent and wait for its result. The subagent has its own context, its own LLM call, and its own budget — use this when a task is self-contained, would otherwise blow up your context, or benefits from a specialized role (bug-hunter, security-scanner, refactor-planner, audit-log). YOU decide how big the budget is: pass `timeoutMs`, `maxIterations`, and `maxToolCalls` sized to the actual work. There is no hidden cap forcing a 3-minute / 80-iteration limit — if a monorepo audit needs 2 hours and 500 tool calls, ask for that. Call multiple delegates in parallel through the provider's parallel-tool-call surface to fan work out across roles.\",\n usageHint:\n \"Set `task` to a complete instruction. Either pick `role` from the roster or pass `name` + `provider` + `model`. For non-trivial work, also pass `timeoutMs` (the wall-clock budget you actually need), `maxIterations`, and `maxToolCalls` — defaults are intentionally generous (4 hours) but the right values depend on scope. Returns the subagent's `TaskResult` — including the textual `result`, iteration count, tool count, and duration. Auto-promotes the host into director mode on first call.\",\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = (input ?? {}) as {\n task?: string;\n role?: string;\n name?: string;\n provider?: string;\n model?: string;\n systemPromptOverride?: string;\n timeoutMs?: number;\n maxIterations?: number;\n maxToolCalls?: number;\n };\n\n if (typeof i.task !== 'string' || !i.task.trim()) {\n return { ok: false, error: '`task` is required.' };\n }\n\n let director = await opts.host.ensureDirector();\n if (!director) {\n director = await opts.host.promoteToDirector();\n }\n if (!director) {\n // Prefer the host's structured reason (set by promoteToDirector\n // when it refuses) so the calling model can see \"3 subagents\n // running, wait or /fleet kill\" instead of a one-size-fits-all\n // \"could not activate\" string. Fall back to the legacy message\n // for hosts that don't implement the optional reason hook.\n const reason = opts.host.getPromotionBlockReason?.();\n return {\n ok: false,\n error:\n reason ??\n 'Director could not be activated — multi-agent host already running in legacy non-director mode. Restart with `--director` for fleet support.',\n };\n }\n\n const timeoutMs = i.timeoutMs ?? defaultTimeoutMs;\n\n // Resolve config: prefer roster role when provided, fall back to\n // explicit name/provider/model. The two forms are intentionally\n // exclusive to keep the surface narrow.\n let cfg: SubagentConfig;\n if (i.role) {\n const base = opts.roster?.[i.role];\n if (!base) {\n return {\n ok: false,\n error: `Unknown role \"${i.role}\". Available: ${rosterIds.join(', ') || '(no roster configured)'}.`,\n };\n }\n cfg = { ...base };\n if (i.systemPromptOverride) cfg.systemPromptOverride = i.systemPromptOverride;\n if (i.provider) cfg.provider = i.provider;\n if (i.model) cfg.model = i.model;\n } else {\n if (!i.name) {\n return {\n ok: false,\n error: 'Either `role` (from the roster) or `name` is required.',\n };\n }\n cfg = {\n name: i.name,\n provider: i.provider,\n model: i.model,\n systemPromptOverride: i.systemPromptOverride,\n };\n }\n\n // Caller-supplied iteration / tool-call budgets win over both the\n // role default and the coordinator default. This is how the\n // orchestrator dials a long-running audit up to \"as much as it\n // needs\" without us having to second-guess the right number\n // anywhere lower in the stack.\n if (typeof i.maxIterations === 'number' && i.maxIterations > 0) {\n cfg.maxIterations = i.maxIterations;\n }\n if (typeof i.maxToolCalls === 'number' && i.maxToolCalls > 0) {\n cfg.maxToolCalls = i.maxToolCalls;\n }\n\n // Timeout coordination (Fix 2). The subagent's internal `timeoutMs`\n // is its OWN budget cap; the delegate's `timeoutMs` is the host's\n // patience. If the host's patience runs out before the subagent's\n // budget does, the host sees a `__timeout` with no result — but\n // the subagent keeps running, burning compute the host can never\n // observe. Force the subagent's internal cap to land ~30s BEFORE\n // the host's timeout so the subagent always finishes (or\n // exhausts) within the host's window and surfaces a real\n // outcome instead of a silent loss.\n const SUBAGENT_TIMEOUT_BUFFER_MS = 30_000;\n const desiredSubTimeout = Math.max(30_000, timeoutMs - SUBAGENT_TIMEOUT_BUFFER_MS);\n if (!cfg.timeoutMs || cfg.timeoutMs > desiredSubTimeout) {\n cfg.timeoutMs = desiredSubTimeout;\n }\n\n try {\n const subagentId = await director.spawn(cfg);\n const taskId = await director.assign({\n id: '',\n description: i.task,\n subagentId,\n });\n const result = await Promise.race<TaskResult | { __timeout: true }>([\n director.awaitTasks([taskId]).then((r) => r[0] as TaskResult),\n new Promise<{ __timeout: true }>((resolve) =>\n setTimeout(() => resolve({ __timeout: true }), timeoutMs),\n ),\n ]);\n\n if ('__timeout' in result) {\n // Host gave up waiting. Subagent may still be running but the\n // budget coordination above should have already capped it ~30s\n // before this point. Try to extract whatever the subagent\n // produced so far from its JSONL transcript.\n const partial = await readSubagentPartial(opts, subagentId);\n return {\n ok: false,\n stopReason: 'host_timeout',\n error: `Subagent did not finish within ${timeoutMs}ms.`,\n hint: 'Reduce scope of the next delegate, raise timeoutMs, or use spawn_subagent + await_tasks for long-running work.',\n subagentId,\n taskId,\n partial,\n };\n }\n\n // Task completed — but \"completed\" can mean success, budget\n // exhaustion (failed/timeout), or stop. Distinguish them so\n // the host LLM can react differently:\n // - 'success' → end_turn, finalText reflects the actual answer\n // - 'failed'/'timeout' with iterations >= maxIterations → budget\n // - 'stopped' → user/director aborted\n // For non-success, also pull partial output from JSONL because\n // the runner throws on max_iterations and `result.result` ends\n // up empty.\n const baseStopReason: StopReason =\n result.status === 'success'\n ? 'end_turn'\n : result.status === 'timeout'\n ? 'subagent_timeout'\n : result.status === 'stopped'\n ? 'aborted'\n : 'budget_exhausted';\n const partial =\n result.status === 'success' ? undefined : await readSubagentPartial(opts, subagentId);\n\n // Lift the classified error envelope into top-level fields so a\n // model reading this output can branch on `errorKind` / `retryable`\n // without parsing a nested object. The original `error` envelope\n // is preserved verbatim for callers that want the full record\n // (including the `cause` stack for diagnostics).\n const errorKind = result.error?.kind;\n const retryable = result.error?.retryable;\n const backoffMs = result.error?.backoffMs;\n return {\n ok: result.status === 'success',\n status: result.status,\n stopReason: baseStopReason,\n errorKind,\n retryable,\n backoffMs,\n subagentId: result.subagentId,\n taskId: result.taskId,\n result: result.result,\n error: result.error,\n iterations: result.iterations,\n toolCalls: result.toolCalls,\n durationMs: result.durationMs,\n ...(partial ? { partial } : {}),\n ...(hintForKind(errorKind, retryable, backoffMs)\n ? { hint: hintForKind(errorKind, retryable, backoffMs) }\n : {}),\n };\n } catch (err) {\n return {\n ok: false,\n stopReason: 'error' as const,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n },\n };\n}\n\ntype StopReason =\n | 'end_turn'\n | 'budget_exhausted'\n | 'subagent_timeout'\n | 'host_timeout'\n | 'aborted'\n | 'error';\n\n/**\n * Per-kind orchestrator hint. Returned alongside the structured error\n * so the calling model has a concrete next step instead of \"task\n * failed, good luck\". Returns undefined for success / unknown kinds —\n * the caller checks for presence before including in output.\n */\nfunction hintForKind(\n kind: string | undefined,\n retryable: boolean | undefined,\n backoffMs: number | undefined,\n): string | undefined {\n if (!kind) return undefined;\n switch (kind) {\n case 'provider_rate_limit':\n return `Provider rate-limited. Retry safe after ${backoffMs ?? 5000}ms backoff. Consider a smaller model or fewer parallel delegates.`;\n case 'provider_5xx':\n return `Provider server error. Retry safe after ${backoffMs ?? 3000}ms backoff — usually transient.`;\n case 'provider_timeout':\n return 'Provider network timeout. Retry safe; reduce input size if it persists.';\n case 'provider_auth':\n return 'Provider rejected credentials. Cannot retry — fix the API key / config and re-invoke.';\n case 'context_overflow':\n return 'Subagent context exceeded the model limit. Narrow the task, use a larger-context model, or split into multiple delegates.';\n case 'budget_iterations':\n case 'budget_tool_calls':\n case 'budget_tokens':\n case 'budget_cost':\n return 'Subagent exhausted its budget. Raise the matching `max*` field on the next delegate or narrow task scope.';\n case 'budget_timeout':\n return 'Subagent hit its wall-clock budget. Raise `timeoutMs` on the next delegate or split the task.';\n case 'aborted_by_parent':\n return 'Subagent was aborted (user Ctrl+C, parent unwound, or sibling failure cascade). Not retryable until the abort condition is resolved.';\n case 'empty_response':\n return 'Subagent ended its turn with no text and no tool calls. Almost always a prompt / config issue — clarify the task or check the model.';\n case 'tool_failed':\n return 'A tool inside the subagent returned ok:false. Inspect `partial.lastAssistantText` for the agent reasoning, then retry with corrected inputs.';\n case 'bridge_failed':\n return 'Parent-child bridge transport failed. This is rare — restart the session and retry.';\n default:\n return retryable\n ? 'Failure classified as retryable. Try again with the same input.'\n : undefined;\n }\n}\n\n/**\n * Parse the per-subagent JSONL at `<sessionsRoot>/<runId>/<subagentId>.jsonl`\n * and pull out the last few useful pieces — the most recent assistant\n * text response, the stop reason, and a count of tool calls. Used by\n * `delegate` when the subagent timed out or exhausted budget without\n * returning a clean `finalText`, so the host LLM still sees what work\n * actually happened.\n */\nasync function readSubagentPartial(\n opts: CreateDelegateToolOptions,\n subagentId: string,\n): Promise<\n | {\n lastAssistantText?: string;\n lastStopReason?: string;\n toolUsesObserved: number;\n events: number;\n }\n | undefined\n> {\n if (!opts.sessionsRoot) return undefined;\n // Locate the JSONL. When `directorRunId` is provided we know the\n // exact path; otherwise scan the sessionsRoot for any subdir\n // containing this subagent id.\n const candidates: string[] = [];\n if (opts.directorRunId) {\n candidates.push(path.join(opts.sessionsRoot, opts.directorRunId, `${subagentId}.jsonl`));\n } else {\n try {\n const runDirs = await fsp.readdir(opts.sessionsRoot);\n for (const r of runDirs) {\n candidates.push(path.join(opts.sessionsRoot, r, `${subagentId}.jsonl`));\n }\n } catch {\n return undefined;\n }\n }\n for (const file of candidates) {\n let raw: string;\n try {\n raw = await fsp.readFile(file, 'utf8');\n } catch {\n continue;\n }\n const lines = raw.split('\\n').filter((l) => l.trim());\n let lastAssistantText: string | undefined;\n let lastStopReason: string | undefined;\n let toolUses = 0;\n for (const line of lines) {\n try {\n const ev = JSON.parse(line) as {\n type: string;\n content?: unknown;\n stopReason?: string;\n name?: string;\n };\n if (ev.type === 'tool_use') toolUses += 1;\n if (ev.type === 'llm_response') {\n if (typeof ev.stopReason === 'string') lastStopReason = ev.stopReason;\n if (Array.isArray(ev.content)) {\n const txt = (ev.content as Array<{ type?: string; text?: string }>)\n .filter((b) => b.type === 'text')\n .map((b) => b.text ?? '')\n .join('\\n')\n .trim();\n if (txt) lastAssistantText = txt;\n }\n }\n } catch {\n // skip\n }\n }\n return {\n lastAssistantText,\n lastStopReason,\n toolUsesObserved: toolUses,\n events: lines.length,\n };\n }\n return undefined;\n}\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n SubagentConfig,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { BudgetExceededError } from './subagent-budget.js';\nimport type { FleetBus } from './fleet-bus.js';\n\n/**\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\n * The factory MUST construct a fresh `Context` per call — sharing context\n * between subagents defeats isolation. Each Agent should also use either\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\n * attributed correctly.\n */\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\n\nexport interface AgentFactoryResult {\n agent: Agent;\n /** Event bus the factory wired to this agent — required for budget hookup. */\n events: EventBus;\n /**\n * Optional cleanup hook invoked in the runner's `finally` block once\n * the task ends (success, failure, abort — same exit path). Factories\n * that own resources scoped to a single task (per-subagent JSONL\n * writers, transient providers, throwaway containers) implement this\n * to close them deterministically instead of relying on GC. Errors\n * thrown here are swallowed so a flaky cleanup can't mask the task's\n * real result.\n */\n dispose?: () => Promise<void> | void;\n}\n\nexport interface AgentRunnerOptions {\n factory: AgentFactory;\n /**\n * Format a TaskSpec into the user input the agent will receive. Defaults\n * to `task.description ?? ''`. Override when subagents expect structured\n * input (e.g. JSON contracts, role-prefixed prompts).\n */\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\n /**\n * When set, the runner attaches the subagent's EventBus to this FleetBus\n * on task start and detaches it when the task finishes. This is the\n * injection seam that lets the TUI fleet panel observe subagent activity\n * live — without it, FleetBus stays empty.\n */\n fleetBus?: FleetBus;\n}\n\n/**\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\n * the coordinator's budget and abort signal. This is the production adapter —\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\n *\n * Lifecycle per task:\n * 1. factory(config) → fresh Agent + EventBus.\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\n * 5. Unsubscribe and let the factory's resources be GC'd.\n *\n * The budget is checked synchronously from event handlers — a runaway agent\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\n * coordinator surfaces as `status: 'failed'` on the task result.\n */\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\n\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\n const factoryResult = await opts.factory(ctx.config);\n const { agent, events } = factoryResult;\n\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\n // other FleetBus subscriber) can observe this subagent live. Detach on\n // task finish — each task is a fresh Agent + EventBus, so we never\n // want a stale bus lingering after the run.\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\n\n // Hook budget into the agent's event stream. We capture errors thrown by\n // recordToolCall/recordUsage so the budget can short-circuit the run by\n // aborting the controller — the agent then unwinds cooperatively.\n const aborter = new AbortController();\n let budgetError: BudgetExceededError | null = null;\n\n const onBudgetError = (err: unknown) => {\n // Any error from a budget operation (BudgetExceededError, TypeError from\n // a malformed event payload, etc.) must abort the run. EventBus.emit()\n // swallows listener throws, so we can't re-throw — set budgetError and\n // abort the controller so the agent unwinds cooperatively.\n aborter.abort();\n budgetError =\n err instanceof BudgetExceededError\n ? err\n : new BudgetExceededError(\n 'tool_calls',\n 0,\n 0,\n );\n // Attach the real error detail so the task result surfaces\n // something actionable instead of a generic budget message.\n if (budgetError !== err && err instanceof Error) {\n budgetError.message += ` (caused by: ${err.message})`;\n }\n };\n\n // Track the name of the most recent tool that returned ok:false so\n // we can lift it into the SubagentError when the agent ends without\n // recovering. Cleared on every successful tool execution so a tool\n // that later succeeded doesn't taint the final report.\n let lastToolFailed: string | null = null;\n\n const unsub: Array<() => void> = [];\n unsub.push(\n events.on('tool.executed', (e) => {\n // Count tool calls on the PAIRED 'tool.executed' event rather\n // than 'tool.started'. A tool can fire start then crash before\n // emitting executed (process killed, signal aborted mid-exec);\n // counting only the paired event keeps the budget tally honest\n // and matches what the model actually saw in its turn.\n try {\n ctx.budget.recordToolCall();\n } catch (eb) {\n onBudgetError(eb);\n }\n // Track ok:false so we can fail the subagent if it ends without\n // recovering. Successful runs clear it — the model may try a\n // tool, get an error, and self-heal on the next iteration; that\n // path should still report success.\n if (e.ok === false) {\n lastToolFailed = e.name;\n } else if (e.ok === true) {\n lastToolFailed = null;\n }\n }),\n events.on('provider.response', (e) => {\n try {\n ctx.budget.recordUsage(e.usage);\n } catch (e2) {\n onBudgetError(e2);\n }\n }),\n events.on('iteration.started', () => {\n try {\n ctx.budget.recordIteration();\n ctx.budget.checkTimeout();\n } catch (e) {\n onBudgetError(e);\n }\n }),\n // D3: cooperative timeout enforcement DURING a long tool call.\n // The iteration-loop checkTimeout() only fires between agent\n // iterations — a single `bash sleep 3600` call would otherwise\n // park inside one tool execution while the timeout silently\n // passes, relying solely on the coordinator's hard Promise.race\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\n // we can hang the check on. When the budget trips here:\n // 1. onBudgetError sets budgetError + aborter.abort()\n // 2. aborter signal propagates to agent.run → tool executor\n // 3. tool's own signal listener kills the child process\n // Cheap: O(1) per progress event, and the budget short-circuits\n // when timeoutMs is unset (most subagents have one set anyway).\n events.on('tool.progress', () => {\n try {\n ctx.budget.checkTimeout();\n } catch (e) {\n onBudgetError(e);\n }\n }),\n );\n\n // Forward the coordinator signal so stop() from outside also aborts.\n const onParentAbort = () => aborter.abort();\n ctx.signal.addEventListener('abort', onParentAbort);\n\n let result: RunResult;\n try {\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\n } finally {\n detachFleet?.();\n ctx.signal.removeEventListener('abort', onParentAbort);\n for (const u of unsub) u();\n // Per-task resource cleanup. Closes JSONL writers, throwaway\n // providers, etc. that the factory wired up. Swallowed errors —\n // a flaky cleanup must not mask the real task result. The\n // caller can re-emit via observability if needed.\n if (factoryResult.dispose) {\n try {\n await factoryResult.dispose();\n } catch {\n // intentional swallow — see comment above\n }\n }\n }\n\n // A budget violation is the signal — surface it so the coordinator can\n // tag the task with the right failure kind ('failed' for budget; the\n // coordinator separately recognises 'timeout' from BudgetExceededError).\n if (budgetError) throw budgetError;\n\n if (result.status === 'failed') {\n throw result.error instanceof Error\n ? result.error\n : new Error(String(result.error ?? 'agent failed'));\n }\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\n // classify them. When the parent signal was aborted, coordinator marks\n // the task 'stopped' (matched against subagent.abortController.aborted).\n if (result.status === 'aborted') {\n throw new Error('agent aborted');\n }\n if (result.status === 'max_iterations') {\n throw new Error('agent exhausted iteration limit');\n }\n\n const usage = ctx.budget.usage();\n // Empty-response guard. A \"successful\" run with no text AND no tool\n // calls is almost always a prompt / config issue, not a real\n // success — the agent burned an iteration to say nothing. Surface\n // it as a classified failure so callers can show \"✗ empty_response\"\n // instead of a confusing green ✓ with no output. We only trip on\n // the (no-text AND no-tools) intersection because text-less runs\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\n const finalText = (result.finalText ?? '').trim();\n if (finalText.length === 0 && usage.toolCalls === 0) {\n throw new Error('empty response');\n }\n // Unrecovered-tool-failure guard. If the last executed tool came\n // back ok:false AND the agent ended its turn with no closing text,\n // the agent never acknowledged or recovered from the failure — the\n // task is effectively broken. A model that handles a tool error\n // emits SOME text on the next iteration (\"the read failed, trying\n // an alternate path…\") which clears `lastToolFailed`; the only way\n // both signals can be live at end-of-run is if the model gave up\n // silently. Surface as `tool_failed` so callers see the actual\n // failure mode instead of a clean ✓ with no output.\n if (finalText.length === 0 && lastToolFailed !== null) {\n throw new Error(`tool failed: ${lastToolFailed}`);\n }\n return {\n result: result.finalText,\n iterations: result.iterations,\n toolCalls: usage.toolCalls,\n };\n };\n}\n\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\n return task.description ?? '';\n}\n","import * as path from 'node:path';\nimport { DefaultSessionStore } from '../storage/session-store.js';\nimport type { SessionStore, SessionWriter } from '../types/session.js';\n\n/**\n * Per-subagent session factory.\n *\n * Director runs produce many parallel transcripts — one per spawned\n * subagent — and we want them all rooted under the same director-run\n * directory so a future `wstack replay <runId>` can rehydrate the whole\n * fleet from a single tree.\n *\n * The factory builds (or accepts) a `SessionStore` whose `dir` points at\n * `<sessionsRoot>/<directorRunId>/`, and returns a small `create()`\n * function that the orchestration layer calls per-spawn. Each call\n * yields a fresh `SessionWriter` whose JSONL file lives in that\n * directory, named by either the caller-supplied `subagentId` (preferred,\n * so the file name is human-readable) or a derived id.\n *\n * **Why a thin factory instead of plumbing options through every spawn\n * site?** Because the director is the only caller that needs this\n * isolation pattern, and shoving `sessionStore` options into\n * `SubagentConfig` would leak storage details into a config shape that\n * agents and the coordinator have no business knowing about.\n */\nexport interface DirectorSessionFactoryOptions {\n /**\n * Either a parent directory where `<directorRunId>/` will be created,\n * or a pre-built `SessionStore` whose `dir` already points at the\n * director run directory. Tests pass an in-memory store for isolation;\n * production code passes the path under `~/.wrongstack/sessions/`.\n */\n store?: SessionStore;\n sessionsRoot?: string;\n /**\n * Director run id — namespaces all subagent JSONLs under one folder.\n * Defaults to a timestamped id; supplied explicitly when resuming a\n * prior fleet manifest.\n */\n directorRunId?: string;\n}\n\nexport interface DirectorSessionFactory {\n /** Absolute directory where this director run's transcripts live. */\n readonly dir: string;\n /** The director run id used to namespace the directory. */\n readonly directorRunId: string;\n /**\n * Create a fresh `SessionWriter` for the named subagent. Each\n * subagent gets its own JSONL file. The writer's `id` matches the\n * supplied `subagentId` so disk paths line up with in-memory ids.\n */\n createSubagentSession(args: {\n subagentId: string;\n provider?: string;\n model?: string;\n title?: string;\n }): Promise<SessionWriter>;\n}\n\n/**\n * Build a `DirectorSessionFactory`. Pass either a pre-configured\n * `SessionStore` (tests) or a `sessionsRoot` path (production). When\n * neither is supplied the factory throws — there's no sane default for\n * \"where do these JSONLs live\".\n */\nexport function makeDirectorSessionFactory(\n opts: DirectorSessionFactoryOptions,\n): DirectorSessionFactory {\n const runId = opts.directorRunId ?? `${new Date().toISOString().replace(/[:.]/g, '-')}-director`;\n\n let store: SessionStore;\n let dir: string;\n if (opts.store) {\n // The caller wired its own store — we trust them on where the\n // files land. We can't introspect a `SessionStore`'s directory\n // without a typed accessor, so we report the run id and let the\n // caller record the path separately if needed.\n store = opts.store;\n dir = opts.sessionsRoot ? path.join(opts.sessionsRoot, runId) : '(caller-managed)';\n } else if (opts.sessionsRoot) {\n dir = path.join(opts.sessionsRoot, runId);\n store = new DefaultSessionStore({ dir });\n } else {\n throw new Error('makeDirectorSessionFactory requires either `store` or `sessionsRoot`');\n }\n\n return {\n dir,\n directorRunId: runId,\n async createSubagentSession({ subagentId, provider, model, title }) {\n // Per-subagent JSONL — DefaultSessionStore generates the file name\n // from the metadata `id`, so we pass `subagentId` directly to\n // keep disk artifacts human-readable.\n return store.create({\n id: subagentId,\n title: title ?? subagentId,\n provider: provider ?? 'unknown',\n model: model ?? 'unknown',\n });\n },\n };\n}\n","/**\n * Pre-built subagent role configurations for the WrongStack fleet.\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\n * for the director's roster.\n */\nimport type { SubagentConfig } from '../types/multi-agent.js';\n\n/**\n * Audit Log Agent — analyzes session logs, event streams, and traces.\n * Use for: post-mortems, trend analysis, operational insights.\n */\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\nsession logs and produce actionable markdown reports.\n\nScope:\n- Parse session logs (iteration counts, tool calls, errors, usage)\n- Detect repeated failure patterns across multiple runs\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\n- Track token consumption trends\n- Generate structured audit reports with severity ratings\n\nInput format you accept:\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\n\nOutput: Markdown audit report with sections:\n- ## Summary (totals, error rate)\n- ## Top Errors (count + context)\n- ## Tool Usage (table with calls, failures, avg duration)\n- ## Anomalies (pattern → severity)\n\nWorking rules:\n- Never fabricate numbers — read the actual logs first\n- Always include file:line references for errors\n- If sessionPath is missing, ask the director to provide it\n- Report confidence level: high (>90% accuracy), medium, low`,\n\n // No hardcoded budgets — the orchestrator (delegate tool or\n // spawn_subagent) decides per-task how much room a subagent gets.\n // A monorepo audit needs hours; a single-file lint check needs\n // seconds. Pinning a number here forces the orchestrator to fight\n // the role's default instead of just asking for what it needs.\n};\n\n/**\n * Bug Hunter Agent — systematic bug and code smell detection.\n * Use for: pre-refactoring health checks, code review, regression prevention.\n */\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\nsource code for bugs, anti-patterns, and code smells using pattern matching\nand heuristics. Output a prioritized hit list with file:line references.\n\nScope:\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\n- Identify anti-patterns (callback hell, God objects, circular deps)\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\n- Rank findings: critical > high > medium > low\n\nInput format you accept:\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\n\nOutput: Markdown bug hunt report:\n- ## Critical (must fix first)\n- ## High (should fix)\n- ## Medium\n- ## Low (consider)\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\n\nBug pattern reference you know:\n| Pattern | Regex hint | Severity |\n|---------|------------|----------|\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\n| Event leak | on\\\\( without off/removeListener | high |\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\n| unsafe any | : any\\\\b or <any> | medium |\n| innerHTML | innerHTML\\\\s*= | high |\n\nWorking rules:\n- Never scan node_modules — it's noise\n- Always include file:line for every finding\n- If >30% of findings are false positives, note the confidence level\n- Ask director for clarification if paths are ambiguous`,\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Refactor Planner Agent — structured refactoring planning.\n * Use for: large rewrites, technical debt reduction, architecture improvements.\n */\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\nstructure and produce a concrete, phased refactoring plan with risk\nassessment, dependency ordering, and rollback strategy.\n\nScope:\n- Map module-level dependencies (import graph)\n- Identify coupling hotspots (high fan-in/out modules)\n- Assess refactoring risk by complexity and test coverage\n- Generate phased plans with checkpoint milestones\n- Produce diff-friendly task lists (one task = one concern)\n\nInput format you accept:\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\n\nOutput: Markdown refactor plan:\n- ## Phase 1: Low Risk / High Payoff (do first)\n Table: | # | Task | Module | Risk | Est. Time |\n- ## Phase 2: Medium Risk\n- ## Phase 3: High Risk (requires full regression)\n- ## Dependency Graph (abbreviated ASCII)\n- ## Rollback Strategy\n- ## Exit Criteria (checkbox list)\n\nRisk scoring criteria:\n| Factor | Low | Medium | High |\n|--------|-----|--------|------|\n| Cyclomatic complexity | <10 | 10-20 | >20 |\n| Test coverage | >80% | 50-80% | <50% |\n| Fan-out (imports) | <5 | 5-15 | >15 |\n\nWorking rules:\n- Always include rollback strategy — every refactor can fail\n- Merge tasks that take <1h into a single phase\n- Respect team constraints (reviewer availability, parallelization)\n- Never plan without analyzing the actual code first`,\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Security Scanner Agent — vulnerability and secret detection.\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\n */\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n prompt: `You are the Security Scanner agent. Your job is to scan code,\nconfigs, and dependencies for security issues from hardcoded secrets to\nsupply chain risks.\n\nScope:\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\n- Scan dependencies for known CVEs (via npm/pnpm audit)\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\n\nInput format you accept:\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\n\nOutput: Markdown security report:\n- ## CRITICAL: Secrets Found (with code snippets)\n- ## HIGH: Injection Vectors\n- ## MEDIUM: Insecure Patterns\n- ## Dependency Issues (CVE list)\n- ## Summary table (severity → count)\n- ## Remediation Checklist (with checkboxes)\n\nSecret patterns you detect:\n| Pattern | Example | Severity |\n|---------|---------|----------|\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\n\nInjection patterns:\n| Construct | Safe alternative |\n|-----------|-----------------|\n| eval(str) | new Function() or parse |\n| innerHTML = x | textContent or sanitize |\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\n\nWorking rules:\n- Never scan node_modules — use npm audit instead\n- Always provide remediation steps, not just findings\n- Verify regex-based secrets before flagging (false positive risk)\n- When in doubt, flag as medium rather than ignoring potential issues`,\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/** All pre-built agents in a map for easy lookup by role. */\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\n 'audit-log': AUDIT_LOG_AGENT,\n 'bug-hunter': BUG_HUNTER_AGENT,\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\n 'security-scanner': SECURITY_SCANNER_AGENT,\n};\n\n/** Quick-access list for spawning all at once. */\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\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';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string;\n ttlSeconds?: number;\n fetchImpl?: typeof fetch;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload;\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;\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/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 private payload?: ModelsDevPayload;\n private fetchedAt?: Date;\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;\n private readonly maxStaleAgeMs: number;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? 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 }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n if (!opts.force) {\n const cached = await this.readCache();\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refresh();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCache();\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n throw err;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\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.payload = json;\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 }\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 ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\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.readCache();\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 readCache(): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(this.cacheFile, '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","export 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[];\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[];\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string;\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: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look forSOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n },\n];\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Mode, ModeConfig, ModeManifest, ModeStore } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n await fs.writeFile(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n 'utf8',\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string;\n userModesDir?: string;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}\n","import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number;\n tags?: string[];\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n });\n }\n }\n\n // Test tasks\n this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n });\n\n // Documentation tasks\n this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n });\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string;\n estimateHours?: number;\n actualHours?: number;\n tags?: string[];\n specRequirementId?: string;\n parentId?: string;\n children?: string[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[];\n priority?: TaskPriority[];\n type?: TaskType[];\n assignee?: string[];\n tags?: string[];\n specRequirementId?: string;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n let actualHours = 0;\n for (const n of graph.nodes.values()) {\n switch (n.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += n.estimateHours ?? 0;\n actualHours += n.actualHours ?? 0;\n }\n const total = graph.nodes.size;\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string): void {\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\n if (inStack.has(id)) return;\n if (visited.has(id)) return;\n if (!graph.nodes.has(id)) return;\n\n visited.add(id);\n inStack.add(id);\n\n for (const edge of graph.edges) {\n if (edge.from === id) visit(edge.to);\n }\n\n inStack.delete(id);\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\n}\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (err: unknown) => void;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string;\n}\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new Error('No graph loaded');\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new Error(`Node ${id} not found`);\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n return node?.status === 'completed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(taskId?: string): TaskTransition[] {\n if (!taskId) return [...this.transitions];\n // Would need taskId tracking per transition\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status !== 'completed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * rejects, the configured `onPersistError` is invoked so failures are\n * surfaced instead of swallowed by an unhandled promise rejection.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n if (this.opts.onPersistError) this.opts.onPersistError(err);\n else\n console.warn(\n '[task-tracker] saveGraph failed:',\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n}\n\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority':\n return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status':\n return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt':\n return a.createdAt - b.createdAt;\n case 'updatedAt':\n return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition;\n maxConcurrent?: number;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\n onTaskFail?: (task: TaskNode, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n this.emit('error', {\n phase: 'analyzing',\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\n });\n this.setPhase('failed');\n throw new Error('Spec too incomplete');\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import type {\n MetricLabels,\n MetricSeries,\n MetricsSink,\n MetricsSnapshot,\n} from '../types/observability.js';\n\ninterface CounterState {\n value: number;\n}\n\ninterface GaugeState {\n value: number;\n}\n\ninterface HistogramState {\n count: number;\n sum: number;\n min: number;\n max: number;\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\n // on p99 for typical agent workloads — small memory footprint, no exporter\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\n samples: number[];\n}\n\nconst RESERVOIR_SIZE = 1024;\n\nfunction labelKey(labels: MetricLabels | undefined): string {\n if (!labels) return '';\n const keys = Object.keys(labels).sort();\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\n return sorted[idx] ?? 0;\n}\n\n/**\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\n * scrape over HTTP. For production push-based pipelines, write an adapter\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\n */\nexport class InMemoryMetricsSink implements MetricsSink {\n private counters = new Map<string, Map<string, CounterState>>();\n private gauges = new Map<string, Map<string, GaugeState>>();\n private histograms = new Map<string, Map<string, HistogramState>>();\n\n counter(name: string, value = 1, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.counters, name);\n const key = labelKey(labels);\n const state = series.get(key) ?? { value: 0 };\n state.value += value;\n series.set(key, state);\n }\n\n gauge(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.gauges, name);\n series.set(labelKey(labels), { value });\n }\n\n histogram(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.histograms, name);\n const key = labelKey(labels);\n let state = series.get(key);\n if (!state) {\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\n series.set(key, state);\n }\n state.count++;\n state.sum += value;\n if (value < state.min) state.min = value;\n if (value > state.max) state.max = value;\n if (state.samples.length < RESERVOIR_SIZE) {\n state.samples.push(value);\n } else {\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\n const r = Math.floor(Math.random() * state.count);\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\n }\n }\n\n snapshot(): MetricsSnapshot {\n const series: MetricSeries[] = [];\n\n for (const [name, byLabel] of this.counters) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'counter',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.gauges) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'gauge',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.histograms) {\n for (const [key, state] of byLabel) {\n const sorted = [...state.samples].sort((a, b) => a - b);\n series.push({\n name,\n type: 'histogram',\n labels: parseLabelKey(key),\n values: {\n count: state.count,\n sum: state.sum,\n min: state.min,\n max: state.max,\n p50: quantile(sorted, 0.5),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n });\n }\n }\n\n return { timestamp: Date.now(), series };\n }\n\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n private getOrCreate<V>(bag: Map<string, Map<string, V>>, name: string): Map<string, V> {\n let series = bag.get(name);\n if (!series) {\n series = new Map();\n bag.set(name, series);\n }\n return series;\n }\n}\n\nfunction parseLabelKey(key: string): MetricLabels {\n if (!key) return {};\n const labels: MetricLabels = {};\n for (const pair of key.split(',')) {\n const eq = pair.indexOf('=');\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return labels;\n}\n\n/** Cheap noop sink — drop-in default when observability is not configured. */\nexport class NoopMetricsSink implements MetricsSink {\n counter(): void {}\n gauge(): void {}\n histogram(): void {}\n snapshot(): MetricsSnapshot {\n return { timestamp: Date.now(), series: [] };\n }\n reset(): void {}\n}\n","import type {\n AggregateHealth,\n HealthCheck,\n HealthCheckResult,\n HealthRegistry,\n HealthStatus,\n} from '../types/observability.js';\n\nconst SEVERITY: Record<HealthStatus, number> = {\n healthy: 0,\n degraded: 1,\n unhealthy: 2,\n};\n\n/**\n * Aggregates registered health checks. Worst status wins — one unhealthy check\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\n * the response.\n */\nexport class DefaultHealthRegistry implements HealthRegistry {\n private checks = new Map<string, HealthCheck>();\n private readonly timeoutMs: number;\n\n constructor(opts: { timeoutMs?: number } = {}) {\n this.timeoutMs = opts.timeoutMs ?? 5_000;\n }\n\n register(check: HealthCheck): void {\n this.checks.set(check.name, check);\n }\n\n unregister(name: string): void {\n this.checks.delete(name);\n }\n\n async run(): Promise<AggregateHealth> {\n const results = await Promise.all(\n Array.from(this.checks.values()).map(async (c) => {\n const result = await this.runOne(c);\n return { name: c.name, ...result };\n }),\n );\n\n let status: HealthStatus = 'healthy';\n for (const r of results) {\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\n }\n\n return { status, timestamp: Date.now(), checks: results };\n }\n\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<HealthCheckResult>((resolve) => {\n timer = setTimeout(\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\n this.timeoutMs,\n );\n });\n try {\n return await Promise.race([check.check(), timeout]);\n } catch (err) {\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n","import type { Span, Tracer } from '../types/observability.js';\n\n/**\n * Default tracer is a noop — zero overhead when observability is not wired up.\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\n */\nexport class NoopTracer implements Tracer {\n startSpan(): Span {\n return NOOP_SPAN;\n }\n}\n\nconst NOOP_SPAN: Span = {\n setAttribute() {},\n recordError() {},\n end() {},\n};\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string; name?: string }): unknown;\n setStatus?(status: { code: number; message?: string }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { MetricsSink } from '../types/observability.js';\n\n/**\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\n * that detaches all listeners. This is the single integration point between\n * the agent's event stream and the observability layer — no metric calls\n * leak into core call sites.\n */\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\n const unsubs: Array<() => void> = [];\n\n unsubs.push(\n events.on('session.started', () => sink.counter('agent.sessions.started')),\n events.on('session.ended', (e) => {\n sink.counter('agent.sessions.ended');\n sink.histogram('agent.session.tokens.input', e.usage.input);\n sink.histogram('agent.session.tokens.output', e.usage.output);\n }),\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\n events.on('provider.response', (e) => {\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\n sink.counter('provider.tokens.input', e.usage.input);\n sink.counter('provider.tokens.output', e.usage.output);\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\n }),\n events.on('provider.retry', (e) =>\n sink.counter('provider.retries.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n }),\n ),\n events.on('provider.error', (e) =>\n sink.counter('provider.errors.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n retryable: String(e.retryable),\n }),\n ),\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\n events.on('tool.executed', (e) => {\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\n }),\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\n events.on('compaction.fired', (e) => {\n sink.counter('compaction.fired.total');\n sink.histogram('compaction.reduction_tokens', e.before - e.after);\n }),\n events.on('mcp.server.connected', (e) =>\n sink.counter('mcp.connects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.reconnected', (e) =>\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.disconnected', (e) =>\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\n ),\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\n );\n\n return () => {\n for (const u of unsubs) u();\n };\n}\n","import type { HealthRegistry, MetricsSink, MetricsSnapshot } from '../types/observability.js';\n\n/** TLS options for HTTPS metrics endpoint. */\nexport interface MetricsTlsOptions {\n cert: string;\n key: string;\n}\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<\n string,\n { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }\n >();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string;\n /** Enable HTTPS by providing TLS key/cert. Both required. */\n tls?: MetricsTlsOptions;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const tls = opts.tls;\n const useHttps = !!(tls?.cert && tls?.key);\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n type RequestListener = (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => void;\n const listener: RequestListener = (req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n if (healthRegistry && url === healthPath) {\n healthRegistry.run().then(\n (agg) => {\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n };\n\n let server: import('node:http').Server;\n if (useHttps && tls) {\n const { createServer } = await import('node:https');\n const { readFileSync } = await import('node:fs');\n server = createServer(\n { cert: readFileSync(tls.cert), key: readFileSync(tls.key) },\n listener,\n );\n } else {\n const { createServer } = await import('node:http');\n server = createServer(listener);\n }\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n const protocol = useHttps ? 'https' : 'http';\n return {\n port: boundPort,\n url: `${protocol}://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number;\n asInt?: string;\n count?: string;\n sum?: number;\n quantileValues?: { quantile: number; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string;\n unit?: string;\n sum?: { dataPoints: OtlpDataPoint[]; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] };\n summary?: { dataPoints: OtlpDataPoint[] };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number;\n /** Authorization header. */\n authorization?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch;\n /** Called on push failure. Defaults to silent. */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) => encodeAttr(k, v)),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(opts: OtlpTraceExporterOptions): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n","import type { Context } from '../core/context.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Tool } from '../types/tool.js';\n\n/**\n * Context introspection and management tool.\n * Allows the model to:\n * - \"check\" → see token budget and message counts\n * - \"summary\" → summarize and replace a range of messages\n * - \"prune\" → remove specific message indices\n * - \"add_note\" → inject a summary note at a specific point\n * - \"compact\" → run compaction via the injected compactor\n */\nexport const CONTEXT_MANAGER_TOOL_NAME = 'context_manager';\n\nexport type ContextManagerAction = 'check' | 'summary' | 'prune' | 'add_note' | 'compact';\n\nexport interface ContextManagerInput {\n action: ContextManagerAction;\n /** 0-based message indices for prune/summary (inclusive). */\n from?: number;\n to?: number;\n /** Text for add_note / summary actions. For summary, this is the LLM-provided summary text. */\n text?: string;\n /** Inject after which index (for add_note). Defaults to prepend (0). */\n afterIndex?: number;\n}\n\nexport interface ContextManagerResult {\n action: ContextManagerAction;\n beforeTokens: number;\n afterTokens?: number;\n removedCount?: number;\n messageCount: number;\n summary?: string;\n notes?: string;\n}\n\n/**\n * Options for creating a context manager tool.\n * `compactor` is required for the \"compact\" action; without it the action returns an error.\n */\nexport interface ContextManagerToolOptions {\n compactor?: Compactor;\n /**\n * Optional sub-LLM summarizer. When provided, the \"summary\" action calls this\n * to produce real summaries of message ranges instead of placeholder text.\n * (signature matches Provider.complete — return the summary text in result.content[0].text)\n */\n summarizer?: (messages: Message[]) => Promise<string>;\n}\n\nfunction roughEstimate(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\n total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n }\n return total;\n}\n\nexport function createContextManagerTool(\n opts: ContextManagerToolOptions = {},\n): Tool<ContextManagerInput, ContextManagerResult> {\n return {\n name: CONTEXT_MANAGER_TOOL_NAME,\n description:\n 'Inspect or reorganize the conversation context window. ' +\n 'Use \"check\" to see token budget. ' +\n 'Use \"summary\" to collapse a message range into a concise note (provide \"text\" for custom summary). ' +\n 'Use \"prune\" to remove specific messages by index. ' +\n 'Use \"add_note\" to inject a summary note. ' +\n 'Use \"compact\" to run aggressive compaction.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['check', 'summary', 'prune', 'add_note', 'compact'],\n description: 'The context operation to perform.',\n },\n from: {\n type: 'number',\n description: 'Start index (inclusive) for summary/prune operations.',\n },\n to: {\n type: 'number',\n description: 'End index (inclusive) for summary/prune operations.',\n },\n text: {\n type: 'string',\n description:\n 'Summary or note text. For \"summary\": the model-provided summary of the removed range. ' +\n 'For \"add_note\": the note to inject.',\n },\n afterIndex: {\n type: 'number',\n description: 'Insert after this index (for add_note). Defaults to prepend (0).',\n },\n },\n required: ['action'],\n },\n permission: 'auto',\n mutating: true,\n\n async execute(input: ContextManagerInput, ctx: Context): Promise<ContextManagerResult> {\n const messages = ctx.messages;\n const beforeTokens = roughEstimate(messages);\n\n // When ctx.state is available, route mutations through the observer\n // layer so subscribers stay in sync. Fall back to direct splice for\n // tests and environments that haven't wired ConversationState.\n const applyMessages = (next: Message[]) => {\n if (ctx.state) {\n ctx.state.replaceMessages(next);\n } else {\n messages.length = 0;\n messages.splice(0, 0, ...next);\n }\n };\n\n switch (input.action) {\n case 'check': {\n return {\n action: 'check',\n beforeTokens,\n messageCount: messages.length,\n notes: JSON.stringify({\n messages: messages.length,\n tokens: beforeTokens,\n readFiles: ctx.readFiles.size,\n todos: ctx.todos.length,\n inProgress: ctx.todos.filter((t) => t.status === 'in_progress').length,\n }),\n };\n }\n\n case 'compact': {\n if (!opts.compactor) {\n return {\n action: 'compact',\n beforeTokens,\n messageCount: messages.length,\n notes: 'No compactor registered. Use /compact aggressive via slash command instead.',\n };\n }\n const report = await opts.compactor.compact(ctx);\n return {\n action: 'compact',\n beforeTokens,\n afterTokens: report.after,\n messageCount: messages.length,\n };\n }\n\n case 'prune': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'prune',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const copy = [...messages];\n const removed = copy.splice(from, to - from + 1);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'prune',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n removedCount: removed.length,\n };\n }\n\n case 'add_note': {\n const noteText = input.text ?? '(no summary)';\n const afterIdx = Math.min(input.afterIndex ?? 0, messages.length);\n const noteMsg: Message = {\n role: 'system',\n content: `[note: ${noteText}]`,\n };\n const copy = [...messages];\n copy.splice(afterIdx, 0, noteMsg);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'add_note',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n summary: noteText,\n };\n }\n\n case 'summary': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'summary',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const summaryText =\n input.text ?? '[summary placeholder — provide \"text\" to record the summary]';\n const summaryMsg: Message = {\n role: 'system',\n content: `[summary of messages ${from}–${to}]: ${summaryText}`,\n };\n const copy = [...messages];\n copy.splice(from, to - from + 1, summaryMsg);\n applyMessages(copy);\n const afterTokens = roughEstimate(copy);\n return {\n action: 'summary',\n beforeTokens,\n afterTokens,\n messageCount: copy.length,\n summary: summaryText,\n };\n }\n\n default:\n return {\n action: input.action,\n beforeTokens,\n messageCount: messages.length,\n notes: `Unknown action: ${input.action}`,\n };\n }\n },\n };\n}\n\n/** Pre-built instance with no compactor — compact action will return an error. */\nexport const contextManagerTool: Tool<ContextManagerInput, ContextManagerResult> =\n createContextManagerTool();\n","import type { MCPServerConfig } from '../types/config.js';\n\n/**\n * Built-in MCP server presets available to all WrongStack users out of the box.\n * These servers must be explicitly enabled in config (disabled by default).\n *\n * To enable: set `mcpServers: { serverName: { enabled: true } }` in your config.\n *\n * Some servers require environment variables or additional config — see notes below.\n *\n * Transport types:\n * stdio — spawns a local npm package binary via child_process\n * sse — HTTP SSE endpoint (client POSTs requests)\n * streamable-http — session-based HTTP with NDJSON responses\n */\n\n/** Filesystem access: read, write, list, search, tree. Good for exploring projects. */\nexport const filesystemServer = (): MCPServerConfig => ({\n name: 'filesystem',\n description: 'Read, write, and navigate the local filesystem (read-heavy tools)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],\n permission: 'confirm',\n});\n\n/** GitHub API: issues, PRs, repos, search, file operations. Requires GITHUB_PERSONAL_ACCESS_TOKEN. */\nexport const githubServer = (): MCPServerConfig => ({\n name: 'github',\n description:\n 'GitHub API — issues, PRs, repos, search, file ops (requires GITHUB_PERSONAL_ACCESS_TOKEN)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: { GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Context7 — codebase-aware documentation and Q&A using context from your code.\n * Live documentation for any library, grounded in your actual versions.\n */\nexport const context7Server = (): MCPServerConfig => ({\n name: 'context7',\n description: 'Codebase-aware documentation and Q&A (context7.ai)',\n transport: 'streamable-http',\n url: 'https://server.context7.ai/mcp',\n permission: 'confirm',\n});\n\n/**\n * Brave Search — web search via Brave Browser's API.\n * Requires BRAVE_SEARCH_API_KEY. Free tier: 2,000 queries/month.\n * Sign up at https://api.search.brave.com/\n */\nexport const braveSearchServer = (): MCPServerConfig => ({\n name: 'brave-search',\n description: 'Web search (Brave). Requires BRAVE_SEARCH_API_KEY — free tier 2k queries/month',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-brave-search'],\n env: { BRAVE_SEARCH_API_KEY: process.env.BRAVE_SEARCH_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Block (Block, Inc.) — Postgres database access via SQL.\n * Useful for running queries against a connected database during development.\n */\nexport const blockServer = (): MCPServerConfig => ({\n name: 'block',\n description: 'Postgres database access via SQL (Block MCP server)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-block'],\n permission: 'confirm',\n});\n\n/**\n * EverArt — AI image generation via various providers.\n * Requires EVERART_API_KEY.\n */\nexport const everArtServer = (): MCPServerConfig => ({\n name: 'everart',\n description: 'AI image generation (EverArt). Requires EVERART_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-everart'],\n env: { EVERART_API_KEY: process.env.EVERART_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Slack — messaging, channels, search.\n * Requires SLACK_BOT_TOKEN and either SLACK_TEAM_ID or SLACK_USER_TOKEN.\n */\nexport const slackServer = (): MCPServerConfig => ({\n name: 'slack',\n description: 'Slack — messaging, channels, search. Requires SLACK_BOT_TOKEN + SLACK_TEAM_ID',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: {\n SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN ?? '',\n SLACK_TEAM_ID: process.env.SLACK_TEAM_ID ?? '',\n },\n permission: 'confirm',\n});\n\n/**\n * AWS knowledge base — EC2, S3, Lambda, IAM, CloudFormation, cost management.\n * Requires AWS access key + secret in environment.\n */\nexport const awsServer = (): MCPServerConfig => ({\n name: 'aws',\n description: 'AWS — EC2, S3, Lambda, IAM, CloudFormation, costs. Requires AWS credentials',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-aws'],\n permission: 'confirm',\n});\n\n/**\n * Google Maps — directions, distance matrix, geocoding, places.\n * Requires GOOGLE_MAPS_API_KEY.\n */\nexport const googleMapsServer = (): MCPServerConfig => ({\n name: 'google-maps',\n description: 'Google Maps — directions, geocoding, places. Requires GOOGLE_MAPS_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-maps'],\n env: { GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/** Sentinel — security vulnerability scanning (sentinel-labs). */\nexport const sentinelServer = (): MCPServerConfig => ({\n name: 'sentinel',\n description: 'Security vulnerability scanning (Sentinel)',\n transport: 'streamable-http',\n url: 'https://mcp.sentinel.ai',\n permission: 'deny', // security tool — require explicit confirmation\n});\n\n/** Everything bundled — full set of built-in servers. Useful for `wstack mcp add --all`. */\nexport const allServers = (): Record<string, MCPServerConfig> => ({\n filesystem: { ...filesystemServer(), enabled: false },\n github: { ...githubServer(), enabled: false },\n context7: { ...context7Server(), enabled: false },\n 'brave-search': { ...braveSearchServer(), enabled: false },\n block: { ...blockServer(), enabled: false },\n everart: { ...everArtServer(), enabled: false },\n slack: { ...slackServer(), enabled: false },\n aws: { ...awsServer(), enabled: false },\n 'google-maps': { ...googleMapsServer(), enabled: false },\n sentinel: { ...sentinelServer(), enabled: false },\n});\n"]}