mastracode 0.4.0 → 0.5.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/CHANGELOG.md +328 -0
- package/LICENSE.md +15 -0
- package/README.md +68 -29
- package/dist/agents/memory.d.ts.map +1 -1
- package/dist/agents/model.d.ts +17 -6
- package/dist/agents/model.d.ts.map +1 -1
- package/dist/agents/prompts/index.d.ts.map +1 -1
- package/dist/agents/prompts/tool-guidance.d.ts +2 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
- package/dist/agents/subagents/audit-tests.d.ts +0 -7
- package/dist/agents/subagents/audit-tests.d.ts.map +1 -1
- package/dist/agents/subagents/execute.d.ts +0 -7
- package/dist/agents/subagents/execute.d.ts.map +1 -1
- package/dist/agents/subagents/explore.d.ts +0 -7
- package/dist/agents/subagents/explore.d.ts.map +1 -1
- package/dist/agents/subagents/index.d.ts.map +1 -1
- package/dist/agents/subagents/plan.d.ts +0 -7
- package/dist/agents/subagents/plan.d.ts.map +1 -1
- package/dist/agents/tools.d.ts +3 -1
- package/dist/agents/tools.d.ts.map +1 -1
- package/dist/agents/workspace.d.ts +4 -1
- package/dist/agents/workspace.d.ts.map +1 -1
- package/dist/{chunk-K4WJUBEC.cjs → chunk-AJEYT7X3.cjs} +763 -429
- package/dist/chunk-AJEYT7X3.cjs.map +1 -0
- package/dist/{chunk-U5A7TFNT.js → chunk-CC2724NI.js} +46 -10
- package/dist/chunk-CC2724NI.js.map +1 -0
- package/dist/{chunk-REVOTI2T.js → chunk-JI4M5525.js} +740 -412
- package/dist/chunk-JI4M5525.js.map +1 -0
- package/dist/{chunk-Z4QRXVST.cjs → chunk-MBPGUMYQ.cjs} +325 -251
- package/dist/chunk-MBPGUMYQ.cjs.map +1 -0
- package/dist/{chunk-MT3YCFCC.cjs → chunk-OEDRHUU5.cjs} +47 -9
- package/dist/chunk-OEDRHUU5.cjs.map +1 -0
- package/dist/{chunk-M5LKPQB4.js → chunk-WKPHD54B.js} +283 -209
- package/dist/chunk-WKPHD54B.js.map +1 -0
- package/dist/{chunk-C4X3C2DL.cjs → chunk-XVYUS2EA.cjs} +2213 -1035
- package/dist/chunk-XVYUS2EA.cjs.map +1 -0
- package/dist/{chunk-X3BGE7CL.js → chunk-YQNZ7DHQ.js} +1788 -613
- package/dist/chunk-YQNZ7DHQ.js.map +1 -0
- package/dist/cli.cjs +79 -31
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +71 -23
- package/dist/cli.js.map +1 -1
- package/dist/clipboard/index.d.ts +5 -0
- package/dist/clipboard/index.d.ts.map +1 -1
- package/dist/error-classification.d.ts +10 -0
- package/dist/error-classification.d.ts.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/config.d.ts +8 -0
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/manager.d.ts +4 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/types.d.ts +30 -3
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/onboarding/onboarding-inline.d.ts +2 -0
- package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
- package/dist/onboarding/packs.d.ts +1 -0
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/settings.d.ts +37 -2
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/permissions-S3LGXIDB.js +3 -0
- package/dist/{permissions-CVXKYIWR.js.map → permissions-S3LGXIDB.js.map} +1 -1
- package/dist/permissions-VGABAVGD.cjs +40 -0
- package/dist/{permissions-2HIUSRQN.cjs.map → permissions-VGABAVGD.cjs.map} +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/providers/claude-max.d.ts +13 -0
- package/dist/providers/claude-max.d.ts.map +1 -1
- package/dist/providers/openai-codex.d.ts +1 -0
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/tool-names.d.ts +68 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tools/ast-smart-edit.d.ts +77 -5
- package/dist/tools/ast-smart-edit.d.ts.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/string-replace-lsp.d.ts +15 -0
- package/dist/tools/string-replace-lsp.d.ts.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/utils.d.ts +4 -2
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tui/command-dispatch.d.ts.map +1 -1
- package/dist/tui/commands/clone.d.ts +29 -0
- package/dist/tui/commands/clone.d.ts.map +1 -0
- package/dist/tui/commands/custom-providers.d.ts +8 -0
- package/dist/tui/commands/custom-providers.d.ts.map +1 -0
- package/dist/tui/commands/index.d.ts +3 -1
- package/dist/tui/commands/index.d.ts.map +1 -1
- package/dist/tui/commands/mcp.d.ts.map +1 -1
- package/dist/tui/commands/models-pack.d.ts +4 -0
- package/dist/tui/commands/models-pack.d.ts.map +1 -1
- package/dist/tui/commands/om.d.ts.map +1 -1
- package/dist/tui/commands/report-issue.d.ts +3 -0
- package/dist/tui/commands/report-issue.d.ts.map +1 -0
- package/dist/tui/commands/resource.d.ts.map +1 -1
- package/dist/tui/commands/settings.d.ts.map +1 -1
- package/dist/tui/commands/threads.d.ts +1 -0
- package/dist/tui/commands/threads.d.ts.map +1 -1
- package/dist/tui/components/ask-question-inline.d.ts +3 -0
- package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
- package/dist/tui/components/custom-editor.d.ts +1 -1
- package/dist/tui/components/custom-editor.d.ts.map +1 -1
- package/dist/tui/components/help-overlay.d.ts.map +1 -1
- package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
- package/dist/tui/components/settings.d.ts +2 -0
- package/dist/tui/components/settings.d.ts.map +1 -1
- package/dist/tui/components/subagent-execution.d.ts +6 -1
- package/dist/tui/components/subagent-execution.d.ts.map +1 -1
- package/dist/tui/components/thread-selector.d.ts +6 -0
- package/dist/tui/components/thread-selector.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-enhanced.d.ts +1 -0
- package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
- package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
- package/dist/tui/handlers/message.d.ts.map +1 -1
- package/dist/tui/handlers/prompts.d.ts +6 -0
- package/dist/tui/handlers/prompts.d.ts.map +1 -1
- package/dist/tui/handlers/subagent.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts +14 -5
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/setup.d.ts.map +1 -1
- package/dist/tui/state.d.ts +4 -5
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui.cjs +19 -19
- package/dist/tui.js +2 -2
- package/dist/utils/debug-log.d.ts +12 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/plans.d.ts +7 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/update-check.d.ts +40 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/chunk-C4X3C2DL.cjs.map +0 -1
- package/dist/chunk-K4WJUBEC.cjs.map +0 -1
- package/dist/chunk-M5LKPQB4.js.map +0 -1
- package/dist/chunk-MT3YCFCC.cjs.map +0 -1
- package/dist/chunk-REVOTI2T.js.map +0 -1
- package/dist/chunk-U5A7TFNT.js.map +0 -1
- package/dist/chunk-X3BGE7CL.js.map +0 -1
- package/dist/chunk-Z4QRXVST.cjs.map +0 -1
- package/dist/docs/SKILL.md +0 -30
- package/dist/docs/assets/SOURCE_MAP.json +0 -11
- package/dist/docs/references/docs-mastra-code-configuration.md +0 -299
- package/dist/docs/references/docs-mastra-code-customization.md +0 -228
- package/dist/docs/references/docs-mastra-code-modes.md +0 -104
- package/dist/docs/references/docs-mastra-code-overview.md +0 -135
- package/dist/docs/references/docs-mastra-code-tools.md +0 -229
- package/dist/docs/references/reference-mastra-code-createMastraCode.md +0 -108
- package/dist/permissions-2HIUSRQN.cjs +0 -40
- package/dist/permissions-CVXKYIWR.js +0 -3
- package/dist/tui/commands/models.d.ts +0 -3
- package/dist/tui/commands/models.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agents/prompts/base.ts","../src/agents/prompts/build.ts","../src/agents/prompts/plan.ts","../src/agents/prompts/fast.ts","../src/agents/prompts/agent-instructions.ts","../src/agents/prompts/tool-guidance.ts","../src/agents/prompts/index.ts","../src/agents/instructions.ts","../src/constants.ts","../src/agents/memory.ts","../src/agents/tools.ts","../src/agents/workspace.ts","../src/hooks/config.ts","../src/hooks/types.ts","../src/hooks/executor.ts","../src/hooks/manager.ts","../src/mcp/config.ts","../src/mcp/manager.ts","../src/schema.ts","../src/utils/gateway-sync.ts","../src/utils/storage-factory.ts","../src/index.ts"],"names":["path","os","fs","path2","os2","fs2","loadSingleConfig","mergeConfigs","path3","os3","fs3","validateConfig","setAuthStorage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAiBO,SAAS,gBAAgB,GAAA,EAA4B;AAC1D,EAAA,OAAO,CAAA;;AAAA;AAAA,mBAAA,EAGY,IAAI,WAAW;AAAA,SAAA,EACzB,IAAI,WAAW;AAAA,EACxB,IAAI,SAAA,GAAY,CAAA,YAAA,EAAe,GAAA,CAAI,SAAS,KAAK,sBAAsB;AAAA,UAAA,EAC7D,IAAI,QAAQ;AAAA,MAAA,EAChB,IAAI,IAAI;AAAA,cAAA,EACA,IAAI,IAAI;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAStB,IAAI,YAAY;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,6HAAA,EAyC6G,IAAI,OAAA,GAAU,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,MAAM,EAAE,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAmBrK;;;ACpFO,SAAS,kBAAkB,GAAA,EAA4B;AAC5D,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,OACE,CAAA;;AAAA,EAAA,EAEF,GAAA,CAAI,WAAW,KAAK,CAAA;;AAAA,EAEtB,GAAA,CAAI,WAAW,IAAI;;AAAA;;AAAA;;AAAA,CAAA,GAMjB,eAAA;AAAA,EAEF;AACA,EAAA,OAAO,eAAA;AACT;AAEO,IAAM,eAAA,GAAkB;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;AC1BxB,IAAM,cAAA,GAAiB;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACAvB,IAAM,cAAA,GAAiB;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;ACM9B,IAAM,iBAAA,GAAoB,CAAC,WAAA,EAAa,WAAW,CAAA;AAGnD,IAAM,iBAAA,GAAoB;AAAA,EACxB,EAAA;AAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,SAAA,EAAW,aAAA,EAAe,kBAAkB,oBAAoB,CAAA;AAY1F,SAAS,oBAAoB,QAAA,EAAiC;AAC5D,EAAA,KAAA,MAAW,YAAY,iBAAA,EAAmB;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AACxC,IAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,sBAAsB,WAAA,EAA0C;AAC9E,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,OAAO,OAAA,EAAQ;AAGrB,EAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,oBAAoB,QAAQ,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,OAAO,EAAE,IAAA,EAAK;AACrD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AACzD,UAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,YAAY,iBAAA,EAAmB;AACxC,IAAA,MAAM,QAAA,GAAW,QAAA,GAAW,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA,GAAI,WAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,oBAAoB,QAAQ,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,OAAO,EAAE,IAAA,EAAK;AACrD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,KAAA,EAAO,WAAW,CAAA;AAC1D,UAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,wBAAwB,OAAA,EAAsC;AAC5E,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAEjC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,KAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,QAAA,GAAW,SAAA;AACrD,IAAA,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA;AAAA,EAAS,OAAO,OAAO,CAAA,CAAA;AAAA,EAC9E,CAAC,CAAA;AAED,EAAA,OAAO;AAAA;;AAAA,EAA6B,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA;AAC3D;;;ACxFO,SAAS,iBAAA,CAAkB,MAAA,EAAgB,OAAA,GAA+B,EAAC,EAAW;AAC3F,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA;;AAAA;;AAAA,uEAAA,CAIwD,CAAA;AAItE,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAAA,CA2B6C,CAAA;AAI3D,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,qEAAA,CAYoD,CAAA;AAAA,EACpE;AAIA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA,iEAAA,CAEgD,CAAA;AAAA,EAChE;AAIA,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,yEAAA,CAkBqD,CAAA;AAInE,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,gGAAA,CAK+E,CAAA;AAAA,EAC/F;AAIA,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA,2EAAA,CAG4D,CAAA;AAE1E,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;;;AC3FA,IAAM,WAAA,GAAyE;AAAA,EAC7E,KAAA,EAAO,iBAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAMO,SAAS,gBAAgB,GAAA,EAA4B;AAE1D,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,EAAO,cAAA;AAC3B,EAAA,MAAM,YAAA,GAAe,cAAa,IAAM,CAAC,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAW,YAAY,CAAA;AAGpF,EAAA,MAAM,eAAe,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,EAAE,cAAc,CAAA;AAGnE,EAAA,MAAM,OAAA,GAA6B;AAAA,IACjC,aAAa,GAAA,CAAI,UAAA;AAAA,IACjB,WAAA,EAAa,IAAI,WAAA,IAAe,SAAA;AAAA,IAChC,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,GAAA,CAAI,WAAA;AAAA,IACV,MAAM,GAAA,CAAI,MAAA;AAAA,IACV,SAAS,GAAA,CAAI,OAAA;AAAA,IAEb;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,gBAAgB,OAAO,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,MAAM,KAAK,WAAA,CAAY,KAAA;AACrD,EAAA,MAAM,eAAe,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAGhE,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAO,KAAA;AACzB,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,MAAA,KAAW,WAAA,GAAc,WAAM,CAAA,CAAE,MAAA,KAAW,gBAAgB,QAAA,GAAM,QAAA;AACjF,MAAA,OAAO,KAAK,IAAI,CAAA,EAAA,EAAK,EAAE,MAAM,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,WAAA,GAAc;AAAA;AAAA,EAA0B,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAA;AAC/D,EAAA,MAAM,mBAAA,GAAsB,wBAAwB,kBAAkB,CAAA;AAEtE,EAAA,OAAO,IAAA,GAAO,WAAA,GAAc,mBAAA,GAAsB,IAAA,GAAO,YAAA;AAC3D;;;ACvEO,SAAS,sBAAA,CAAuB,EAAE,cAAA,EAAe,EAAsD;AAC5G,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACnD,EAAA,MAAM,QAAQ,cAAA,EAAgB,KAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,gBAAgB,MAAA,IAAU,OAAA;AACzC,EAAA,MAAM,WAAA,GAAc,KAAA,EAAO,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAI;AAEtD,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,WAAA;AAAA,IACA,WAAA,EAAa,OAAO,WAAA,IAAe,EAAA;AAAA,IACnC,SAAA,EAAW,mBAAA,CAAoB,WAAW,CAAA,IAAK,KAAA,EAAO,SAAA;AAAA,IACtD,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,IAAA,EAAA,qBAAU,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IAC3C,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,OAAO,cAAA,IAAkB,MAAA;AAAA,IAClC,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,IACjC,MAAA;AAAA,IACA,WAAA,EAAA,qBAAiB,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IAClD,UAAA,EAAY,KAAA,EAAO,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC9C;AAAA,GACF;AAEA,EAAA,OAAO,gBAAgB,SAAS,CAAA;AAClC;;;AC3BO,IAAM,mBAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,mBAAA,IAAuB,yBAAA;AAG/D,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,qBAAA,GAAwB,GAAA;;;ACIrC,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAI,eAAA,GAAiC,IAAA;AAMrC,SAAS,gBAAgB,cAAA,EAAgC;AACvD,EAAA,OAAQ,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EAA6D,QAAA,IAAW;AAC9G;AAMA,SAAS,gBAAA,CAAiB,EAAE,cAAA,EAAe,EAAuC;AAChF,EAAA,MAAM,KAAA,GAAQ,gBAAgB,cAAc,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,KAAA,EAAO,eAAA,IAAmB,mBAAmB,CAAA;AACnE;AAMA,SAAS,iBAAA,CAAkB,EAAE,cAAA,EAAe,EAAuC;AACjF,EAAA,MAAM,KAAA,GAAQ,gBAAgB,cAAc,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,KAAA,EAAO,gBAAA,IAAoB,mBAAmB,CAAA;AACpE;AAOO,SAAS,iBAAiB,OAAA,EAA+B;AAC9D,EAAA,OAAO,CAAC,EAAE,cAAA,EAAe,KAA0C;AACjE,IAAA,MAAM,KAAA,GAAQ,gBAAgB,cAAc,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,WAAW,CAAA;AAE7C,IAAA,MAAM,YAAA,GAAe,OAAO,oBAAA,IAAwB,qBAAA;AACpD,IAAA,MAAM,YAAA,GAAe,OAAO,mBAAA,IAAuB,qBAAA;AAEnD,IAAA,MAAM,WAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,YAAY,IAAI,OAAO,CAAA,CAAA;AAC3D,IAAA,IAAI,YAAA,IAAgB,oBAAoB,QAAA,EAAU;AAChD,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,YAAA,GAAe,IAAI,MAAA,CAAO;AAAA,MACxB,OAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB;AAAA,UACnB,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,OAAA;AAAA,UACP,WAAA,EAAa;AAAA,YACX,cAAc,CAAA,GAAI,CAAA;AAAA,YAClB,gBAAA,EAAkB,GAAA;AAAA,YAClB,KAAA,EAAO,gBAAA;AAAA,YACP,aAAA,EAAe,YAAA;AAAA,YACf,UAAA,EAAY,CAAA;AAAA,YACZ,aAAA,EAAe;AAAA,cACb,eAAA,EAAiB;AAAA;AACnB,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,kBAAkB,CAAA,GAAI,CAAA;AAAA,YACtB,UAAA,EAAY,GAAA;AAAA,YACZ,KAAA,EAAO,iBAAA;AAAA,YACP,iBAAA,EAAmB,YAAA;AAAA,YACnB,aAAA,EAAe;AAAA,cACb,eAAA,EAAiB;AAAA;AACnB;AACF;AACF;AACF,KACD,CAAA;AACD,IAAA,eAAA,GAAkB,QAAA;AAElB,IAAA,OAAO,YAAA;AAAA,EACT,CAAA;AACF;ACrEO,SAAS,mBAAmB,UAAA,EAAyB;AAC1D,EAAA,OAAO,SAAS,eAAA,CAAgB,EAAE,cAAA,EAAe,EAAuC;AACtF,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,IAAW;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,OAAA;AAE9B,IAAA,MAAM,UAAU,KAAA,EAAO,cAAA;AACvB,IAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,UAAA,CAAW,YAAY,CAAA;AAEzD,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,EAAA;AAE1C,IAAA,MAAM,QAAA,GAAW,eAAe,WAAW,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,eAAe,WAAW,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,eAAe,WAAW,CAAA;AAC3C,IAAA,MAAM,kBAAA,GAAqB,yBAAyB,WAAW,CAAA;AAC/D,IAAA,MAAM,aAAA,GAAgB,oBAAoB,WAAW,CAAA;AAKrD,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,QAAA;AAAA,MACN,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAY,QAAA;AAAA,MACZ,eAAA,EAAiB,kBAAA;AAAA,MACjB,sBAAA,EAAwB;AAAA,KAC1B;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,kBAAA,GAAqB,oBAAA;AAC3B,MAAA,KAAA,CAAM,cAAA,GAAiB,gBAAA;AACvB,MAAA,KAAA,CAAM,UAAA,GAAa,aAAA;AAAA,IACrB;AAEA,IAAA,IAAI,cAAa,EAAG;AAClB,MAAA,KAAA,CAAM,aAAa,mBAAA,EAAoB;AACvC,MAAA,KAAA,CAAM,cAAc,oBAAA,EAAqB;AAAA,IAC3C,WAAW,gBAAA,EAAkB;AAC3B,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAE,CAAA;AACpC,MAAA,KAAA,CAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,kBAAA,EAAmB;AAAA,IACxD;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,QAAA,GAAW,WAAW,QAAA,EAAS;AACrC,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AClDA,IAAM,4BAA4BA,aAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,eAAe,QAAQ,CAAA;AAElF,IAAM,wBAAwBA,aAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,WAAW,QAAQ,CAAA;AAE1E,IAAM,6BAA6BA,aAAA,CAAK,IAAA,CAAKC,YAAG,OAAA,EAAQ,EAAG,eAAe,QAAQ,CAAA;AAElF,IAAM,yBAAyBD,aAAA,CAAK,IAAA,CAAKC,YAAG,OAAA,EAAQ,EAAG,WAAW,QAAQ,CAAA;AAM1E,SAAS,kBAAkB,UAAA,EAAgC;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,CAACC,YAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAG/B,IAAA,MAAM,QAAA,GAAWA,YAAA,CAAG,YAAA,CAAa,SAAS,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,UAAUA,YAAA,CAAG,WAAA,CAAY,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AACjE,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,KAAA,CAAM,gBAAe,EAAG;AAC1B,UAAA,MAAM,QAAA,GAAWF,aAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AAChD,UAAA,MAAM,QAAA,GAAWE,YAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AACzC,UAAA,MAAM,IAAA,GAAOA,YAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AACjC,UAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AAGtB,YAAA,MAAM,UAAA,GAAaF,aAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,YAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AACzB,cAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,cAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,aAAa,iBAAA,CAAkB;AAAA,EACnC,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAA,CAAoB,EAAE,cAAA,EAAe,EAAuC;AAC1F,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,IAAW;AAC9B,EAAA,MAAM,cAAc,KAAA,EAAO,WAAA;AAE3B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,YAAA,GAAe,KAAA,EAAO,mBAAA,IAAuB,EAAC;AAEpD,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,IAC9B,EAAA,EAAI,uBAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,UAAA,EAAY,IAAI,eAAA,CAAgB;AAAA,MAC9B,QAAA,EAAU,WAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,YAAA,CAAa;AAAA,MACxB,gBAAA,EAAkB,WAAA;AAAA,MAClB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKD,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,IACxB,GAAI,WAAW,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,EAAQ,UAAA,KAAe;AAAC,GACvD,CAAA;AAED,EAAA,SAAA,CAAU,UAAA,CAAW,eAAA,CAAgB,CAAC,GAAG,YAAY,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,MAAcA,aAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzG,EAAA,OAAO,SAAA;AACT;AAEA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,EAAA,OAAA,CAAQ,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAClC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACzB;AACF;AC5GA,IAAM,YAAA,GAAgC;AAAA,EACpC,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,gBAAgB,UAAA,EAAiC;AAC/D,EAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,EAAA,MAAM,WAAA,GAAc,oBAAoB,UAAU,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,iBAAiB,UAAU,CAAA;AAChD,EAAA,MAAM,aAAA,GAAgB,iBAAiB,WAAW,CAAA;AAElD,EAAA,OAAO,YAAA,CAAa,cAAc,aAAa,CAAA;AACjD;AAEO,SAAS,oBAAoB,UAAA,EAA4B;AAC9D,EAAA,OAAYG,IAAA,CAAA,IAAA,CAAK,UAAA,EAAY,aAAA,EAAe,YAAY,CAAA;AAC1D;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAYA,IAAA,CAAA,IAAA,CAAQC,EAAA,CAAA,OAAA,EAAQ,EAAG,aAAA,EAAe,YAAY,CAAA;AAC5D;AAEA,SAAS,iBAAiB,QAAA,EAA+B;AACvD,EAAA,IAAI;AACF,IAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,SAAU,EAAC;AACtC,IAAA,MAAM,GAAA,GAASA,GAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,eAAe,GAAA,EAA2B;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,SAAiB,EAAC;AAE7C,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,MAAM,GAAA,GAAM,GAAA;AAEZ,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG;AAC7B,MAAA,MAAM,KAAA,GAAS,GAAA,CAAI,KAAK,CAAA,CAAgB,OAAO,WAAW,CAAA;AAC1D,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,GAAA,EAAqC;AACxD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,OAAO,GAAA,CAAI,IAAA,KAAS,SAAA,IAAa,OAAO,IAAI,OAAA,KAAY,QAAA;AAC1D;AAEA,SAAS,YAAA,CAAa,QAAqB,OAAA,EAAmC;AAC5E,EAAA,MAAM,SAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAI,MAAA,CAAO,KAAK,CAAA,IAAK,EAAC,EAAI,GAAI,OAAA,CAAQ,KAAK,CAAA,IAAK,EAAG,CAAA;AACrE,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,QAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AChEO,SAAS,gBAAgB,KAAA,EAAkD;AAChF,EAAA,OAAO,KAAA,KAAU,YAAA,IAAgB,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,kBAAA;AACjE;;;ACZA,IAAM,eAAA,GAAkB,GAAA;AAExB,eAAsB,WAAA,CAAY,MAAsB,YAAA,EAA8C;AACpG,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,eAAA;AAChC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,OAAO,IAAI,QAAoB,CAAA,OAAA,KAAW;AACxC,IAAA,MAAM,SAAA,GAAY,QAAQ,QAAA,KAAa,OAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,GAAQ,SAAA;AAClC,IAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAC,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA,GAAI,CAAC,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AAExE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,SAAA,EAAW;AAAA,MACpC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9B,KAAK,YAAA,CAAa,GAAA;AAAA,MAClB,GAAA,EAAK;AAAA,QACH,GAAG,OAAA,CAAQ,GAAA;AAAA,QACX,mBAAmB,YAAA,CAAa;AAAA;AAClC,KACD,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB,GAAG,OAAO,CAAA;AAEV,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,CAAA,QAAA,KAAY;AAC5B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AAEX,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,QAAA,IAAI;AACF,UAAA,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,QACzC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ;AAAA,QACN,IAAA;AAAA,QACA,UAAU,QAAA,IAAY,CAAA;AAAA,QACtB,MAAA,EAAQ,YAAA;AAAA,QACR,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAK,IAAK,MAAA;AAAA,QACzB,QAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,CAAA,KAAA,KAAS;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AAEX,MAAA,OAAA,CAAQ;AAAA,QACN,IAAA;AAAA,QACA,QAAA,EAAU,CAAA;AAAA,QACV,QAAQ,KAAA,CAAM,OAAA;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAC/C,MAAA,KAAA,CAAM,OAAO,GAAA,EAAI;AAAA,IACnB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,WAAA,CAAY,MAAsB,OAAA,EAA0C;AAC1F,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAE1B,EAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,OAAO,KAAA;AAC/B,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAsB,gBAAA,CACpB,KAAA,EACA,YAAA,EACA,YAAA,GAAuC,EAAC,EACd;AAC1B,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,iBAAA;AAEJ,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,OAAK,WAAA,CAAY,CAAA,EAAG,YAAY,CAAC,CAAA;AACjE,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EACpD;AAEA,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,YAAA,CAAa,eAAe,CAAA;AAE7D,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA;AACnD,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAEnB,IAAA,IAAI,MAAA,CAAO,QAAQ,iBAAA,EAAmB;AACpC,MAAA,iBAAA,GAAoB,iBAAA,GAChB,GAAG,iBAAiB;AAAA,EAAK,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAA,GACxD,OAAO,MAAA,CAAO,iBAAA;AAAA,IACpB;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,QAAA,CAAS,IAAA,CAAK,wBAAwB,IAAA,CAAK,OAAA,IAAW,eAAe,CAAA,IAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC1F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,IAAK,QAAA,EAAU;AACrC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,UAAU,CAAA,iBAAA,EAAoB,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAO,CAAA,CAAA;AAE7G,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,MAAA;AAAA,QACb,iBAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AAE3B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,IAAU,CAAA,sBAAA,EAAyB,OAAO,QAAQ,CAAA,CAAA;AACzE,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,WAAA,IAAe,KAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,iBAAA,EAAmB,SAAS,QAAA,EAAS;AAC/D;;;AC/IO,IAAM,cAAN,MAAkB;AAAA,EACf,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,YAAoB,SAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,gBAAgB,UAAU,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,CAAA;AAAA,EAC3C;AAAA,EAEA,SAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAsD;AACpD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AAAA,MAC5C,QAAQ,kBAAA;AAAmB,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CAAc,QAAA,EAAkB,SAAA,EAA8C;AAClF,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,UAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB,YAAA;AAAA,MACjB,SAAA,EAAW,QAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,OAAO,iBAAiB,KAAA,EAAO,KAAA,EAAO,EAAE,SAAA,EAAW,UAAU,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,cAAA,CACJ,QAAA,EACA,SAAA,EACA,YACA,SAAA,EAC0B;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB,aAAA;AAAA,MACjB,SAAA,EAAW,QAAA;AAAA,MACX,UAAA,EAAY,SAAA;AAAA,MACZ,WAAA,EAAa,UAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,OAAO,iBAAiB,KAAA,EAAO,KAAA,EAAO,EAAE,SAAA,EAAW,UAAU,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,oBAAoB,WAAA,EAA+C;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,gBAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB,kBAAA;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,OAAO,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAA,CACJ,gBAAA,EACA,UAAA,EAC0B;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB,MAAA;AAAA,MACjB,iBAAA,EAAmB,gBAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,OAAO,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,eAAA,GAA4C;AAChD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,YAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,OAAO,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,EACtC;AAAA,EACA,MAAM,aAAA,GAA0C;AAC9C,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,UAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,OAAO,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,CAAgB,QAAgB,OAAA,EAAwB;AACtD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,YAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAElC,IAAA,MAAM,KAAA,GAA+B;AAAA,MACnC,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,eAAA,EAAiB,cAAA;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC/C;AACF,CAAA;ACpKO,SAAS,cAAc,UAAA,EAA+B;AAC3D,EAAA,MAAM,YAAA,GAAe,mBAAmB,UAAU,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeC,iBAAAA,CAAiB,gBAAA,EAAkB,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAiB,iBAAA,CAAkB,UAAU,CAAC,CAAA;AAEpE,EAAA,OAAOC,aAAAA,CAAa,YAAA,EAAc,YAAA,EAAc,aAAa,CAAA;AAC/D;AAEO,SAAS,kBAAkB,UAAA,EAA4B;AAC5D,EAAA,OAAYC,IAAA,CAAA,IAAA,CAAK,UAAA,EAAY,aAAA,EAAe,UAAU,CAAA;AACxD;AAEO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAYA,IAAA,CAAA,IAAA,CAAQC,EAAA,CAAA,OAAA,EAAQ,EAAG,aAAA,EAAe,UAAU,CAAA;AAC1D;AAEO,SAAS,sBAAsB,UAAA,EAA4B;AAChE,EAAA,OAAYD,IAAA,CAAA,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,qBAAqB,CAAA;AAC/D;AAEA,SAASF,kBAAiB,QAAA,EAA6B;AACrD,EAAA,IAAI;AACF,IAAA,IAAI,CAAII,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,SAAU,EAAC;AACtC,IAAA,MAAM,GAAA,GAASA,GAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,IAAA,OAAOC,eAAAA,CAAe,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,mBAAmB,UAAA,EAA+B;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,sBAAsB,UAAU,CAAA;AACjD,IAAA,IAAI,CAAID,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,SAAU,EAAC;AACtC,IAAA,MAAM,GAAA,GAASA,GAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE7B,IAAA,IAAI,MAAA,EAAQ,UAAA,IAAc,OAAO,MAAA,CAAO,eAAe,QAAA,EAAU;AAC/D,MAAA,OAAOC,eAAAA,CAAe,EAAE,UAAA,EAAY,MAAA,CAAO,YAAY,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAASA,gBAAe,GAAA,EAAyB;AAC/C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,SAAiB,EAAC;AAC7C,EAAA,MAAM,GAAA,GAAM,GAAA;AAEZ,EAAA,IAAI,CAAC,IAAI,UAAA,IAAc,OAAO,IAAI,UAAA,KAAe,QAAA,SAAiB,EAAC;AAEnE,EAAA,MAAM,UAA2C,EAAC;AAClD,EAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AAEvB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACtD,IAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAI;AAAA,QACd,SAAU,KAAA,CAAkC,OAAA;AAAA,QAC5C,MAAM,KAAA,CAAM,OAAA,CAAS,MAAkC,IAAI,CAAA,GACrD,MAAkC,IAAA,GACpC,MAAA;AAAA,QACJ,GAAA,EACE,OAAQ,KAAA,CAAkC,GAAA,KAAQ,YAAa,KAAA,CAAkC,GAAA,KAAQ,IAAA,GACnG,KAAA,CAAkC,GAAA,GACpC;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,KAAW,CAAA,SAAU,EAAC;AAC/C,EAAA,OAAO,EAAE,YAAY,OAAA,EAAQ;AAC/B;AAEA,SAAS,oBAAoB,GAAA,EAAuB;AAClD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,OAAO,OAAO,IAAI,OAAA,KAAY,QAAA;AAChC;AAMA,SAASJ,iBAAgB,OAAA,EAAiC;AACxD,EAAA,MAAM,SAA0C,EAAC;AAEjD,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,MAAW,CAAC,MAAM,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC9D,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,KAAW,CAAA,SAAU,EAAC;AAC9C,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;;;AC/EO,SAAS,iBAAiB,UAAA,EAAgC;AAC/D,EAAA,IAAI,MAAA,GAAS,cAAc,UAAU,CAAA;AACrC,EAAA,IAAI,MAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,QAA6B,EAAC;AAClC,EAAA,IAAI,cAAA,uBAAqB,GAAA,EAA6B;AACtD,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,SAAS,gBACP,OAAA,EACA;AACA,IAAA,MAAM,OAA2F,EAAC;AAClG,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjD,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,GAAA,CAAI,GAAA,EAAI;AAAA,IACpE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,eAAe,sBAAA,GAAwC;AACrD,IAAA,MAAM,UAAU,MAAA,CAAO,UAAA;AACvB,IAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,MACrB,EAAA,EAAI,iBAAA;AAAA,MACJ,OAAA,EAAS,gBAAgB,OAAO;AAAA,KACjC,CAAA;AAKD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAEvC,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,MAAM,OAAO,SAAA,EAAU;AAE/B,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,MAAM,MAAA,GAAS,GAAG,IAAI,CAAA,CAAA,CAAA;AACtB,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC,CAAA;AAC3E,QAAA,cAAA,CAAe,IAAI,IAAA,EAAM;AAAA,UACvB,IAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,WAAW,eAAA,CAAgB,MAAA;AAAA,UAC3B,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAEpE,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,cAAA,CAAe,IAAI,IAAA,EAAM;AAAA,UACvB,IAAA;AAAA,UACA,SAAA,EAAW,KAAA;AAAA,UACX,SAAA,EAAW,CAAA;AAAA,UACX,WAAW,EAAC;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAe,UAAA,GAA4B;AACzC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,UAAA,EAAW;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,GAAO;AACX,MAAA,IAAI,WAAA,EAAa;AACjB,MAAA,MAAM,sBAAA,EAAuB;AAC7B,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,MAAA,GAAS;AACb,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAA,GAAS,cAAc,UAAU,CAAA;AACjC,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,cAAA,uBAAqB,GAAA,EAAI;AACzB,MAAA,WAAA,GAAc,KAAA;AACd,MAAA,MAAM,sBAAA,EAAuB;AAC7B,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,UAAA;AAAA,IAEA,QAAA,GAAW;AACT,MAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,IACpB,CAAA;AAAA,IAEA,UAAA,GAAa;AACX,MAAA,OAAO,MAAA,CAAO,eAAe,MAAA,IAAa,MAAA,CAAO,KAAK,MAAA,CAAO,UAAU,EAAE,MAAA,GAAS,CAAA;AAAA,IACpF,CAAA;AAAA,IAEA,iBAAA,GAAoB;AAClB,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,cAAA,GAAiB;AACf,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,kBAAkB,UAAU,CAAA;AAAA,QACrC,QAAQ,gBAAA,EAAiB;AAAA,QACzB,MAAA,EAAQ,sBAAsB,UAAU;AAAA,OAC1C;AAAA,IACF,CAAA;AAAA,IAEA,SAAA,GAAY;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;ACjJO,IAAM,WAAA,GAAc,EAAE,MAAA,CAAO;AAAA,EAClC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAErC,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA,EAErC,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,mBAAmB,CAAA;AAAA,EACvD,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,mBAAmB,CAAA;AAAA;AAAA,EAExD,oBAAA,EAAsB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,GAAM,CAAA;AAAA,EAC/C,mBAAA,EAAqB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,GAAM,CAAA;AAAA;AAAA,EAE9C,aAAA,EAAe,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,EAE9E,IAAA,EAAM,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA;AAAA,EAE/B,eAAA,EAAiB,EACd,MAAA,CAAO;AAAA,IACN,YAAY,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,OAAO,MAAM,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IAC7E,OAAO,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,OAAO,MAAM,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,GACzE,CAAA,CACA,OAAA,CAAQ,EAAE,UAAA,EAAY,EAAC,EAAG,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA;AAAA,EAExC,YAAA,EAAc,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA;AAAA,EAEtC,aAAA,EAAe,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,EAEtE,OAAO,CAAA,CACJ,KAAA;AAAA,IACC,EAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,MAClB,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,aAAA,EAAe,WAAW,CAAC,CAAA;AAAA,MACtD,UAAA,EAAY,EAAE,MAAA;AAAO,KACtB;AAAA,GACH,CACC,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEb,mBAAA,EAAqB,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEnD,UAAA,EAAY,EACT,MAAA,CAAO;AAAA,IACN,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,UAAA,EAAY,EAAE,MAAA;AAAO,GACtB,CAAA,CACA,QAAA,EAAS,CACT,QAAQ,IAAI;AACjB,CAAC,CAAA;ACxCD,IAAM,YAAYP,aAAAA,CAAK,IAAA,CAAKC,YAAG,OAAA,EAAQ,EAAG,UAAU,QAAQ,CAAA;AAC5D,IAAM,UAAA,GAAaD,aAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAA;AAC9D,IAAM,6BAAA,GAAgCA,aAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,wBAAwB,CAAA;AACnF,IAAM,yBAAA,GAA4BA,aAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,+BAA+B,CAAA;AAGtF,IAAM,wBAAA,GAA2B,IAAI,EAAA,GAAK,GAAA;AAG1C,IAAI,SAAA,GAAY,KAAA;AAKhB,eAAe,eAAA,CAAgB,UAAkB,OAAA,EAAgC;AAC/E,EAAA,MAAM,YAAA,GAAe,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,YAAY,CAAA,IAAA,CAAA;AAEzE,EAAA,IAAI;AACF,IAAA,MAAME,YAAAA,CAAG,QAAA,CAAS,SAAA,CAAU,QAAA,EAAU,SAAS,OAAO,CAAA;AACtD,IAAA,MAAMA,YAAAA,CAAG,QAAA,CAAS,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI;AACF,MAAA,MAAMA,YAAAA,CAAG,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKA,eAAe,0BAAA,GAGZ;AACD,EAAA,MAAM,eAA+C,EAAC;AACtD,EAAA,MAAM,YAAsC,EAAC;AAE7C,EAAA,MAAM,QAAA,GAAW,CAAC,IAAI,gBAAA,CAAiB,EAAE,CAAA,EAAG,IAAI,cAAA,EAAgB,CAAA;AAEhE,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,cAAA,EAAe;AAG/C,MAAA,MAAM,kBAAA,GAAqB,QAAQ,EAAA,KAAO,YAAA;AAE1C,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,cAAA,GAAiB,kBAAA,GACnB,UAAA,GACA,UAAA,KAAe,OAAA,CAAQ,EAAA,GACrB,OAAA,CAAQ,EAAA,GACR,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAEjC,QAAA,YAAA,CAAa,cAAc,CAAA,GAAI,MAAA;AAC/B,QAAA,SAAA,CAAU,cAAc,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK;AAAA,MACjD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,OAAA,CAAQ,EAAE,KAAK,KAAK,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,YAAA,EAAc,MAAA,EAAQ,SAAA,EAAU;AACtD;AAKA,SAAS,qBAAqB,MAAA,EAA0C;AACtE,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAChD,IAAI,CAAC,CAAC,QAAA,EAAU,SAAS,CAAA,KAAM;AAC9B,IAAA,MAAM,aAAa,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AAClD,IAAA,MAAM,WAAA,GAAc,WAAA,GAAc,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,QAAA;AACpD,IAAA,MAAM,aAAa,CAAA,WAAA,EAAc,WAAW,eAAe,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAEhF,IAAA,IAAI,UAAA,CAAW,SAAS,GAAA,EAAK;AAC3B,MAAA,MAAM,eAAA,GAAkB,UAAU,GAAA,CAAI,CAAA,CAAA,KAAK,QAAQ,CAAC,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnE,MAAA,OAAO,cAAc,WAAW,CAAA;AAAA,EAAiB,eAAe;AAAA,IAAA,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAMP,qBAAqB;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAiBvB;AAKA,SAAS,eAAA,GAA+B;AACtC,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,YAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,YAAYA,YAAAA,CAAG,YAAA,CAAa,UAAA,EAAY,OAAO,EAAE,IAAA,EAAK;AAC5D,IAAA,OAAO,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,EAAE,CAAC,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,iBAAiB,IAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,YAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAAA,aAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AACA,IAAAA,YAAAA,CAAG,cAAc,UAAA,EAAY,IAAA,CAAK,SAAQ,CAAE,QAAA,IAAY,OAAO,CAAA;AAAA,EACjE,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,2CAA2C,KAAK,CAAA;AAAA,EAC/D;AACF;AAKA,eAAsB,YAAA,CAAa,QAAQ,KAAA,EAAsB;AAC/D,EAAA,IAAI,SAAA,IAAa,CAAC,KAAA,EAAO;AACvB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,OAAA,EAAQ;AACpD,MAAA,IAAI,gBAAgB,wBAAA,EAA0B;AAE5C,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAA,GAAY,IAAA;AAEZ,EAAA,IAAI;AAGF,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,MAAM,0BAAA,EAA2B;AAG/D,IAAA,MAAMA,aAAG,QAAA,CAAS,KAAA,CAAM,WAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAGtD,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AACA,IAAA,MAAM,gBAAgB,6BAAA,EAA+B,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC,CAAA;AAG1F,IAAA,MAAM,YAAA,GAAe,qBAAqB,MAAM,CAAA;AAChD,IAAA,MAAM,eAAA,CAAgB,2BAA2B,YAAY,CAAA;AAG7D,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,gBAAA,CAAiB,GAAG,CAAA;AAAA,EAGtB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAgC,KAAK,CAAA;AAAA,EACrD,CAAA,SAAE;AACA,IAAA,SAAA,GAAY,KAAA;AAAA,EACd;AACF;AC3LA,SAAS,oBAAA,GAA6C;AACpD,EAAA,OAAO,IAAI,WAAA,CAAY;AAAA,IACrB,EAAA,EAAI,qBAAA;AAAA,IACJ,GAAA,EAAK,CAAA,KAAA,EAAQ,eAAA,EAAiB,CAAA;AAAA,GAC/B,CAAA;AACH;AAQA,eAAsB,cAAc,MAAA,EAA+C;AACjF,EAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,EAAA,EAAI,qBAAA;AAAA,MACJ,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,GAAI,OAAO,SAAA,GAAY,EAAE,WAAW,MAAA,CAAO,SAAA,KAAc;AAAC,KAC3D;AAAA,GACH;AACF;AAEA,eAAe,gBAAgB,MAAA,EAAiD;AAE9E,EAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,IAAoB,CAAC,OAAO,IAAA,EAAM;AAC5C,IAAA,OAAO;AAAA,MACL,SAAS,oBAAA,EAAqB;AAAA,MAC9B,OAAA,EACE;AAAA,KAEJ;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,EAAA,EAAI,qBAAA;AAAA,IACJ,GAAI,OAAO,UAAA,GAAa,EAAE,YAAY,MAAA,CAAO,UAAA,KAAe,EAAC;AAAA,IAC7D,GAAI,OAAO,WAAA,GAAc,EAAE,aAAa,MAAA,CAAO,WAAA,KAAgB,EAAC;AAAA,IAChE,GAAI,OAAO,kBAAA,GAAqB,EAAE,oBAAoB,MAAA,CAAO,kBAAA,KAAuB;AAAC,GACvF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,GACjB,IAAI,cAAc,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAkB,MAAA,CAAO,gBAAA,EAAkB,CAAA,GACxE,IAAI,aAAA,CAAc;AAAA,IAChB,GAAG,IAAA;AAAA,IACH,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AAIL,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,EAAK;AAAA,EACnB,SAAS,GAAA,EAAU;AACjB,IAAA,MAAM,GAAA,GAAM,GAAA,EAAK,OAAA,IAAW,MAAA,CAAO,GAAG,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,IAAoB,CAAA,EAAG,OAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,IAAQ,IAAI,CAAA,CAAA;AAC/E,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,KAAA,EAAM;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO;AAAA,MACL,SAAS,oBAAA,EAAqB;AAAA,MAC9B,OAAA,EACE,CAAA,mCAAA,EAAsC,MAAM,CAAA,EAAA,EAAK,GAAG;AAAA,wDAAA;AAAA,KAExD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;;;ACzDA,IAAM,oBAAA,GAA+C;AAAA,EACnD,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAuBA,eAAsB,iBAAiB,MAAA,EAA2B;AAChE,EAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAGvC,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,EAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,EAAAU,gBAAqB,WAAW,CAAA;AAGhC,EAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AAEjC,EAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,OAAA,CAAQ,QAAQ,CAAA;AACjE,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAA,CAAQ,UAAA,GAAa,kBAAA;AACrB,IAAA,OAAA,CAAQ,kBAAA,GAAqB,IAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,iBAAiB,YAAA,EAAa;AAGpC,EAAA,MAAM,gBAAgB,MAAA,EAAQ,OAAA,IAAW,iBAAiB,OAAA,CAAQ,QAAA,EAAU,eAAe,OAAO,CAAA;AAClG,EAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,CAAc,aAAa,CAAA;AACvD,EAAA,MAAM,UAAU,aAAA,CAAc,OAAA;AAC9B,EAAA,MAAM,iBAAiB,aAAA,CAAc,OAAA;AAErC,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AAGvC,EAAA,MAAM,aAAa,MAAA,EAAQ,UAAA,GAAa,MAAA,GAAY,gBAAA,CAAiB,QAAQ,QAAQ,CAAA;AAGrF,EAAA,MAAM,iBAAA,GAAoB,IAAI,KAAA,CAAM;AAAA,IAClC,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,sBAAA;AAAA,IACd,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO,mBAAmB,UAAU;AAAA,GACrC,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,IAAI,MAAA,CAAO;AAAA,IAChC,MAAA,EAAQ,EAAE,iBAAA,EAAkB;AAAA,IAC5B,MAAA,EAAQ,UAAA;AAAA,IACR;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,mBAAmB,CAAA;AAG7D,EAAA,MAAM,WAAA,GAAc,QAAQ,YAAA,GAAe,MAAA,GAAY,IAAI,WAAA,CAAY,OAAA,CAAQ,UAAU,cAAc,CAAA;AAEvG,EAAA,IAAI,WAAA,EAAa,UAAS,EAAG;AAC3B,IAAA,MAAM,UAAA,GAAa,YAAY,SAAA,EAAU;AACzC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,IAAO,KAAA,EAAO,MAAA,IAAU,IAAI,CAAC,CAAA;AAChG,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,kBAAA,GAAqB,wBAAA,CAAyB,OAAA,CAAQ,QAAQ,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,OAAA,CAAQ,QAAQ,CAAA;AAE1D,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,IAAA,EAAM,QAAA;AAAA,IACN,cAAA,EAAgB,QAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,gBAAA,GAAsC;AAAA,IAC1C;AAAA,MACE,IAAI,eAAA,CAAgB,EAAA;AAAA,MACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,WAAA,EACE,0GAAA;AAAA,MACF,cAAc,eAAA,CAAgB,YAAA;AAAA,MAC9B,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,IAAI,YAAA,CAAa,EAAA;AAAA,MACjB,MAAM,YAAA,CAAa,IAAA;AAAA,MACnB,WAAA,EACE,kHAAA;AAAA,MACF,cAAc,YAAA,CAAa,YAAA;AAAA,MAC3B,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,IAAI,eAAA,CAAgB,EAAA;AAAA,MACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,WAAA,EACE,0GAAA;AAAA,MACF,cAAc,eAAA,CAAgB,YAAA;AAAA,MAC9B,KAAA,EAAO;AAAA,QACL,GAAG,aAAA;AAAA,QACH,kBAAA,EAAoB,oBAAA;AAAA,QACpB,UAAA,EAAY,aAAA;AAAA,QACZ,eAAA,EAAiB,kBAAA;AAAA,QACjB,UAAA,EAAY,aAAA;AAAA,QACZ,UAAA,EAAY;AAAA;AACd;AACF,GACF;AAEA,EAAA,MAAM,YAAA,GAA8B;AAAA,IAClC;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAgB,2BAAA;AAAA,MAChB,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,cAAA,EAAgB,sBAAA;AAAA,MAChB,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,cAAA,EAAgB,sBAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,MAAM,wBAAA,GAA+C;AAAA,IACnD;AAAA,MACE,EAAA,EAAI,cAAA;AAAA,MACJ,UAAA,EAAY,IAAI,EAAA,GAAK,GAAA;AAAA,MACrB,OAAA,EAAS,MAAM,YAAA;AAAa;AAC9B,GACF;AAIA,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,SAAA,EAAW,YAAY,UAAA,CAAW,WAAW,IAAI,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA,GAAoB,QAAA,GAAW,KAAA;AAAA,IACtG,MAAA,EAAQ,YAAY,UAAA,CAAW,cAAc,IAAI,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,GAAiB,QAAA,GAAW,KAAA;AAAA,IACnG,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,gBAAA,GAAmB,QAAA,GAAW,KAAA;AAAA,IACpD,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,4BAAA,GAA+B,QAAA,GAAW,KAAA;AAAA,IAC9D,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,gBAAA,GAAmB,QAAA,GAAW;AAAA,GACtD;AACA,EAAA,MAAM,YAAA,GAAe,sBAAsB,aAAa,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,oBAAoB,aAAa,CAAA;AACxD,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,cAAA,EAAgB,YAAY,CAAA;AAC3E,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,cAAA,EAAgB,cAAc,CAAA;AAGtE,EAAA,MAAM,KAAA,GAAA,CAAS,MAAA,EAAQ,KAAA,IAAS,YAAA,EAAc,IAAI,CAAA,IAAA,KAAQ;AACxD,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA;AAC5C,IAAA,OAAO,aAAa,EAAE,GAAG,IAAA,EAAM,cAAA,EAAgB,YAAW,GAAI,IAAA;AAAA,EAChE,CAAC,CAAA;AAGD,EAAA,MAAM,kBAA0C,EAAE,OAAA,EAAS,QAAQ,IAAA,EAAM,MAAA,EAAQ,SAAS,OAAA,EAAQ;AAClG,EAAA,MAAM,SAAA,GAAA,CAAa,MAAA,EAAQ,SAAA,IAAa,gBAAA,EAAkB,IAAI,CAAA,EAAA,KAAM;AAClE,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,iBAAA,CAAkB,MAAM,CAAA,GAAI,MAAA;AACnD,IAAA,OAAO,QAAQ,EAAE,GAAG,EAAA,EAAI,cAAA,EAAgB,OAAM,GAAI,EAAA;AAAA,EACpD,CAAC,CAAA;AAGD,EAAA,MAAM,qBAA8C,EAAC;AACrD,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,kBAAA,CAAmB,eAAA,GAAkB,gBAAA;AACrC,IAAA,kBAAA,CAAmB,gBAAA,GAAmB,gBAAA;AAAA,EACxC;AACA,EAAA,IAAI,cAAA,CAAe,WAAA,CAAY,IAAA,KAAS,IAAA,EAAM;AAC5C,IAAA,kBAAA,CAAmB,IAAA,GAAO,eAAe,WAAA,CAAY,IAAA;AAAA,EACvD;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA,EAAG;AACjF,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,kBAAA,CAAmB,eAAA,GAAkB,OAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,kBAAA,CAAmB,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAE,CAAA,GAAI,OAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,IAC1B,EAAA,EAAI,aAAA;AAAA,IACJ,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,oBAAA,EAAsB,eAAA;AAAA,IACtB,YAAA,EAAc;AAAA,MACZ,aAAa,OAAA,CAAQ,QAAA;AAAA,MACrB,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,IAAA,EAAM,IAAA;AAAA,MACN,GAAG,kBAAA;AAAA,MACH,GAAG,MAAA,EAAQ;AAAA,KACb;AAAA,IACA,SAAA,EAAW,mBAAA;AAAA,IACX,KAAA;AAAA,IACA,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,wBAAA;AAAA,IAChD,kBAAkB,CAAA,QAAA,KAAY;AAC5B,MAAA,MAAM,OAAA,GAAU,qBAAqB,QAAQ,CAAA;AAC7C,MAAA,IAAI,OAAA,IAAW,WAAA,CAAY,UAAA,CAAW,OAAO,CAAA,EAAG;AAC9C,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,qBAAA,EAAuB,MAAM,YAAA,EAAa,CAAE,cAAA;AAAA,IAC5C,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,iBAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAGD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,UAAU,CAAA,KAAA,KAAS;AACzB,MAAA,IAAI,KAAA,CAAM,SAAS,gBAAA,EAAkB;AACnC,QAAA,WAAA,CAAY,YAAA,CAAa,MAAM,QAAQ,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB;AAC1C,QAAA,WAAA,CAAY,YAAA,CAAa,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,MAC1C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,WAAA,EAAa,aAAa,cAAA,EAAe;AACzE","file":"chunk-M5LKPQB4.js","sourcesContent":["/**\n * Base system prompt — shared behavioral instructions for all modes.\n * This is the \"brain\" that makes the agent a good coding assistant.\n */\n\nexport interface PromptContext {\n projectPath: string;\n projectName: string;\n gitBranch?: string;\n platform: string;\n date: string;\n mode: string;\n modelId?: string;\n activePlan?: { title: string; plan: string; approvedAt: string } | null;\n toolGuidance: string;\n}\n\nexport function buildBasePrompt(ctx: PromptContext): string {\n return `You are Mastra Code, an interactive CLI coding agent that helps users with software engineering tasks.\n\n# Environment\nWorking directory: ${ctx.projectPath}\nProject: ${ctx.projectName}\n${ctx.gitBranch ? `Git branch: ${ctx.gitBranch}` : 'Not a git repository'}\nPlatform: ${ctx.platform}\nDate: ${ctx.date}\nCurrent mode: ${ctx.mode}\n\n# Tone and Style\n- Your output is displayed on a command line interface. Keep responses concise.\n- Use Github-flavored markdown for formatting.\n- Only use emojis if the user explicitly requests it.\n- Use tool calls for actions (editing files, running commands, searching, etc.). Use text for communication — talk to the user in text, not via tools, except for communication tools like \\`submit_plan\\`, \\`ask_user\\`, and \\`task_write\\`.\n- Prioritize technical accuracy over validating the user's beliefs. Be direct and objective. Respectful correction is more valuable than false agreement.\n\n${ctx.toolGuidance}\n\n# How to Work on Tasks\n\n## Start by Understanding\n- Read relevant code before making changes. Use search_content/find_files to find related files.\n- For unfamiliar codebases, check git log to understand recent changes and patterns.\n- Identify existing conventions (naming, structure, error handling) and follow them.\n\n## Work Incrementally\n- Focus on ONE thing at a time. Complete it fully before moving to the next.\n- Leave the codebase in a clean state after each change — no half-implemented features.\n- For multi-step tasks, use tasks to track progress and ensure nothing is missed.\n\n## Verify Before Moving On\n- After each change, verify it works. Don't assume — actually test it.\n- Run the relevant tests, check for type errors, or manually verify the behavior.\n- If something breaks, fix it immediately. Don't pile more changes on top of broken code.\n\n# Coding Philosophy\n\n- **Avoid over-engineering.** Only make changes that are directly requested or clearly necessary.\n- **Don't add extras.** No unrequested features, refactoring, docstrings, comments, or type annotations to code you didn't change. Only add comments where the logic isn't self-evident.\n- **Don't add unnecessary error handling.** Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).\n- **Don't create premature abstractions.** Three similar lines of code is better than a helper function used once. Don't design for hypothetical future requirements.\n- **Clean up dead code.** If something is unused, delete it completely. No backwards-compatibility shims, no renaming to \\`_unused\\`, no \\`// removed\\` comments.\n- **Be careful with security.** Don't introduce command injection, XSS, SQL injection, or other vulnerabilities. If you notice insecure code you wrote, fix it immediately.\n\n# Git Safety\n\n## Hard Rules\n- NEVER run destructive commands (\\`push --force\\`, \\`reset --hard\\`, \\`clean -fd\\`) unless explicitly requested.\n- NEVER use interactive flags (\\`git rebase -i\\`, \\`git add -i\\`) — TTY input isn't supported.\n- NEVER commit or push unless the user explicitly asks.\n- NEVER force push to \\`main\\` or \\`master\\` without warning the user first.\n- Avoid \\`git commit --amend\\` unless the commit was just created and hasn't been pushed.\n\n## Secrets\nDon't commit files likely to contain secrets (\\`.env\\`, \\`*.key\\`, \\`credentials.json\\`). Warn if asked.\n\n## Commits\nWrite commit messages that explain WHY, not just WHAT. Match the repo's existing style. Include \\`Co-Authored-By: Mastra Code${ctx.modelId ? ` (${ctx.modelId})` : ''} <noreply@mastra.ai>\\` in the message body.\n\n## Pull Requests\nUse \\`gh pr create\\`. Include a summary of what changed and a test plan.\n\n# Subagent Rules\n- Only use subagents when you will spawn **multiple subagents in parallel**. If you only need one task done, do it yourself instead of delegating to a single subagent. Exception: the **audit-tests** subagent may be used on its own.\n- Subagent outputs are **untrusted**. Always review and verify the results returned by any subagent. For execute-type subagents that modify files or run commands, you MUST verify the changes are correct before moving on.\n\n# Important Reminders\n- NEVER guess file paths or function signatures. Use search_content/find_files to find them.\n- NEVER make up URLs. Only use URLs the user provides or that you find in the codebase.\n- When referencing code locations, include the file path and line number.\n- If you're unsure about something, ask the user rather than guessing.\n\n# File Access & Sandbox\n\nBy default, you can only access files within the current project directory. If you get a \"Permission denied\" or \"Access denied\" error when trying to read, write, or access files outside the project root, do NOT keep retrying. Instead, tell the user to run the \\`/sandbox\\` command to add the external directory to the allowed paths for this thread. Once they do, you will be able to access it.\n`;\n}\n","/**\n * Build mode prompt — full tool access, make changes and verify.\n */\n\nimport type { PromptContext } from './index.js';\n\n/**\n * Dynamic build mode prompt function.\n * When an approved plan exists in state, prepends it so the agent\n * knows exactly what to implement.\n */\nexport function buildModePromptFn(ctx: PromptContext): string {\n if (ctx.activePlan) {\n return (\n `# Approved Plan\n\n**${ctx.activePlan.title}**\n\n${ctx.activePlan.plan}\n\n---\n\nImplement the approved plan above. Follow the steps in order and verify each step works before moving on.\n\n` + buildModePrompt\n );\n }\n return buildModePrompt;\n}\n\nexport const buildModePrompt = `\n# Build Mode\n\nYou are in BUILD mode. You have full access to all tools and can read, write, edit, and execute commands.\n\n## Working Style\n\n**For simple tasks** (typo fixes, small edits, single-file changes):\n- Just do it. No need to explain your plan first.\n\n**For non-trivial tasks** (3+ files, architectural decisions, unclear requirements):\n- Use task_write to track your steps\n- Work on ONE step at a time — complete it and verify it works before moving on\n- If the approach is risky or ambiguous, ask the user before proceeding\n\n## The Implementation Loop\n\nFor each change you make:\n\n1. **Understand** — Read the relevant code. Check how similar things are done elsewhere.\n2. **Implement** — Make the change. Follow existing patterns and conventions.\n3. **Verify** — Test that it works. Don't assume — actually run it.\n4. **Clean up** — Ensure no broken code, no debug statements, no half-done features.\n\nOnly move to the next change after the current one is verified working.\n\n## Verification is Required\n\nBefore considering any task complete:\n- Run relevant tests (check package.json for test scripts)\n- For TypeScript, run \\`tsc --noEmit\\` to catch type errors\n- If there are no automated tests, manually verify the behavior works as expected\n- Use task_check to ensure all tracked tasks are done\n\n**Don't mark something as done until you've verified it actually works.**\n\n## Error Recovery\n\nWhen something breaks:\n1. Read the full error output carefully — don't guess\n2. Find the root cause, not just the symptom\n3. Fix it properly — no casts or suppressions to hide errors\n4. Re-run to confirm the fix\n5. If stuck after 2 attempts, tell the user what you've tried\n\n## Git in Build Mode\n\n- Don't commit unless asked — just report what you changed\n- Before committing, verify the code compiles and passes lint\n- Use descriptive branch names: \\`feat/...\\`, \\`fix/...\\`, \\`refactor/...\\`\n`;\n","/**\n * Plan mode prompt — read-only exploration and planning.\n */\n\nexport const planModePrompt = `\n# Plan Mode — READ-ONLY\n\nYou are in PLAN mode. Your job is to explore the codebase and design an implementation plan — NOT to make changes.\n\n## CRITICAL: Read-Only Mode\n\nThis mode is **strictly read-only**. You must NOT modify anything.\n\n- Do NOT modify, create, or delete any files\n- Do NOT run commands that change state (no git commit, no npm install, no file creation)\n- Do NOT run build commands, tests, or scripts that have side effects\n\nIf the user asks you to make changes while in Plan mode, explain that you're in read-only mode and they should switch to Build mode (\\`/mode build\\`) first.\n\n## Exploration Strategy\n\nBefore writing any plan, build a mental model of the codebase:\n1. Start with the directory structure (\\`view\\` on the project root or relevant subdirectory).\n2. Find the relevant entry points and core files using \\`search_content\\` and \\`find_files\\`.\n3. Read the actual code — don't assume based on file names alone.\n4. Trace data flow: where does input come from, how is it transformed, where does it go?\n5. Identify existing patterns the codebase uses (naming, structure, error handling, testing).\n\n## Your Plan Output\n\nProduce a clear, step-by-step plan with this structure:\n\n### Overview\nOne paragraph: what the change does and why.\n\n### Complexity Estimate\n- **Size**: Small (1-2 files) / Medium (3-5 files) / Large (6+ files)\n- **Risk**: Low (additive, no breaking changes) / Medium (modifies existing behavior) / High (architectural, affects many consumers)\n- **Dependencies**: List any new packages, external services, or migration steps needed.\n\n### Steps\nFor each step:\n1. **File**: path to create or modify\n2. **Change**: what to add/modify/remove, with enough specificity to implement directly\n3. **Why**: brief rationale connecting this step to the overall goal\n\n### Verification\n- What tests to run\n- What to check manually\n- What could go wrong\n\n## IMMEDIATE ACTION: Call submit_plan Tool\n\nAs soon as your plan is complete, **STOP** and call the \\`submit_plan\\` tool immediately.\n\n**CRITICAL:** Do NOT generate a long text response describing your plan. The plan content belongs in the \\`submit_plan\\` tool call, not in your text output.\n\nWhen done, call:\n\\`\\`\\`javascript\nsubmit_plan({\n title: \"short descriptive title\",\n plan: \"your full plan in markdown\"\n})\n\\`\\`\\`\n\nThe user will see the plan rendered inline and can:\n- **Approve** — automatically switches to Build mode for implementation\n- **Reject** — stays in Plan mode\n- **Request changes** — provides feedback for you to revise and resubmit\n\nDo NOT start implementing until the plan is approved. If rejected with feedback, revise the plan and call \\`submit_plan\\` again.\n`;\n","/**\n * Fast mode prompt — quick answers and small edits, minimal overhead.\n */\n\nexport const fastModePrompt = `\n# Fast Mode\n\nYou are in FAST mode. Optimize for speed and brevity.\n\n## Rules\n- Keep responses short. Under 200 words unless the task genuinely requires more.\n- Skip planning. Just do the task directly.\n- For questions: give the direct answer, not a tutorial.\n- For edits: make the change, show what you did, move on.\n- Don't explore the codebase more than necessary for the immediate task.\n\n## When to Use Tools vs. Just Answer\n- If the user asks a general programming question, answer directly from knowledge. Don't search the codebase.\n- If the user asks about THIS project's code, use tools to look it up — don't guess.\n- If the user asks for a quick edit and you know the file, read it and edit it. Don't ask for confirmation.\n- One tool call to read + one to edit is ideal. Minimize round trips.\n`;\n","/**\n * Load project and global agent instruction files (AGENTS.md, CLAUDE.md).\n * Prefers AGENTS.md over CLAUDE.md when multiple exist at the same location.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n// Filenames to check, in order of preference\nconst INSTRUCTION_FILES = ['AGENTS.md', 'CLAUDE.md'];\n\n// Locations to scan (relative to project root or home)\nconst PROJECT_LOCATIONS = [\n '', // project root\n '.claude',\n '.mastracode',\n];\n\nconst GLOBAL_LOCATIONS = ['.claude', '.mastracode', '.config/claude', '.config/mastracode'];\n\ninterface InstructionSource {\n path: string;\n content: string;\n scope: 'global' | 'project';\n}\n\n/**\n * Find the first existing instruction file at a given base path.\n * Prefers AGENTS.md over CLAUDE.md.\n */\nfunction findInstructionFile(basePath: string): string | null {\n for (const filename of INSTRUCTION_FILES) {\n const fullPath = join(basePath, filename);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Load all agent instruction files from global and project locations.\n * Returns an array of instruction sources, with global ones first.\n */\nexport function loadAgentInstructions(projectPath: string): InstructionSource[] {\n const sources: InstructionSource[] = [];\n const home = homedir();\n\n // Load global instructions first\n for (const location of GLOBAL_LOCATIONS) {\n const basePath = join(home, location);\n const filePath = findInstructionFile(basePath);\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf-8').trim();\n if (content) {\n sources.push({ path: filePath, content, scope: 'global' });\n break; // Only use first found global instruction file\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // Load project instructions\n for (const location of PROJECT_LOCATIONS) {\n const basePath = location ? join(projectPath, location) : projectPath;\n const filePath = findInstructionFile(basePath);\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf-8').trim();\n if (content) {\n sources.push({ path: filePath, content, scope: 'project' });\n break; // Only use first found project instruction file\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n return sources;\n}\n\n/**\n * Format loaded instructions into a string for the system prompt.\n */\nexport function formatAgentInstructions(sources: InstructionSource[]): string {\n if (sources.length === 0) return '';\n\n const sections = sources.map(source => {\n const label = source.scope === 'global' ? 'Global' : 'Project';\n return `<!-- ${label} instructions from ${source.path} -->\\n${source.content}`;\n });\n\n return `\\n# Agent Instructions\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n","/**\n * Mode-specific tool behavioral guidance.\n * Generates tool usage instructions that match the actual registered tool names\n * and are scoped to what's available in the current mode.\n */\n\ninterface ToolGuidanceOptions {\n hasWebSearch?: boolean;\n}\n\nexport function buildToolGuidance(modeId: string, options: ToolGuidanceOptions = {}): string {\n const sections: string[] = [];\n\n sections.push(`# Tool Usage Rules\n\nIMPORTANT: You can ONLY call tools by their exact registered names listed below. Shell commands like \\`git\\`, \\`npm\\`, \\`ls\\`, etc. are NOT tools — they must be run via the \\`execute_command\\` tool.\n\nYou have access to the following tools. Use the RIGHT tool for the job:`);\n\n // --- Read tools (all modes) ---\n\n sections.push(`\n**view** — Read file contents or list directories\n- Use this to read files before editing them. NEVER propose changes to code you haven't read.\n- Use \\`view_range\\` for large files to read specific sections.\n- For directory listings, this shows 2 levels deep.\n- Example: To check lines 50-100 of a large file: \\`view(\"src/big-file.ts\", { view_range: [50, 100] })\\`\n\n**search_content** — Search file contents using regex\n- Use this for ALL content search (finding functions, variables, error messages, imports, etc.)\n- NEVER use \\`execute_command\\` with grep, rg, or ag. Always use the search_content tool.\n- Supports regex patterns, file type filtering, and context lines.\n- Example: Find where a function is defined: \\`search_content(\"function handleSubmit\", { glob: \"**/*.ts\" })\\`\n- Example: Find all imports of a module: \\`search_content(\"from ['\\\\\"]express['\\\\\"]\", { glob: \"**/*.ts\" })\\`\n\n**find_files** — Find files by name pattern\n- Use this to find files matching a pattern (e.g., \"**/*.ts\", \"src/**/test*\").\n- NEVER use \\`execute_command\\` with find or ls for file search. Always use find_files.\n- Respects .gitignore automatically.\n- Example: Find all test files: \\`find_files(\"**/*.test.ts\")\\`\n- Example: Find config files: \\`find_files(\"**/config.{js,ts,json}\")\\`\n\n**execute_command** — Run shell commands\n- Use for: git, npm/pnpm, docker, build tools, test runners, and other terminal operations.\n- Do NOT use for: file reading (use view), file search (use search_content/find_files), file editing (use string_replace_lsp/write_file).\n- Commands have a 30-second default timeout. Use the \\`timeout\\` parameter for longer-running commands.\n- Pipe to \\`| tail -N\\` for commands with long output — the full output streams to the user, only the last N lines are returned to you. If you're building any kind of package you should be tailing.\n- Good: Run independent commands in parallel when possible.\n- Bad: Running \\`cat file.txt\\` — use the view tool instead.`);\n\n // --- Write/edit tools (build & fast only) ---\n\n if (modeId !== 'plan') {\n sections.push(`\n**string_replace_lsp** — Edit files by replacing exact text\n- You MUST read a file with \\`view\\` before editing it.\n- \\`old_str\\` must be an exact match of existing text in the file.\n- Provide enough surrounding context in \\`old_str\\` to make it unique.\n- For creating new files, use \\`write_file\\` instead.\n- Good: Include 2-3 lines of surrounding context to ensure uniqueness.\n- Bad: Using just \\`return true;\\` — too common, will match multiple places.\n\n**write_file** — Create new files or overwrite existing ones\n- Use this to create new files.\n- If overwriting an existing file, you MUST have read it first with \\`view\\`.\n- NEVER create files unless necessary. Prefer editing existing files.`);\n }\n\n // --- Web tools (all modes, conditionally available) ---\n\n if (options.hasWebSearch) {\n sections.push(`\n**web_search** / **web_extract** — Search the web / extract page content\n- Use for looking up documentation, error messages, package APIs.`);\n }\n\n // --- Task management tools (all modes) ---\n\n sections.push(`\n**task_write** — Track tasks for complex multi-step work\n- Use when a task requires 3 or more distinct steps or actions.\n- Pass the FULL task list each time (replaces previous list).\n- Mark tasks \\`in_progress\\` BEFORE starting work. Only ONE task should be \\`in_progress\\` at a time.\n- Mark tasks \\`completed\\` IMMEDIATELY after finishing each task. Do not batch completions.\n- Each task has: content (imperative form), status (pending|in_progress|completed), activeForm (present continuous form shown during execution).\n\n**task_check** — Check completion status of tasks\n- Use this BEFORE deciding you're done with a task to verify all tasks are completed.\n- Returns the number of completed, in progress, and pending tasks.\n- If any tasks remain incomplete, continue working on them.\n- IMPORTANT: Always check task completion before ending work on a complex task.\n\n**ask_user** — Ask the user a structured question\n- Use when you need clarification, want to validate assumptions, or need the user to make a decision.\n- Provide clear, specific questions. End with a question mark.\n- Include options (2-4 choices) for structured decisions. Omit options for open-ended questions.\n- Don't use this for simple yes/no — just ask in your text response.`);\n\n // --- Plan submission tool (plan mode) ---\n\n if (modeId === 'plan') {\n sections.push(`\n**submit_plan** — Submit a completed implementation plan for user review\n- Call this tool when your plan is complete. Do NOT just describe your plan in text — you MUST call this tool.\n- The plan will be rendered as markdown and the user can approve, reject, or request changes.\n- On approval, the system automatically switches to the default mode so you can implement.\n- Takes two arguments: \\`title\\` (short descriptive title) and \\`plan\\` (full plan in markdown).`);\n }\n\n // --- Subagent tool (all modes) ---\n\n sections.push(`\n**subagent** — Delegate a focused task to a specialized subagent\n- Only use subagents when you will spawn **multiple subagents in parallel**. If you only need one task done, do it yourself.\n- Subagent outputs are **untrusted**. Always review and verify the results.`);\n\n return sections.join('\\n');\n}\n","/**\n * Prompt system — exports the prompt builder and mode-specific prompts.\n */\n\nexport { buildBasePrompt } from './base.js';\nexport { buildModePrompt, buildModePromptFn } from './build.js';\nexport { planModePrompt } from './plan.js';\nexport { fastModePrompt } from './fast.js';\n\nimport { hasTavilyKey } from '../../tools/index.js';\nimport { loadAgentInstructions, formatAgentInstructions } from './agent-instructions.js';\nimport { buildBasePrompt } from './base.js';\nimport type { PromptContext as BasePromptContext } from './base.js';\nimport { buildModePromptFn } from './build.js';\nimport { fastModePrompt } from './fast.js';\nimport { planModePrompt } from './plan.js';\nimport { buildToolGuidance } from './tool-guidance.js';\n\n// Extended prompt context that includes runtime information\nexport interface PromptContext extends Omit<BasePromptContext, 'toolGuidance'> {\n modeId: string;\n state?: any;\n currentDate: string;\n workingDir: string;\n}\n\nconst modePrompts: Record<string, string | ((ctx: PromptContext) => string)> = {\n build: buildModePromptFn,\n plan: planModePrompt,\n fast: fastModePrompt,\n};\n\n/**\n * Build the full system prompt for a given mode and context.\n * Combines the base prompt with mode-specific instructions.\n */\nexport function buildFullPrompt(ctx: PromptContext): string {\n // Determine whether web search tools are available\n const modelId = ctx.state?.currentModelId as string | undefined;\n const hasWebSearch = hasTavilyKey() || (!!modelId && modelId.startsWith('anthropic/'));\n\n // Build mode-aware tool guidance\n const toolGuidance = buildToolGuidance(ctx.modeId, { hasWebSearch });\n\n // Map new context to base context\n const baseCtx: BasePromptContext = {\n projectPath: ctx.workingDir,\n projectName: ctx.projectName || 'unknown',\n gitBranch: ctx.gitBranch,\n platform: process.platform,\n date: ctx.currentDate,\n mode: ctx.modeId,\n modelId: ctx.modelId,\n activePlan: ctx.state?.activePlan,\n toolGuidance,\n };\n\n const base = buildBasePrompt(baseCtx);\n const entry = modePrompts[ctx.modeId] || modePrompts.build;\n const modeSpecific = typeof entry === 'function' ? entry(ctx) : entry;\n\n // Inject current task state so agent doesn't lose track after OM truncation\n let taskSection = '';\n const tasks = ctx.state?.tasks as { content: string; status: string; activeForm: string }[] | undefined;\n if (tasks && tasks.length > 0) {\n const lines = tasks.map(t => {\n const icon = t.status === 'completed' ? '✓' : t.status === 'in_progress' ? '▸' : '○';\n return ` ${icon} [${t.status}] ${t.content}`;\n });\n taskSection = `\\n<current-task-list>\\n${lines.join('\\n')}\\n</current-task-list>\\n`;\n }\n\n // Load and inject agent instructions from AGENTS.md/CLAUDE.md files\n const instructionSources = loadAgentInstructions(ctx.workingDir);\n const instructionsSection = formatAgentInstructions(instructionSources);\n\n return base + taskSection + instructionsSection + '\\n' + modeSpecific;\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { stateSchema } from '../schema.js';\nimport { getCurrentGitBranch } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nexport function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined;\n const state = harnessContext?.state;\n const modeId = harnessContext?.modeId ?? 'build';\n const projectPath = state?.projectPath ?? process.cwd();\n\n const promptCtx: PromptContext = {\n projectPath,\n projectName: state?.projectName ?? '',\n gitBranch: getCurrentGitBranch(projectPath) ?? state?.gitBranch,\n platform: process.platform,\n date: new Date().toISOString().split('T')[0]!,\n mode: modeId,\n modelId: state?.currentModelId || undefined,\n activePlan: state?.activePlan ?? null,\n modeId: modeId,\n currentDate: new Date().toISOString().split('T')[0]!,\n workingDir: state?.projectPath ?? process.cwd(),\n state: state,\n };\n\n return buildFullPrompt(promptCtx);\n}\n","// Default OM model - using gemini-2.5-flash for efficiency\nexport const DEFAULT_OM_MODEL_ID = process.env.DEFAULT_OM_MODEL_ID ?? 'google/gemini-2.5-flash';\n\n// Default OM thresholds — per-thread overrides are loaded from thread metadata\nexport const DEFAULT_OBS_THRESHOLD = 30_000;\nexport const DEFAULT_REF_THRESHOLD = 40_000;\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport { Memory } from '@mastra/memory';\nimport { DEFAULT_OM_MODEL_ID, DEFAULT_OBS_THRESHOLD, DEFAULT_REF_THRESHOLD } from '../constants';\nimport type { stateSchema } from '../schema';\nimport { getOmScope } from '../utils/project';\nimport { resolveModel } from './model';\n\nlet cachedMemory: Memory | null = null;\nlet cachedMemoryKey: string | null = null;\n\n/**\n * Read harness state from requestContext.\n * Used by both the memory factory and the OM model functions.\n */\nfunction getHarnessState(requestContext: RequestContext) {\n return (requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined)?.getState?.();\n}\n\n/**\n * Observer model function — reads the current observer model ID from\n * harness state via requestContext (now propagated by OM's agent.generate).\n */\nfunction getObserverModel({ requestContext }: { requestContext: RequestContext }) {\n const state = getHarnessState(requestContext);\n return resolveModel(state?.observerModelId ?? DEFAULT_OM_MODEL_ID);\n}\n\n/**\n * Reflector model function — reads the current reflector model ID from\n * harness state via requestContext (now propagated by OM's agent.generate).\n */\nfunction getReflectorModel({ requestContext }: { requestContext: RequestContext }) {\n const state = getHarnessState(requestContext);\n return resolveModel(state?.reflectorModelId ?? DEFAULT_OM_MODEL_ID);\n}\n\n/**\n * Dynamic memory factory function.\n * Reads OM thresholds from harness state via requestContext.\n * Model functions also read from requestContext (no mutable bridge needed).\n */\nexport function getDynamicMemory(storage: MastraCompositeStore) {\n return ({ requestContext }: { requestContext: RequestContext }) => {\n const state = getHarnessState(requestContext);\n const omScope = getOmScope(state?.projectPath);\n\n const obsThreshold = state?.observationThreshold ?? DEFAULT_OBS_THRESHOLD;\n const refThreshold = state?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD;\n\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}`;\n if (cachedMemory && cachedMemoryKey === cacheKey) {\n return cachedMemory;\n }\n\n cachedMemory = new Memory({\n storage,\n options: {\n observationalMemory: {\n enabled: true,\n scope: omScope,\n observation: {\n bufferTokens: 1 / 5,\n bufferActivation: 2000,\n model: getObserverModel,\n messageTokens: obsThreshold,\n blockAfter: 2,\n modelSettings: {\n maxOutputTokens: 60000,\n },\n },\n reflection: {\n bufferActivation: 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n modelSettings: {\n maxOutputTokens: 60000,\n },\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { McpManager } from '../mcp';\nimport type { stateSchema } from '../schema';\nimport {\n createViewTool,\n createGrepTool,\n createGlobTool,\n createExecuteCommandTool,\n createWriteFileTool,\n createWebSearchTool,\n createWebExtractTool,\n hasTavilyKey,\n stringReplaceLspTool,\n astSmartEditTool,\n requestSandboxAccessTool,\n} from '../tools';\n\nexport function createDynamicTools(mcpManager?: McpManager) {\n return function getDynamicTools({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined;\n const state = ctx?.getState?.();\n const modeId = ctx?.modeId ?? 'build';\n\n const modelId = state?.currentModelId;\n const isAnthropicModel = modelId?.startsWith('anthropic/');\n\n const projectPath = state?.projectPath ?? '';\n\n const viewTool = createViewTool(projectPath);\n const grepTool = createGrepTool(projectPath);\n const globTool = createGlobTool(projectPath);\n const executeCommandTool = createExecuteCommandTool(projectPath);\n const writeFileTool = createWriteFileTool(projectPath);\n\n // NOTE: Tool names \"grep\" and \"glob\" are reserved by Anthropic's OAuth\n // validation (they match Claude Code's internal tools). We use\n // \"search_content\" and \"find_files\" to avoid the collision.\n const tools: Record<string, any> = {\n view: viewTool,\n search_content: grepTool,\n find_files: globTool,\n execute_command: executeCommandTool,\n request_sandbox_access: requestSandboxAccessTool,\n };\n\n if (modeId !== 'plan') {\n tools.string_replace_lsp = stringReplaceLspTool;\n tools.ast_smart_edit = astSmartEditTool;\n tools.write_file = writeFileTool;\n }\n\n if (hasTavilyKey()) {\n tools.web_search = createWebSearchTool();\n tools.web_extract = createWebExtractTool();\n } else if (isAnthropicModel) {\n const anthropic = createAnthropic({});\n tools.web_search = anthropic.tools.webSearch_20250305();\n }\n\n if (mcpManager) {\n const mcpTools = mcpManager.getTools();\n Object.assign(tools, mcpTools);\n }\n\n return tools;\n };\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { Workspace, LocalFilesystem, LocalSandbox } from '@mastra/core/workspace';\nimport type { stateSchema } from '../schema';\n\n// =============================================================================\n// Create Workspace with Skills\n// =============================================================================\n\n// We support multiple skill locations for compatibility:\n// 1. Project-local: .mastracode/skills (project-specific mastracode skills)\n// 2. Project-local: .claude/skills (Claude Code compatible skills)\n// 3. Global: ~/.mastracode/skills (user-wide mastracode skills)\n// 4. Global: ~/.claude/skills (user-wide Claude Code skills)\n\nconst mastraCodeLocalSkillsPath = path.join(process.cwd(), '.mastracode', 'skills');\n\nconst claudeLocalSkillsPath = path.join(process.cwd(), '.claude', 'skills');\n\nconst mastraCodeGlobalSkillsPath = path.join(os.homedir(), '.mastracode', 'skills');\n\nconst claudeGlobalSkillsPath = path.join(os.homedir(), '.claude', 'skills');\n\n// Mastra's LocalSkillSource.readdir uses Node's Dirent.isDirectory() which\n// returns false for symlinks. Tools like `npx skills add` install skills as\n// symlinks, so we need to resolve them. For each symlinked skill directory,\n// we add the real (resolved) parent path as an additional skill scan path.\nfunction collectSkillPaths(skillsDirs: string[]): string[] {\n const paths: string[] = [];\n const seen = new Set<string>();\n\n for (const skillsDir of skillsDirs) {\n if (!fs.existsSync(skillsDir)) continue;\n\n // Always add the directory itself\n const resolved = fs.realpathSync(skillsDir);\n if (!seen.has(resolved)) {\n seen.add(resolved);\n paths.push(skillsDir);\n }\n\n // Check for symlinked skill subdirectories and add their real parents\n try {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) {\n const linkPath = path.join(skillsDir, entry.name);\n const realPath = fs.realpathSync(linkPath);\n const stat = fs.statSync(realPath);\n if (stat.isDirectory()) {\n // Add the real parent directory as a skill path\n // so Mastra discovers it as a regular directory\n const realParent = path.dirname(realPath);\n if (!seen.has(realParent)) {\n seen.add(realParent);\n paths.push(realParent);\n }\n }\n }\n }\n } catch {\n // Ignore errors during symlink resolution\n }\n }\n\n return paths;\n}\n\nconst skillPaths = collectSkillPaths([\n mastraCodeLocalSkillsPath,\n claudeLocalSkillsPath,\n mastraCodeGlobalSkillsPath,\n claudeGlobalSkillsPath,\n]);\n\nexport function getDynamicWorkspace({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined;\n const state = ctx?.getState?.();\n const projectPath = state?.projectPath;\n\n if (!projectPath) {\n throw new Error('Project path is required');\n }\n\n // Sync filesystem's allowedPaths with sandbox-granted paths from harness state\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n\n const workspace = new Workspace({\n id: 'mastra-code-workspace',\n name: 'Mastra Code Workspace',\n filesystem: new LocalFilesystem({\n basePath: projectPath,\n allowedPaths: skillPaths,\n }),\n sandbox: new LocalSandbox({\n workingDirectory: projectPath,\n env: process.env,\n }),\n // Disable workspace tools — built-in tools are used instead.\n // Workspace tools use different output formats (e.g. → separator, offset/limit params)\n // that the TUI renderers don't fully support yet.\n // We will update to use workspace tools very soon - just disabling until then\n tools: { enabled: false },\n ...(skillPaths.length > 0 ? { skills: skillPaths } : {}),\n });\n\n workspace.filesystem.setAllowedPaths([...skillPaths, ...sandboxPaths.map((p: string) => path.resolve(p))]);\n\n return workspace;\n}\n\nif (skillPaths.length > 0) {\n console.info(`Skills loaded from:`);\n for (const p of skillPaths) {\n console.info(` - ${p}`);\n }\n}\n","/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.mastracode/hooks.json) and project (.mastracode/hooks.json).\n * Global hooks run first, project hooks append.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { HooksConfig, HookDefinition, HookEventName } from './types.js';\n\nconst VALID_EVENTS: HookEventName[] = [\n 'PreToolUse',\n 'PostToolUse',\n 'Stop',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n];\n\nexport function loadHooksConfig(projectDir: string): HooksConfig {\n const globalPath = getGlobalHooksPath();\n const projectPath = getProjectHooksPath(projectDir);\n\n const globalConfig = loadSingleConfig(globalPath);\n const projectConfig = loadSingleConfig(projectPath);\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'hooks.json');\n}\n\nexport function getGlobalHooksPath(): string {\n return path.join(os.homedir(), '.mastracode', 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string): HooksConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction validateConfig(raw: unknown): HooksConfig {\n if (!raw || typeof raw !== 'object') return {};\n\n const config: HooksConfig = {};\n const obj = raw as Record<string, unknown>;\n\n for (const event of VALID_EVENTS) {\n if (Array.isArray(obj[event])) {\n const hooks = (obj[event] as unknown[]).filter(isValidHook);\n if (hooks.length > 0) {\n config[event] = hooks;\n }\n }\n }\n\n return config;\n}\n\nfunction isValidHook(raw: unknown): raw is HookDefinition {\n if (!raw || typeof raw !== 'object') return false;\n const obj = raw as Record<string, unknown>;\n return obj.type === 'command' && typeof obj.command === 'string';\n}\n\nfunction mergeConfigs(global: HooksConfig, project: HooksConfig): HooksConfig {\n const merged: HooksConfig = {};\n\n for (const event of VALID_EVENTS) {\n const combined = [...(global[event] ?? []), ...(project[event] ?? [])];\n if (combined.length > 0) {\n merged[event] = combined;\n }\n }\n\n return merged;\n}\n","/**\n * Type definitions for the hooks system.\n * Hooks are user-configured shell commands that run at lifecycle events.\n */\n\n// =============================================================================\n// Hook Event Names\n// =============================================================================\nexport type HookEventName =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'Stop'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Notification';\n\nexport type BlockingHookEvent = 'PreToolUse' | 'Stop' | 'UserPromptSubmit';\n\nexport function isBlockingEvent(event: HookEventName): event is BlockingHookEvent {\n return event === 'PreToolUse' || event === 'Stop' || event === 'UserPromptSubmit';\n}\n\n// =============================================================================\n// Hook Configuration\n// =============================================================================\n\nexport interface HookMatcher {\n /** Regex pattern matched against tool_name (PreToolUse/PostToolUse only). */\n tool_name?: string;\n}\n\nexport interface HookDefinition {\n /** Hook type. Only \"command\" supported in phase 1. */\n type: 'command';\n /** Shell command to execute via /bin/sh -c. */\n command: string;\n /** Optional matcher to filter when this hook runs. */\n matcher?: HookMatcher;\n /** Timeout in ms. Default 10000. Process killed after timeout. */\n timeout?: number;\n /** Human-readable description for /hooks display. */\n description?: string;\n}\nexport interface HooksConfig {\n PreToolUse?: HookDefinition[];\n PostToolUse?: HookDefinition[];\n Stop?: HookDefinition[];\n UserPromptSubmit?: HookDefinition[];\n SessionStart?: HookDefinition[];\n SessionEnd?: HookDefinition[];\n Notification?: HookDefinition[];\n}\n\n// =============================================================================\n// Stdin Protocol (JSON sent to hook process)\n// =============================================================================\n\nexport interface HookStdinBase {\n session_id: string;\n cwd: string;\n hook_event_name: HookEventName;\n}\n\nexport interface HookStdinToolEvent extends HookStdinBase {\n hook_event_name: 'PreToolUse' | 'PostToolUse';\n tool_name: string;\n tool_input: unknown;\n tool_output?: unknown;\n tool_error?: boolean;\n}\n\nexport interface HookStdinUserPrompt extends HookStdinBase {\n hook_event_name: 'UserPromptSubmit';\n user_message: string;\n}\n\nexport interface HookStdinStop extends HookStdinBase {\n hook_event_name: 'Stop';\n assistant_message?: string;\n stop_reason: 'complete' | 'aborted' | 'error';\n}\nexport interface HookStdinSession extends HookStdinBase {\n hook_event_name: 'SessionStart' | 'SessionEnd';\n}\n\nexport interface HookStdinNotification extends HookStdinBase {\n hook_event_name: 'Notification';\n /** Why the notification fired: agent_done, ask_question, tool_approval, plan_approval, sandbox_access */\n reason: string;\n /** Optional human-readable message for the notification. */\n message?: string;\n}\n\nexport type HookStdin =\n | HookStdinToolEvent\n | HookStdinUserPrompt\n | HookStdinStop\n | HookStdinSession\n | HookStdinNotification;\n\n// =============================================================================\n// Stdout Protocol (JSON read from hook process)\n// =============================================================================\n\nexport interface HookStdout {\n decision?: 'allow' | 'block';\n reason?: string;\n additionalContext?: string;\n}\n\n// =============================================================================\n// Execution Results\n// =============================================================================\n\nexport interface HookResult {\n hook: HookDefinition;\n exitCode: number;\n stdout?: HookStdout;\n stderr?: string;\n timedOut: boolean;\n durationMs: number;\n}\n\nexport interface HookEventResult {\n allowed: boolean;\n blockReason?: string;\n additionalContext?: string;\n results: HookResult[];\n warnings: string[];\n}\n","/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n","/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from './config.js';\nimport { runHooksForEvent } from './executor.js';\nimport type {\n HooksConfig,\n HookEventResult,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n} from './types.js';\n\nexport class HookManager {\n private config: HooksConfig;\n private projectDir: string;\n private sessionId: string;\n\n constructor(projectDir: string, sessionId: string) {\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.config = loadHooksConfig(projectDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n hasHooks(): boolean {\n return Object.keys(this.config).length > 0;\n }\n\n getConfig(): HooksConfig {\n return this.config;\n }\n\n getConfigPaths(): { project: string; global: string } {\n return {\n project: getProjectHooksPath(this.projectDir),\n global: getGlobalHooksPath(),\n };\n }\n\n // =========================================================================\n // Event Methods\n // =========================================================================\n\n async runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult> {\n const hooks = this.config.PreToolUse;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinToolEvent = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'PreToolUse',\n tool_name: toolName,\n tool_input: toolInput,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runPostToolUse(\n toolName: string,\n toolInput: unknown,\n toolOutput: unknown,\n toolError: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.PostToolUse;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinToolEvent = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'PostToolUse',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n tool_error: toolError,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runUserPromptSubmit(userMessage: string): Promise<HookEventResult> {\n const hooks = this.config.UserPromptSubmit;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinUserPrompt = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'UserPromptSubmit',\n user_message: userMessage,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runStop(\n assistantMessage: string | undefined,\n stopReason: 'complete' | 'aborted' | 'error',\n ): Promise<HookEventResult> {\n const hooks = this.config.Stop;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinStop = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'Stop',\n assistant_message: assistantMessage,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSessionStart(): Promise<HookEventResult> {\n const hooks = this.config.SessionStart;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinSession = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'SessionStart',\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n async runSessionEnd(): Promise<HookEventResult> {\n const hooks = this.config.SessionEnd;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinSession = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'SessionEnd',\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n /**\n * Fire notification hooks (non-blocking, fire-and-forget).\n * Called when the TUI is waiting for user input.\n */\n runNotification(reason: string, message?: string): void {\n const hooks = this.config.Notification;\n if (!hooks || hooks.length === 0) return;\n\n const stdin: HookStdinNotification = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'Notification',\n reason,\n message,\n };\n\n // Fire-and-forget — don't await\n runHooksForEvent(hooks, stdin).catch(() => {});\n }\n}\n","/**\n * MCP server configuration loading from filesystem.\n * Loads from:\n * 1. .claude/settings.local.json (Claude Code compat — lowest priority)\n * 2. ~/.mastracode/mcp.json (global)\n * 3. .mastracode/mcp.json (project — highest priority)\n *\n * Project overrides global by server name. Claude Code config is lowest priority.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { McpConfig, McpServerConfig } from './types.js';\n\nexport function loadMcpConfig(projectDir: string): McpConfig {\n const claudeConfig = loadClaudeSettings(projectDir);\n const globalConfig = loadSingleConfig(getGlobalMcpPath());\n const projectConfig = loadSingleConfig(getProjectMcpPath(projectDir));\n\n return mergeConfigs(claudeConfig, globalConfig, projectConfig);\n}\n\nexport function getProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'mcp.json');\n}\n\nexport function getGlobalMcpPath(): string {\n return path.join(os.homedir(), '.mastracode', 'mcp.json');\n}\n\nexport function getClaudeSettingsPath(projectDir: string): string {\n return path.join(projectDir, '.claude', 'settings.local.json');\n}\n\nfunction loadSingleConfig(filePath: string): McpConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction loadClaudeSettings(projectDir: string): McpConfig {\n try {\n const filePath = getClaudeSettingsPath(projectDir);\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n // Claude Code stores mcpServers at the top level of settings\n if (parsed?.mcpServers && typeof parsed.mcpServers === 'object') {\n return validateConfig({ mcpServers: parsed.mcpServers });\n }\n return {};\n } catch {\n return {};\n }\n}\n\nfunction validateConfig(raw: unknown): McpConfig {\n if (!raw || typeof raw !== 'object') return {};\n const obj = raw as Record<string, unknown>;\n\n if (!obj.mcpServers || typeof obj.mcpServers !== 'object') return {};\n\n const servers: Record<string, McpServerConfig> = {};\n const rawServers = obj.mcpServers as Record<string, unknown>;\n\n for (const [name, entry] of Object.entries(rawServers)) {\n if (isValidServerConfig(entry)) {\n servers[name] = {\n command: (entry as Record<string, unknown>).command as string,\n args: Array.isArray((entry as Record<string, unknown>).args)\n ? ((entry as Record<string, unknown>).args as string[])\n : undefined,\n env:\n typeof (entry as Record<string, unknown>).env === 'object' && (entry as Record<string, unknown>).env !== null\n ? ((entry as Record<string, unknown>).env as Record<string, string>)\n : undefined,\n };\n }\n }\n\n if (Object.keys(servers).length === 0) return {};\n return { mcpServers: servers };\n}\n\nfunction isValidServerConfig(raw: unknown): boolean {\n if (!raw || typeof raw !== 'object') return false;\n const obj = raw as Record<string, unknown>;\n return typeof obj.command === 'string';\n}\n\n/**\n * Merge configs: claude (lowest priority) < global < project (highest).\n * Later configs override earlier by server name.\n */\nfunction mergeConfigs(...configs: McpConfig[]): McpConfig {\n const merged: Record<string, McpServerConfig> = {};\n\n for (const config of configs) {\n if (config.mcpServers) {\n for (const [name, server] of Object.entries(config.mcpServers)) {\n merged[name] = server;\n }\n }\n }\n\n if (Object.keys(merged).length === 0) return {};\n return { mcpServers: merged };\n}\n","/**\n * MCP manager — orchestrates MCP server connections using MCPClient directly.\n * Created once at startup, provides tools from connected MCP servers.\n */\n\nimport { MCPClient } from '@mastra/mcp';\nimport { loadMcpConfig, getProjectMcpPath, getGlobalMcpPath, getClaudeSettingsPath } from './config.js';\nimport type { McpConfig, McpServerStatus } from './types.js';\n\n/** Public interface for the MCP manager returned by createMcpManager(). */\nexport interface McpManager {\n /** Connect to all configured MCP servers and collect their tools. */\n init(): Promise<void>;\n /** Disconnect all servers, reload config from disk, reconnect. */\n reload(): Promise<void>;\n /** Disconnect from all MCP servers and clean up. */\n disconnect(): Promise<void>;\n /** Get all tools from connected MCP servers (namespaced as serverName_toolName). */\n getTools(): Record<string, any>;\n /** Check if any MCP servers are configured. */\n hasServers(): boolean;\n /** Get status of all servers. */\n getServerStatuses(): McpServerStatus[];\n /** Get config file paths for display. */\n getConfigPaths(): { project: string; global: string; claude: string };\n /** Get the merged config. */\n getConfig(): McpConfig;\n}\n\n/**\n * Create an MCP manager that wraps MCPClient with config-file discovery\n * and per-server status tracking.\n */\nexport function createMcpManager(projectDir: string): McpManager {\n let config = loadMcpConfig(projectDir);\n let client: MCPClient | null = null;\n let tools: Record<string, any> = {};\n let serverStatuses = new Map<string, McpServerStatus>();\n let initialized = false;\n\n function buildServerDefs(\n servers: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>,\n ) {\n const defs: Record<string, { command: string; args?: string[]; env?: Record<string, string> }> = {};\n for (const [name, cfg] of Object.entries(servers)) {\n defs[name] = { command: cfg.command, args: cfg.args, env: cfg.env };\n }\n return defs;\n }\n\n async function connectAndCollectTools(): Promise<void> {\n const servers = config.mcpServers;\n if (!servers || Object.keys(servers).length === 0) {\n return;\n }\n\n client = new MCPClient({\n id: 'mastra-code-mcp',\n servers: buildServerDefs(servers),\n });\n\n // MCPClient.listTools() uses Promise.all internally — a single server\n // failure throws for all. We call it once wrapped in try/catch and\n // derive per-server status from tool name prefixes (serverName_toolName).\n const serverNames = Object.keys(servers);\n\n try {\n tools = await client.listTools();\n\n for (const name of serverNames) {\n const prefix = `${name}_`;\n const serverToolNames = Object.keys(tools).filter(t => t.startsWith(prefix));\n serverStatuses.set(name, {\n name,\n connected: true,\n toolCount: serverToolNames.length,\n toolNames: serverToolNames,\n });\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n\n for (const name of serverNames) {\n serverStatuses.set(name, {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n error: errMsg,\n });\n }\n }\n }\n\n async function disconnect(): Promise<void> {\n if (client) {\n try {\n await client.disconnect();\n } catch {\n // Ignore disconnect errors\n }\n client = null;\n }\n }\n\n return {\n async init() {\n if (initialized) return;\n await connectAndCollectTools();\n initialized = true;\n },\n\n async reload() {\n await disconnect();\n config = loadMcpConfig(projectDir);\n tools = {};\n serverStatuses = new Map();\n initialized = false;\n await connectAndCollectTools();\n initialized = true;\n },\n\n disconnect,\n\n getTools() {\n return { ...tools };\n },\n\n hasServers() {\n return config.mcpServers !== undefined && Object.keys(config.mcpServers).length > 0;\n },\n\n getServerStatuses() {\n return Array.from(serverStatuses.values());\n },\n\n getConfigPaths() {\n return {\n project: getProjectMcpPath(projectDir),\n global: getGlobalMcpPath(),\n claude: getClaudeSettingsPath(projectDir),\n };\n },\n\n getConfig() {\n return config;\n },\n };\n}\n","import { z } from 'zod';\nimport { DEFAULT_OM_MODEL_ID } from './constants';\n\nexport const stateSchema = z.object({\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n currentModelId: z.string().default(''),\n // Subagent model settings (per-thread/per-mode)\n subagentModelId: z.string().optional(), // Thread-level default for subagents\n // Observational Memory model settings\n observerModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n reflectorModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n // Observational Memory threshold settings\n observationThreshold: z.number().default(30_000),\n reflectionThreshold: z.number().default(40_000),\n // Thinking level for model reasoning effort\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh']).default('off'),\n // YOLO mode — auto-approve all tool calls\n yolo: z.boolean().default(false),\n // Permission rules — per-category and per-tool approval policies\n permissionRules: z\n .object({\n categories: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n tools: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n })\n .default({ categories: {}, tools: {} }),\n // Smart editing mode — use AST-based analysis for code edits\n smartEditing: z.boolean().default(true),\n // Notification mode — alert when TUI needs user attention\n notifications: z.enum(['bell', 'system', 'both', 'off']).default('off'),\n // Task list (persisted per-thread)\n tasks: z\n .array(\n z.object({\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n )\n .default([]),\n // Sandbox allowed paths (per-thread, absolute paths allowed in addition to project root)\n sandboxAllowedPaths: z.array(z.string()).default([]),\n // Active plan (set when a plan is approved in Plan mode)\n activePlan: z\n .object({\n title: z.string(),\n plan: z.string(),\n approvedAt: z.string(),\n })\n .nullable()\n .default(null),\n});\n","/**\n * Gateway sync utility for keeping the model registry up to date.\n * Periodically fetches provider data from gateways and updates the global cache.\n */\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { ModelsDevGateway, NetlifyGateway } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\n\n// Cache paths (same as Mastra uses)\nconst CACHE_DIR = path.join(os.homedir(), '.cache', 'mastra');\nconst CACHE_FILE = path.join(CACHE_DIR, 'gateway-refresh-time');\nconst GLOBAL_PROVIDER_REGISTRY_JSON = path.join(CACHE_DIR, 'provider-registry.json');\nconst GLOBAL_PROVIDER_TYPES_DTS = path.join(CACHE_DIR, 'provider-types.generated.d.ts');\n\n// Default sync interval: 5 minutes\nconst DEFAULT_SYNC_INTERVAL_MS = 5 * 60 * 1000;\n\nlet syncInterval: NodeJS.Timeout | null = null;\nlet isSyncing = false;\n\n/**\n * Atomic file write to prevent corruption from concurrent writes\n */\nasync function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const randomSuffix = Math.random().toString(36).substring(2, 15);\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${randomSuffix}.tmp`;\n\n try {\n await fs.promises.writeFile(tempPath, content, 'utf-8');\n await fs.promises.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.promises.unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Fetch providers from all gateways\n */\nasync function fetchProvidersFromGateways(): Promise<{\n providers: Record<string, ProviderConfig>;\n models: Record<string, string[]>;\n}> {\n const allProviders: Record<string, ProviderConfig> = {};\n const allModels: Record<string, string[]> = {};\n\n const gateways = [new ModelsDevGateway({}), new NetlifyGateway()];\n\n for (const gateway of gateways) {\n try {\n const providers = await gateway.fetchProviders();\n\n // models.dev is a provider registry, not a true gateway - don't prefix its providers\n const isProviderRegistry = gateway.id === 'models.dev';\n\n for (const [providerId, config] of Object.entries(providers)) {\n const typeProviderId = isProviderRegistry\n ? providerId\n : providerId === gateway.id\n ? gateway.id\n : `${gateway.id}/${providerId}`;\n\n allProviders[typeProviderId] = config;\n allModels[typeProviderId] = config.models.sort();\n }\n } catch (error) {\n console.warn(`[GatewaySync] Failed to fetch from ${gateway.id}:`, error);\n }\n }\n\n return { providers: allProviders, models: allModels };\n}\n\n/**\n * Generate TypeScript type definitions content\n */\nfunction generateTypesContent(models: Record<string, string[]>): string {\n const providerModelsEntries = Object.entries(models)\n .map(([provider, modelList]) => {\n const modelsList = modelList.map(m => `'${m}'`);\n const needsQuotes = /[^a-zA-Z0-9_$]/.test(provider);\n const providerKey = needsQuotes ? `'${provider}'` : provider;\n const singleLine = ` readonly ${providerKey}: readonly [${modelsList.join(', ')}];`;\n\n if (singleLine.length > 120) {\n const formattedModels = modelList.map(m => ` '${m}',`).join('\\n');\n return ` readonly ${providerKey}: readonly [\\n${formattedModels}\\n ];`;\n }\n\n return singleLine;\n })\n .join('\\n');\n\n return `/**\n * THIS FILE IS AUTO-GENERATED - DO NOT EDIT\n * Generated from model gateway providers\n */\n\nexport type ProviderModelsMap = {\n${providerModelsEntries}\n};\n\nexport type Provider = keyof ProviderModelsMap;\n\nexport interface ProviderModels {\n [key: string]: string[];\n}\n\nexport type ModelRouterModelId =\n | {\n [P in Provider]: \\`\\${P}/\\${ProviderModelsMap[P][number]}\\`;\n }[Provider]\n | (string & {});\n\nexport type ModelForProvider<P extends Provider> = ProviderModelsMap[P][number];\n`;\n}\n\n/**\n * Get the last sync time from disk\n */\nfunction getLastSyncTime(): Date | null {\n try {\n if (!fs.existsSync(CACHE_FILE)) {\n return null;\n }\n const timestamp = fs.readFileSync(CACHE_FILE, 'utf-8').trim();\n return new Date(parseInt(timestamp, 10));\n } catch {\n return null;\n }\n}\n\n/**\n * Save the last sync time to disk\n */\nfunction saveLastSyncTime(date: Date): void {\n try {\n if (!fs.existsSync(CACHE_DIR)) {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n }\n fs.writeFileSync(CACHE_FILE, date.getTime().toString(), 'utf-8');\n } catch (error) {\n console.warn('[GatewaySync] Failed to save sync time:', error);\n }\n}\n\n/**\n * Sync gateways and update the global cache\n */\nexport async function syncGateways(force = false): Promise<void> {\n if (isSyncing && !force) {\n return;\n }\n\n // Check if we synced recently (within the last 5 minutes)\n if (!force) {\n const lastSync = getLastSyncTime();\n if (lastSync) {\n const timeSinceSync = Date.now() - lastSync.getTime();\n if (timeSinceSync < DEFAULT_SYNC_INTERVAL_MS) {\n // console.debug(`[GatewaySync] Skipping sync, last sync was ${Math.round(timeSinceSync / 1000)}s ago`)\n return;\n }\n }\n }\n\n isSyncing = true;\n\n try {\n // console.debug(\"[GatewaySync] Starting gateway sync...\")\n\n const { providers, models } = await fetchProvidersFromGateways();\n\n // Ensure cache directory exists\n await fs.promises.mkdir(CACHE_DIR, { recursive: true });\n\n // Write registry JSON\n const registryData = {\n providers,\n models,\n version: '1.0.0',\n };\n await atomicWriteFile(GLOBAL_PROVIDER_REGISTRY_JSON, JSON.stringify(registryData, null, 2));\n\n // Write types file\n const typesContent = generateTypesContent(models);\n await atomicWriteFile(GLOBAL_PROVIDER_TYPES_DTS, typesContent);\n\n // Save sync time\n const now = new Date();\n saveLastSyncTime(now);\n\n // console.debug(`[GatewaySync] ✅ Sync completed at ${now.toISOString()}`)\n } catch (error) {\n console.error('[GatewaySync] ❌ Sync failed:', error);\n } finally {\n isSyncing = false;\n }\n}\n\n/**\n * Start periodic gateway sync\n * @param intervalMs Sync interval in milliseconds (default: 5 minutes)\n */\nexport function startGatewaySync(intervalMs = DEFAULT_SYNC_INTERVAL_MS): void {\n if (syncInterval) {\n return;\n }\n\n // Do an initial sync\n syncGateways().catch(console.error);\n\n // Set up periodic sync\n syncInterval = setInterval(() => {\n syncGateways().catch(console.error);\n }, intervalMs);\n\n // Don't prevent process exit\n syncInterval.unref();\n}\n\n/**\n * Stop periodic gateway sync\n */\nexport function stopGatewaySync(): void {\n if (syncInterval) {\n clearInterval(syncInterval);\n syncInterval = null;\n }\n}\n","/**\n * Storage factory — creates the appropriate storage backend based on resolved config.\n *\n * If PG is selected but fails to connect, falls back to LibSQL so the TUI\n * can start and the user can fix the connection via /settings.\n */\n\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport { LibSQLStore } from '@mastra/libsql';\nimport { PostgresStore } from '@mastra/pg';\n\nimport type { StorageConfig, PgStorageConfig } from './project.js';\nimport { getDatabasePath } from './project.js';\n\nexport interface StorageResult {\n storage: MastraCompositeStore;\n /** Non-null when PG was requested but failed — contains a user-facing warning. */\n warning?: string;\n}\n\nfunction createFallbackLibSQL(): MastraCompositeStore {\n return new LibSQLStore({\n id: 'mastra-code-storage',\n url: `file:${getDatabasePath()}`,\n });\n}\n\n/**\n * Create a storage instance from the resolved config.\n *\n * - `libsql` backend → LibSQLStore (always available)\n * - `pg` backend → PostgresStore, falls back to LibSQL on connection failure\n */\nexport async function createStorage(config: StorageConfig): Promise<StorageResult> {\n if (config.backend === 'pg') {\n return createPgStorage(config);\n }\n\n // Default: LibSQL\n return {\n storage: new LibSQLStore({\n id: 'mastra-code-storage',\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n }),\n };\n}\n\nasync function createPgStorage(config: PgStorageConfig): Promise<StorageResult> {\n // No connection info → fall back with guidance\n if (!config.connectionString && !config.host) {\n return {\n storage: createFallbackLibSQL(),\n warning:\n 'PostgreSQL backend selected but no connection info configured. ' +\n 'Using LibSQL fallback. Set a connection string via /settings.',\n };\n }\n\n const base = {\n id: 'mastra-code-storage' as const,\n ...(config.schemaName ? { schemaName: config.schemaName } : {}),\n ...(config.disableInit ? { disableInit: config.disableInit } : {}),\n ...(config.skipDefaultIndexes ? { skipDefaultIndexes: config.skipDefaultIndexes } : {}),\n };\n\n const store = config.connectionString\n ? new PostgresStore({ ...base, connectionString: config.connectionString })\n : new PostgresStore({\n ...base,\n host: config.host!,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n });\n\n // Test the connection before committing — if it fails, fall back to LibSQL\n // so the user can fix the config via /settings.\n try {\n await store.init();\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n const target = config.connectionString ?? `${config.host}:${config.port ?? 5432}`;\n try {\n await store.close();\n } catch {\n // ignore cleanup errors\n }\n return {\n storage: createFallbackLibSQL(),\n warning:\n `Failed to connect to PostgreSQL at ${target}: ${msg}\\n` +\n 'Using LibSQL fallback. Fix the connection via /settings.',\n };\n }\n\n return { storage: store };\n}\n","import { Mastra } from '@mastra/core';\nimport { Agent } from '@mastra/core/agent';\nimport { Harness, taskWriteTool, taskCheckTool } from '@mastra/core/harness';\nimport type { HeartbeatHandler, HarnessMode, HarnessSubagent } from '@mastra/core/harness';\nimport { noopLogger } from '@mastra/core/logger';\n\nimport { getDynamicInstructions } from './agents/instructions.js';\nimport { getDynamicMemory } from './agents/memory.js';\nimport { getDynamicModel, resolveModel } from './agents/model.js';\nimport { executeSubagent } from './agents/subagents/execute.js';\nimport { exploreSubagent } from './agents/subagents/explore.js';\nimport { planSubagent } from './agents/subagents/plan.js';\nimport { createDynamicTools } from './agents/tools.js';\n\nimport { getDynamicWorkspace } from './agents/workspace.js';\nimport { AuthStorage } from './auth/storage.js';\nimport { HookManager } from './hooks/index.js';\nimport { createMcpManager } from './mcp/index.js';\nimport type { ProviderAccess } from './onboarding/packs.js';\nimport { getAvailableModePacks, getAvailableOmPacks } from './onboarding/packs.js';\nimport { loadSettings, resolveModelDefaults, resolveOmModel } from './onboarding/settings.js';\nimport { getToolCategory } from './permissions.js';\nimport { setAuthStorage } from './providers/claude-max.js';\nimport { setAuthStorage as setOpenAIAuthStorage } from './providers/openai-codex.js';\n\nimport { stateSchema } from './schema.js';\nimport {\n createViewTool,\n createGrepTool,\n createGlobTool,\n createExecuteCommandTool,\n createWriteFileTool,\n stringReplaceLspTool,\n} from './tools/index.js';\nimport { mastra } from './tui/theme.js';\nimport { syncGateways } from './utils/gateway-sync.js';\nimport { detectProject, getStorageConfig, getResourceIdOverride } from './utils/project.js';\nimport type { StorageConfig } from './utils/project.js';\nimport { createStorage } from './utils/storage-factory.js';\nimport { acquireThreadLock, releaseThreadLock } from './utils/thread-lock.js';\n\nconst PROVIDER_TO_OAUTH_ID: Record<string, string> = {\n anthropic: 'anthropic',\n openai: 'openai-codex',\n};\n\nexport interface MastraCodeConfig {\n /** Working directory for project detection. Default: process.cwd() */\n cwd?: string;\n /** Override modes (model IDs, colors, which modes exist). Default: build/plan/fast */\n modes?: HarnessMode[];\n /** Override or extend subagent definitions. Default: explore/plan/execute */\n subagents?: HarnessSubagent[];\n /** Extra tools merged into the dynamic tool set */\n extraTools?: Record<string, any>;\n /** Custom storage config instead of auto-detected default */\n storage?: StorageConfig;\n /** Initial state overrides (yolo, thinkingLevel, etc.) */\n initialState?: Record<string, unknown>;\n /** Override heartbeat handlers. Default: gateway-sync */\n heartbeatHandlers?: HeartbeatHandler[];\n /** Disable MCP server discovery. Default: false */\n disableMcp?: boolean;\n /** Disable hooks. Default: false */\n disableHooks?: boolean;\n}\n\nexport async function createMastraCode(config?: MastraCodeConfig) {\n const cwd = config?.cwd ?? process.cwd();\n\n // Auth storage (shared with Claude Max / OpenAI providers and Harness)\n const authStorage = new AuthStorage();\n setAuthStorage(authStorage);\n setOpenAIAuthStorage(authStorage);\n\n // Project detection\n const project = detectProject(cwd);\n\n const resourceIdOverride = getResourceIdOverride(project.rootPath);\n if (resourceIdOverride) {\n project.resourceId = resourceIdOverride;\n project.resourceIdOverride = true;\n }\n\n // Load global settings to resolve storage preferences (needed before storage creation)\n const globalSettings = loadSettings();\n\n // Storage\n const storageConfig = config?.storage ?? getStorageConfig(project.rootPath, globalSettings.storage);\n const storageResult = await createStorage(storageConfig);\n const storage = storageResult.storage;\n const storageWarning = storageResult.warning;\n\n const memory = getDynamicMemory(storage);\n\n // MCP\n const mcpManager = config?.disableMcp ? undefined : createMcpManager(project.rootPath);\n\n // Agent\n const codeAgentInstance = new Agent({\n id: 'code-agent',\n name: 'Code Agent',\n instructions: getDynamicInstructions,\n model: getDynamicModel,\n tools: createDynamicTools(mcpManager),\n });\n\n const mastraInstance = new Mastra({\n agents: { codeAgentInstance },\n logger: noopLogger,\n storage,\n });\n\n const codeAgent = mastraInstance.getAgent('codeAgentInstance');\n\n // Hooks\n const hookManager = config?.disableHooks ? undefined : new HookManager(project.rootPath, 'session-init');\n\n if (hookManager?.hasHooks()) {\n const hookConfig = hookManager.getConfig();\n const hookCount = Object.values(hookConfig).reduce((sum, hooks) => sum + (hooks?.length ?? 0), 0);\n console.info(`Hooks: ${hookCount} hook(s) configured`);\n }\n\n // Build subagent definitions with project-scoped tools\n const viewTool = createViewTool(project.rootPath);\n const grepTool = createGrepTool(project.rootPath);\n const globTool = createGlobTool(project.rootPath);\n const executeCommandTool = createExecuteCommandTool(project.rootPath);\n const writeFileTool = createWriteFileTool(project.rootPath);\n\n const readOnlyTools = {\n view: viewTool,\n search_content: grepTool,\n find_files: globTool,\n };\n\n const defaultSubagents: HarnessSubagent[] = [\n {\n id: exploreSubagent.id,\n name: exploreSubagent.name,\n description:\n \"Read-only codebase exploration. Use for questions like 'find all usages of X', 'how does module Y work'.\",\n instructions: exploreSubagent.instructions,\n tools: readOnlyTools,\n },\n {\n id: planSubagent.id,\n name: planSubagent.name,\n description:\n \"Read-only analysis and planning. Use for 'create an implementation plan for X', 'analyze the architecture of Y'.\",\n instructions: planSubagent.instructions,\n tools: readOnlyTools,\n },\n {\n id: executeSubagent.id,\n name: executeSubagent.name,\n description:\n \"Task execution with write capabilities. Use for 'implement feature X', 'fix bug Y', 'refactor module Z'.\",\n instructions: executeSubagent.instructions,\n tools: {\n ...readOnlyTools,\n string_replace_lsp: stringReplaceLspTool,\n write_file: writeFileTool,\n execute_command: executeCommandTool,\n task_write: taskWriteTool,\n task_check: taskCheckTool,\n },\n },\n ];\n\n const defaultModes: HarnessMode[] = [\n {\n id: 'build',\n name: 'Build',\n default: true,\n defaultModelId: 'anthropic/claude-opus-4-6',\n color: mastra.purple,\n agent: codeAgent,\n },\n {\n id: 'plan',\n name: 'Plan',\n defaultModelId: 'openai/gpt-5.2-codex',\n color: mastra.blue,\n agent: codeAgent,\n },\n {\n id: 'fast',\n name: 'Fast',\n defaultModelId: 'cerebras/zai-glm-4.7',\n color: mastra.green,\n agent: codeAgent,\n },\n ];\n\n const defaultHeartbeatHandlers: HeartbeatHandler[] = [\n {\n id: 'gateway-sync',\n intervalMs: 5 * 60 * 1000,\n handler: () => syncGateways(),\n },\n ];\n\n // Build lightweight provider access for resolving built-in packs at startup.\n // OAuth providers are checked via authStorage, env-only providers via process.env.\n const startupAccess: ProviderAccess = {\n anthropic: authStorage.isLoggedIn('anthropic') ? 'oauth' : process.env.ANTHROPIC_API_KEY ? 'apikey' : false,\n openai: authStorage.isLoggedIn('openai-codex') ? 'oauth' : process.env.OPENAI_API_KEY ? 'apikey' : false,\n cerebras: process.env.CEREBRAS_API_KEY ? 'apikey' : false,\n google: process.env.GOOGLE_GENERATIVE_AI_API_KEY ? 'apikey' : false,\n deepseek: process.env.DEEPSEEK_API_KEY ? 'apikey' : false,\n };\n const builtinPacks = getAvailableModePacks(startupAccess);\n const builtinOmPacks = getAvailableOmPacks(startupAccess);\n const effectiveDefaults = resolveModelDefaults(globalSettings, builtinPacks);\n const effectiveOmModel = resolveOmModel(globalSettings, builtinOmPacks);\n\n // Apply resolved model defaults to modes\n const modes = (config?.modes ?? defaultModes).map(mode => {\n const savedModel = effectiveDefaults[mode.id];\n return savedModel ? { ...mode, defaultModelId: savedModel } : mode;\n });\n\n // Map subagent types to mode models: explore→fast, plan→plan, execute→build\n const subagentModeMap: Record<string, string> = { explore: 'fast', plan: 'plan', execute: 'build' };\n const subagents = (config?.subagents ?? defaultSubagents).map(sa => {\n const modeId = subagentModeMap[sa.id];\n const model = modeId ? effectiveDefaults[modeId] : undefined;\n return model ? { ...sa, defaultModelId: model } : sa;\n });\n\n // Build initial state with global preferences\n const globalInitialState: Record<string, unknown> = {};\n if (effectiveOmModel) {\n globalInitialState.observerModelId = effectiveOmModel;\n globalInitialState.reflectorModelId = effectiveOmModel;\n }\n if (globalSettings.preferences.yolo !== null) {\n globalInitialState.yolo = globalSettings.preferences.yolo;\n }\n // Seed subagent models from global settings\n for (const [key, modelId] of Object.entries(globalSettings.models.subagentModels)) {\n if (key === '_default') {\n globalInitialState.subagentModelId = modelId;\n } else {\n globalInitialState[`subagentModelId_${key}`] = modelId;\n }\n }\n\n const harness = new Harness({\n id: 'mastra-code',\n resourceId: project.resourceId,\n storage,\n memory,\n stateSchema,\n subagents,\n resolveModel,\n toolCategoryResolver: getToolCategory,\n initialState: {\n projectPath: project.rootPath,\n projectName: project.name,\n gitBranch: project.gitBranch,\n yolo: true,\n ...globalInitialState,\n ...config?.initialState,\n },\n workspace: getDynamicWorkspace,\n modes,\n heartbeatHandlers: config?.heartbeatHandlers ?? defaultHeartbeatHandlers,\n modelAuthChecker: provider => {\n const oauthId = PROVIDER_TO_OAUTH_ID[provider];\n if (oauthId && authStorage.isLoggedIn(oauthId)) {\n return true;\n }\n return undefined;\n },\n modelUseCountProvider: () => loadSettings().modelUseCounts,\n threadLock: {\n acquire: acquireThreadLock,\n release: releaseThreadLock,\n },\n });\n\n // Sync hookManager session ID on thread changes\n if (hookManager) {\n harness.subscribe(event => {\n if (event.type === 'thread_changed') {\n hookManager.setSessionId(event.threadId);\n } else if (event.type === 'thread_created') {\n hookManager.setSessionId(event.thread.id);\n }\n });\n }\n\n return { harness, mcpManager, hookManager, authStorage, storageWarning };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/permissions.ts"],"names":[],"mappings":"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","file":"chunk-MT3YCFCC.cjs","sourcesContent":["/**\n * Granular tool permission system.\n *\n * Tools are classified into categories by risk level.\n * Each category has a configurable policy: \"allow\", \"ask\", or \"deny\".\n * Session-scoped grants let the user approve a category once per session.\n */\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp';\n\nexport const TOOL_CATEGORIES: Record<ToolCategory, { label: string; description: string }> = {\n read: {\n label: 'Read',\n description: 'Read files, search, list directories',\n },\n edit: {\n label: 'Edit',\n description: 'Create, modify, or delete files',\n },\n execute: {\n label: 'Execute',\n description: 'Run shell commands',\n },\n mcp: {\n label: 'MCP',\n description: 'External MCP server tools',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Tool → Category mapping\n// ---------------------------------------------------------------------------\n\nconst TOOL_CATEGORY_MAP: Record<string, ToolCategory> = {\n // Read-only tools — always safe\n view: 'read',\n search_content: 'read',\n find_files: 'read',\n web_search: 'read',\n 'web-search': 'read',\n web_extract: 'read',\n 'web-extract': 'read',\n // Edit tools — modify files\n string_replace_lsp: 'edit',\n ast_smart_edit: 'edit',\n write_file: 'edit',\n subagent: 'edit',\n\n // Execute tools — run arbitrary commands\n execute_command: 'execute',\n\n // Interactive / planning tools — always allowed (no category needed)\n // ask_user, task_write, task_check, submit_plan, request_sandbox_access\n};\n\n// Tools that never need approval regardless of policy\nconst ALWAYS_ALLOW_TOOLS = new Set(['ask_user', 'task_write', 'task_check', 'submit_plan', 'request_sandbox_access']);\n\n/**\n * Get the category for a tool, or null if the tool is always-allowed.\n */\nexport function getToolCategory(toolName: string): ToolCategory | null {\n if (ALWAYS_ALLOW_TOOLS.has(toolName)) return null;\n return TOOL_CATEGORY_MAP[toolName] ?? 'mcp';\n}\n\n/**\n * Get the list of known tools for a given category.\n */\nexport function getToolsForCategory(category: ToolCategory): string[] {\n return Object.entries(TOOL_CATEGORY_MAP)\n .filter(([, cat]) => cat === category)\n .map(([tool]) => tool);\n}\n\n// ---------------------------------------------------------------------------\n// Policies\n// ---------------------------------------------------------------------------\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport interface PermissionRules {\n /** Policy per category. Missing categories default to their DEFAULT_POLICIES value. */\n categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n /** Per-tool overrides. Tool name → policy. Takes precedence over category. */\n tools: Record<string, PermissionPolicy>;\n}\n\n/** Default policies when no rules are configured (YOLO=false equivalent). */\nexport const DEFAULT_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'ask',\n execute: 'ask',\n mcp: 'ask',\n};\n\n/** YOLO-mode policies — everything auto-allowed. */\nexport const YOLO_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'allow',\n execute: 'allow',\n mcp: 'allow',\n};\n\nexport function createDefaultRules(): PermissionRules {\n return {\n categories: { ...DEFAULT_POLICIES },\n tools: {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// Session grants — temporary \"always allow\" for this session\n// ---------------------------------------------------------------------------\n\nexport class SessionGrants {\n private grantedCategories = new Set<ToolCategory>();\n private grantedTools = new Set<string>();\n\n allowCategory(category: ToolCategory): void {\n this.grantedCategories.add(category);\n }\n\n allowTool(toolName: string): void {\n this.grantedTools.add(toolName);\n }\n\n isGranted(toolName: string, category: ToolCategory): boolean {\n return this.grantedTools.has(toolName) || this.grantedCategories.has(category);\n }\n\n reset(): void {\n this.grantedCategories.clear();\n this.grantedTools.clear();\n }\n\n getGrantedCategories(): ToolCategory[] {\n return [...this.grantedCategories];\n }\n\n getGrantedTools(): string[] {\n return [...this.grantedTools];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Decision engine\n// ---------------------------------------------------------------------------\n\nexport type ApprovalDecision = 'allow' | 'ask' | 'deny';\n\n/**\n * Determine whether a tool call should be allowed, prompted, or denied.\n *\n * Priority order:\n * 1. Always-allowed tools (ask_user, task_write, etc.) → allow\n * 2. Per-tool policy override → use that policy\n * 3. Session grants (user said \"always allow\" during this session) → allow\n * 4. Category policy → use that policy\n * 5. Fallback → \"ask\"\n */\nexport function resolveApproval(\n toolName: string,\n rules: PermissionRules,\n sessionGrants: SessionGrants,\n): ApprovalDecision {\n // 1. Always-allowed tools\n const category = getToolCategory(toolName);\n if (category === null) return 'allow';\n\n // 2. Per-tool override\n const toolPolicy = rules.tools[toolName];\n if (toolPolicy) return toolPolicy;\n\n // 3. Session grants\n if (sessionGrants.isGranted(toolName, category)) return 'allow';\n\n // 4. Category policy\n const categoryPolicy = rules.categories[category];\n if (categoryPolicy) return categoryPolicy;\n\n // 5. Default policy for category\n return DEFAULT_POLICIES[category] ?? 'ask';\n}\n"]}
|