@wrongstack/core 0.31.1 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-subagent-runner-DpZTLdBe.d.ts → agent-subagent-runner-C66vi4Gq.d.ts} +1 -1
- package/dist/{config-BUEGM4JP.d.ts → config-ZRCf7sTu.d.ts} +21 -1
- package/dist/coordination/index.d.ts +7 -7
- package/dist/coordination/index.js +3051 -2947
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +8 -8
- package/dist/defaults/index.js +1435 -1321
- package/dist/defaults/index.js.map +1 -1
- package/dist/execution/index.d.ts +5 -5
- package/dist/extension/index.d.ts +2 -2
- package/dist/{index-ysfO_DlX.d.ts → index-6_csX32J.d.ts} +1 -1
- package/dist/{index-pXJdVLe0.d.ts → index-DkVgH3wC.d.ts} +31 -1
- package/dist/index.d.ts +135 -15
- package/dist/index.js +1236 -931
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +2 -2
- package/dist/infrastructure/index.js +17 -3
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/kernel/index.d.ts +2 -2
- package/dist/{mcp-servers-BzB3r7_c.d.ts → mcp-servers-DONdo-XM.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-DOXSgtom.d.ts → multi-agent-coordinator-BUsjiRWl.d.ts} +1 -1
- package/dist/{null-fleet-bus-CAQDGsKc.d.ts → null-fleet-bus-FvgHnZah.d.ts} +169 -131
- package/dist/{plan-templates-BZMi-VpU.d.ts → plan-templates-DYCeRCDN.d.ts} +1 -1
- package/dist/sdd/index.d.ts +3 -3
- package/dist/storage/index.d.ts +2 -2
- package/dist/{tool-executor-BAi4WI2d.d.ts → tool-executor-BpK-SWtJ.d.ts} +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.js +17 -3
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +107 -1
- package/dist/utils/index.js +53 -2
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/multi-agent/SKILL.md +57 -1
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/blocks.ts","../../src/types/messages.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/types/default-config.ts","../../src/types/secret-vault.ts","../../src/utils/atomic-write.ts","../../src/security/secret-vault.ts","../../src/utils/color.ts","../../src/infrastructure/logger.ts","../../src/infrastructure/token-counter.ts","../../src/utils/token-estimate.ts","../../src/utils/message-invariants.ts","../../src/execution/compactor.ts","../../src/infrastructure/path-resolver.ts","../../src/execution/regex-patterns.ts","../../src/execution/error-handler.ts","../../src/execution/retry-policy.ts","../../src/security/secret-scrubber.ts","../../src/utils/merge-models-payload.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/types/context-window.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/types/spec.ts","../../src/types/task-graph.ts","../../src/security/capabilities.ts","../../src/utils/json-schema-validate.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/utils/regex-guard.ts","../../src/storage/session-reader.ts"],"names":["path","stat","resolve","randomBytes","path2","fsp","open","fs3","path3","hasToolUse","fs4","path5","fs5","handlers","walk"],"mappings":";;;;;;AA2EO,SAAS,YAAY,CAAA,EAAiC;AAC3D,EAAA,OAAO,EAAE,IAAA,KAAS,MAAA;AACpB;AACO,SAAS,eAAe,CAAA,EAAoC;AACjE,EAAA,OAAO,EAAE,IAAA,KAAS,UAAA;AACpB;AACO,SAAS,kBAAkB,CAAA,EAAuC;AACvE,EAAA,OAAO,EAAE,IAAA,KAAS,aAAA;AACpB;AACO,SAAS,aAAa,CAAA,EAAkC;AAC7D,EAAA,OAAO,EAAE,IAAA,KAAS,OAAA;AACpB;AACO,SAAS,gBAAgB,CAAA,EAAqC;AACnE,EAAA,OAAO,EAAE,IAAA,KAAS,UAAA;AACpB;;;AChFO,SAAS,SAAS,OAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,OAAA;AAC3E;AAEO,SAAS,OAAO,OAAA,EAA0C;AAC/D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAM,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAuB,IAAI,CAAA,CACvC,KAAK,EAAE,CAAA;AACZ;;;ACGO,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,cAAA,EAAgB,gBAAA;AAAA,EAChB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAEpB,cAAA,EAAgB,gBAAA;AAAA,EAChB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAEzB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAElB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,oBAAA,EAAsB,sBAAA;AAAA;AAAA,EAEtB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAElB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAExB,OAAA,EAAS;AACX;AAuBO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAChC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAQT;AACD,IAAA,KAAA,CAAM,KAAK,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,OAAA;AACjC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,KAAA;AACvC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAmB;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,GAAU,CAAA,CAAA,EAAI,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/D,IAAA,OAAO,GAAG,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,OAAO,GAAG,GAAG,CAAA,CAAA;AAAA,EAC5C;AACF;AAEA,SAAS,cAAc,GAAA,EAAsC;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAC7B,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,CACjC,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AACtC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACrD;AAOO,IAAM,SAAA,GAAN,cAAwB,eAAA,CAAgB;AAAA,EACpC,QAAA;AAAA,EAET,YAAY,IAAA,EAcT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,MAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAS,EAAE,IAAA,EAAM,KAAK,QAAA,EAAU,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AACF;AAKO,IAAM,WAAA,GAAN,cAA0B,eAAA,CAAgB;AAAA,EAC/C,YAAY,IAAA,EAQT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,KAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAKO,IAAM,WAAA,GAAN,cAA0B,eAAA,CAAgB;AAAA,EACtC,UAAA;AAAA,EAET,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,yBAAA;AAAA,MACvC,SAAS,EAAE,MAAA,EAAQ,KAAK,UAAA,EAAY,GAAG,KAAK,OAAA,EAAQ;AAAA,MACpD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACF;AAMO,IAAM,UAAA,GAAN,cAAyB,eAAA,CAAgB;AAAA,EAC9C,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,gBAAgB,SAAA,GAAY,OAAA;AAAA,MAChE,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,SAAS,WAAA,CAAY,qBAAA;AAAA,MAC3D,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAQO,SAAS,iBAAA,CACd,GAAA,EACA,IAAA,GAA6E,WAAA,CAAY,gBAAA,EACxE;AACjB,EAAA,IAAI,GAAA,YAAe,iBAAiB,OAAO,GAAA;AAC3C,EAAA,MAAM,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,WAAA,CAAY,gBAAA,GAAmB,IAAA;AAAA,IAC1D,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,YAAA,GAAN,cAA2B,eAAA,CAAgB;AAAA,EACvC,SAAA;AAAA,EAET,YAAY,IAAA,EAMT;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,uBAAuB,OAAA,GAAU,SAAA;AAAA,MACrE,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,iBAAA;AAAA,MACvC,SAAS,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,GAAG,KAAK,OAAA,EAAQ;AAAA,MACtD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AACF;AAKO,IAAM,OAAA,GAAN,cAAsB,eAAA,CAAgB;AAAA,EAClC,IAAA;AAAA,EAET,YAAY,IAAA,EAST;AACD,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,cAAA;AAAA,MACvC,SAAS,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,GAAG,KAAK,OAAA,EAAQ;AAAA,MAC5C,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACnB;AACF;AAIO,SAAS,kBAAkB,GAAA,EAAsC;AACtE,EAAA,OAAO,GAAA,YAAe,eAAA;AACxB;AAEO,SAAS,YAAY,GAAA,EAAgC;AAC1D,EAAA,OAAO,GAAA,YAAe,SAAA;AACxB;AAEO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,GAAA,YAAe,WAAA;AACxB;AAEO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,GAAA,YAAe,WAAA;AACxB;AAEO,SAAS,eAAe,GAAA,EAAmC;AAChE,EAAA,OAAO,GAAA,YAAe,YAAA;AACxB;AAEO,SAAS,aAAa,GAAA,EAAiC;AAC5D,EAAA,OAAO,GAAA,YAAe,UAAA;AACxB;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,OAAO,GAAA,YAAe,OAAA;AACxB;;;AClPO,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;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,CAAA,EAAG,OAAO,WAAA,CAAY,sBAAA;AACrC,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,qBAAA;AACtE,EAAA,IAAI,IAAA,KAAS,sBAAA,IAA0B,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,oBAAA;AAC1E,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,mBAAA;AACtE,EAAA,IAAI,IAAA,KAAS,uBAAA,IAA2B,MAAA,KAAW,GAAA,SAAY,WAAA,CAAY,wBAAA;AAC3E,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,WAAA,CAAY,sBAAA;AACvC,EAAA,IAAI,MAAA,IAAU,GAAA,EAAK,OAAO,WAAA,CAAY,qBAAA;AACtC,EAAA,OAAO,WAAA,CAAY,wBAAA;AACrB;;;AClMO,IAAM,oBAAA,GAAuB,OAAO,MAAA,CAAO;AAAA,EAChD,wBAAA,EAA0B,OAAA;AAAA,EAC1B,aAAA,EAAe,GAAA;AAAA,EACf,kBAAA,EAAoB,GAAA;AAAA,EACpB,gBAAA,EAAkB,IAAA;AAAA,EAClB,0BAAA,EAA4B,GAAA;AAAA,EAC5B,eAAA,EAAiB;AACnB,CAAC;AAGM,IAAM,sBAAA,GAAyB,OAAO,MAAA,CAAO;AAAA,EAClD,SAAA,EAAW,EAAA;AAAA,EACX,cAAA,EAAgB;AAClB,CAAC;AAGM,IAAM,uBAAA,GAA0B,OAAO,MAAA,CAAO;AAAA,EACnD,kBAAA,EAAoB;AACtB,CAAC;AAGM,IAAM,8BAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,EAC1D,UAAA,EAAY,UAAA;AAAA,EACZ,QAAA,EAAU;AAAA,IACR,YAAA,EAAc;AAAA,MACZ,UAAA,EAAY;AAAA;AACd;AAEJ,CAAC;;;AChBM,IAAM,gBAAA,GAAmB,SAAA;ACThC,eAAsB,WAAA,CACpB,UAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,GAAA,GAAWA,cAAQ,UAAU,CAAA;AACnC,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAASA,eAAS,UAAU,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAIhG,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAS,EAAA,CAAA,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,EAAQ,CAAA;AAAA,IACpF,CAAA,MAAO;AACL,MAAA,MAAS,aAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAS,EAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,IAAA,EAAK;AAAA,MAChB,CAAA,SAAE;AACA,QAAA,MAAM,GAAG,KAAA,EAAM;AAAA,MACjB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMC,KAAAA,GAAO,MAAS,EAAA,CAAA,IAAA,CAAK,UAAU,CAAA;AACrC,MAAA,IAAA,GAAOA,MAAK,IAAA,GAAO,GAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,MAAA,MAAS,EAAA,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,eAAA,CAAgB,KAAK,UAAU,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI;AACF,MAAA,MAAS,UAAO,GAAG,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAUA,IAAM,sBAAA,uBAA6B,GAAA,CAAI,CAAC,SAAS,OAAA,EAAS,QAAA,EAAU,WAAW,CAAC,CAAA;AAEhF,eAAe,eAAA,CAAgB,MAAc,EAAA,EAA2B;AACtE,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AACpC,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI;AACF,MAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,MAAA;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAM,OAAQ,GAAA,EAA+B,IAAA;AAC7C,MAAA,IAAI,CAAC,QAAQ,CAAC,sBAAA,CAAuB,IAAI,IAAI,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,MAAA,EAAQ;AACrE,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,QAAQ,CAACC,QAAAA,KAAY,WAAWA,QAAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF;AACA,EAAA,MAAM,OAAA;AACR;;;AC7EA,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,GAAKC,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;AAK5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,IAAA,CAAK,OAAO,OAAO,GAAA,CAAI,MAAM,oBACzC,SAAS,CAAA,4CAAA;AAAA,SACxB;AAAA,MACF;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,CAAeC,cAAQ,IAAA,CAAK,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAMD,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;AAK5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,IAAA,CAAK,OAAO,OAAO,GAAA,CAAI,MAAM,oBACzC,SAAS,CAAA,4CAAA;AAAA,SACxB;AAAA,MACF;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,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,aAAA,CAAc,CAAC,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,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,MAAUE,EAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AACjD,IAAA,OAAA,GAAU,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAA;AACpD,EAAA,MAAUA,SAAWD,KAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE7D,EAAA,MAAM,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACjF,EAAA,MAAM,wBAAwB,UAAU,CAAA;AAC1C;AAUA,eAAsB,uBAAA,CACpB,YACA,KAAA,EAC6C;AAC7C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,EACzC;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,EACzC;AACA,EAAA,MAAM,OAAA,GAAU,EAAE,CAAA,EAAG,CAAA,EAAE;AACvB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AACjD,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAM,UAAA,EAAW;AAE5D,EAAA,MAAM,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAChF,EAAA,MAAM,wBAAwB,UAAU,CAAA;AACxC,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,CAAA,EAAG,MAAM,UAAA,EAAW;AACjD;AAQA,eAAe,wBAAwB,QAAA,EAAiC;AACtE,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,MAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAExC,MAAA,MAAM,aAAA,CAAc,QAAA,EAAU,CAAC,QAAA,EAAU,gBAAA,EAAkB,UAAA,EAAY,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,IACvG,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iDAAA,EAAoD,QAAQ,CAAA,kEAAA,CAA+D,CAAA;AAAA,IAC1I;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAUA,EAAA,CAAA,KAAA,CAAM,UAAU,GAAK,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,SAAA,CAAa,IAAA,EAAS,KAAA,EAAoB,OAAA,EAA2B;AAC5E,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,IAAA,KAAS,UAAU,IAAA,EAAM,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,GAAA,mBAA+B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvD,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,aAAA,CAAc,CAAC,CAAA,IAAK,CAAC,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACtF,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACxB,MAAA,OAAA,CAAQ,CAAA,EAAA;AAAA,IACV,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,EAAM;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAIA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,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;;;AC3TA,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,CAACC,KAAAA,EAAc,KAAA,KACf,CAAC,CAAA,KACC,KAAA,GAAQ,CAAA,KAAA,EAAQA,KAAI,CAAA,CAAA,EAAI,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,CAAA,GAAM,CAAA;AAEzC,IAAM,KAAA,GAAQ;AAAA,EACnB,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EACpB,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACpB,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACnB,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACtB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACzB,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACpB,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACvB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACxB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5B,IAAA,EAAM,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EAC3B,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAI;AAC1B,CAAA;;;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;;;AClGA,IAAM,oBAAA,GAAuB,GAAA;AAOtB,IAAM,sBAAN,MAAkD;AAAA,EAC/C,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,CAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,CAAA;AAAA,EACJ,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACT,UAAA,uBAAiB,GAAA,EAAwB;AAAA;AAAA,EAEzC,SAAA,GAAY,CAAA;AAAA,EACZ,aAAA,GAAgB,CAAA;AAAA,EAExB,WAAA,CAAY,IAAA,GAA8E,EAAC,EAAG;AAC5F,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,OAAA,CAAQ,OAAc,KAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,IAAa,MAAM,SAAA,IAAa,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,UAAA,IAAc,CAAA;AAEvC,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,KAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,SAAA,IAAa,CAAA;AAExC,IAAA,MAAM,QAAQ,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACnD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,cAAc,KAAA,EAAO;AAEpD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,IAAQ,oBAAA,EAAsB;AAChD,QAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACvC,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,MACjC;AAEA,MAAA,KAAK,IAAA,CAAK,SACP,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAC5B,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,iCAAA,EAAmC,EAAE,KAAA,EAAO,KAAA,IAAS,aAAa,CAAA;AACpF,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACL;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,CAAiB,OAAc,QAAA,EAA+B;AAC5D,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,IAAa,MAAM,SAAA,IAAa,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,UAAA,IAAc,CAAA;AAEvC,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,KAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,SAAA,IAAa,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,IAAQ,oBAAA,EAAsB;AAChD,MAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACvC,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,KAAA,GAAe;AACb,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,oBAAA,GAA6D;AAC3D,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,KAAK,aAAA,EAAc;AAAA,EAChE;AAAA,EAEA,YAAA,GAAkF;AAChF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,MAC5B,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MAC9B,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,SAAA,GAAY,KAAK,UAAU,CAAA;AAAA,MAC9C,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,UAAA,GAAyB;AAIvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,KAAA;AACpC,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,aAAa,IAAA,CAAK,UAAA;AAAA,MAClB,QAAA,EAAU,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,KAAK,SAAA,GAAY;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AAAA,EAEQ,UAAA,CAAW,OAAc,KAAA,EAAyB;AACxD,IAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,aAAc,KAAA,CAAM,KAAA,GAAQ,MAAa,KAAA,CAAM,KAAA;AACrE,IAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,cAAe,KAAA,CAAM,MAAA,GAAS,MAAa,KAAA,CAAM,MAAA;AACxE,IAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,EAAW;AACtC,MAAA,IAAA,CAAK,SAAA,IAAc,KAAA,CAAM,SAAA,GAAY,GAAA,GAAa,KAAA,CAAM,SAAA;AAAA,IAC1D;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,EAAY;AACxC,MAAA,IAAA,CAAK,SAAA,IAAc,KAAA,CAAM,UAAA,GAAa,GAAA,GAAa,KAAA,CAAM,UAAA;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,eAAe,CAAA,EAA8B;AACpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA;AAAA,IAChB,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA;AAAA,IACnB,UAAA,EAAY,EAAE,IAAA,EAAM;AAAA,GACtB;AACF;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAM,CAAA,GAAI,GAAA;AAClC;;;ACjJA,IAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,aAAA,GAAgB,GAAA,KACxD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,aAAa,CAAC,CAAA;AAoBpD,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;AAOO,SAAS,sBAAsB,IAAA,EAA4E;AAChH,EAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,GACjC,mBAAmB,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA,GACzC,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAC,CAAA;AACvD;AAqBO,SAAS,qBAAA,CACd,QAAA,EACA,YAAA,EACA,KAAA,EACuB;AAEvB,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,cAAA,GAAiB,mBAAmB,QAAQ,CAAA;AAAA,EAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAClC,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,aAAa,CAAA,EAAG;AACzD,QAAA,MAAM,UAAW,CAAA,CAA2B,OAAA;AAC5C,QAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,UAAA,cAAA,IAAkB,mBAAmB,OAAO,CAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjC,UAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,YAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,cAAA,IAAK,CAAA,CAAwB,SAAS,MAAA,EAAQ;AAC5C,gBAAA,cAAA,IAAkB,kBAAA,CAAoB,EAAuB,IAAI,CAAA;AAAA,cACnE,CAAA,MAAO;AACL,gBAAA,cAAA,IAAkB,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,cACxD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,YAAA,GAAe,mBAAmB,YAAY,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AACtC,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,IAAS,CAAA,CAAwB,SAAS,MAAA,EAAQ;AACnF,QAAA,YAAA,IAAgB,kBAAA,CAAoB,EAAuB,IAAI,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,WAAA,IAAe,sBAAsB,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,YAAA,GAAe,WAAA;AAO9C,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,cAAA;AAAA,IACV,YAAA,EAAc,YAAA;AAAA,IACd,KAAA,EAAO,WAAA;AAAA,IACP;AAAA,GACF;AACF;;;AC7JO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,qBAA+B,EAAC;AACtC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,MAAiB,EAAC;AAExB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,QAAA,GAAW,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,GAAA,GAAM,QAAA;AAEV,IAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,CAAC,MAAA,KAAW;AAC3C,QAAA,MAAM,OAAuB,EAAC;AAC9B,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,KAAA,CAAM,SAAS,UAAA,IAAc,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACvD,YAAA,eAAA,CAAgB,IAAA,CAAK,MAAM,EAAE,CAAA;AAC7B,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACjB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,GAAA;AAAA,IACpB;AAEA,IAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,UAAU,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,CAAC,MAAA,KAAW;AAC3C,QAAA,MAAM,OAAuB,EAAC;AAC9B,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,KAAA,CAAM,SAAS,aAAA,IAAiB,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACnE,YAAA,kBAAA,CAAmB,IAAA,CAAK,MAAM,WAAW,CAAA;AACzC,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACjB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,GAAA;AAAA,IACpB;AAEA,IAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACvB,MAAA,eAAA,EAAA;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACd;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAU,GAAA,GAAM,QAAA;AAAA,IAC1B,MAAA,EAAQ,EAAE,OAAA,EAAS,eAAA,EAAiB,oBAAoB,eAAA;AAAgB,GAC1E;AACF;AAEA,SAAS,WAAW,GAAA,EAAmC;AACrD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAyB,CAAA,CAAE,SAAS,UAAU,CAAA;AAChF;AAEA,SAAS,cAAc,GAAA,EAAmC;AACxD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAA4B,CAAA,CAAE,SAAS,aAAa,CAAA;AACtF;AAEA,SAAS,WAAW,GAAA,EAAuC;AACzD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,aAAa,OAAO,GAAA;AAC7C,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,GAAG,CAAA,EAAG;AACtC,IAAA,IAAI,MAAM,IAAA,KAAS,UAAA,EAAY,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAAuC;AAC5D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,QAAQ,OAAO,GAAA;AACxC,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,GAAG,CAAA,EAAG;AACtC,IAAA,IAAI,MAAM,IAAA,KAAS,aAAA,EAAe,GAAA,CAAI,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAA0C;AAC/D,EAAA,OAAO,GAAA,IAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,UAAU,EAAC;AAC5D;AAEA,SAAS,UAAA,CACP,KACA,EAAA,EACgB;AAChB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,GAAA;AACxC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,GAAA,CAAI,OAAA,CAAQ,UAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AACxF,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK;AACjC;AAEA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,OAAO,IAAI,OAAA,KAAY,QAAA,SAAiB,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA;AAC1E,EAAA,OAAO,GAAA,CAAI,QAAQ,MAAA,KAAW,CAAA;AAChC;;;ACnGO,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,CAAA;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,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC/C,IAAA,MAAM,aAA0C,EAAC;AACjD,IAAA,MAAM,MAAA,GAAS,wBAAwB,GAAG,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,SAAA,IAAa,IAAA,CAAK,SAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,cAAA,IAAkB,IAAA,CAAK,cAAA;AAGtD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,GAAA,EAAK,WAAW,cAAc,CAAA;AAC3E,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,GAAA,EAAK,SAAS,CAAA;AAC5D,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,QAAA,GAAW,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,OAAO,OAAA,EAAS;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,WAAA;AAAA,MACP,uBAAA,EAAyB,UAAA;AAAA,MACzB,sBAAA,EAAwB,SAAA;AAAA,MACxB,UAAA;AAAA,MACA,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,OAAA,GACtB;AAAA,QACE,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,QACjC,kBAAA,EAAoB,SAAS,MAAA,CAAO,kBAAA;AAAA,QACpC,eAAA,EAAiB,SAAS,MAAA,CAAO;AAAA,OACnC,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,GAAA,EAAsB;AAChD,IAAA,MAAM,SAAA,GAAY,sBAAsB,GAAA,CAAI,QAAA,EAAU,IAAI,YAAA,EAAc,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AACvF,IAAA,OAAO,SAAA,CAAU,KAAA;AAAA,EACnB;AAAA,EAEQ,oBACN,GAAA,EACA,SAAA,GAAY,KAAK,SAAA,EACjB,cAAA,GAAiB,KAAK,cAAA,EACd;AACR,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,WAAW,CAAA,EAAA,EAAK;AACtE,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;AAMA,IAAA,KAAA,IAAS,CAAA,GAAI,aAAA,EAAe,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACpD,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AACtE,MAAA,MAAME,WAAAA,GAAa,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAC9D,MAAA,IAAIA,WAAAA,IAAc,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ;AACzC,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAC3B,QAAA,IACE,IAAA,IACA,KAAK,IAAA,KAAS,MAAA,IACd,OAAO,IAAA,CAAK,OAAA,KAAY,YACxB,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA,IAC1B,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,EACjD;AAGA,UAAA,aAAA,GAAgB,CAAA,GAAI,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,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,gBAAgB,OAAO,CAAA;AACpC,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,QAAA,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,oBAAA,CAAqB,GAAA,EAAc,SAAA,GAAY,IAAA,CAAK,SAAA,EAAmB;AAC7E,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,MAAA,GAAS,YAAY,CAAC,CAAA;AAC7D,IAAA,IAAI,SAAA,IAAa,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,wBAAwB,GAAA,EAA0C;AACzE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,GAAO,qBAAqB,CAAA;AAC/C,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,IAAA;AAClD,EAAA,MAAM,SAAA,GAAY,MAAA;AAClB,EAAA,IACE,OAAO,SAAA,CAAU,SAAA,KAAc,YAC/B,OAAO,SAAA,CAAU,mBAAmB,QAAA,EACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;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;AC/OA,IAAM,eAAA,GAAkB;AAAA,EACtB,MAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,sBAAN,MAAkD;AAAA,EAC9C,WAAA;AAAA,EACA,GAAA;AAAA,EAET,WAAA,CAAY,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAG;AACvC,IAAA,IAAA,CAAK,GAAA,GAAW,cAAQ,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA;AAAA,EACpD;AAAA,EAEA,kBAAkB,KAAA,EAAuB;AACvC,IAAA,IAAI,GAAA,GAAW,cAAQ,KAAK,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAY,KAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC7B,IAAA,OAAO,QAAQ,IAAA,EAAM;AACnB,MAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,QAAA,IAAI;AACF,UAAGC,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAM,CAAC,CAAA;AACpC,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAc,cAAQ,GAAG,CAAA;AAC/B,MAAA,IAAI,WAAW,GAAA,EAAK;AACpB,MAAA,GAAA,GAAM,MAAA;AAAA,IACR;AACA,IAAA,OAAY,cAAQ,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,MAAM,GAAA,GAAW,iBAAW,KAAK,CAAA,GAAI,QAAa,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,KAAK,CAAA;AACzE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAUA,iBAAa,GAAG,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,GAAY,gBAAU,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,OAAA,EAA0B;AACrC,IAAA,MAAM,UAAA,GAAkB,gBAAU,OAAO,CAAA;AACzC,IAAA,MAAM,IAAA,GAAY,KAAA,CAAA,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AAC5C,IAAA,IAAI,UAAA,KAAe,MAAM,OAAO,IAAA;AAChC,IAAA,MAAM,GAAA,GAAW,KAAA,CAAA,QAAA,CAAS,IAAA,EAAM,UAAU,CAAA;AAC1C,IAAA,OAAO,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,CAAM,iBAAW,GAAG,CAAA;AAAA,EACtD;AAAA,EAEA,iBAAiB,OAAA,EAAyB;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,EAAG;AAIhC,MAAA,MAAM,UAAe,KAAA,CAAA,UAAA,CAAW,OAAO,CAAA,GAAS,KAAA,CAAA,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA;AACpE,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,OAAO,CAAA,mCAAA,CAAqC,CAAA;AAG3E,MAAC,IAA4D,QAAA,GAAW,OAAA;AACxE,MAAC,GAAA,CAA4D,cAAc,IAAA,CAAK,WAAA;AAChF,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACxEO,IAAM,cAAA,GAAiB,yDAAA;;;ACe9B,IAAM,mBAAA,GAAsB,0BAAA;AAMrB,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,EAAQ,KAAK,GAAA,CAAI,GAAA,EAAO,OAAO,CAAC,CAAA;AACvD,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7C,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,oBAAA,EAAqB;AAAA,MACzD;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,MAAM,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK;AACtB,QAAA,IAAI,EAAE,GAAA,YAAe,aAAA,CAAA,EAAgB,OAAO,IAAA;AAC5C,QAAA,IAAI,GAAA,CAAI,WAAW,GAAA,IAAO,GAAA,CAAI,WAAW,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEzE,QAAA,MAAM,WAAW,IAAA,EAAM,cAAA;AACvB,QAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,EAAU,EAAA;AACjC,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,UAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AACtD,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,MAAM,eAAe,MAAM,QAAA,CAAS,QAAA,CAAS,UAAA,EAAY,IAAI,KAAK,CAAA;AAClE,UAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAI1B,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AAC/C,YAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,MAAA,CAAO,iBAAA;AAC1C,YAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,KAAA,IAAS,MAAA,CAAO,iBAAA;AACvD,YAAA,IAAI,SAAA,IAAa,aAAa,OAAO,KAAA;AACrC,YAAA,IAAI,aAAa,YAAA,CAAa,KAAA,IAAS,CAAC,CAAA,CAAE,WAAW,OAAO,KAAA;AAC5D,YAAA,IAAI,YAAA,CAAa,aAAa,MAAA,IAAU,CAAC,EAAE,UAAA,EAAY,KAAA,EAAO,SAAS,OAAO,CAAA;AAC5E,cAAA,OAAO,KAAA;AACT,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAED,UAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,UAAA,MAAM,WAAW,UAAA,CAAW,MAAA;AAAA,YAAO,CAAC,IAAA,EAAM,IAAA,KAAA,CACvC,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA,KAAM,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA,CAAA,GAAK,IAAA,GAAO;AAAA,WAC7D;AAEA,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ,iBAAA;AAAA,YACR,OAAO,QAAA,CAAS;AAAA,WAClB;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AACF,GACF;AACF;AAEO,IAAM,8BAA8B,uBAAA;AAEpC,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;;;ACtKO,IAAM,qBAAN,MAAgD;AAAA,EACrD,WAAA,CAAY,KAA4B,OAAA,EAA0B;AAChE,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI,CAAC,GAAA,CAAI,SAAA,EAAW,OAAO,KAAA;AAC3B,MAAA,OAAO,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,IAAW,EAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AACzC,IAAA,IAAI,SAAA,SAAkB,OAAA,GAAU,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,GAAA,EAAoC;AAC9C,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,MAAA,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;;;ACzBA,IAAM,QAAA,GAAsB;AAAA;AAAA;AAAA,EAG1B;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,iEAAA,EAAkE;AAAA,EAC/F,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,sDAAA,EAAuD;AAAA,EACpF,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,8DAAA,EAA+D;AAAA,EAC/F,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,kDAAA,EAAmD;AAAA,EACpF,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,uDAAA,EAAwD;AAAA,EAClF,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,gEAAA,EAAiE;AAAA,EAC/F;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IAAc,KAAA,EAAO;AAAA,GAC7B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,oBAAA;AAAA;AAAA,IAEN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,KAAA;AAAA;AAAA,IAEN,KAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,aAAA;AAAA;AAAA,IAEN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACjE,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,gCAAA,EAAiC;AAAA,EAChE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACnD,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACnD;AAAA,IACE,IAAA,EAAM,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA;AAAA;AAAA,IAGN,KAAA,EAAO;AAAA;AAEX,CAAA;AAOA,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;;;ACvGO,SAAS,kBAAA,CACd,MACA,OAAA,EACkB;AAClB,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,IAAA,GAAA,CAAI,EAAE,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA;AAAA,EAClC;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACtD,IAAA,MAAM,QAAA,GAAW,IAAI,EAAE,CAAA;AACvB,IAAA,GAAA,CAAI,EAAE,IAAI,QAAA,GAAW,aAAA,CAAc,UAAU,UAAU,CAAA,GAAI,cAAc,UAAU,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAyB,OAAA,EAA+C;AAC7F,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,EACvB;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACjE,IAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,IAAA,MAAA,CAAO,GAAG,IAAI,QAAA,GAAW,UAAA,CAAW,UAAU,OAAO,CAAA,GAAI,EAAE,GAAG,OAAA,EAAQ;AAAA,EACxE;AACA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA;AAAA,IAEH,GAAG,cAAA,CAAe;AAAA,MAChB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,IACD;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CAAW,MAAsB,OAAA,EAAyC;AACjF,EAAA,MAAM,MAAA,GAAyB,EAAE,GAAG,IAAA,EAAM,GAAG,OAAA,EAAQ;AAGrD,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAO;AAC/B,IAAA,MAAA,CAAO,QAAQ,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,QAAQ,KAAA,EAAM;AAAA,EACnD;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM;AAC7B,IAAA,MAAA,CAAO,OAAO,EAAE,GAAG,KAAK,IAAA,EAAM,GAAG,QAAQ,IAAA,EAAK;AAAA,EAChD;AACA,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,OAAA,CAAQ,UAAA,EAAY;AACzC,IAAA,MAAA,CAAO,aAAa,EAAE,GAAG,KAAK,UAAA,EAAY,GAAG,QAAQ,UAAA,EAAW;AAAA,EAClE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAAyC;AAC9D,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA,EAAG;AACrD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,EACvB;AACA,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAO;AACxB;AAGA,SAAS,eAAkD,GAAA,EAAoB;AAC7E,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,GAAA,CAAI,CAAY,CAAA,GAAI,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT;;;AChFA,IAAM,WAAA,GAAc,6BAAA;AACpB,IAAM,sBAAsB,EAAA,GAAK,IAAA;AA4CjC,IAAM,aAAA,GAA4C;AAAA,EAChD,mBAAA,EAAqB,WAAA;AAAA,EACrB,iCAAA,EAAmC,WAAA;AAAA,EACnC,gBAAA,EAAkB,QAAA;AAAA,EAClB,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,cAAA,EAAgB,mBAAA;AAAA,EAChB,aAAA,EAAe,mBAAA;AAAA,EACf,kBAAA,EAAoB,mBAAA;AAAA,EACpB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,6BAAA,EAA+B,mBAAA;AAAA,EAC/B,qBAAA,EAAuB,mBAAA;AAAA,EACvB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,gBAAA,EAAkB;AACpB,CAAA;AAEO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,KAAK,OAAO,aAAA;AACjB,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA;AAC/B;AAEO,IAAM,wBAAN,MAAsD;AAAA;AAAA,EAEnD,OAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EACA,SAAA;AAAA,EACS,SAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EAEjB,YAAY,IAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,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;AACvC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GACH,IAAA,CAAK,gBAAA,KACJ,IAAA,CAAK,UAAA,GACGC,KAAA,CAAA,IAAA,CAAUA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,2BAA2B,CAAA,GACnE,MAAA,CAAA;AAAA,EACR;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,GAA4B,EAAC,EAA8B;AACpE,IAAA,IAAI,KAAK,OAAA,IAAW,CAAC,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,OAAA;AAG7C,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA;AACpB,MAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,QAAA,CACZ,IAAA,GAA4B,EAAC,EAC7B,mBAAmB,KAAA,EACQ;AAC3B,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,WAAA,EAAY;AAAA,IAChC,SAAS,GAAA,EAAK;AAEZ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AACA,MAAA,IAAI,gBAAA,EAAkB;AAEpB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,2CACE,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,gCAAA;AAAA,SACF;AACA,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,WAAA,GAAyC;AACrD,IAAA,MAAM,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,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;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAA,CAAY,IAAA,GAA4B,EAAC,EAA8B;AACnF,IAAA,IAAI,KAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,cAAA;AACpD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,OAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC5C,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,EAAC;AACnC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAc,mBAAmB,IAAA,EAAkE;AACjG,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,kBAAkB,OAAO,MAAA;AACvD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAC3D,MAAA,IAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,SAAS,CAAA,SAAU,MAAA,CAAO,OAAA;AAAA,IAC9D;AACA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,UAAA,EAAY;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB,OACvC,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjD,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,KAAK,IAAA,CAAK,UAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AACA,MAAA,MAAM,WAAA,CAAY,KAAK,gBAAA,EAAkB,IAAA,CAAK,UAAU,QAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAGN,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAC3D,MAAA,IAAI,UAAU,IAAA,CAAK,mBAAA,CAAoB,OAAO,SAAS,CAAA,SAAU,MAAA,CAAO,OAAA;AACxE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAAyD;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,MAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASC,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAM,CAAA;AACtD,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAqC;AAGzC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,EAAY;AACpC,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,YAAY,EAAE,KAAA,EAAO,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,aAAA,GAA6C;AACjD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,YAAY,EAAA,EAAmD;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,MAAM,CAAA,GAAI,QAAQ,EAAE,CAAA;AACpB,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA,GAAI,MAAA;AAAA,EACvC;AAAA,EAEA,MAAM,QAAA,CAAS,UAAA,EAAoB,OAAA,EAAqD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAClD,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAO,MAAM,SAAA,IAAa,KAAA;AAAA,QAC1B,QAAQ,OAAA,CAAQ,KAAA,CAAM,YAAY,KAAA,EAAO,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,QAC1D,SAAA,EAAW,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,WAAA,CAAY,KAAK,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,MAAA,CAAO,iBAAA;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,EAAQ,IAAK,GAAA;AAAA,IAC/D;AACA,IAAA,OAAA,CAAQ,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA,CAAU,SAAQ,IAAK,GAAA;AAAA,EACnD;AAAA,EAEQ,gBAAgB,CAAA,EAAwC;AAC9D,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQ,cAAA,CAAe,CAAA,CAAE,GAAG,CAAA;AAAA,MAC5B,SAAS,CAAA,CAAE,GAAA;AAAA,MACX,OAAA,EAAS,CAAA,CAAE,GAAA,IAAO,EAAC;AAAA,MACnB,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AAAA,MACpC,KAAK,CAAA,CAAE;AAAA,KACT;AAAA,EACF;AAAA,EAEQ,QAAQ,YAAA,EAA+B;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,YAAY,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AAAA,EAC9D;AAAA,EAEQ,oBAAoB,YAAA,EAA+B;AACzD,IAAA,OAAO,IAAA,CAAK,KAAI,GAAI,IAAI,KAAK,YAAY,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,aAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,YAAY,IAAA,EAAkD;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAASA,EAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,GAAwB;AACtB,IAAA,OAAYD,KAAA,CAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,EACpC;AACF;;;ACnUO,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,GACzD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,2CAAA;AAAA,IACb,MAAA,EAAQ,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,CAAA;AAAA,IAuBR,IAAA,EAAM,CAAC,MAAA,EAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,IAClC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,GAC1C;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,gDAAA;AAAA,IACb,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;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,6FAAA,CAAA;AAAA,IA0DR,IAAA,EAAM,CAAC,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,IACvC,eAAA,EAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS;AAAA;AAE/C;;;AC/NO,IAAM,8BAAA,GAAsD;AAE5D,IAAM,oBAAA,GAAqD,OAAO,MAAA,CAAO;AAAA,EAC9E;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,qFAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,MAAM,GAAA,EAAI;AAAA,IAC/C,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,qEAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,GAAA,EAAK,MAAM,IAAA,EAAK;AAAA,IAChD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,4EAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IACjD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,gFAAA;AAAA,IACb,YAAY,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,GAAA,EAAK,MAAM,IAAA,EAAK;AAAA,IAChD,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY;AAAA;AAEhB,CAAC;AAEM,SAAS,sBAAA,GAA8C;AAC5D,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,UAAA,IAAa,CAAE,CAAA;AACpF;AAEO,SAAS,qBAAqB,EAAA,EAAyD;AAC5F,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,OAAO,oBAAA,CAAqB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzD,EAAA,OAAO,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW,EAAE,GAAI,IAAA;AAClE;AAEO,SAAS,sBAAsB,EAAA,EAAuC;AAC3E,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD;AAEO,SAAS,0BAAA,CACd,MAAA,GAAkC,EAAC,EACnC,YAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,MAAA,CAAO,IAAA,IAAQ,8BAAA;AACjD,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,SAAS,CAAA,IAAK,qBAAqB,8BAA8B,CAAA;AAEnG,EAAA,IAAI,IAAA,CAAK,OAAO,8BAAA,EAAgC;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MAC9C,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MAC9C,IAAA,EAAM,MAAA,CAAO,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW;AAAA,KAChD;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,SAAA;AAAA,IACpC,cAAA,EAAgB,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK;AAAA,GAChD;AACF;AAEO,SAAS,4BAA4B,QAAA,EAAkC;AAC5E,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,KAAM;AACrC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,EAAA,KAAO,QAAA,GAAW,GAAA,GAAM,GAAA;AACzC,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,EAAA,CAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,EAAE,WAAW,CAAA,CAAA;AAAA,EACjE,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACd;;;ACjHO,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,EAAIE,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;AAAA,EAE1C,qBAAA;AAAA,EAER,WAAA,CAAY,QAA2B,SAAA,EAA4B;AACjE,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AAErC,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC3E,MAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAE9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACjC,QAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,GAAG,CAAA;AAAA,QACP,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,GAAA,EAAmC;AAC5C,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,KAAK,GAAA,CAAI,EAAA,IAAM,KAAK,aAAa,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAU,GAAA,EAAmC;AACjD,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,IAAA,GAAA,CAAI,EAAA,GAAK,GAAA;AACT,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EACpC;AAAA,EAEA,UAAU,OAAA,EAAmE;AAC3E,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAuC,CAAA;AAC9D,IAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAuC,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,OAAA,CAAW,GAAA,EAAoB,SAAA,EAA+C;AAClF,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,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,CAACX,QAAAA,EAAS,MAAA,KAAW;AAEtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,aAAa,CAAA;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACzC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,aAAa,CAAA,iBAAA,EAAoB,OAAO,IAAI,CAAC,CAAA;AAAA,MAC3E,GAAG,OAAO,CAAA;AAOV,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA,EAAG;AAC3C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAClC,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,aAAA,EAAe;AAAA,QACtC,OAAA,EAASA,QAAAA;AAAA,QACT,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,GAAA,CAAI,EAAA,IAAM,KAAK,aAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AAClE,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,aAAa,CAAA;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACzC,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,KAAK,eAAA,EAAiB;AACxC,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,MAAA,CAAA,CAAE,MAAA,CAAO,IAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAGzB,IAAA,IAAA,CAAK,qBAAA,IAAwB;AAC7B,IAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAC7B,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AACF;AAEO,SAAS,aAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EACA,EAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,IAAI,UAAA,EAAW;AAAA,IACf,IAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AACF;;;AChFO,IAAM,qBAAA,GAAsC;AAAA,EACjD,EAAA,EAAI,SAAA;AAAA,EACJ,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,8CAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,IAChD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,IACxD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,IACxD,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,IAC7C,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,IAC9C,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,IAChD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,qBAAA,EAAuB,OAAO,CAAA;AAAE,GAC/D;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,IAC9F;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,oBAAoB,EAAC;AAAA,MACrB,WAAW,EAAC;AAAA,MACZ,YAAY;AAAC;AACf;AAEJ;;;ACdO,SAAS,oBAAoB,KAAA,EAAgC;AAClE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACpC,IAAA,QAAQ,EAAE,MAAA;AAAQ,MAChB,KAAK,WAAA;AACH,QAAA,SAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,UAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA;AAEJ,IAAA,cAAA,IAAkB,EAAE,aAAA,IAAiB,CAAA;AACrC,IAAA,WAAA,IAAe,EAAE,WAAA,IAAe,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,IAAA;AAE1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA,EAAiB,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,SAAA,GAAY,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAAA,IACrE,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAsC;AACrE,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAC7C,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,UAAU,CAAA;AACnE,EAAA,MAAM,eAAA,GAAkB,cACrB,MAAA,CAAO,CAAC,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAC,EAC/E,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAElB,EAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAA,EAAI,CAAC,CAAA;AAE3F,EAAA,OAAO;AAAA,IACL,SAAS,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACtC,kBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,gBAAgB,KAAA,EAA4B;AAC1D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,SAAS,MAAM,EAAA,EAAkB;AAE/B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG;AAE1B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,EAAA,EAAI,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,MAAM,SAAA,EAAW;AACpC,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1KO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,eAAA,EAAiB,iBAAA;AAAA,EAMR;AAAA,EAGT,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,wBAAA,EAA0B,0BAAA;AAAA,EAGZ;AAAA,EAGd,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAGhB,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,eAAA,EAAiB;AACnB,CAAA;AASO,IAAM,uBAAA,GAAqD;AAAA,EAChE,gBAAA,CAAiB,eAAA;AAAA,EACjB,gBAAA,CAAiB,QAAA;AAAA,EACjB,gBAAA,CAAiB,wBAAA;AAAA,EACjB,gBAAA,CAAiB,SAAA;AAAA,EACjB,gBAAA,CAAiB,cAAA;AAAA,EACjB,gBAAA,CAAiB,aAAA;AAAA,EACjB,gBAAA,CAAiB;AACnB,CAAA;AAMO,SAAS,mCACd,UAAA,EACS;AACT,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,MAAM,IAAA,GAA0B,MAAM,OAAA,CAAQ,UAAU,IAAI,UAAA,GAAc,KAAA,CAAM,gBAAgB,EAAC;AACjG,EAAA,OAAO,KAAK,IAAA,CAAK,CAAC,MAAM,uBAAA,CAAwB,QAAA,CAAS,CAAmB,CAAC,CAAA;AAC/E;AAqBO,SAAS,yBACd,UAAA,EACkB;AAClB,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,MAAM,IAAA,GAA0B,MAAM,OAAA,CAAQ,UAAU,IAAI,UAAA,GAAc,KAAA,CAAM,gBAAgB,EAAC;AACjG,EAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IAAO,CAAC,CAAA,KAClB,uBAAA,CAAwB,QAAA,CAAS,CAAmB;AAAA,GACtD;AACF;;;ACjFO,SAAS,qBAAA,CAAsB,OAAgB,MAAA,EAAsC;AAC1F,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAAY,KAAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,MAAM,CAAA;AAC9B,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC3C;AAEA,SAASA,KAAAA,CAAK,KAAA,EAAgB,MAAA,EAAoBd,KAAAA,EAAc,MAAA,EAAiC;AAC/F,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG;AACjD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAMA,KAAAA,IAAQ,QAAA;AAAA,QACd,OAAA,EAAS,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,OACtF,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAMA,KAAAA,IAAQ,QAAA;AAAA,QACd,SAAS,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAA,MAAA,EAAS,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,OAC7D,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,aAAA,CAAc,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AACvC,MAAA,IAAI,EAAE,OAAO,GAAA,CAAA,EAAM;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAASA,OAAM,GAAG,CAAA,EAAG,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,MACjF;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,MAAW,CAAC,KAAK,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAChE,QAAA,IAAI,OAAO,GAAA,EAAK;AACd,UAAAc,KAAAA,CAAK,IAAI,GAAG,CAAA,EAAG,WAAW,QAAA,CAASd,KAAAA,EAAM,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,IAAW,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,EAAO;AACnE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAMc,MAAK,IAAA,EAAM,MAAA,CAAO,KAAA,EAAqB,CAAA,EAAGd,KAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA;AAAA,EAC5F;AACF;AAEA,SAAS,SAAA,CAAU,OAAgB,IAAA,EAAuB;AACxD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA;AAAA,IAC1B,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACzD,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC5D,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,SAAA;AAAA,IAC1B,KAAK,MAAA;AACH,MAAA,OAAO,KAAA,KAAU,IAAA;AAAA,IACnB,KAAK,OAAA;AACH,MAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC5B,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,cAAc,CAAA,EAAqB;AAC1C,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,aAAa,CAAA,EAAoB;AACxC,EAAA,IAAI,CAAA,KAAM,MAAM,OAAO,MAAA;AACvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,OAAA;AAC7B,EAAA,OAAO,OAAO,CAAA;AAChB;AAEA,SAAS,QAAA,CAAS,QAAgB,GAAA,EAAqB;AACrD,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACzB;AAEA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,SAAa,CAAA,KAAM,CAAA;AAC3C,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,IAAA,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,EAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AAClC,IAAA,IAAI,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,KAAA;AAAA,MAAM,CAAC,MACf,SAAA,CAAW,CAAA,CAA8B,CAAC,CAAA,EAAI,CAAA,CAA8B,CAAC,CAAC;AAAA,KAChF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;AChHO,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;;;ACnCO,IAAM,eAAN,MAAmB;AAAA,EAIxB,WAAA,CACmB,UACT,IAAA,EACR;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACT,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAER,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,kBAAA,IAAsB,GAAA;AACrD,IAAA,IAAA,CAAK,aAAa,0BAAA,CAA2B;AAAA,MAC3C,0BAAA,EAA4B,KAAK,0BAAA,IAA8B;AAAA,KAChE,CAAA;AAAA,EACH;AAAA,EAPmB,QAAA;AAAA,EACT,IAAA;AAAA,EALO,UAAA;AAAA,EACA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBjB,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,KAAK,cAAA,GAAiB,MAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CACJ,QAAA,EACA,GAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,0BAAA,IAA8B,GAAA;AAErD,IAAA,MAAM,MAAA,GAAS,OAAO,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;AAKA,MAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,GAAA,CAAI,KAAA,EAAO,KAAK,WAAW,CAAA;AACpE,MAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,QAAA,MAAM,eAAe,UAAA,CAAW,MAAA,CAC7B,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAA,IAAQ,OAAO,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACnD,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,EAAA;AAAA,UACjB,OAAA,EACE,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA;;AAAA;AAAA,EACjB,YAAY;;AAAA,kHAAA,EAEY,KAAK,IAAI,CAAA,mCAAA,CAAA;AAAA,UAC1D,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAC5C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAKA,MAAA,MAAM,iBAAA,GAAoB,yBAAyB,IAAI,CAAA;AACvD,MAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAIhC,QAAA,IAAI,IAAA,CAAK,KAAK,MAAA,EAAQ;AAEtB,MACF;AAUA,MAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA,EAAG;AACpC,QAAA,MAAM,SAAS,IAAA,CAAK,oBAAA,CAAqB,KAAK,mBAAA,CAAoB,GAAA,CAAI,KAAK,CAAC,CAAA;AAC5E,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,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;AAM/E,MAAA,IAAI,sBAAsB,QAAA,CAAS,UAAA;AASnC,MAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,gBAAA;AAIzB,MAAA,MAAM,OAAO,MAAA,CAAO,OAAA,SAAgB,IAAA,IAAQ,MAAA,CAAO,mBAAkB,KAAM,IAAA;AAE3E,MAAA,IAAI,kBAAkB,MAAA,GAAS,CAAA,IAAK,mBAAA,KAAwB,MAAA,IAAU,CAAC,IAAA,EAAM;AAE3E,QAAA,mBAAA,GAAsB,SAAA;AAAA,MACxB;AAEA,MAAA,IAAI,wBAAwB,MAAA,EAAQ;AAClC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,SAAS,MAAM,CAAA;AACrD,QAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAC5C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,EAAM;AAAA,MACxD;AAEA,MAAA,IAAI,wBAAwB,SAAA,EAAW;AACrC,QAAA,IAAI,IAAA,CAAK,KAAK,cAAA,EAAgB;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAChF,UAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,QAAA,EAAU;AAC3C,YAAA,MAAM,MAAA,GAAS;AAAA,cACb,IAAA,EAAM,aAAA;AAAA,cACN,aAAa,GAAA,CAAI,EAAA;AAAA,cACjB,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,iBAAA,CAAA;AAAA,cAC3B,QAAA,EAAU;AAAA,aACZ;AACA,YAAA,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,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;AAIA,MAAA,MAAM,gBAAA,GAAmB,mCAAmC,IAAI,CAAA,GAAK,KAAK,YAAA,IAAgB,KAAM,EAAC;AAIjG,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,EAAQ,UAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI;AAAA,QAC5D,aAAa,IAAA,CAAK,IAAA;AAAA,QAClB,iBAAiB,IAAA,CAAK,QAAA;AAAA,QACtB,mBAAmB,IAAA,CAAK,UAAA;AAAA,QACxB,qBAAqB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA;AAAA,QAC3D,iCAAA,EAAmC,iBAAiB,MAAA,GAAS;AAAA,OAC9D,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,aAAA,GAAgB,KAAA;AACpB,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,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,MAAA,GAAS,IAAA;AACT,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,OAAO,IAAA,CAAK,YAAY,UAAA,EAAY;AAE1D,QAAA,aAAA,GAAgB,IAAA;AAChB,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;AAOlB,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,CAAC,MAAA,EAAQ;AAC/B,QAAA,IAAI,CAAC,aAAA,IAAiB,OAAO,IAAA,CAAK,YAAY,UAAA,EAAY;AACxD,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,UAC/B,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,YAAkB,KAAA,GACtC,SAAS,MAAA,GACT,IAAI,KAAA,CAAM,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,GAAW,QAAA,CAAS,SAAS,SAAS,CAAA;AAE/E,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;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,oBAAA,CAAqB,KAAmB,GAAA,EAA+B;AAC7E,IAAA,IAAI,OAAA,GACF,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,uMAAA,CAAA;AAQnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,GAAA,GAAM,GAAA;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,mBAAA,EAAiB,GAAA,CAAI,MAAM,CAAA,aAAA,CAAA,GAAkB,GAAA;AACpG,MAAA,OAAA,IACE,CAAA;AAAA,EAE4E,OAAO,CAAA,CAAA;AAAA,IACvF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,KAAmB,MAAA,EAAkC;AACxE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,GAAA,CAAI,EAAA;AAAA,MACjB,SAAS,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,UAAA,EAAa,UAAU,QAAQ,CAAA,CAAA;AAAA,MACzD,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,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,MAAM,SAAA,GAAY,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,UAAU,UAAA,KAAe,OAAA;AACnF,QAAA,OAAO,SAAA,GAAY,aAAA,CAAc,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AAAA,MACpD;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;AAcA,IAAM,qBAAA,GAAwB,CAAC,OAAA,EAAS,iBAAA,EAAmB,MAAM,CAAA;AAEjE,SAAS,sBAAsB,KAAA,EAAyB;AACtD,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AACxE,EAAA,MAAM,GAAA,GAAM,KAAA;AAGZ,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,OAAO,KAAK,MAAA,KAAW,CAAA,IAAK,sBAAsB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAU,CAAA;AAC7E;AAQA,SAAS,oBAAoB,KAAA,EAAoC;AAC/D,EAAA,IAAI,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG,OAAO,MAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AACtC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;;;ACjgBA,IAAM,eAAA,GAAkB,GAAA;AAGxB,IAAM,kBAAA,GAA4C;AAAA,EAChD,0BAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAYO,SAAS,gBAAA,CAAiB,SAAiB,KAAA,EAA4C;AAC5F,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,0BAAA,EAA2B;AAAA,EACzD;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,kBAAA,EAAmB;AAAA,EACjD;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,eAAA,EAAiB;AACpC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,gBAAA,EAAmB,eAAe,CAAA,WAAA,CAAA,EAAc;AAAA,EAC9E;AACA,EAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA,EAAG;AACpB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EACE;AAAA,OACJ;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,IAAI,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,KAC/C;AAAA,EACF;AACF;;;ACpCO,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,EAAoB,YAAA,EAA0D;AAChH,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,GAAA;AACzB,IAAA,MAAM,OAAA,GAAU,aAAa,CAAC,CAAA;AAC9B,IAAA,MAAM,eAAe,CAAA,CAAE,KAAA,GAAQ,IAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA;AAIlD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,GAAM,CAAC,SAAS,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,GAAI,CAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,YAAA,EAAc,aAAA,EAAe,WAAA,EAAY;AAC7D,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AACtC,QAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,YAAA,CAAa,OAAO,OAAO,KAAA;AACpE,QAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,SAAA,GAAY,YAAA,CAAa,OAAO,OAAO,KAAA;AACpE,QAAA,IAAI,cAAc,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,YAAA,CAAa,UAAU,OAAO,KAAA;AAC3E,QAAA,IAAI,cAAc,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,YAAA,CAAa,OAAO,OAAO,KAAA;AAClE,QAAA,IAAI,cAAc,SAAA,KAAc,MAAA,IAAa,EAAE,UAAA,GAAa,YAAA,CAAa,WAAW,OAAO,KAAA;AAC3F,QAAA,IAAI,WAAA,IAAe,CAAC,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,KAAA;AACxE,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IAChC;AAEA,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,QAAA,GAAW,gBAAA,CAAiB,CAAA,CAAE,KAAA,EAAO,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,KAAK,QAAA,CAAS,KAAA;AACpB,IAAA,OAAO,CAAC,IAAA,KAAS;AACf,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACtB,MAAA,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAS,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,WAAA,KAAgB,CAAA,CAAE,KAAA;AAC9C,EAAA,OAAO,CAAC,IAAA,KAAS;AACf,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,WAAA,EAAY,GAAI,IAAA;AACtC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC9B,IAAA,OAAO,GAAA,KAAQ,KAAK,IAAA,GAAO,EAAE,OAAO,GAAA,EAAK,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,MAAA,EAAO;AAAA,EACpE,CAAA;AACF;AAEA,SAAS,UAAU,CAAA,EAAgC;AACjD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,YAAA;AACH,MAAA,OAAO,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA,IAClC,KAAK,cAAA;AACH,MAAA,OAAO,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AAAA,IAC7C,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,IAC7E,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA,CAAA;AAAA,IACjC,KAAK,eAAA;AAAA,IACL,KAAK,iBAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,IACjC,KAAK,cAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAO,CAAA,CAAE,KAAA;AAAA,IACX,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,CAAA;AAAA,IAC/B,KAAK,iBAAA;AAAA,IACL,KAAK,mBAAA;AACH,MAAA,OAAO,CAAA,CAAE,SAAA;AAAA,IACX;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,OAAA,EAA0C;AACjE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACX,KAAK,UAAA;AACH,QAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,MACvD,KAAK,aAAA;AACH,QAAA,OAAO,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7E;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,IAAM,cAAA,GAAiB,EAAA;AAEvB,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,GAAA,EAAqB;AACnE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,cAAc,CAAA;AAC/C,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,cAAc,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,CAAA,GAAI,QAAA,GAAM,EAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,QAAA,GAAM,EAAA;AACxC,EAAA,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,GAAI,MAAA;AACrE;AAEA,SAAS,cAAA,CAAe,MAAuB,MAAA,EAAgC;AAC7E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,IAAA,CAAK,QAAA,IAAY,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,IAAS,GAAG,CAAA,CAAE,CAAA;AAAA,EACxE;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAC7C,EAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC3D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,YAAA,EAAc;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAa,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAC9B,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACnC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAA,KAAe,UAAA,EAAY;AAC/C,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,QACtC;AACA,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,CAAA,CAAE,IAAI,CAAA,EAAA,CAAI,CAAA;AACzC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,QAAA,KAAA,CAAM,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC1F,QAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,CAAA,CAAE,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA,CAAE,CAAA;AAC1D,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACnD,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,CAAA,CAAE,MAAM,CAAA,QAAA,EAAM,CAAA,CAAE,KAAK,CAAA,OAAA,CAAS,CAAA;AAC9D,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,eAAA,CAAgB,MAAuB,MAAA,EAAgC;AAC9E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,QAAA,EAAM,IAAA,CAAK,QAAA,IAAY,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,IAAS,GAAG,CAAA,gBAAA,EAAc,KAAK,SAAS,CAAA;AAAA,GAC/F;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,EAAA,EAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,YAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,WAAA,CAAa,CAAA;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,WAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,CAAA;AACpE,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,IAAI,CAAA,CAAE,EAAE,gBAAgB,CAAA,CAAE,OAAA,GAAU,aAAa,EAAE,CAAA,CAAA,EACjD,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAU,KAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CACtE,CAAA;AAAA,SACF;AACA,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,SAAA,EAAY,EAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvD,QAAA;AAEA;AACJ,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB","file":"index.js","sourcesContent":["export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\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 { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\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 === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\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 === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\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 === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\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 ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});","/**\n * 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 { 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 { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\r\nimport * as fs from 'node:fs';\r\nimport * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type { SecretVault } from '../types/secret-vault.js';\r\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface SecretVaultOptions {\r\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\r\n keyFile: string;\r\n}\r\n\r\nconst KEY_BYTES = 32;\r\nconst IV_BYTES = 12;\r\nconst TAG_BYTES = 16;\r\nconst ALGO = 'aes-256-gcm';\r\n\r\n/**\r\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\r\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\r\n * a fresh one is generated. Decryption of plaintext values is a no-op so\r\n * legacy configs continue to work.\r\n */\r\nexport class DefaultSecretVault implements SecretVault {\r\n private readonly keyFile: string;\r\n private key?: Buffer;\r\n\r\n constructor(opts: SecretVaultOptions) {\r\n this.keyFile = opts.keyFile;\r\n }\r\n\r\n isEncrypted(value: string): boolean {\r\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\r\n }\r\n\r\n encrypt(plaintext: string): string {\r\n if (this.isEncrypted(plaintext)) return plaintext;\r\n const key = this.loadOrCreateKey();\r\n const iv = randomBytes(IV_BYTES);\r\n const cipher = createCipheriv(ALGO, key, iv);\r\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n return `${ENCRYPTED_PREFIX}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\r\n }\r\n\r\n decrypt(value: string): string {\r\n if (!this.isEncrypted(value)) return value;\r\n const rest = value.slice(ENCRYPTED_PREFIX.length);\r\n const parts = rest.split(':');\r\n if (parts.length !== 3) {\r\n throw new Error('SecretVault: malformed encrypted value');\r\n }\r\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\r\n const iv = Buffer.from(ivB64, 'base64');\r\n const tag = Buffer.from(tagB64, 'base64');\r\n const ct = Buffer.from(ctB64, 'base64');\r\n if (iv.length !== IV_BYTES) throw new Error('SecretVault: bad IV length');\r\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\r\n const key = this.loadOrCreateKey();\r\n const decipher = createDecipheriv(ALGO, key, iv);\r\n decipher.setAuthTag(tag);\r\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\r\n return pt.toString('utf8');\r\n }\r\n\r\n private loadOrCreateKey(): Buffer {\r\n if (this.key) return this.key;\r\n try {\r\n const buf = fs.readFileSync(this.keyFile);\r\n if (buf.length !== KEY_BYTES) {\r\n // A wrong-size key is not ENOENT — the file is corrupted or was\r\n // tampered with. Throwing instead of falling through to create a\r\n // new key protects all secrets encrypted under this key; the user\r\n // can remove the file manually to generate a fresh key.\r\n throw new Error(\r\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\r\n `(expected ${KEY_BYTES}). Remove it manually to generate a new key.`,\r\n );\r\n }\r\n this.key = buf;\r\n return this.key;\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\r\n }\r\n // Create a fresh key. Use sync APIs so the constructor-free getter\r\n // remains synchronous from the caller's perspective.\r\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\r\n const key = randomBytes(KEY_BYTES);\r\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\r\n // to create the key file, only one succeeds and the loser gets EEXIST.\r\n try {\r\n fs.writeFileSync(this.keyFile, key, { mode: 0o600, flag: 'wx' });\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\r\n // Another process won the race — re-read what they wrote.\r\n const buf = fs.readFileSync(this.keyFile);\r\n if (buf.length !== KEY_BYTES) {\r\n // A wrong-size key is not ENOENT — the file is corrupted or was\r\n // tampered with. Throwing instead of falling through to create a\r\n // new key protects all secrets encrypted under this key; the user\r\n // can remove the file manually to generate a fresh key.\r\n throw new Error(\r\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\r\n `(expected ${KEY_BYTES}). Remove it manually to generate a new key.`,\r\n );\r\n }\r\n this.key = buf;\r\n return this.key;\r\n }\r\n this.key = key;\r\n return key;\r\n }\r\n}\r\n\r\n/**\r\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\r\n * returning a new object. Used by the config loader so the rest of the\r\n * system never has to know about the wire format.\r\n */\r\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\r\n // A single corrupted/malformed encrypted field should not kill the entire\r\n // config load. Swallow per-field decrypt errors (zero the field so callers\r\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\r\n return walk(cfg, vault, (v, key) => {\r\n try {\r\n return vault.decrypt(v);\r\n } catch (err) {\r\n console.warn(\r\n `[secret-vault] Failed to decrypt \"${key}\":`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n return '';\r\n }\r\n });\r\n}\r\n\r\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\r\n return walk(cfg, vault, (v) => vault.encrypt(v));\r\n}\r\n\r\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\r\n if (node === null || node === undefined) return node;\r\n if (typeof node !== 'object') return node;\r\n if (Array.isArray(node)) {\r\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\r\n }\r\n const out: Record<string, unknown> = Object.create(null);\r\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\r\n if (typeof v === 'string' && isSecretField(k)) {\r\n out[k] = transform(v, k);\r\n } else if (typeof v === 'object' && v !== null) {\r\n out[k] = walk(v, vault, transform);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n\r\n/**\r\n * A key is treated as secret-bearing if its name (case-insensitive) contains\r\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\r\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\r\n * Use a named field with `isSecret: false` annotation if you must opt out —\r\n * see `NON_SECRET_OVERRIDES` below.\r\n */\r\nconst SECRET_KEY_PATTERN =\r\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\r\n\r\n// Field names that contain the literal substring \"key\" but are not secrets.\r\n// Keep this list short; the substring rule itself is intentionally narrow.\r\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\r\n\r\nfunction isSecretField(name: string): boolean {\r\n const lc = name.toLowerCase();\r\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\r\n return SECRET_KEY_PATTERN.test(lc);\r\n}\r\n\r\n/**\r\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\r\n * fields encrypted. Used by the `wstack auth` subcommand.\r\n */\r\nexport async function rewriteConfigEncrypted(\r\n configPath: string,\r\n vault: SecretVault,\r\n patch?: Record<string, unknown>,\r\n): Promise<void> {\r\n let current: Record<string, unknown> = {};\r\n try {\r\n const raw = await fsp.readFile(configPath, 'utf8');\r\n current = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n // start from empty\r\n }\r\n const merged = deepMerge(current, patch ?? {});\r\n const encrypted = encryptConfigSecrets(merged, vault);\r\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\r\n // atomicWrite: torn write here would erase every saved encrypted API key.\r\n await atomicWrite(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\r\n await restrictFilePermissions(configPath);\r\n}\r\n\r\n/**\r\n * Scan a config file on disk for plaintext secret-bearing fields and\r\n * rewrite the file with them encrypted in place. Returns a count of how\r\n * many fields were migrated. Idempotent — calling on a fully-encrypted\r\n * file is a no-op and writes nothing. Used by the CLI on every boot so\r\n * users who had plaintext keys before the vault landed are upgraded\r\n * transparently.\r\n */\r\nexport async function migratePlaintextSecrets(\r\n configPath: string,\r\n vault: SecretVault,\r\n): Promise<{ migrated: number; file: string }> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(configPath, 'utf8');\r\n } catch {\r\n return { migrated: 0, file: configPath };\r\n }\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n return { migrated: 0, file: configPath };\r\n }\r\n const counter = { n: 0 };\r\n const migrated = walkCount(parsed, vault, counter);\r\n if (counter.n === 0) return { migrated: 0, file: configPath };\r\n // atomicWrite: runs on every boot for legacy users — torn write = wipe.\r\n await atomicWrite(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\r\n await restrictFilePermissions(configPath);\r\n return { migrated: counter.n, file: configPath };\r\n}\r\n\r\n/**\r\n * Restrict a file to owner-only access. On POSIX this is chmod 0o600.\r\n * On Windows, chmod is a no-op — we use icacls to remove inherited\r\n * permissions and grant only the current user. Failures are logged\r\n * but not thrown so callers are not blocked on unsupported platforms.\r\n */\r\nasync function restrictFilePermissions(filePath: string): Promise<void> {\r\n if (process.platform === 'win32') {\r\n try {\r\n const { execFile } = await import('node:child_process');\r\n const { promisify } = await import('node:util');\r\n const execFileAsync = promisify(execFile);\r\n // Remove inherited ACEs, grant full control only to current user.\r\n await execFileAsync('icacls', [filePath, '/inheritance:r', '/grant:r', `${process.env.USERNAME}:(F)`]);\r\n } catch {\r\n // Best-effort: icacls may not be available in all environments.\r\n console.warn(`[secret-vault] Could not restrict permissions on ${filePath} — config file may be readable by other users on this system.`);\r\n }\r\n } else {\r\n try {\r\n await fsp.chmod(filePath, 0o600);\r\n } catch {\r\n // Best-effort\r\n }\r\n }\r\n}\r\n\r\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\r\n if (node === null || node === undefined) return node;\r\n if (typeof node !== 'object') return node;\r\n if (Array.isArray(node)) {\r\n return node.map((item) => walkCount(item, vault, counter)) as unknown as T;\r\n }\r\n const out: Record<string, unknown> = Object.create(null);\r\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\r\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\r\n out[k] = vault.encrypt(v);\r\n counter.n++;\r\n } else if (typeof v === 'object' && v !== null) {\r\n out[k] = walkCount(v, vault, counter);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n\r\n/** Keys that, when written into a plain object, can poison the prototype\r\n * chain. We never want user config to carry these. */\r\nconst FORBIDDEN_PROTO_KEYS = new Set([\r\n '__proto__',\r\n 'constructor',\r\n 'prototype',\r\n '__defineGetter__',\r\n '__defineSetter__',\r\n '__lookupGetter__',\r\n '__lookupSetter__',\r\n]);\r\n\r\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\r\n const out: Record<string, unknown> = { ...a };\r\n for (const [k, v] of Object.entries(b)) {\r\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\r\n const existing = out[k];\r\n if (\r\n v !== null &&\r\n typeof v === 'object' &&\r\n !Array.isArray(v) &&\r\n existing !== null &&\r\n typeof existing === 'object' &&\r\n !Array.isArray(existing)\r\n ) {\r\n out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n","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 type { EventBus } from '../kernel/events.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { Usage } from '../types/provider.js';\nimport type { CacheStats, TokenCounter } from '../types/token-counter.js';\n\ninterface PriceEntry {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nconst PRICE_CACHE_MAX_SIZE = 100;\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry;\n private readonly providerId?: string;\n private readonly events?: EventBus;\n private priceCache = new Map<string, PriceEntry>();\n /** Most recently accounted request's tokens. Used for per-request context pressure. */\n private lastInput = 0;\n private lastCacheRead = 0;\n\n constructor(opts: { registry?: ModelsRegistry; providerId?: string; events?: EventBus } = {}) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n }\n\n account(usage: Usage, model?: string): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n } else if (this.registry && this.providerId && model) {\n // Evict oldest entry when cache is full before async lookup.\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0]!);\n }\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', { model: model ?? '<unknown>' });\n return undefined;\n });\n }\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n const price = priceFromModel(resolved);\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0]!);\n }\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n currentRequestTokens(): { input: number; cacheRead: number } {\n return { input: this.lastInput, cacheRead: this.lastCacheRead };\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n if (usage.cacheWrite && price.cacheWrite) {\n this.costInput += (usage.cacheWrite / 1_000_000) * price.cacheWrite;\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\nconst _cal = {\n ratio: 1.0, // current calibration multiplier (actual / estimated)\n count: 0, // number of samples recorded\n prevEst: 0, // estimated tokens from the most recent estimateRequestTokens call\n /** EWM α — higher = faster adaptation, more volatile */\n alpha: 0.3,\n};\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\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\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: { name: string; description?: string; inputSchema: unknown }): number {\n return RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(tool.description ?? '') +\n RoughTokenEstimate(JSON.stringify(tool.inputSchema));\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (typeof b === 'object' && b !== null && (b as { type?: string }).type === 'text') {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n _cal.prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to `_cal.prevEst`\n * for backward compatibility with callers that don't have the pre-flight value.\n */\nexport function recordActualUsage(actualInputTokens: number, estimatedInputTokens?: number): void {\n if (actualInputTokens <= 0) return;\n const est = estimatedInputTokens ?? _cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (_cal.count === 0) {\n _cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n _cal.ratio = _cal.alpha * sampleRatio + (1 - _cal.alpha) * _cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n _cal.ratio = Math.min(1.5, Math.max(0.5, _cal.ratio));\n _cal.count++;\n}\n\n/**\n * Returns the current calibration state. Exposed for debugging and\n * tests — not needed by normal callers.\n */\nexport function getCalibrationState(): { ratio: number; count: number; calibrated: boolean } {\n return {\n ratio: _cal.ratio,\n count: _cal.count,\n calibrated: _cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools);\n\n if (_cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, _cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n return result;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites.\n */\nexport function resetCalibration(): void {\n _cal.ratio = 1.0;\n _cal.count = 0;\n _cal.prevEst = 0;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","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 { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n estimateRequestTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\n/**\n * Default tools config values shared across CLI and WebUI.\n * Import this instead of hardcoding to avoid cross-surface inconsistencies.\n * These mirror the values in BEHAVIOR_DEFAULTS (config-loader.ts).\n *\n * @deprecated Import from '../types/default-config.js' instead.\n * This re-export exists for backward compatibility.\n */\nexport { DEFAULT_TOOLS_CONFIG, DEFAULT_CONTEXT_CONFIG, DEFAULT_AUTONOMY_CONFIG } from '../types/default-config.js';\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\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 beforeFull = this.estimateFullRequest(ctx);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx, preserveK, eliseThreshold);\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, preserveK);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n const afterFull = this.estimateFullRequest(ctx);\n return {\n before: beforeTokens,\n after: afterTokens,\n fullRequestTokensBefore: beforeFull,\n fullRequestTokensAfter: afterFull,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n /**\n * Estimate the full API request token count: messages + systemPrompt + toolDefs.\n * This is the accurate figure for context-window pressure monitoring.\n */\n private estimateFullRequest(ctx: Context): number {\n const breakdown = estimateRequestTokens(ctx.messages, ctx.systemPrompt, ctx.tools ?? []);\n return breakdown.total;\n }\n\n private eliseOldToolResults(\n ctx: Context,\n preserveK = this.preserveK,\n eliseThreshold = this.eliseThreshold,\n ): 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 < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\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 < 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]`,\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, preserveK = this.preserveK): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - 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 readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n\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","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n '.wrongstack',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n while (dir !== root) {\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return path.resolve(start);\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath) ? path.basename(absPath) : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string; projectRoot?: string }).fullPath = absPath;\n (err as Error & { fullPath?: string; projectRoot?: string }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","/**\n * Shared regex patterns used across execution and security-scanner.\n * Centralized here to avoid duplication and keep patterns in sync.\n */\n\n/** Matches Node.js ECONN* errors and fetch failure messages. */\nexport const NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\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;\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.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const 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 { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 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 { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n {\n type: 'anthropic_key',\n regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g,\n },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n {\n type: 'stripe_key',\n regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g,\n },\n {\n type: 'telegram_bot_token',\n // Telegram tokens are of the form bot<digits>:<alphanum> in URL paths\n regex: /\\/bot\\d+:[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g,\n },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex:\n /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex:\n /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n {\n type: 'bearer_token',\n // Anchored with alternation instead of negative lookahead — avoids V8\n // backtracking risk on adversarial input. Bounded at 512 chars.\n // Min 12 chars: some OAuth providers issue shorter-lived tokens (< 20\n // chars). A 12-char base64 string has ~71 bits of entropy — above the\n // threshold where random strings are unlikely to produce false matches.\n regex: /(?:^|[^A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{12,512}=*(?:$|[^A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Anchored with alternation instead of lookbehind to avoid backtracking.\n // Value bounded at 512 chars.\n regex: /(?:^|\\s)([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,512})['\"]?(?:\\s|$)/g,\n },\n];\n\n/**\n * Per-chunk cap. Splits long inputs into 64 KB chunks to keep scrub() memory\n * bounded. Real scrub() inputs (LLM responses, tool outputs) are typically\n * much smaller; this cap handles edge cases without impacting normal usage.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\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","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.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 * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: 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 private readonly overlay?: ModelsDevPayload;\n private readonly overlayUrl?: string;\n private readonly overlayFile?: string;\n private readonly overlayCacheFile?: string;\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 this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n err instanceof Error ? err.message : String(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const 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.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 /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (this.overlay) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (fetched) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean }): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) return cached.payload;\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? 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.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n","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 for SOLID 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 id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: `## Brief Mode\n\nYou are WrongStack, a fast, no-nonsense AI coding agent.\nGet to the point — read files, run commands, make changes.\n\n### Operating rules\n1. **Read first.** Inspect relevant files before touching anything.\n2. **Edit surgically.** Use edit tool for existing files, write only for new ones.\n3. **One sentence before action.** State what you're doing, then do it.\n4. **Say what happened.** After tool calls, one line: success, failure, or what's next.\n5. **Be honest.** Admit when you don't know or something failed. No filler.\n6. **Keep moving.** Task done? Stop. More work needed? State it and continue.\n\n### Decision rules\n- **Ambiguous task?** Ask. One question, get clarity, proceed.\n- **Clear task, unknown approach?** Pick one reasonable path, execute, report.\n- **Tool fails?** Retry once with adjusted params, then report.\n\n### Output style\n- Prose paragraphs (no bullet points unless unavoidable)\n- Code blocks for code, backticks for paths/commands\n- One-liner sufficient? One liner.\n- Max 3 sentences per paragraph.`,\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: `## Teach Mode\n\nYou are WrongStack, an expert AI coding mentor.\n\nYou operate inside the user's terminal with full access to their codebase. You help developers learn and understand — not just execute tasks, but build mental models.\n\n### Teaching philosophy\n\n1. **Explain the why.** When you make a change, explain why it works that way — not just what you did.\n2. **Build mental models.** Use analogies, highlight patterns, connect new concepts to things the user already knows.\n3. **Read before teaching.** Always inspect relevant files so your explanations are accurate and specific to the actual code.\n4. **Surgical edits with context.** When editing code, explain the approach before doing it, and what trade-offs were considered.\n5. **Be thorough but not verbose.** A 2-paragraph explanation beats a 5-paragraph one. Depth without padding.\n6. **Admit knowledge gaps.** If you're unsure, say so. Speculating teaches bad patterns.\n\n### Teaching style\n\n- **Before action:** Briefly explain what you're going to do and why.\n- **After action:** Summarize what happened and what the user should take away from this.\n- **With code:** Show concrete examples, explain syntax choices, point out gotchas.\n- **With errors:** Explain why the error occurred, what it's actually complaining about, and how to avoid it in the future.\n- **General principles:** Offer them when the user's question suggests a deeper concept they'd benefit from understanding.\n\n### Decision heuristics\n\n- **Task is ambiguous?** Ask — but frame the question as \"what would you like to learn from this?\"\n- **Task is clear, approach is unknown?** Execute, then teach the approach as you go.\n- **Tool fails?** Explain what failed, why it failed, and how to avoid the failure.\n- **User asks \"how do I...?\"** Don't just give the answer — explain the underlying mechanism.\n- **Context window filling up?** Compact, but summarize what was lost so the teaching continuity isn't broken.\n\n### Output format\n\n- Use headings to structure multi-concept explanations.\n- Code blocks with brief annotations for code examples.\n- **Bold** key terms and concepts worth remembering.\n- Callouts like \"Key takeaway:\" or \"Pattern:\" to anchor learning.\n- Max 3 sentences per paragraph — readability over completeness.\n\n### Don'ts\n\n- Don't lecture condescendingly — the user is a developer, not a beginner.\n- Don't pad explanations with obvious things.\n- Don't skip the \"why\" — even quick tasks deserve one sentence of context.\n- Don't just say \"do X\" — say \"do X because Y.\"\n- Don't leave the user hanging after a complex operation — explain what just happened.\n\n### Core principles\n\nYou follow these principles, but always with explanation:\n- Read before write\n- Surgical edits over rewrites\n- Show your work (explain your reasoning, not just mechanical steps)\n- Be honest about limits\n- Format for scanability\n- Recover explicitly from failures\n\nRemember: your job is to make the user a better developer, not just to complete tasks faster.`,\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n },\n];\n","export type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string;\n warnThreshold?: number;\n softThreshold?: number;\n hardThreshold?: number;\n preserveK?: number;\n eliseThreshold?: number;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID)!;\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)!.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n /** Stores the transport unsubscribe function so it can be called on stop(). */\n private _transportUnsubscribe?: () => void;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this._transportUnsubscribe = this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new 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 // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n // Reject if stop() was called after the initial check and cleared\n // the guard — this prevents a request from being enqueued after\n // stop() has already released the lock on pendingRequests.\n if (!this.inflightGuards.has(correlationId)) {\n clearTimeout(timer);\n reject(new Error('Bridge stopped'));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new Error('Bridge stopped'));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n // Call the transport unsubscribe to clean up the subscription handler.\n // This prevents memory leaks when bridges are created and destroyed frequently.\n this._transportUnsubscribe?.();\n this._transportUnsubscribe = undefined;\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType =\n | 'overview'\n | 'requirements'\n | 'architecture'\n | 'api'\n | 'data'\n | 'security'\n | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[];\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[];\n implements?: string[];\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[];\n dependencies?: string[];\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n {\n type: 'non-functional',\n priority: 'medium',\n acceptanceCriteria: [],\n blockedBy: [],\n implements: [],\n },\n ],\n};\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string;\r\n estimateHours?: number;\r\n actualHours?: number;\r\n tags?: string[];\r\n specRequirementId?: string;\r\n parentId?: string;\r\n children?: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n startedAt?: number; // set when status → in_progress\r\n completedAt?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[];\r\n priority?: TaskPriority[];\r\n type?: TaskType[];\r\n assignee?: string[];\r\n tags?: string[];\r\n specRequirementId?: string;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0;\r\n let pending = 0;\r\n let inProgress = 0;\r\n let blocked = 0;\r\n let failed = 0;\r\n let review = 0;\r\n let estimatedHours = 0;\r\n let actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed':\r\n completed++;\r\n break;\r\n case 'pending':\r\n pending++;\r\n break;\r\n case 'in_progress':\r\n inProgress++;\r\n break;\r\n case 'blocked':\r\n blocked++;\r\n break;\r\n case 'failed':\r\n failed++;\r\n break;\r\n case 'review':\r\n review++;\r\n break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\n * Well-known tool capabilities used for authorization decisions.\n *\n * These are the preferred values for `Tool.capabilities`.\n * New capabilities should be added here with clear documentation.\n *\n * Philosophy (2026-06+):\n * - Prefer capabilities over exact tool name matching.\n * - Subagent guards and future policies should primarily key off capabilities.\n * - Name-based denylists are legacy and will be phased down.\n */\nexport const ToolCapabilities = {\n /** Can execute arbitrary commands in the user's shell (the `bash` tool). */\n SHELL_ARBITRARY: 'shell.arbitrary',\n\n /** Can execute a restricted set of commands (the `exec` tool). */\n SHELL_RESTRICTED: 'shell.restricted',\n\n /** Can read files inside the project (and possibly outside via symlinks if not guarded). */\n FS_READ: 'fs.read',\n\n /** Can write / modify / delete files inside the project. */\n FS_WRITE: 'fs.write',\n\n /** Can write files outside the current project root (very high risk). */\n FS_WRITE_OUTSIDE_PROJECT: 'fs.write.outside-project',\n\n /** Can perform outbound network requests. */\n NET_OUTBOUND: 'net.outbound',\n\n /** Proxies tools from external MCP servers (unknown capability). */\n MCP_PROXY: 'mcp.proxy',\n\n /** Can spawn or manage subagents / multi-agent tasks. */\n SUBAGENT_SPAWN: 'subagent.spawn',\n\n /** Can mutate global or session configuration / trust state. */\n CONFIG_MUTATE: 'config.mutate',\n\n /** Can install packages or run package managers with side effects. */\n PACKAGE_INSTALL: 'package.install',\n} as const;\n\nexport type ToolCapability = (typeof ToolCapabilities)[keyof typeof ToolCapabilities];\n\n/**\n * Set of capabilities that are considered dangerous for subagents by default.\n * Subagents should not receive these capabilities unless the leader explicitly\n * allows the specific tool at spawn time.\n */\nexport const DANGEROUS_FOR_SUBAGENTS: readonly ToolCapability[] = [\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.FS_WRITE_OUTSIDE_PROJECT,\n ToolCapabilities.MCP_PROXY,\n ToolCapabilities.SUBAGENT_SPAWN,\n ToolCapabilities.CONFIG_MUTATE,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Check if a tool (or its capabilities array) includes any dangerous capability\n * for subagent execution.\n */\nexport function hasDangerousCapabilityForSubagents(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n): boolean {\n if (!toolOrCaps) return false;\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.some((c) => DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability));\n}\n\n/**\n * Check if a tool declares a specific capability (or any of the provided ones).\n */\nexport function hasCapability(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n capability: ToolCapability | ToolCapability[],\n): boolean {\n if (!toolOrCaps) return false;\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n const toCheck = Array.isArray(capability) ? capability : [capability];\n return toCheck.some((c) => caps.includes(c));\n}\n\n/**\n * Returns the intersection of a tool's capabilities with the dangerous set.\n * Useful for logging and audit trails.\n */\nexport function getDangerousCapabilities(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n): ToolCapability[] {\n if (!toolOrCaps) return [];\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.filter((c): c is ToolCapability =>\n DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability),\n );\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors);\n return { ok: errors.length === 0, errors };\n}\n\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n value.forEach((item, i) => walk(item, schema.items as JSONSchema, `${path}[${i}]`, errors));\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","/**\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 {\n hasDangerousCapabilityForSubagents,\n getDangerousCapabilities,\n} from '../security/capabilities.js';\nimport { validateAgainstSchema } from '../utils/json-schema-validate.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 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 * Clear the interactive confirm awaiter so the executor returns\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\n * the CLI to switch from inline prompts (REPL) to event-driven\n * confirmation (TUI) at runtime.\n */\n clearConfirmAwaiter(): void {\n this.opts.confirmAwaiter = undefined;\n }\n\n /**\n * 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 // Strong guarantee: Validate input against the tool's declared JSON Schema\n // *before* permission checks or execution. This is a hard gate — bad calls\n // are rejected early with actionable feedback so the model can self-correct.\n const validation = validateAgainstSchema(use.input, tool.inputSchema);\n if (!validation.ok) {\n const errorDetails = validation.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}\\n\\n` +\n `Please call the tool again with arguments that match its inputSchema. ` +\n `You can use the \"tool-help\" tool with name=\"${tool.name}\" to see the exact expected schema.`,\n is_error: true,\n };\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Capability safety net at the executor level (defense in depth).\n // For tools declaring dangerous capabilities, we ensure the permission\n // decision cannot silently become \"auto\" in non-yolo contexts.\n const toolDangerousCaps = getDangerousCapabilities(tool);\n if (toolDangerousCaps.length > 0) {\n // If the tool has dangerous capabilities and we're not in full yolo mode,\n // we can force the downstream permission policy to treat it more strictly.\n // For now we record it; future policy profiles can act on this.\n if (this.opts.events) {\n // Observability hook for dangerous capability usage\n }\n }\n\n // Provider boundary: the model's tool arguments arrive as a raw JSON\n // string accumulated over streamed deltas. When that string is not a\n // valid JSON object (truncated, scalar, or mangled by a proxy/local\n // model), the parsers wrap it under a sentinel key instead of silently\n // producing `{}`. Executing the tool with such input yields a cryptic\n // \"<field> is required\" error that the model can't act on. Detect the\n // sentinel here and feed back an actionable message so the model\n // resends well-formed arguments.\n if (hasMalformedArguments(use.input)) {\n const result = this.malformedInputResult(use, extractMalformedRaw(use.input));\n budget = this.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 // Post-permission dangerous capability enforcement (B-side guarantee).\n // Even after the permission policy has spoken, we apply an extra conservative\n // rule for tools that declare high-risk capabilities (shell arbitrary, write outside\n // project, mcp proxy, etc.). This reduces the blast radius of prompt injection.\n let effectivePermission = decision.permission;\n\n // YOLO is the user's explicit \"stop asking\" switch, so it also waives the\n // dangerous-capability net below (matching the historical behavior where\n // --yolo skipped every prompt). The net still fires in non-yolo runs —\n // e.g. a trust-file auto-allow for a shell tool still gets a confirm, so\n // a single trusted pattern can't silently widen into arbitrary shell.\n // Detected via optional methods so policies without them (AutoApprove,\n // test mocks) keep the stricter default.\n const policy = this.opts.permissionPolicy as {\n getYolo?(): boolean;\n getForceAllYolo?(): boolean;\n };\n const yolo = policy.getYolo?.() === true || policy.getForceAllYolo?.() === true;\n\n if (toolDangerousCaps.length > 0 && effectivePermission === 'auto' && !yolo) {\n // Outside yolo we force at least 'confirm' for dangerous-capability tools.\n effectivePermission = 'confirm';\n }\n\n if (effectivePermission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (effectivePermission === 'confirm') {\n if (this.opts.confirmAwaiter) {\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\n if (choice !== 'yes' && choice !== 'always') {\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" denied by user.`,\n is_error: true,\n };\n budget = this.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 // effectivePermission === 'auto' (after all safety layers)\n // Capability audit for observability.\n const toolCapsForAudit = hasDangerousCapabilityForSubagents(tool) ? (tool.capabilities ?? []) : [];\n\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\n // adapter or other Tracer is bound — zero overhead by default.\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\n 'tool.name': tool.name,\n 'tool.mutating': tool.mutating,\n 'tool.permission': tool.permission,\n 'tool.capabilities': JSON.stringify(tool.capabilities ?? []),\n 'tool.has_dangerous_capabilities': toolCapsForAudit.length > 0,\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 let cleanupCalled = false;\n let caught = false;\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 caught = true;\n if (combined.aborted && typeof tool.cleanup === 'function') {\n // Best-effort cleanup; never let it mask the original error.\n cleanupCalled = true;\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n throw err;\n } finally {\n clearTimeout(timer);\n // If the tool completed successfully (no error thrown) but the combined\n // signal was aborted (e.g. timeout), the catch block above never fired.\n // Call cleanup here and then throw so the caller sees the abort.\n // When `caught` is true, we already have an in-flight throw — don't\n // override it from `finally` (that would replace the original error\n // with the abort reason and mask the actual failure).\n if (combined.aborted && !caught) {\n if (!cleanupCalled && typeof tool.cleanup === 'function') {\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n const reason = combined.reason instanceof Error\n ? combined.reason\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'aborted');\n // biome-ignore lint/correctness/noUnsafeFinally: guarded by `!caught` — only runs when the tool returned cleanly but the signal aborted, so there is no in-flight exception to override.\n throw reason;\n }\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 malformedInputResult(use: ToolUseBlock, raw?: string): ToolResultBlock {\n let content =\n `Tool \"${use.name}\" received arguments that were not a valid JSON object, so they ` +\n `could not be parsed. Re-issue the call with the arguments encoded as a single ` +\n `well-formed JSON object matching the tool's input schema.`;\n // Echo the raw payload back so the model can see *what* it produced and\n // self-correct. Without this the model is blind to its own mistake and\n // tends to resend the identical malformed call in a loop. Common causes:\n // unescaped newlines/quotes/backslashes inside a string field, or the\n // arguments being truncated mid-stream.\n if (raw) {\n const max = 800;\n const excerpt = raw.length > max ? `${raw.slice(0, max)}… (truncated, ${raw.length} chars total)` : raw;\n content +=\n ` Common cause: a string field (e.g. code in old_string/new_string) ` +\n `contains literal newlines, quotes, or backslashes that must be JSON-escaped, ` +\n `or the payload was cut off mid-stream. The raw arguments received were:\\n${excerpt}`;\n }\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content,\n is_error: true,\n };\n }\n\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\n is_error: true,\n };\n }\n\n private 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 const isPathKey = subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n return isPathKey ? normalizePath(v) : 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\n/**\n * Sentinel keys the provider adapters use to wrap tool arguments that could\n * not be parsed into a proper JSON object. `parseToolInput` (Anthropic /\n * shared) uses `__raw`, `contentFromOpenAI` uses `__raw_arguments`, and the\n * streaming response builder's `safeJsonOrRaw` uses `_raw`. Keep this list in\n * sync if a new adapter introduces another marker.\n *\n * NOTE: `parseToolInput` and `safeJsonOrRaw` now attempt JSON repair\n * (auto-closing braces and strings) before wrapping — so a truncated blob\n * like `{\"old_string\": \"line1\\nline2` gets repaired first. The sentinel is\n * only used when repair also fails.\n */\nconst MALFORMED_ARG_MARKERS = ['__raw', '__raw_arguments', '_raw'] as const;\n\nfunction hasMalformedArguments(input: unknown): boolean {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const obj = input as Record<string, unknown>;\n // The sentinel is the *only* key when wrapping occurred — a real tool call\n // that legitimately uses a key named e.g. `_raw` will carry other keys too.\n const keys = Object.keys(obj);\n return keys.length === 1 && MALFORMED_ARG_MARKERS.includes(keys[0] as never);\n}\n\n/**\n * Pull the original (unparseable) payload back out of a sentinel-wrapped input\n * so the executor can echo it to the model. The wrapped value is usually the\n * raw argument string, but a scalar/array that parsed cleanly is wrapped too —\n * stringify those. Returns undefined if nothing usable is present.\n */\nfunction extractMalformedRaw(input: unknown): string | undefined {\n if (!hasMalformedArguments(input)) return undefined;\n const obj = input as Record<string, unknown>;\n const value = obj[Object.keys(obj)[0]!];\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\r\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n *\r\n * The heavy operations re-parse the JSONL stream on every call — fine for\r\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n const filtered = raw.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n const out: SessionSummaryLite[] = filtered.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.store.load(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE loading events — avoids loading thousands of events\r\n // from sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n const sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n const filtered = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n ids = filtered.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.store.load(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = data.events[i]!;\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.store.load(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.store.load(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/blocks.ts","../../src/types/messages.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/types/default-config.ts","../../src/types/secret-vault.ts","../../src/utils/atomic-write.ts","../../src/security/secret-vault.ts","../../src/utils/term.ts","../../src/utils/color.ts","../../src/infrastructure/logger.ts","../../src/infrastructure/token-counter.ts","../../src/utils/token-estimate.ts","../../src/utils/message-invariants.ts","../../src/execution/compactor.ts","../../src/infrastructure/path-resolver.ts","../../src/execution/regex-patterns.ts","../../src/execution/error-handler.ts","../../src/execution/retry-policy.ts","../../src/security/secret-scrubber.ts","../../src/utils/merge-models-payload.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/types/context-window.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/types/spec.ts","../../src/types/task-graph.ts","../../src/security/capabilities.ts","../../src/utils/json-schema-validate.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/utils/regex-guard.ts","../../src/storage/session-reader.ts"],"names":["path","stat","resolve","randomBytes","path2","fsp","open","fs3","path3","hasToolUse","fs4","path5","fs5","handlers","walk"],"mappings":"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","file":"index.js","sourcesContent":["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 { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\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 === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\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 === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\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 === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\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 ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});","/**\n * 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 { 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 { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\r\nimport * as fs from 'node:fs';\r\nimport * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type { SecretVault } from '../types/secret-vault.js';\r\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface SecretVaultOptions {\r\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\r\n keyFile: string;\r\n}\r\n\r\nconst KEY_BYTES = 32;\r\nconst IV_BYTES = 12;\r\nconst TAG_BYTES = 16;\r\nconst ALGO = 'aes-256-gcm';\r\n\r\n/**\r\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\r\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\r\n * a fresh one is generated. Decryption of plaintext values is a no-op so\r\n * legacy configs continue to work.\r\n */\r\nexport class DefaultSecretVault implements SecretVault {\r\n private readonly keyFile: string;\r\n private key?: Buffer;\r\n\r\n constructor(opts: SecretVaultOptions) {\r\n this.keyFile = opts.keyFile;\r\n }\r\n\r\n isEncrypted(value: string): boolean {\r\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\r\n }\r\n\r\n encrypt(plaintext: string): string {\r\n if (this.isEncrypted(plaintext)) return plaintext;\r\n const key = this.loadOrCreateKey();\r\n const iv = randomBytes(IV_BYTES);\r\n const cipher = createCipheriv(ALGO, key, iv);\r\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n return `${ENCRYPTED_PREFIX}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\r\n }\r\n\r\n decrypt(value: string): string {\r\n if (!this.isEncrypted(value)) return value;\r\n const rest = value.slice(ENCRYPTED_PREFIX.length);\r\n const parts = rest.split(':');\r\n if (parts.length !== 3) {\r\n throw new Error('SecretVault: malformed encrypted value');\r\n }\r\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\r\n const iv = Buffer.from(ivB64, 'base64');\r\n const tag = Buffer.from(tagB64, 'base64');\r\n const ct = Buffer.from(ctB64, 'base64');\r\n if (iv.length !== IV_BYTES) throw new Error('SecretVault: bad IV length');\r\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\r\n const key = this.loadOrCreateKey();\r\n const decipher = createDecipheriv(ALGO, key, iv);\r\n decipher.setAuthTag(tag);\r\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\r\n return pt.toString('utf8');\r\n }\r\n\r\n private loadOrCreateKey(): Buffer {\r\n if (this.key) return this.key;\r\n try {\r\n const buf = fs.readFileSync(this.keyFile);\r\n if (buf.length !== KEY_BYTES) {\r\n // A wrong-size key is not ENOENT — the file is corrupted or was\r\n // tampered with. Throwing instead of falling through to create a\r\n // new key protects all secrets encrypted under this key; the user\r\n // can remove the file manually to generate a fresh key.\r\n throw new Error(\r\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\r\n `(expected ${KEY_BYTES}). Remove it manually to generate a new key.`,\r\n );\r\n }\r\n this.key = buf;\r\n return this.key;\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\r\n }\r\n // Create a fresh key. Use sync APIs so the constructor-free getter\r\n // remains synchronous from the caller's perspective.\r\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\r\n const key = randomBytes(KEY_BYTES);\r\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\r\n // to create the key file, only one succeeds and the loser gets EEXIST.\r\n try {\r\n fs.writeFileSync(this.keyFile, key, { mode: 0o600, flag: 'wx' });\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\r\n // Another process won the race — re-read what they wrote.\r\n const buf = fs.readFileSync(this.keyFile);\r\n if (buf.length !== KEY_BYTES) {\r\n // A wrong-size key is not ENOENT — the file is corrupted or was\r\n // tampered with. Throwing instead of falling through to create a\r\n // new key protects all secrets encrypted under this key; the user\r\n // can remove the file manually to generate a fresh key.\r\n throw new Error(\r\n `SecretVault: key file ${this.keyFile} is ${buf.length} bytes ` +\r\n `(expected ${KEY_BYTES}). Remove it manually to generate a new key.`,\r\n );\r\n }\r\n this.key = buf;\r\n return this.key;\r\n }\r\n this.key = key;\r\n return key;\r\n }\r\n}\r\n\r\n/**\r\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\r\n * returning a new object. Used by the config loader so the rest of the\r\n * system never has to know about the wire format.\r\n */\r\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\r\n // A single corrupted/malformed encrypted field should not kill the entire\r\n // config load. Swallow per-field decrypt errors (zero the field so callers\r\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\r\n return walk(cfg, vault, (v, key) => {\r\n try {\r\n return vault.decrypt(v);\r\n } catch (err) {\r\n console.warn(\r\n `[secret-vault] Failed to decrypt \"${key}\":`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n return '';\r\n }\r\n });\r\n}\r\n\r\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\r\n return walk(cfg, vault, (v) => vault.encrypt(v));\r\n}\r\n\r\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\r\n if (node === null || node === undefined) return node;\r\n if (typeof node !== 'object') return node;\r\n if (Array.isArray(node)) {\r\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\r\n }\r\n const out: Record<string, unknown> = Object.create(null);\r\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\r\n if (typeof v === 'string' && isSecretField(k)) {\r\n out[k] = transform(v, k);\r\n } else if (typeof v === 'object' && v !== null) {\r\n out[k] = walk(v, vault, transform);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n\r\n/**\r\n * A key is treated as secret-bearing if its name (case-insensitive) contains\r\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\r\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\r\n * Use a named field with `isSecret: false` annotation if you must opt out —\r\n * see `NON_SECRET_OVERRIDES` below.\r\n */\r\nconst SECRET_KEY_PATTERN =\r\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\r\n\r\n// Field names that contain the literal substring \"key\" but are not secrets.\r\n// Keep this list short; the substring rule itself is intentionally narrow.\r\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\r\n\r\nfunction isSecretField(name: string): boolean {\r\n const lc = name.toLowerCase();\r\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\r\n return SECRET_KEY_PATTERN.test(lc);\r\n}\r\n\r\n/**\r\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\r\n * fields encrypted. Used by the `wstack auth` subcommand.\r\n */\r\nexport async function rewriteConfigEncrypted(\r\n configPath: string,\r\n vault: SecretVault,\r\n patch?: Record<string, unknown>,\r\n): Promise<void> {\r\n let current: Record<string, unknown> = {};\r\n try {\r\n const raw = await fsp.readFile(configPath, 'utf8');\r\n current = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n // start from empty\r\n }\r\n const merged = deepMerge(current, patch ?? {});\r\n const encrypted = encryptConfigSecrets(merged, vault);\r\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\r\n // atomicWrite: torn write here would erase every saved encrypted API key.\r\n await atomicWrite(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\r\n await restrictFilePermissions(configPath);\r\n}\r\n\r\n/**\r\n * Scan a config file on disk for plaintext secret-bearing fields and\r\n * rewrite the file with them encrypted in place. Returns a count of how\r\n * many fields were migrated. Idempotent — calling on a fully-encrypted\r\n * file is a no-op and writes nothing. Used by the CLI on every boot so\r\n * users who had plaintext keys before the vault landed are upgraded\r\n * transparently.\r\n */\r\nexport async function migratePlaintextSecrets(\r\n configPath: string,\r\n vault: SecretVault,\r\n): Promise<{ migrated: number; file: string }> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(configPath, 'utf8');\r\n } catch {\r\n return { migrated: 0, file: configPath };\r\n }\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n return { migrated: 0, file: configPath };\r\n }\r\n const counter = { n: 0 };\r\n const migrated = walkCount(parsed, vault, counter);\r\n if (counter.n === 0) return { migrated: 0, file: configPath };\r\n // atomicWrite: runs on every boot for legacy users — torn write = wipe.\r\n await atomicWrite(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\r\n await restrictFilePermissions(configPath);\r\n return { migrated: counter.n, file: configPath };\r\n}\r\n\r\n/**\r\n * Restrict a file to owner-only access. On POSIX this is chmod 0o600.\r\n * On Windows, chmod is a no-op — we use icacls to remove inherited\r\n * permissions and grant only the current user. Failures are logged\r\n * but not thrown so callers are not blocked on unsupported platforms.\r\n */\r\nasync function restrictFilePermissions(filePath: string): Promise<void> {\r\n if (process.platform === 'win32') {\r\n try {\r\n const { execFile } = await import('node:child_process');\r\n const { promisify } = await import('node:util');\r\n const execFileAsync = promisify(execFile);\r\n // Remove inherited ACEs, grant full control only to current user.\r\n await execFileAsync('icacls', [filePath, '/inheritance:r', '/grant:r', `${process.env.USERNAME}:(F)`]);\r\n } catch {\r\n // Best-effort: icacls may not be available in all environments.\r\n console.warn(`[secret-vault] Could not restrict permissions on ${filePath} — config file may be readable by other users on this system.`);\r\n }\r\n } else {\r\n try {\r\n await fsp.chmod(filePath, 0o600);\r\n } catch {\r\n // Best-effort\r\n }\r\n }\r\n}\r\n\r\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\r\n if (node === null || node === undefined) return node;\r\n if (typeof node !== 'object') return node;\r\n if (Array.isArray(node)) {\r\n return node.map((item) => walkCount(item, vault, counter)) as unknown as T;\r\n }\r\n const out: Record<string, unknown> = Object.create(null);\r\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\r\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\r\n out[k] = vault.encrypt(v);\r\n counter.n++;\r\n } else if (typeof v === 'object' && v !== null) {\r\n out[k] = walkCount(v, vault, counter);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n\r\n/** Keys that, when written into a plain object, can poison the prototype\r\n * chain. We never want user config to carry these. */\r\nconst FORBIDDEN_PROTO_KEYS = new Set([\r\n '__proto__',\r\n 'constructor',\r\n 'prototype',\r\n '__defineGetter__',\r\n '__defineSetter__',\r\n '__lookupGetter__',\r\n '__lookupSetter__',\r\n]);\r\n\r\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\r\n const out: Record<string, unknown> = { ...a };\r\n for (const [k, v] of Object.entries(b)) {\r\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\r\n const existing = out[k];\r\n if (\r\n v !== null &&\r\n typeof v === 'object' &&\r\n !Array.isArray(v) &&\r\n existing !== null &&\r\n typeof existing === 'object' &&\r\n !Array.isArray(existing)\r\n ) {\r\n out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\r\n } else {\r\n out[k] = v;\r\n }\r\n }\r\n return out as T;\r\n}\r\n","/**\n * TTY detection helpers — the single source of truth for \"is this process\n * running against a real terminal?\". Replaces ad-hoc `process.stdin.isTTY`\n * / `process.stdout.isTTY` checks scattered across the codebase so that:\n *\n * 1. test code can mock a single module instead of stubbing `isTTY` on\n * every ReadStream/WriteStream the test happens to touch;\n * 2. a future TTY-detection source (an env var override, a Windows\n * ConPTY workaround, …) lands in one place;\n * 3. `isInteractive()` encodes the rule the project already used inline\n * (\"both streams are TTYs AND we're not running under CI\") in one\n * testable helper instead of the same 3-condition check in two\n * different files.\n *\n * Scope: detection only. Raw-mode control (`setRawMode`), resize\n * subscriptions, and write-injection belong to a future, larger TTY\n * abstraction; this module is the smallest pull that gives us a\n * testable seam and dedups 20+ call sites.\n */\n\nconst hasStdout = (): boolean => typeof process !== 'undefined' && !!process.stdout;\nconst hasStdin = (): boolean => typeof process !== 'undefined' && !!process.stdin;\n\n/** True when `process.stdout` is attached to a terminal (not a pipe/file). */\nexport function isStdoutTTY(): boolean {\n return hasStdout() && Boolean(process.stdout.isTTY);\n}\n\n/** True when `process.stdin` is attached to a terminal (not a pipe/file). */\nexport function isStdinTTY(): boolean {\n return hasStdin() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * True when the current process is an interactive session: both stdin and\n * stdout are TTYs. Callers that also need a \"not a single-shot invocation\"\n * or \"not under CI\" check should layer that on top — keeping this helper\n * minimal preserves the original inline checks it replaces.\n */\nexport function isInteractive(): boolean {\n return isStdinTTY() && isStdoutTTY();\n}\n\n/** Current terminal size in characters, with a 24×80 fallback for non-TTYs. */\nexport function getTermSize(): { rows: number; cols: number } {\n if (!hasStdout()) return { rows: 24, cols: 80 };\n return {\n rows: process.stdout.rows ?? 24,\n cols: process.stdout.columns ?? 80,\n };\n}\n\n/**\n * Subscribe to terminal resize events. `cb` is called with the new size each\n * time the underlying stream emits `resize`. Returns a cleanup function the\n * caller MUST call on dispose to remove the listener — leaving a stale\n * `resize` listener on a disposed component leaks the closure (and the\n * component itself, transitively) until the process exits.\n *\n * The stream argument defaults to `process.stdout`. Pass an explicit\n * `NodeJS.WriteStream` when the caller already owns one (e.g. a status line\n * that targets an injected `out` for testability). For non-TTY streams no\n * listener is registered and the returned cleanup is a no-op.\n */\nexport function onResize(\n cb: (size: { rows: number; cols: number }) => void,\n stream: NodeJS.WriteStream = process.stdout,\n): () => void {\n if (!stream || typeof stream.on !== 'function') return () => {};\n const handler = (): void => {\n cb({\n rows: stream.rows ?? 24,\n cols: stream.columns ?? 80,\n });\n };\n stream.on('resize', handler);\n return () => {\n stream.off('resize', handler);\n };\n}\n\n/**\n * Toggle raw mode on a TTY stdin stream. Returns `true` when the toggle was\n * applied, `false` when the stream is null, not a TTY, or doesn't expose\n * `setRawMode` (pipes, file descriptors, Windows ConPTY edge cases). Callers\n * that need to restore the previous mode should snapshot `input.isRaw`\n * BEFORE the call and pass the value to a second call to flip back.\n *\n * Use this helper to drop the now-redundant\n * `if (input.isTTY) input.setRawMode(...)` ceremony at every call site.\n */\nexport function setRawMode(input: NodeJS.ReadStream, mode: boolean): boolean {\n if (!input || input.isTTY !== true) return false;\n if (typeof input.setRawMode !== 'function') return false;\n input.setRawMode(mode);\n return true;\n}\n\n/**\n * Stream-agnostic write primitive. Returns `false` when the stream is\n * missing or doesn't expose `write` so callers can degrade silently under\n * hostile host environments (closed pipe, mock injects `null`, test\n * replaces the stream with a stub).\n *\n * **Not exported in the public API.** Exposed only inside `term.ts` for\n * `writeOut` / `writeErr` to share a single implementation. If a caller\n * needs to write to an arbitrary stream, they should call `writeOut` (or\n * `writeErr`) with an explicit `stream` argument — the named functions\n * are the public surface so the \"this is the standard error stream\"\n * intent stays visible at every call site.\n */\nfunction writeTo(\n s: string,\n stream: NodeJS.WriteStream | undefined,\n): boolean {\n if (!stream || typeof stream.write !== 'function') return false;\n stream.write(s);\n return true;\n}\n\n/**\n * Write `s` to `stream` (defaults to `process.stdout`). Returns `false`\n * when the stream is missing or doesn't expose `write` so callers can\n * degrade silently under hostile host environments (closed pipe, mock\n * injects `null`, test replaces the stream with a stub).\n *\n * Why a helper:\n * 1. **Single seam for output capture in tests** — stub `writeOut` once\n * and assert on what the rest of the codebase intended to print,\n * without spying on `process.stdout.write` (which is brittle and\n * leaks across parallel test files).\n * 2. **Stream swap without grep** — routing the CLI's output to a\n * logger or `out.log` becomes a one-line change at process boot.\n * 3. **Defensive default** — closes the \"what if `process.stdout` is\n * `null`\" gap that currently exists at ~50 call sites that just\n * call `process.stdout.write(s)` and crash on certain Windows\n * redirect invocations.\n *\n * Call-site migration is staged: this commit introduces the helper, a\n * follow-up commit replaces the 50+ `process.stdout.write(...)` sites\n * with `writeOut(...)`. Until that migration lands, both forms coexist\n * and `writeOut` is the preferred form for new code.\n */\nexport function writeOut(\n s: string,\n stream: NodeJS.WriteStream = process.stdout,\n): boolean {\n return writeTo(s, stream);\n}\n\n/**\n * Symmetric partner of `writeOut` for the standard error stream. Same shape,\n * same defensive contract, same single-seam-for-tests story — just defaults to\n * `process.stderr` instead of `process.stdout`.\n *\n * Use this in code paths that emit error/diagnostic/warning text. Keeping\n * these two helpers split (rather than a single `writeTo(s, stream)`) means\n * the call site reads as a clear intent signal: \"I am writing an error\" vs.\n * \"I am writing a result\" — which matters for callers that decide between\n * stdout/stderr routing (e.g. `--quiet` flags, log-level filtering,\n * structured-log rewriters that fork on stream).\n *\n * Stderr writes from the core logger (see `infrastructure/logger.ts`) and from\n * the TUI guard (see `tui/run-tui.ts`) used to call `process.stderr.write`\n * directly. Routing them through this helper lets tests stub the stream at\n * one boundary and lets future logging middleware (e.g. a JSON-line rewriter)\n * swap the destination for the entire process in one place.\n */\nexport function writeErr(\n s: string,\n stream: NodeJS.WriteStream = process.stderr,\n): boolean {\n return writeTo(s, stream);\n}\n","import { isStdoutTTY } from './term.js';\n\nconst isColorTty = (): boolean => {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return isStdoutTTY();\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';\nimport { writeErr } from '../utils/term.js';\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nconst COLORS: Record<LogLevel, (s: string) => string> = {\n error: color.red,\n warn: color.yellow,\n info: color.cyan,\n debug: color.gray,\n trace: color.dim,\n};\n\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 writeErr(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n writeErr(`${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 type { EventBus } from '../kernel/events.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { Usage } from '../types/provider.js';\nimport type { CacheStats, TokenCounter } from '../types/token-counter.js';\n\ninterface PriceEntry {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nconst PRICE_CACHE_MAX_SIZE = 100;\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry;\n private readonly providerId?: string;\n private readonly events?: EventBus;\n private priceCache = new Map<string, PriceEntry>();\n /** Most recently accounted request's tokens. Used for per-request context pressure. */\n private lastInput = 0;\n private lastCacheRead = 0;\n\n constructor(opts: { registry?: ModelsRegistry; providerId?: string; events?: EventBus } = {}) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n }\n\n account(usage: Usage, model?: string): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n } else if (this.registry && this.providerId && model) {\n // Evict oldest entry when cache is full before async lookup.\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0]!);\n }\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', { model: model ?? '<unknown>' });\n return undefined;\n });\n }\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n // Snapshot per-request tokens for context pressure tracking.\n this.lastInput = usage.input;\n this.lastCacheRead = usage.cacheRead ?? 0;\n const price = priceFromModel(resolved);\n if (this.priceCache.size >= PRICE_CACHE_MAX_SIZE) {\n const keys = [...this.priceCache.keys()];\n this.priceCache.delete(keys[0]!);\n }\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n currentRequestTokens(): { input: number; cacheRead: number } {\n return { input: this.lastInput, cacheRead: this.lastCacheRead };\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n if (usage.cacheWrite && price.cacheWrite) {\n this.costInput += (usage.cacheWrite / 1_000_000) * price.cacheWrite;\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\nconst _cal = {\n ratio: 1.0, // current calibration multiplier (actual / estimated)\n count: 0, // number of samples recorded\n prevEst: 0, // estimated tokens from the most recent estimateRequestTokens call\n /** EWM α — higher = faster adaptation, more volatile */\n alpha: 0.3,\n};\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\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\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: { name: string; description?: string; inputSchema: unknown }): number {\n return RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(tool.description ?? '') +\n RoughTokenEstimate(JSON.stringify(tool.inputSchema));\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (typeof b === 'object' && b !== null && (b as { type?: string }).type === 'text') {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n _cal.prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to `_cal.prevEst`\n * for backward compatibility with callers that don't have the pre-flight value.\n */\nexport function recordActualUsage(actualInputTokens: number, estimatedInputTokens?: number): void {\n if (actualInputTokens <= 0) return;\n const est = estimatedInputTokens ?? _cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (_cal.count === 0) {\n _cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n _cal.ratio = _cal.alpha * sampleRatio + (1 - _cal.alpha) * _cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n _cal.ratio = Math.min(1.5, Math.max(0.5, _cal.ratio));\n _cal.count++;\n}\n\n/**\n * Returns the current calibration state. Exposed for debugging and\n * tests — not needed by normal callers.\n */\nexport function getCalibrationState(): { ratio: number; count: number; calibrated: boolean } {\n return {\n ratio: _cal.ratio,\n count: _cal.count,\n calibrated: _cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools);\n\n if (_cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, _cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n return result;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites.\n */\nexport function resetCalibration(): void {\n _cal.ratio = 1.0;\n _cal.count = 0;\n _cal.prevEst = 0;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","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 { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n estimateRequestTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\n/**\n * Default tools config values shared across CLI and WebUI.\n * Import this instead of hardcoding to avoid cross-surface inconsistencies.\n * These mirror the values in BEHAVIOR_DEFAULTS (config-loader.ts).\n *\n * @deprecated Import from '../types/default-config.js' instead.\n * This re-export exists for backward compatibility.\n */\nexport { DEFAULT_TOOLS_CONFIG, DEFAULT_CONTEXT_CONFIG, DEFAULT_AUTONOMY_CONFIG } from '../types/default-config.js';\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\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 beforeFull = this.estimateFullRequest(ctx);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx, preserveK, eliseThreshold);\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, preserveK);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n const afterFull = this.estimateFullRequest(ctx);\n return {\n before: beforeTokens,\n after: afterTokens,\n fullRequestTokensBefore: beforeFull,\n fullRequestTokensAfter: afterFull,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n /**\n * Estimate the full API request token count: messages + systemPrompt + toolDefs.\n * This is the accurate figure for context-window pressure monitoring.\n */\n private estimateFullRequest(ctx: Context): number {\n const breakdown = estimateRequestTokens(ctx.messages, ctx.systemPrompt, ctx.tools ?? []);\n return breakdown.total;\n }\n\n private eliseOldToolResults(\n ctx: Context,\n preserveK = this.preserveK,\n eliseThreshold = this.eliseThreshold,\n ): 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 < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\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 < 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]`,\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, preserveK = this.preserveK): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - 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 readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n\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","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n '.wrongstack',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n while (dir !== root) {\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return path.resolve(start);\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath) ? path.basename(absPath) : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string; projectRoot?: string }).fullPath = absPath;\n (err as Error & { fullPath?: string; projectRoot?: string }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","/**\n * Shared regex patterns used across execution and security-scanner.\n * Centralized here to avoid duplication and keep patterns in sync.\n */\n\n/** Matches Node.js ECONN* errors and fetch failure messages. */\nexport const NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\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;\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.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const 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 { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 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 { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n {\n type: 'anthropic_key',\n regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g,\n },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n {\n type: 'stripe_key',\n regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g,\n },\n {\n type: 'telegram_bot_token',\n // Telegram tokens are of the form bot<digits>:<alphanum> in URL paths\n regex: /\\/bot\\d+:[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g,\n },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex:\n /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex:\n /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n {\n type: 'bearer_token',\n // Anchored with alternation instead of negative lookahead — avoids V8\n // backtracking risk on adversarial input. Bounded at 512 chars.\n // Min 12 chars: some OAuth providers issue shorter-lived tokens (< 20\n // chars). A 12-char base64 string has ~71 bits of entropy — above the\n // threshold where random strings are unlikely to produce false matches.\n regex: /(?:^|[^A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{12,512}=*(?:$|[^A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Anchored with alternation instead of lookbehind to avoid backtracking.\n // Value bounded at 512 chars.\n regex: /(?:^|\\s)([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,512})['\"]?(?:\\s|$)/g,\n },\n];\n\n/**\n * Per-chunk cap. Splits long inputs into 64 KB chunks to keep scrub() memory\n * bounded. Real scrub() inputs (LLM responses, tool outputs) are typically\n * much smaller; this cap handles edge cases without impacting normal usage.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\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","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.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 * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: 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 private readonly overlay?: ModelsDevPayload;\n private readonly overlayUrl?: string;\n private readonly overlayFile?: string;\n private readonly overlayCacheFile?: string;\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 this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n err instanceof Error ? err.message : String(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const 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.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 /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (this.overlay) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (fetched) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean }): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) return cached.payload;\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? 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.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n","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 for SOLID 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 id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: `## Brief Mode\n\nYou are WrongStack, a fast, no-nonsense AI coding agent.\nGet to the point — read files, run commands, make changes.\n\n### Operating rules\n1. **Read first.** Inspect relevant files before touching anything.\n2. **Edit surgically.** Use edit tool for existing files, write only for new ones.\n3. **One sentence before action.** State what you're doing, then do it.\n4. **Say what happened.** After tool calls, one line: success, failure, or what's next.\n5. **Be honest.** Admit when you don't know or something failed. No filler.\n6. **Keep moving.** Task done? Stop. More work needed? State it and continue.\n\n### Decision rules\n- **Ambiguous task?** Ask. One question, get clarity, proceed.\n- **Clear task, unknown approach?** Pick one reasonable path, execute, report.\n- **Tool fails?** Retry once with adjusted params, then report.\n\n### Output style\n- Prose paragraphs (no bullet points unless unavoidable)\n- Code blocks for code, backticks for paths/commands\n- One-liner sufficient? One liner.\n- Max 3 sentences per paragraph.`,\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: `## Teach Mode\n\nYou are WrongStack, an expert AI coding mentor.\n\nYou operate inside the user's terminal with full access to their codebase. You help developers learn and understand — not just execute tasks, but build mental models.\n\n### Teaching philosophy\n\n1. **Explain the why.** When you make a change, explain why it works that way — not just what you did.\n2. **Build mental models.** Use analogies, highlight patterns, connect new concepts to things the user already knows.\n3. **Read before teaching.** Always inspect relevant files so your explanations are accurate and specific to the actual code.\n4. **Surgical edits with context.** When editing code, explain the approach before doing it, and what trade-offs were considered.\n5. **Be thorough but not verbose.** A 2-paragraph explanation beats a 5-paragraph one. Depth without padding.\n6. **Admit knowledge gaps.** If you're unsure, say so. Speculating teaches bad patterns.\n\n### Teaching style\n\n- **Before action:** Briefly explain what you're going to do and why.\n- **After action:** Summarize what happened and what the user should take away from this.\n- **With code:** Show concrete examples, explain syntax choices, point out gotchas.\n- **With errors:** Explain why the error occurred, what it's actually complaining about, and how to avoid it in the future.\n- **General principles:** Offer them when the user's question suggests a deeper concept they'd benefit from understanding.\n\n### Decision heuristics\n\n- **Task is ambiguous?** Ask — but frame the question as \"what would you like to learn from this?\"\n- **Task is clear, approach is unknown?** Execute, then teach the approach as you go.\n- **Tool fails?** Explain what failed, why it failed, and how to avoid the failure.\n- **User asks \"how do I...?\"** Don't just give the answer — explain the underlying mechanism.\n- **Context window filling up?** Compact, but summarize what was lost so the teaching continuity isn't broken.\n\n### Output format\n\n- Use headings to structure multi-concept explanations.\n- Code blocks with brief annotations for code examples.\n- **Bold** key terms and concepts worth remembering.\n- Callouts like \"Key takeaway:\" or \"Pattern:\" to anchor learning.\n- Max 3 sentences per paragraph — readability over completeness.\n\n### Don'ts\n\n- Don't lecture condescendingly — the user is a developer, not a beginner.\n- Don't pad explanations with obvious things.\n- Don't skip the \"why\" — even quick tasks deserve one sentence of context.\n- Don't just say \"do X\" — say \"do X because Y.\"\n- Don't leave the user hanging after a complex operation — explain what just happened.\n\n### Core principles\n\nYou follow these principles, but always with explanation:\n- Read before write\n- Surgical edits over rewrites\n- Show your work (explain your reasoning, not just mechanical steps)\n- Be honest about limits\n- Format for scanability\n- Recover explicitly from failures\n\nRemember: your job is to make the user a better developer, not just to complete tasks faster.`,\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n },\n];\n","export type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string;\n warnThreshold?: number;\n softThreshold?: number;\n hardThreshold?: number;\n preserveK?: number;\n eliseThreshold?: number;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID)!;\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)!.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n /** Stores the transport unsubscribe function so it can be called on stop(). */\n private _transportUnsubscribe?: () => void;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this._transportUnsubscribe = this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new 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 // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n // Reject if stop() was called after the initial check and cleared\n // the guard — this prevents a request from being enqueued after\n // stop() has already released the lock on pendingRequests.\n if (!this.inflightGuards.has(correlationId)) {\n clearTimeout(timer);\n reject(new Error('Bridge stopped'));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new Error('Bridge stopped'));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n // Call the transport unsubscribe to clean up the subscription handler.\n // This prevents memory leaks when bridges are created and destroyed frequently.\n this._transportUnsubscribe?.();\n this._transportUnsubscribe = undefined;\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType =\n | 'overview'\n | 'requirements'\n | 'architecture'\n | 'api'\n | 'data'\n | 'security'\n | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[];\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[];\n implements?: string[];\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[];\n dependencies?: string[];\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n {\n type: 'non-functional',\n priority: 'medium',\n acceptanceCriteria: [],\n blockedBy: [],\n implements: [],\n },\n ],\n};\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string;\r\n estimateHours?: number;\r\n actualHours?: number;\r\n tags?: string[];\r\n specRequirementId?: string;\r\n parentId?: string;\r\n children?: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n startedAt?: number; // set when status → in_progress\r\n completedAt?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[];\r\n priority?: TaskPriority[];\r\n type?: TaskType[];\r\n assignee?: string[];\r\n tags?: string[];\r\n specRequirementId?: string;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0;\r\n let pending = 0;\r\n let inProgress = 0;\r\n let blocked = 0;\r\n let failed = 0;\r\n let review = 0;\r\n let estimatedHours = 0;\r\n let actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed':\r\n completed++;\r\n break;\r\n case 'pending':\r\n pending++;\r\n break;\r\n case 'in_progress':\r\n inProgress++;\r\n break;\r\n case 'blocked':\r\n blocked++;\r\n break;\r\n case 'failed':\r\n failed++;\r\n break;\r\n case 'review':\r\n review++;\r\n break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\n * Well-known tool capabilities used for authorization decisions.\n *\n * These are the preferred values for `Tool.capabilities`.\n * New capabilities should be added here with clear documentation.\n *\n * Philosophy (2026-06+):\n * - Prefer capabilities over exact tool name matching.\n * - Subagent guards and future policies should primarily key off capabilities.\n * - Name-based denylists are legacy and will be phased down.\n */\nexport const ToolCapabilities = {\n /** Can execute arbitrary commands in the user's shell (the `bash` tool). */\n SHELL_ARBITRARY: 'shell.arbitrary',\n\n /** Can execute a restricted set of commands (the `exec` tool). */\n SHELL_RESTRICTED: 'shell.restricted',\n\n /** Can read files inside the project (and possibly outside via symlinks if not guarded). */\n FS_READ: 'fs.read',\n\n /** Can write / modify / delete files inside the project. */\n FS_WRITE: 'fs.write',\n\n /** Can write files outside the current project root (very high risk). */\n FS_WRITE_OUTSIDE_PROJECT: 'fs.write.outside-project',\n\n /** Can perform outbound network requests. */\n NET_OUTBOUND: 'net.outbound',\n\n /** Proxies tools from external MCP servers (unknown capability). */\n MCP_PROXY: 'mcp.proxy',\n\n /** Can spawn or manage subagents / multi-agent tasks. */\n SUBAGENT_SPAWN: 'subagent.spawn',\n\n /** Can mutate global or session configuration / trust state. */\n CONFIG_MUTATE: 'config.mutate',\n\n /** Can install packages or run package managers with side effects. */\n PACKAGE_INSTALL: 'package.install',\n} as const;\n\nexport type ToolCapability = (typeof ToolCapabilities)[keyof typeof ToolCapabilities];\n\n/**\n * Set of capabilities that are considered dangerous for subagents by default.\n * Subagents should not receive these capabilities unless the leader explicitly\n * allows the specific tool at spawn time.\n */\nexport const DANGEROUS_FOR_SUBAGENTS: readonly ToolCapability[] = [\n ToolCapabilities.SHELL_ARBITRARY,\n ToolCapabilities.FS_WRITE,\n ToolCapabilities.FS_WRITE_OUTSIDE_PROJECT,\n ToolCapabilities.MCP_PROXY,\n ToolCapabilities.SUBAGENT_SPAWN,\n ToolCapabilities.CONFIG_MUTATE,\n ToolCapabilities.PACKAGE_INSTALL,\n];\n\n/**\n * Check if a tool (or its capabilities array) includes any dangerous capability\n * for subagent execution.\n */\nexport function hasDangerousCapabilityForSubagents(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n): boolean {\n if (!toolOrCaps) return false;\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.some((c) => DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability));\n}\n\n/**\n * Check if a tool declares a specific capability (or any of the provided ones).\n */\nexport function hasCapability(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n capability: ToolCapability | ToolCapability[],\n): boolean {\n if (!toolOrCaps) return false;\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n const toCheck = Array.isArray(capability) ? capability : [capability];\n return toCheck.some((c) => caps.includes(c));\n}\n\n/**\n * Returns the intersection of a tool's capabilities with the dangerous set.\n * Useful for logging and audit trails.\n */\nexport function getDangerousCapabilities(\n toolOrCaps: { capabilities?: readonly string[] } | readonly string[] | undefined,\n): ToolCapability[] {\n if (!toolOrCaps) return [];\n // Use `as unknown as ...` to allow accessing .capabilities on the union type\n const input = toolOrCaps as unknown as { capabilities?: readonly string[] };\n const caps: readonly string[] = Array.isArray(toolOrCaps) ? toolOrCaps : (input.capabilities ?? []);\n return caps.filter((c): c is ToolCapability =>\n DANGEROUS_FOR_SUBAGENTS.includes(c as ToolCapability),\n );\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors);\n return { ok: errors.length === 0, errors };\n}\n\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n value.forEach((item, i) => walk(item, schema.items as JSONSchema, `${path}[${i}]`, errors));\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","/**\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 {\n hasDangerousCapabilityForSubagents,\n getDangerousCapabilities,\n} from '../security/capabilities.js';\nimport { validateAgainstSchema } from '../utils/json-schema-validate.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 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 * Clear the interactive confirm awaiter so the executor returns\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\n * the CLI to switch from inline prompts (REPL) to event-driven\n * confirmation (TUI) at runtime.\n */\n clearConfirmAwaiter(): void {\n this.opts.confirmAwaiter = undefined;\n }\n\n /**\n * 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 // Strong guarantee: Validate input against the tool's declared JSON Schema\n // *before* permission checks or execution. This is a hard gate — bad calls\n // are rejected early with actionable feedback so the model can self-correct.\n const validation = validateAgainstSchema(use.input, tool.inputSchema);\n if (!validation.ok) {\n const errorDetails = validation.errors\n .map((e) => ` - ${e.path || 'input'}: ${e.message}`)\n .join('\\n');\n\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content:\n `Invalid arguments for tool \"${tool.name}\".\\n\\n` +\n `Validation errors:\\n${errorDetails}\\n\\n` +\n `Please call the tool again with arguments that match its inputSchema. ` +\n `You can use the \"tool-help\" tool with name=\"${tool.name}\" to see the exact expected schema.`,\n is_error: true,\n };\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n // Capability safety net at the executor level (defense in depth).\n // For tools declaring dangerous capabilities, we ensure the permission\n // decision cannot silently become \"auto\" in non-yolo contexts.\n const toolDangerousCaps = getDangerousCapabilities(tool);\n if (toolDangerousCaps.length > 0) {\n // If the tool has dangerous capabilities and we're not in full yolo mode,\n // we can force the downstream permission policy to treat it more strictly.\n // For now we record it; future policy profiles can act on this.\n if (this.opts.events) {\n // Observability hook for dangerous capability usage\n }\n }\n\n // Provider boundary: the model's tool arguments arrive as a raw JSON\n // string accumulated over streamed deltas. When that string is not a\n // valid JSON object (truncated, scalar, or mangled by a proxy/local\n // model), the parsers wrap it under a sentinel key instead of silently\n // producing `{}`. Executing the tool with such input yields a cryptic\n // \"<field> is required\" error that the model can't act on. Detect the\n // sentinel here and feed back an actionable message so the model\n // resends well-formed arguments.\n if (hasMalformedArguments(use.input)) {\n const result = this.malformedInputResult(use, extractMalformedRaw(use.input));\n budget = this.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 // Post-permission dangerous capability enforcement (B-side guarantee).\n // Even after the permission policy has spoken, we apply an extra conservative\n // rule for tools that declare high-risk capabilities (shell arbitrary, write outside\n // project, mcp proxy, etc.). This reduces the blast radius of prompt injection.\n let effectivePermission = decision.permission;\n\n // YOLO is the user's explicit \"stop asking\" switch, so it also waives the\n // dangerous-capability net below (matching the historical behavior where\n // --yolo skipped every prompt). The net still fires in non-yolo runs —\n // e.g. a trust-file auto-allow for a shell tool still gets a confirm, so\n // a single trusted pattern can't silently widen into arbitrary shell.\n // Detected via optional methods so policies without them (AutoApprove,\n // test mocks) keep the stricter default.\n const policy = this.opts.permissionPolicy as {\n getYolo?(): boolean;\n getForceAllYolo?(): boolean;\n };\n const yolo = policy.getYolo?.() === true || policy.getForceAllYolo?.() === true;\n\n if (toolDangerousCaps.length > 0 && effectivePermission === 'auto' && !yolo) {\n // Outside yolo we force at least 'confirm' for dangerous-capability tools.\n effectivePermission = 'confirm';\n }\n\n if (effectivePermission === 'deny') {\n const result = this.deniedResult(use, decision.reason);\n budget = this.decrementBudget(result, budget);\n return { result, tool, durationMs: Date.now() - start };\n }\n\n if (effectivePermission === 'confirm') {\n if (this.opts.confirmAwaiter) {\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\n if (choice !== 'yes' && choice !== 'always') {\n const result = {\n type: 'tool_result' as const,\n tool_use_id: use.id,\n content: `Tool \"${tool.name}\" denied by user.`,\n is_error: true,\n };\n budget = this.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 // effectivePermission === 'auto' (after all safety layers)\n // Capability audit for observability.\n const toolCapsForAudit = hasDangerousCapabilityForSubagents(tool) ? (tool.capabilities ?? []) : [];\n\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\n // adapter or other Tracer is bound — zero overhead by default.\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\n 'tool.name': tool.name,\n 'tool.mutating': tool.mutating,\n 'tool.permission': tool.permission,\n 'tool.capabilities': JSON.stringify(tool.capabilities ?? []),\n 'tool.has_dangerous_capabilities': toolCapsForAudit.length > 0,\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 let cleanupCalled = false;\n let caught = false;\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 caught = true;\n if (combined.aborted && typeof tool.cleanup === 'function') {\n // Best-effort cleanup; never let it mask the original error.\n cleanupCalled = true;\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n throw err;\n } finally {\n clearTimeout(timer);\n // If the tool completed successfully (no error thrown) but the combined\n // signal was aborted (e.g. timeout), the catch block above never fired.\n // Call cleanup here and then throw so the caller sees the abort.\n // When `caught` is true, we already have an in-flight throw — don't\n // override it from `finally` (that would replace the original error\n // with the abort reason and mask the actual failure).\n if (combined.aborted && !caught) {\n if (!cleanupCalled && typeof tool.cleanup === 'function') {\n try {\n await tool.cleanup(input, ctx);\n } catch {\n /* swallow */\n }\n }\n const reason = combined.reason instanceof Error\n ? combined.reason\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'aborted');\n // biome-ignore lint/correctness/noUnsafeFinally: guarded by `!caught` — only runs when the tool returned cleanly but the signal aborted, so there is no in-flight exception to override.\n throw reason;\n }\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 malformedInputResult(use: ToolUseBlock, raw?: string): ToolResultBlock {\n let content =\n `Tool \"${use.name}\" received arguments that were not a valid JSON object, so they ` +\n `could not be parsed. Re-issue the call with the arguments encoded as a single ` +\n `well-formed JSON object matching the tool's input schema.`;\n // Echo the raw payload back so the model can see *what* it produced and\n // self-correct. Without this the model is blind to its own mistake and\n // tends to resend the identical malformed call in a loop. Common causes:\n // unescaped newlines/quotes/backslashes inside a string field, or the\n // arguments being truncated mid-stream.\n if (raw) {\n const max = 800;\n const excerpt = raw.length > max ? `${raw.slice(0, max)}… (truncated, ${raw.length} chars total)` : raw;\n content +=\n ` Common cause: a string field (e.g. code in old_string/new_string) ` +\n `contains literal newlines, quotes, or backslashes that must be JSON-escaped, ` +\n `or the payload was cut off mid-stream. The raw arguments received were:\\n${excerpt}`;\n }\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content,\n is_error: true,\n };\n }\n\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\n return {\n type: 'tool_result',\n tool_use_id: use.id,\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\n is_error: true,\n };\n }\n\n private 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 const isPathKey = subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n return isPathKey ? normalizePath(v) : 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\n/**\n * Sentinel keys the provider adapters use to wrap tool arguments that could\n * not be parsed into a proper JSON object. `parseToolInput` (Anthropic /\n * shared) uses `__raw`, `contentFromOpenAI` uses `__raw_arguments`, and the\n * streaming response builder's `safeJsonOrRaw` uses `_raw`. Keep this list in\n * sync if a new adapter introduces another marker.\n *\n * NOTE: `parseToolInput` and `safeJsonOrRaw` now attempt JSON repair\n * (auto-closing braces and strings) before wrapping — so a truncated blob\n * like `{\"old_string\": \"line1\\nline2` gets repaired first. The sentinel is\n * only used when repair also fails.\n */\nconst MALFORMED_ARG_MARKERS = ['__raw', '__raw_arguments', '_raw'] as const;\n\nfunction hasMalformedArguments(input: unknown): boolean {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const obj = input as Record<string, unknown>;\n // The sentinel is the *only* key when wrapping occurred — a real tool call\n // that legitimately uses a key named e.g. `_raw` will carry other keys too.\n const keys = Object.keys(obj);\n return keys.length === 1 && MALFORMED_ARG_MARKERS.includes(keys[0] as never);\n}\n\n/**\n * Pull the original (unparseable) payload back out of a sentinel-wrapped input\n * so the executor can echo it to the model. The wrapped value is usually the\n * raw argument string, but a scalar/array that parsed cleanly is wrapped too —\n * stringify those. Returns undefined if nothing usable is present.\n */\nfunction extractMalformedRaw(input: unknown): string | undefined {\n if (!hasMalformedArguments(input)) return undefined;\n const obj = input as Record<string, unknown>;\n const value = obj[Object.keys(obj)[0]!];\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\r\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n *\r\n * The heavy operations re-parse the JSONL stream on every call — fine for\r\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n const filtered = raw.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n const out: SessionSummaryLite[] = filtered.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.store.load(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE loading events — avoids loading thousands of events\r\n // from sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n const sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n const filtered = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n ids = filtered.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.store.load(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = data.events[i]!;\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.store.load(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.store.load(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n"]}
|