@easynet/agent-tool 1.0.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.
Files changed (157) hide show
  1. package/README.md +103 -0
  2. package/dist/chunk-3YLVPZRJ.cjs +32 -0
  3. package/dist/chunk-3YLVPZRJ.cjs.map +1 -0
  4. package/dist/chunk-AXUNV4MK.js +28 -0
  5. package/dist/chunk-AXUNV4MK.js.map +1 -0
  6. package/dist/chunk-BM4EVYI5.js +1069 -0
  7. package/dist/chunk-BM4EVYI5.js.map +1 -0
  8. package/dist/chunk-P3UEAZHK.cjs +171 -0
  9. package/dist/chunk-P3UEAZHK.cjs.map +1 -0
  10. package/dist/chunk-RPAMQCFH.js +167 -0
  11. package/dist/chunk-RPAMQCFH.js.map +1 -0
  12. package/dist/chunk-Z7TGIG77.cjs +1108 -0
  13. package/dist/chunk-Z7TGIG77.cjs.map +1 -0
  14. package/dist/cli.cjs +154 -0
  15. package/dist/cli.cjs.map +1 -0
  16. package/dist/cli.d.ts +10 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +147 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/codegen/build.d.ts +23 -0
  21. package/dist/codegen/build.d.ts.map +1 -0
  22. package/dist/codegen/generator.d.ts +15 -0
  23. package/dist/codegen/generator.d.ts.map +1 -0
  24. package/dist/codegen/index.d.ts +21 -0
  25. package/dist/codegen/index.d.ts.map +1 -0
  26. package/dist/codegen/init.d.ts +17 -0
  27. package/dist/codegen/init.d.ts.map +1 -0
  28. package/dist/codegen/run.d.ts +19 -0
  29. package/dist/codegen/run.d.ts.map +1 -0
  30. package/dist/codegen/scan/scanN8n.d.ts +17 -0
  31. package/dist/codegen/scan/scanN8n.d.ts.map +1 -0
  32. package/dist/codegen/scan/scanSkill.d.ts +17 -0
  33. package/dist/codegen/scan/scanSkill.d.ts.map +1 -0
  34. package/dist/codegen/scan/scanTools.d.ts +31 -0
  35. package/dist/codegen/scan/scanTools.d.ts.map +1 -0
  36. package/dist/codegen/scan/scanner.d.ts +26 -0
  37. package/dist/codegen/scan/scanner.d.ts.map +1 -0
  38. package/dist/codegen/scan/schemaFromTs.d.ts +16 -0
  39. package/dist/codegen/scan/schemaFromTs.d.ts.map +1 -0
  40. package/dist/codegen/types.d.ts +81 -0
  41. package/dist/codegen/types.d.ts.map +1 -0
  42. package/dist/core.cjs +20 -0
  43. package/dist/core.cjs.map +1 -0
  44. package/dist/core.d.ts +8 -0
  45. package/dist/core.d.ts.map +1 -0
  46. package/dist/core.js +3 -0
  47. package/dist/core.js.map +1 -0
  48. package/dist/discovery/MCPProcessManager.d.ts +57 -0
  49. package/dist/discovery/MCPProcessManager.d.ts.map +1 -0
  50. package/dist/discovery/errors.d.ts +13 -0
  51. package/dist/discovery/errors.d.ts.map +1 -0
  52. package/dist/discovery/load/LangChainLoader.d.ts +7 -0
  53. package/dist/discovery/load/LangChainLoader.d.ts.map +1 -0
  54. package/dist/discovery/load/MCPLoader.d.ts +8 -0
  55. package/dist/discovery/load/MCPLoader.d.ts.map +1 -0
  56. package/dist/discovery/load/N8nLoader.d.ts +25 -0
  57. package/dist/discovery/load/N8nLoader.d.ts.map +1 -0
  58. package/dist/discovery/load/SkillLoader.d.ts +20 -0
  59. package/dist/discovery/load/SkillLoader.d.ts.map +1 -0
  60. package/dist/discovery/load/SkillManifest.d.ts +79 -0
  61. package/dist/discovery/load/SkillManifest.d.ts.map +1 -0
  62. package/dist/discovery/load/SkillMdParser.d.ts +31 -0
  63. package/dist/discovery/load/SkillMdParser.d.ts.map +1 -0
  64. package/dist/discovery/load/index.d.ts +6 -0
  65. package/dist/discovery/load/index.d.ts.map +1 -0
  66. package/dist/discovery/load/resolveEntry.d.ts +7 -0
  67. package/dist/discovery/load/resolveEntry.d.ts.map +1 -0
  68. package/dist/discovery/scan/DirectoryScanner.d.ts +37 -0
  69. package/dist/discovery/scan/DirectoryScanner.d.ts.map +1 -0
  70. package/dist/discovery/scan/scanUtil.d.ts +16 -0
  71. package/dist/discovery/scan/scanUtil.d.ts.map +1 -0
  72. package/dist/discovery/types.d.ts +99 -0
  73. package/dist/discovery/types.d.ts.map +1 -0
  74. package/dist/index.cjs +3014 -0
  75. package/dist/index.cjs.map +1 -0
  76. package/dist/index.d.ts +68 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +2778 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/llm/AgentLLMAdapter.d.ts +27 -0
  81. package/dist/llm/AgentLLMAdapter.d.ts.map +1 -0
  82. package/dist/llm/LangChainToolsHub.d.ts +31 -0
  83. package/dist/llm/LangChainToolsHub.d.ts.map +1 -0
  84. package/dist/llm/OpenAICompatibleClient.d.ts +64 -0
  85. package/dist/llm/OpenAICompatibleClient.d.ts.map +1 -0
  86. package/dist/llm/ReActAgent.d.ts +35 -0
  87. package/dist/llm/ReActAgent.d.ts.map +1 -0
  88. package/dist/llm-export.cjs +20 -0
  89. package/dist/llm-export.cjs.map +1 -0
  90. package/dist/llm-export.d.ts +9 -0
  91. package/dist/llm-export.d.ts.map +1 -0
  92. package/dist/llm-export.js +3 -0
  93. package/dist/llm-export.js.map +1 -0
  94. package/dist/mcp/MCPClientAdapter.d.ts +34 -0
  95. package/dist/mcp/MCPClientAdapter.d.ts.map +1 -0
  96. package/dist/mcp/connectMCP.d.ts +47 -0
  97. package/dist/mcp/connectMCP.d.ts.map +1 -0
  98. package/dist/mcp/index.d.ts +10 -0
  99. package/dist/mcp/index.d.ts.map +1 -0
  100. package/dist/mcp/registerMCPTools.d.ts +24 -0
  101. package/dist/mcp/registerMCPTools.d.ts.map +1 -0
  102. package/dist/observability/EventLog.d.ts +60 -0
  103. package/dist/observability/EventLog.d.ts.map +1 -0
  104. package/dist/observability/Logger.d.ts +33 -0
  105. package/dist/observability/Logger.d.ts.map +1 -0
  106. package/dist/observability/Metrics.d.ts +70 -0
  107. package/dist/observability/Metrics.d.ts.map +1 -0
  108. package/dist/observability/Tracing.d.ts +69 -0
  109. package/dist/observability/Tracing.d.ts.map +1 -0
  110. package/dist/registry/ToolRegistry.d.ts +68 -0
  111. package/dist/registry/ToolRegistry.d.ts.map +1 -0
  112. package/dist/report/AgentReportGenerator.d.ts +53 -0
  113. package/dist/report/AgentReportGenerator.d.ts.map +1 -0
  114. package/dist/report/agent-report-template.html +362 -0
  115. package/dist/report/index.d.ts +3 -0
  116. package/dist/report/index.d.ts.map +1 -0
  117. package/dist/report/types.d.ts +101 -0
  118. package/dist/report/types.d.ts.map +1 -0
  119. package/dist/runAgent.d.ts +37 -0
  120. package/dist/runAgent.d.ts.map +1 -0
  121. package/dist/runtime/Budget.d.ts +63 -0
  122. package/dist/runtime/Budget.d.ts.map +1 -0
  123. package/dist/runtime/Evidence.d.ts +19 -0
  124. package/dist/runtime/Evidence.d.ts.map +1 -0
  125. package/dist/runtime/PTCRuntime.d.ts +115 -0
  126. package/dist/runtime/PTCRuntime.d.ts.map +1 -0
  127. package/dist/runtime/PTCRuntimeObservability.d.ts +26 -0
  128. package/dist/runtime/PTCRuntimeObservability.d.ts.map +1 -0
  129. package/dist/runtime/PTCRuntimePipeline.d.ts +62 -0
  130. package/dist/runtime/PTCRuntimePipeline.d.ts.map +1 -0
  131. package/dist/runtime/PolicyEngine.d.ts +67 -0
  132. package/dist/runtime/PolicyEngine.d.ts.map +1 -0
  133. package/dist/runtime/Retry.d.ts +33 -0
  134. package/dist/runtime/Retry.d.ts.map +1 -0
  135. package/dist/runtime/SchemaValidator.d.ts +42 -0
  136. package/dist/runtime/SchemaValidator.d.ts.map +1 -0
  137. package/dist/templates/mcp-server.js +48 -0
  138. package/dist/templates/n8n-invoker.js +11 -0
  139. package/dist/templates/skill-invoker.js +11 -0
  140. package/dist/templates/tool-index.js +9 -0
  141. package/dist/toolDescriptor.d.ts +38 -0
  142. package/dist/toolDescriptor.d.ts.map +1 -0
  143. package/dist/types/Events.d.ts +99 -0
  144. package/dist/types/Events.d.ts.map +1 -0
  145. package/dist/types/ToolIntent.d.ts +40 -0
  146. package/dist/types/ToolIntent.d.ts.map +1 -0
  147. package/dist/types/ToolResult.d.ts +30 -0
  148. package/dist/types/ToolResult.d.ts.map +1 -0
  149. package/dist/types/ToolSpec.d.ts +99 -0
  150. package/dist/types/ToolSpec.d.ts.map +1 -0
  151. package/dist/types/index.d.ts +6 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/extensions/examples/README.md +40 -0
  154. package/extensions/examples/scripts/agent-tool-react-stock.mjs +30 -0
  155. package/extensions/examples/tools/instruction-only/skill/SKILL.md +26 -0
  156. package/extensions/examples/tools/web-search/mcp/mcp.json +8 -0
  157. package/package.json +122 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/codegen/init.ts","../src/discovery/scan/scanUtil.ts","../src/codegen/scan/schemaFromTs.ts","../src/codegen/scan/scanner.ts","../src/discovery/load/SkillManifest.ts","../src/discovery/load/SkillMdParser.ts","../src/discovery/errors.ts","../src/codegen/scan/scanSkill.ts","../src/discovery/load/N8nLoader.ts","../src/codegen/scan/scanN8n.ts","../src/codegen/scan/scanTools.ts","../src/codegen/generator.ts","../src/codegen/build.ts","../src/codegen/run.ts"],"names":["path","fs","readdir","join","ts","path2","fs2","ts2","yaml","extname","relative","readFile","path3","basename","defaultInputSchema","path4","__dirname","path5","fileURLToPath","fs3","path6","path7","fs4","spawn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,SAAA,GAAY;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAchB,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA,CAAA;AAAA,EAKb,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EASb,eAAA,EAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAWjB,sBAAA,EAAwB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAQxB,6BAAA,EAA+B,CAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAAA,EAS/B,+BAAA,EAAiC,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAKjC,WAAA,EAAa,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAmBf,CAAA;AAMA,eAAsB,WAAA,CAAY,OAAA,GAAuB,EAAC,EAA4D;AACpH,EAAA,MAAM,aAAkBA,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,KAAK,CAAA;AACnE,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,MAASC,cAAA,CAAA,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAE9C,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAC9C,IAAA,MAASC,qBAAWD,gBAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,IAAA,IAAI;AACF,MAAA,MAASC,sBAAO,QAAQ,CAAA;AACxB,MAAA,IAAI,YAAY,cAAA,EAAgB;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAASA,cAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AACpC;AC5GA,eAAsB,sBAAA,CACpB,UACA,QAAA,EACmB;AACnB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,KAAK,CAAA;AACnD,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,mBAAA,CACb,GAAA,EACA,QAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,MAAMC,WAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AACpD,IAAA,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACtB,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAA,EAAa,EAAE,WAAA,EAAY;AAAA,MAC3B,MAAA,EAAQ,EAAE,MAAA;AAAO,KACnB,CAAE,CAAA;AAAA,EACJ,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AACxD,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,IAAA,KAAS,kBAAkB,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACrF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,oBAAoBC,UAAAA,CAAK,GAAA,EAAK,MAAM,IAAI,CAAA,EAAG,UAAU,KAAK,CAAA;AAAA,EAClE;AACF;AAOO,SAAS,cAAA,CAAe,YAAoB,WAAA,EAA6B;AAC9E,EAAA,MAAM,UAAA,GAAa,WAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,4BAA4B,EAAE,CAAA;AACzC,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,WAAA;AAClC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AACnC;ACpDO,SAAS,+BAAA,CACd,IAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,2BAAA,CAA4B,IAA+B,CAAA;AACnF,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAA,GAAS,uDAAuD,CAAA;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,oBAAA,EAAsB,IAAA,EAAK;AAAA,EACtD;AACA,EAAA,IAAI,UAAA,GAAa,WAAA,CAAY,wBAAA,CAAyB,GAAG,CAAA;AAEzD,EAAA,IAAI,UAAA,CAAW,SAAA,IAAY,EAAG,OAAA,OAAc,SAAA,EAAW;AACrD,IAAA,MAAM,WAAY,UAAA,CAAgC,aAAA;AAClD,IAAA,IAAI,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,GAAa,SAAS,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAC/D,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IACjB,OAAkD,IAAA,KAAS,QAAA,IAC5D,MAAA,CAAO,IAAA,CAAM,MAAA,CAAmC,UAAA,IAAc,EAAE,EAAE,MAAA,GAAS,CAAA;AAC7E,EAAA,OAAO,WAAW,MAAA,GAAS,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA,EAAK;AAC1E;AAGO,SAAS,0BAAA,CACd,IAAA,EACA,WAAA,EACA,MAAA,EACwC;AACxC,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EACpE;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,IAAA,CAAuB,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9C,IAAA,MAAM,MAAO,KAAA,CAA2D,MAAA;AACxE,IAAA,MAAM,SAAA,GAAY,MACd,WAAA,CAAY,yBAAA,CAA0B,KAAK,KAAK,CAAA,GAChD,WAAA,CAAY,iBAAA,CAAkB,KAAK,CAAA;AACvC,IAAA,MAAM,aAAa,CAAC,CAAC,KAAA,CAAM,aAAA,IAAiB,MAAM,WAAA,KAAgB,MAAA;AAClE,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,EAAW,WAAA,EAAa,MAAM,CAAA;AAClE,IAAA,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA;AACnB,IAAA,IAAI,CAAC,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA;AAAA,MACA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC,KAC5C;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,QAAWC,cAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AACzD,EAAA,IAAI,QAAWA,cAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AACzD,EAAA,IAAI,QAAWA,cAAA,CAAA,SAAA,CAAU,OAAA,EAAS,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3D,EAAA,IAAI,QAAWA,cAAA,CAAA,SAAA,CAAU,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACrD,EAAA,IAAI,QAAWA,cAAA,CAAA,SAAA,CAAU,SAAA,IAAa,QAAWA,cAAA,CAAA,SAAA,CAAU,IAAA,SAAa,EAAC;AACzE,EAAA,IAAI,KAAA,GAAWA,cAAA,CAAA,SAAA,CAAU,GAAA,IAAO,KAAA,GAAWA,yBAAU,OAAA,EAAS;AAC5D,IAAA,MAAA,GAAS,CAAA,iDAAA,CAAmD,CAAA;AAC5D,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,IAAA,CAAK,WAAU,EAAG;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAAA,MACzB,CAAC,CAAA,KAAM,EAAE,CAAA,CAAE,KAAA,GAAWA,yBAAU,SAAA,CAAA,IAAc,EAAE,CAAA,CAAE,KAAA,GAAWA,cAAA,CAAA,SAAA,CAAU,IAAA;AAAA,KACzE;AACA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG,OAAO,iBAAiB,YAAA,CAAa,CAAC,CAAA,EAAI,WAAA,EAAa,MAAM,CAAA;AAC5F,IAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAAA,EACzC;AAEA,EAAA,IAAI,WAAA,CAAY,WAAA,CAAY,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,WAAW,OAAA,CAAQ,aAAA;AACzB,IAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,IAAA,MAAM,QAAQ,QAAA,GAAW,gBAAA,CAAiB,UAAU,WAAA,EAAa,MAAM,IAAI,EAAC;AAC5E,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,KAAA,GAAQ,EAAC,EAAE;AAAA,EACxE;AAEA,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,YAAA,CAAa,IAAI,CAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC9C,EAAA,IAAI,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC9C,EAAA,IAAI,GAAA,KAAQ,SAAA,EAAW,OAAO,EAAE,MAAM,SAAA,EAAU;AAChD,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACpC,IAAA,MAAM,QAAA,GACJ,KAAA,KAAU,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAkB,GAAI,KAAA,KAAU,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,KAAsB,EAAC;AACzG,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,EAC1C;AAEA,EAAA,IAAI,KAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,EAAc,CAAE,UAAU,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,KAAK,aAAA,EAAc;AACjC,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,OAAO,CAAA,CAAE,gBAAA;AACf,MAAA,MAAM,QAAA,GAAW,IAAA,GACb,WAAA,CAAY,iBAAA,CAAkB,IAAI,IAClC,WAAA,CAAY,yBAAA,CAA0B,CAAA,EAAI,CAAA,CAA+C,gBAAgB,CAAA;AAC7G,MAAA,MAAM,QAAA,GAAW,QAAWA,cAAA,CAAA,mBAAA,CAAoB,IAAI,IAAI,CAAC,CAAC,KAAK,aAAA,GAAgB,KAAA;AAC/E,MAAA,UAAA,CAAW,EAAE,IAAI,CAAA,GAAI,gBAAA,CAAiB,QAAA,EAAU,aAAa,MAAM,CAAA;AACnE,MAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,GAAI,QAAA,CAAS,MAAA,GAAS,EAAE,QAAA,EAAS,GAAI,EAAC,EAAG;AAAA,EAChF;AAEA,EAAA,MAAA,GAAS,CAAA,kBAAA,EAAqB,GAAG,CAAA,cAAA,CAAgB,CAAA;AACjD,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;;;ACxHA,IAAM,QAAA,GAAW,OAAA;AAEjB,IAAM,aAAA,GAA8B,CAAC,MAAA,EAAQ,aAAA,EAAe,kBAAkB,aAAa,CAAA;AAWpF,SAAS,aAAa,OAAA,EAId;AACb,EAAA,MAAM,WAAA,GAAmBC,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA;AACpD,EAAA,MAAM,YAAA,GACJ,OAAA,CAAQ,YAAA,IAAqBA,gBAAA,CAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,CAAC,SAAS,CAAA;AAC7C,EAAA,MAAM,SAAmD,EAAC;AAC1D,EAAA,MAAM,WAAqD,EAAC;AAE5D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,kBAAA,GAA0BA,gBAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,YAAY,CAAA;AAC/D,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,IAAA,kBAAA,GAA0BD,gBAAA,CAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAAA,EAC7D;AACA,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACrC,IAAA,MAAM,UAAA,GAAgBC,cAAA,CAAA,cAAA,CAAe,kBAAA,EAAuBA,cAAA,CAAA,GAAA,CAAI,QAAQ,CAAA;AACxE,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,OAAO,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA,EAAG,CAAA;AACvF,MAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,QAAQ,QAAA,EAAS;AAAA,IACvC;AACA,IAAA,MAAM,MAAA,GAAYA,cAAA,CAAA,0BAAA;AAAA,MAChB,UAAA,CAAW,MAAA;AAAA,MACRA,cAAA,CAAA,GAAA;AAAA,MACEF,yBAAQ,kBAAkB;AAAA,KACjC;AACA,IAAA,IAAI,MAAA,CAAO,OAAO,MAAA,EAAQ;AACxB,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAA,IAAY,UAAA,EAAY,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,WAAW,CAAA,EAAG,CAAA;AAAA,MACtF;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,QAAQ,QAAA,EAAS;AAAA,IACvC;AACA,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAA,GAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,QAAWE,cAAA,CAAA,YAAA,CAAa,MAAA;AAAA,QACxB,QAAWA,cAAA,CAAA,UAAA,CAAW,MAAA;AAAA,QACtB,kBAAqBA,cAAA,CAAA,oBAAA,CAAqB,QAAA;AAAA,QAC1C,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,IAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,SAAA,EAAW,WAAA,CAAY,WAAA,EAAa,OAAO,CAAA;AAAA,MAC3C,QAAQ;AAAC,KACX;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,aAAA,CAAc,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,EAAe;AAC3C,EAAA,MAAM,QAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,UAAA,IAAc,OAAA,CAAQ,cAAA,EAAe,EAAG;AACjD,IAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,IAAA,IAAI,SAAS,QAAA,CAAS,cAAc,KAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AACrE,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAWF,gBAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAWA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,EAAG;AAE/E,IAAGE,cAAA,CAAA,YAAA,CAAa,UAAA,EAAY,CAAC,IAAA,KAAS;AACpC,MAAA,MAAM,IAAA,GAAO,8BAAA,CAA+B,IAAgB,CAAA;AAC5D,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,MAAA,MAAM,KAAA,GAAQ,iBAAiB,IAAI,CAAA;AAEnC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,KAAW,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA,KAAA,EAAQ,IAAI,+CAA+C,CAAA;AAAA,MACtG;AACA,MAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AAEjC,MAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAG,IAAI,CAAA;AAC5F,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,0BAAA,CAA2B,IAAA,EAAM,aAAa,MAAM,CAAA;AAEvE,MAAA,MAAM,cACJ,MAAA,CAAO,IAAA,CAAM,MAAA,CAAmC,UAAA,IAAc,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,GACvE,SACA,EAAE,IAAA,EAAM,QAAA,EAAmB,UAAA,EAAY,EAAC,EAAE;AAEhD,MAAA,MAAM,YAAA,GAAe,+BAAA,CAAgC,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAE9E,MAAA,MAAM,aAAkBF,gBAAA,CAAA,QAAA,CAAS,WAAA,EAAa,QAAQ,CAAA,IAAUA,0BAAS,QAAQ,CAAA;AACjF,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,EAAY,IAAI,CAAA;AAEhD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,WAAA,IAAe,QAAA,CAAS,IAAI,CAAA;AAAA,QACzC,WAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA,EAAO,EAAE,IAAA,EAAM,EAAE,YAAW,EAAE;AAAA,QAC9B,UAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AACnC;AAEA,SAAS,WAAA,CAAY,aAAqB,QAAA,EAA8B;AACtE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc;AACzB,IAAA,MAAM,GAAA,GAAWA,yBAAQ,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAYA,gBAAA,CAAA,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,GAAA;AAC1F,MAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAC7C,MAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAC/C,MAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAOA,wBAAS,QAAQ,CAAA,CAAE,MAAA,EAAO,MAAO,QAAQ,CAAA;AAAA,aAC3C,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,MAAM,MAAA,GAAcD,gBAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAC3C,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,YAAY,MAAM,CAAA;AACpD,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,YAAY,GAAA,EAAuB;AAC1C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAA,CAAK,GAAA,EAAK,CAAC,QAAA,KAAa;AACtB,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAUD,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EAC9F,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,4BAAY,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,WAAA,EAAa,MAAM,CAAC,CAAA;AAE/D,SAAS,IAAA,CAAK,KAAa,KAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,UAAaC,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,IAAA,GAAYD,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAClC,MAAA,IAAI,CAAA,CAAE,WAAA,EAAY,IAAK,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,WAAA,IACtD,CAAA,CAAE,MAAA,EAAO,EAAG,KAAA,CAAM,IAAI,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,8BAAA,CACP,MACA,WAAA,EACkG;AAClG,EAAA,IAAOE,cAAA,CAAA,qBAAA,CAAsB,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,EAAM;AAC/C,IAAA,MAAM,QAAA,GAAA,CAAeA,cAAA,CAAA,YAAA,CAAa,IAAI,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAYA,cAAA,CAAA,UAAA,CAAW,aAAa,CAAA;AACjG,IAAA,IAAI,QAAA,SAAiB,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ,EAAE;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAOA,cAAA,CAAA,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAChC,IAAA,MAAM,QAAA,GAAA,CAAeA,cAAA,CAAA,YAAA,CAAa,IAAI,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAYA,cAAA,CAAA,UAAA,CAAW,aAAa,CAAA;AACjG,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAc;AACpD,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,MAAA,IAAI,IAAA,IAAWA,cAAA,CAAA,eAAA,CAAgB,IAAI,CAAA,EAAG;AACpC,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAuB,OAAA,EAAQ;AAClD,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA,MAC5B;AACA,MAAA,IAAI,IAAA,IAAWA,cAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACzC,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAuB,OAAA,EAAQ;AAClD,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAkF;AACtG,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAOA,cAAA,CAAA,qBAAA,CAAsB,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA;AAClB,IAAA,IAAOA,cAAA,CAAA,yBAAA,CAA0B,EAAE,CAAA,IAAK,EAAA,CAAG,MAAA,IAAaA,mCAAoB,EAAA,CAAG,MAAM,CAAA,EAAG,OAAO,EAAA,CAAG,MAAA;AAAA,EACpG;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,IAAA,EAA2B;AACnD,EAAA,MAAM,GAAA,GAASA,uCAAwB,IAAI,CAAA;AAC3C,EAAA,OAAO,IAAI,MAAA,CAAO,CAAC,CAAA,KAAwBA,cAAA,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAA;AACvD;AAEA,SAAS,WAAW,IAAA,EAAwB;AAC1C,EAAA,MAAM,IAAA,GAAUA,4BAAa,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAoC,OAAA,EAAS,OAAA,EAAQ,IAAK,EAAA;AACxE,IAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAAA,EAC9B;AACA,EAAA,MAAM,GAAA,GAASA,uCAAwB,IAAI,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAOA,cAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,IAAA,GAAO,EAAE,WAAA,EAAY;AAC3B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,IAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,QAAoB,YAAA,EAA8B;AACxE,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAChD,MAAA,IAAI,SAAS,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,GAAG,OAAO,KAAA;AAAA,IAC9C;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,EAAO;AACzD,QAAA,MAAM,CAAA,GAAK,KAAA,CAA2B,IAAA,CAAK,IAAA,EAAK;AAChD,QAAA,IAAI,KAAK,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,GAAG,OAAO,CAAA;AAAA,MACtC;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,kCAAkC,CAAA;AAC3D,IAAA,IAAI,QAAQ,CAAC,CAAA,SAAU,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAA2B;AAC5C,EAAA,MAAM,IAAA,GAAUA,4BAAa,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAoC,OAAA,EAAS,OAAA,EAAQ,IAAK,EAAA;AACxE,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,UAAW,GAAA,CAA2B,OAAA;AAC5C,MAAA,MAAM,CAAA,GAAA,CAAK,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC1E,MAAA,IAAI,aAAA,CAAc,QAAA,CAAS,CAAe,CAAA,EAAG,OAAO,CAAA;AAAA,IACtD;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAASA,uCAAwB,IAAI,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAOA,cAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,IAAA,GAAO,EAAE,WAAA,EAAY;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AAC/C,MAAA,IAAI,KAAA,IAAS,cAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAe,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA;AAAA,IAC7E;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,EAAE,IAAA,EAAK;AACpF;;;AC7MO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACkBP,KAAAA,EACA,KAAA,EAChB,OAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,kBAAA,EAAqBA,KAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAJ7B,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAIA,IAAM,YAAA,GAAe,cAAA;AACrB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,sBAAA,GAAyB,IAAA;AAC/B,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,cAAA,GAAiB,CAAC,WAAA,EAAa,QAAQ,CAAA;AAC7C,IAAM,eAAA,GAAkB,oBAAA;AAMjB,SAAS,mBAAA,CACd,IACA,QAAA,EACgC;AAEhC,EAAA,IAAI,CAAC,EAAA,CAAG,IAAA,IAAQ,OAAO,EAAA,CAAG,SAAS,QAAA,EAAU;AAC3C,IAAA,MAAM,IAAI,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAQ,kBAAkB,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,GAAS,eAAA,EAAiB;AACpC,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,MAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,eAAe,CAAA,iBAAA,EAAoB,EAAA,CAAG,KAAK,MAAM,CAAA,CAAA;AAAA,KAC3E;AAAA,EACF;AACA,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,KAAK,UAAA,CAAW,GAAG,KAAK,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAQ,8BAA8B,CAAA;AAAA,EAC/E;AACA,EAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,QAAA;AAAA,QACA,MAAA;AAAA,QACA,sCAAsC,QAAQ,CAAA,CAAA;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,EAAA,CAAG,WAAA,IAAe,OAAO,EAAA,CAAG,gBAAgB,QAAA,EAAU;AACzD,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,WAAA,CAAY,MAAA,GAAS,sBAAA,EAAwB;AAClD,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA,CAAA,4BAAA,EAA+B,sBAAsB,CAAA,iBAAA,EAAoB,EAAA,CAAG,YAAY,MAAM,CAAA,CAAA;AAAA,KAChG;AAAA,EACF;AACA,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,EAAA,CAAG,WAAW,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAG,aAAA,IAAiB,IAAA,IAAQ,OAAO,EAAA,CAAG,kBAAkB,QAAA,EAAU;AACpE,IAAA,IAAI,EAAA,CAAG,aAAA,CAAc,MAAA,GAAS,wBAAA,EAA0B;AACtD,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,QAAA;AAAA,QACA,eAAA;AAAA,QACA,CAAA,8BAAA,EAAiC,wBAAwB,CAAA,iBAAA,EAAoB,EAAA,CAAG,cAAc,MAAM,CAAA,CAAA;AAAA,OACtG;AAAA,IACF;AAAA,EACF;AACF;AC9KA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO;AACtD,CAAC,CAAA;AACD,IAAM,yCAAyB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,WAAA,EAAa,MAAM,CAAC,CAAA;AAKnE,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,WAAW,CAAC,CAAA;AAiBjD,SAAS,YAAA,CACd,SACA,QAAA,EACyD;AACzD,EAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,EAAU;AAElC,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAC3C,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAClD,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAE9C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASQ,qBAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,IAAI,MAAA,IAAU,QAAQ,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzE,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,QAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,GAAA,GAAM,MAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA,6BAA6B,OAAO,CAAA;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AAC5D,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,WAAA,EAAa;AACzB,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA,CAAC,OAAO,kBAAA,GAAqB;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,EAAK,eAAe,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,GAAA,EAAK,eAAe,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAgC;AAAA,IACpC,IAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAI,OAAA,IAAW,EAAE,OAAA,EAAQ;AAAA,IACzB,GAAI,aAAA,IAAiB,EAAE,aAAA,EAAc;AAAA,IACrC,GAAI,YAAA,IAAgB,EAAE,YAAA,EAAa;AAAA,IACnC,GAAI,YAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,EAAE,QAAA;AAAS,GACjE;AACA,EAAA,mBAAA,CAAoB,aAAa,QAAQ,CAAA;AAEzC,EAAA,OAAO,EAAE,WAAA,EAAa,YAAA,EAAc,IAAA,EAAK;AAC3C;AAEA,SAAS,WAAA,CACP,GAAA,EACA,GAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,IAAI,GAAG,CAAA;AACjB,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,EAAA;AACtB,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,SAAA,EAAW,OAAO,OAAO,CAAC,CAAA;AACpE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACpB,IAAA,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA,CAAO,CAAC,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,QAAA;AAAA,MACA,aAAA;AAAA,MACA,sBAAsB,GAAG,CAAA,6CAAA;AAAA,KAC3B;AAAA,EACF;AACA,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;AAMA,SAAS,kBAAkB,GAAA,EAAkD;AAC3E,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,MAAA;AACxB,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAClD,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAA,IAAa,MAAM,IAAA,EAAM;AAC1D,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,OAAO,CAAA,KAAM,QAAA,GAAW,KAAK,SAAA,CAAU,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,GAAA,GAAM,MAAA;AAAA,EACzC;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,OAAO,QAAQ,QAAA,IAAY,OAAO,QAAQ,SAAA,EAAW;AAClF,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAOA,eAAsB,mBAAmB,OAAA,EAA2C;AAClF,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,MAAM,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,SAAS,CAAA;AACzC,EAAA,OAAO,SAAA;AACT;AAEA,eAAe,OAAA,CACb,QAAA,EACA,WAAA,EACA,SAAA,EACe;AACf,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMN,WAAAA,CAAQ,WAAA,EAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWC,UAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,IAAI,CAAA;AAE7C,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AAEvB,MAAA,IAAI,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,CAAM,SAAS,cAAA,EAAgB;AAC/D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AAEzB,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAMM,aAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,WAAA,EAAY;AAC5C,MAAA,MAAM,OAAA,GAAUC,cAAAA,CAAS,QAAA,EAAU,QAAQ,CAAA;AAE3C,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,YAAA,EAAc,OAAA;AAAA,QACd,YAAA,EAAc,QAAA;AAAA,QACd,SAAA,EAAW,GAAA;AAAA,QACX,IAAA,EAAM,kBAAkB,GAAG;AAAA,OAC5B,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAoC;AAC7D,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,MAAA;AACrC,EAAA,IAAI,sBAAA,CAAuB,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,cAAA;AAC5C,EAAA,OAAO,MAAA;AACT;AAMA,eAAsB,oBAAoB,OAAA,EAA2C;AACnF,EAAA,MAAM,WAAA,GAAcP,UAAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAE5C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMQ,YAAA,CAAS,WAAA,EAAa,OAAO,CAAA;AAAA,EAC/C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,WAAA;AAAA,MACA,MAAA;AAAA,MACA,CAAA,sBAAA,EAA0B,IAAc,OAAO,CAAA;AAAA,KACjD;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAa,GAAI,YAAA,CAAa,SAAS,WAAW,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,OAAO,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC9OO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,EAE/B,OAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAET,WAAA,CACE,OAAA,EACA,KAAA,EACA,OAAA,EACA,KAAA,EACA;AACA,IAAA,KAAA,CAAM,IAAI,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;ACRA,IAAM,kBAAA,GAAqB,EAAE,IAAA,EAAM,QAAA,EAAmB,YAAY,EAAC,EAAG,sBAAsB,IAAA,EAAK;AAKjG,eAAsB,aAAa,WAAA,EAA+C;AAChF,EAAA,MAAM,WAAA,GAAmBC,yBAAQ,WAAW,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,WAAA,EAAa,UAAU,CAAA;AAEjE,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,SAAkD,EAAC;AAEzD,EAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,IAAA,MAAM,eAAoBA,gBAAA,CAAA,QAAA,CAAS,WAAA,EAAa,OAAO,CAAA,IAAUA,0BAAS,OAAO,CAAA;AACjF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAClD,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,YAAA,EAAc,QAAA,CAAS,YAAY,IAAI,CAAA;AACnE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,IAAA;AAAA,QACA,WAAA,EAAa,SAAS,WAAA,CAAY,WAAA;AAAA,QAClC,WAAA,EAAa,kBAAA;AAAA,QACb,OAAO,EAAE,IAAA,EAAM,EAAE,UAAA,EAAY,QAAO,EAAE;AAAA,QACtC,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,GAAG;AAAA,OAC5C,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,YAAA,EAAc,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AC7BA,eAAsB,gBAAA,CACpB,OAAA,EACA,gBAAA,GAA2B,eAAA,EACJ;AACvB,EAAA,MAAM,YAAA,GAAeT,UAAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AACnD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMQ,YAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,OAAA;AAAA,MACA,MAAA;AAAA,MACA,4BAA4B,YAAY,CAAA,CAAA;AAAA,MACxC;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI;AACF,IAAA,WAAA,GAAc,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC9B,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,OAAA;AAAA,MACA,MAAA;AAAA,MACA,mBAAmB,YAAY,CAAA,CAAA;AAAA,MAC/B;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,YAAY,KAAA,IAAS,CAAC,MAAM,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,EAAG;AAC3D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,OAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAA,uCAAA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,EAAA,MAAM,OACH,WAAA,CAAY,IAAA,IACZ,IAAA,EAAM,IAAA,IACPE,eAAS,OAAO,CAAA;AAClB,EAAA,MAAM,cACH,WAAA,CAAY,WAAA,IACZ,IAAA,EAAM,WAAA,IACP,iBAAiB,IAAI,CAAA,CAAA;AACvB,EAAA,IAAI,UAAA;AACJ,EAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AAAA,MACxB,CAAC,MACC,CAAA,CAAE,IAAA,KAAS,4BAA6B,CAAA,CAAE,IAAA,EAAiB,SAAS,SAAS;AAAA,KACjF;AACA,IAAA,IAAI,WAAA,EAAa,UAAA,IAAc,OAAO,WAAA,CAAY,eAAe,QAAA,EAAU;AACzE,MAAA,MAAM,SAAS,WAAA,CAAY,UAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,WAAA;AACtC,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7D,QAAA,UAAA,GAAa,OAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,WAAA,EAAY;AACtD;AAYA,eAAsB,WAAA,CACpB,SACA,QAAA,EACqB;AACrB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,gBAAA;AAAA,IAC5B,OAAA;AAAA,IACA,SAAS,UAAA,IAAc;AAAA,GACzB;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,WAAA,EAAY;AAC1C;;;AClFA,IAAMC,mBAAAA,GAAqB,EAAE,IAAA,EAAM,QAAA,EAAmB,YAAY,EAAC,EAAG,sBAAsB,IAAA,EAAK;AAKjG,eAAsB,WAAW,WAAA,EAA6C;AAC5E,EAAA,MAAM,WAAA,GAAmBC,yBAAQ,WAAW,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,WAAA,EAAa,eAAe,CAAA;AAEtE,EAAA,MAAM,MAAqB,EAAC;AAC5B,EAAA,MAAM,SAAkD,EAAC;AAEzD,EAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,IAAA,MAAM,eAAoBA,gBAAA,CAAA,QAAA,CAAS,WAAA,EAAa,OAAO,CAAA,IAAUA,0BAAS,OAAO,CAAA;AACjF,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,WAAA,EAAa,QAAQ,UAAA,EAAW,GAAI,MAAM,gBAAA,CAAiB,OAAO,CAAA;AACxF,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,YAAA,EAAc,MAAM,CAAA;AACpD,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,MAAA;AAAA,QACb,WAAA,EAAaD,mBAAAA;AAAA,QACb,OAAO,EAAE,IAAA,EAAM,EAAE,UAAA,EAAY,kBAAiB,EAAE;AAAA,QAChD,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QAC3C;AAAA,OACD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,YAAA,EAAc,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;;;ACjBA,eAAsB,eAAA,CACpB,WAAA,EACA,OAAA,GAA+B,EAAC,EACH;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,CAAC,SAAS,CAAA;AAC7C,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,KAAe,IAAA;AAE1C,EAAA,MAAM,CAAC,cAAA,EAAgB,WAAA,EAAa,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACjE,OAAA,CAAQ,QAAQ,YAAA,CAAa,EAAE,aAAa,OAAA,EAAS,YAAA,EAAc,CAAC,CAAA;AAAA,IACpE,aAAa,WAAW,CAAA;AAAA,IACxB,UAAA,GAAa,UAAA,CAAW,WAAW,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,GAAA,EAAK,EAAC,EAAG,MAAA,EAAQ,IAAI;AAAA,GAC/E,CAAA;AAED,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,GAAG,cAAA,CAAe,KAAA;AAAA,IAClB,GAAG,WAAA,CAAY,MAAA;AAAA,IACf,GAAG,SAAA,CAAU;AAAA,GACf;AAEA,EAAA,MAAM,MAAA,GAAmD;AAAA,IACvD,GAAG,cAAA,CAAe,MAAA;AAAA,IAClB,GAAG,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,GAAA,EAAK,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAAA,IACtE,GAAI,UAAA,GAAa,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAK,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAI;AAAC,GACzF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,cAAA,CAAe,QAAQ,CAAA;AAE5C,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AACnC;ACjDA,IAAME,WAAA,GAAiBC,gBAAA,CAAA,OAAA,CAAQC,iBAAA,CAAc,oQAAe,CAAC,CAAA;AAE7D,eAAe,aAAa,IAAA,EAA+B;AACzD,EAAA,KAAA,MAAW,GAAA,IAAO;AAAA,IACXD,gBAAA,CAAA,IAAA,CAAKD,aAAW,WAAW,CAAA;AAAA,IAC3BC,gBAAA,CAAA,IAAA,CAAKD,WAAA,EAAW,IAAA,EAAM,WAAW;AAAA,GACxC,EAAG;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAASG,cAAA,CAAA,QAAA,CAAcF,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,GAAG,OAAO,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,sDAAA,CAAwD,CAAA;AACrG;AAEA,IAAM,cAAA,GAAiB;AAAA,EACrB,SAAA,EAAW,eAAA;AAAA,EACX,SAAA,EAAW,eAAA;AAAA,EACX,YAAA,EAAc,kBAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,mBAAA,CAAoB,OAA2B,sBAAA,EAAwC;AAC9F,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,OAAA,GAAeA,sBAAK,sBAAA,EAAwB,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAClF,IAAA,OAAO,aAAa,CAAA,CAAE,IAAI,4BAA4B,OAAO,CAAA,IAAA,EAAO,EAAE,UAAU,CAAA,CAAA,CAAA;AAAA,EAClF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,SAAS,sBAAA,CAAuB,OAAwB,sBAAA,EAAwC;AAC9F,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,WAAA,GAAmBA,sBAAK,sBAAA,EAAwB,CAAA,CAAE,YAAY,SAAS,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACjG,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,OAAA,CAAQ,MAAM,KAAK,CAAA;AACrD,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA;AAAA,gCAAA,EACE,WAAW,6BAA6B,WAAW,CAAA;AAAA;AAAA;AAAA,qEAAA,EAGd,CAAA,CAAE,IAAI,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA;AAAA;AAAA,KAAA,CAAA;AAAA,EAIxG,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,SAAS,qBAAqB,KAAA,EAA8B;AAC1D,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,GAAA,GACJ,CAAA,CAAE,UAAA,GACE,CAAA,CAAA,EAAI,EAAE,UAAU,CAAA,CAAA,CAAA,GAChB,0BAAA,GAA6B,CAAA,CAAE,KAAK,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA,CAAE,aAAY,GAAI,UAAA;AACxF,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA;AAAA,kBAAA,EACZ,GAAG,CAAA;AAAA,gEAAA,EAC2C,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,KAAA,CAAA;AAAA,EAKpE,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAGA,eAAsB,SAAS,OAAA,EAIyB;AACtD,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAY,GAAI,OAAA;AACvC,EAAA,MAASE,cAAA,CAAA,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1C,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAA6B,CAAA,CAAE,SAAS,UAAU,CAAA;AACtF,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAA0B,CAAA,CAAE,SAAS,OAAO,CAAA;AAC7E,EAAA,MAAM,WAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAwB,CAAA,CAAE,SAAS,KAAK,CAAA;AAEvE,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACtC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,GAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc;AAAA,MAC3B,cAAc,CAAA,CAAE,YAAA,IAAgB,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA,EAAK;AAAA,MAC7E,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,YAAY,CAAA,CAAE;AAAA,KAChB;AAAA,IACA,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,GAAI,CAAA,CAAE,IAAA,KAAS,WAAW,EAAE,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,IACrD,GAAI,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,EAAE,YAAY,CAAA,CAAE,UAAA,EAAY,UAAA,EAAY,CAAA,CAAE,UAAA;AAAW,GAC/E,CAAE,CAAA;AACF,EAAA,MAASA,cAAA,CAAA,SAAA;AAAA,IACFF,gBAAA,CAAA,IAAA,CAAK,QAAQ,iBAAiB,CAAA;AAAA,IACnC,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAAA,IACrC;AAAA,GACF;AAEA,EAAA,MAAM,UAAA,GAAa,EAAE,WAAA,EAAkBA,gBAAA,CAAA,OAAA,CAAQ,WAAW,CAAA,EAAE;AAC5D,EAAA,MAASE,cAAA,CAAA,SAAA,CAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAEjG,EAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,QAAA,CAAS,MAAA,EAAQ,WAAW,CAAA,IAAK,GAAA;AAClD,EAAA,MAAM,yBAAyB,GAAA,CAAI,KAAA,CAAWA,gBAAA,CAAA,GAAG,CAAA,CAAE,SAAS,GAAA,GAAM,GAAA;AAElE,EAAA,MAAM,CAAC,mBAAmB,iBAAA,EAAmB,oBAAA,EAAsB,kBAAkB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACzG,YAAA,CAAa,eAAe,SAAS,CAAA;AAAA,IACrC,YAAA,CAAa,eAAe,SAAS,CAAA;AAAA,IACrC,YAAA,CAAa,eAAe,YAAY,CAAA;AAAA,IACxC,YAAA,CAAa,eAAe,UAAU;AAAA,GACvC,CAAA;AAED,EAAA,MAAM,cAAc,iBAAA,CAAkB,OAAA,CAAQ,aAAa,mBAAA,CAAoB,aAAA,EAAe,sBAAsB,CAAC,CAAA;AACrH,EAAA,MAASE,yBAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA,EAAG,aAAa,OAAO,CAAA;AAE3E,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,UAAA,EAAY,sBAAsB,CAAA;AAC5E,EAAA,MAAM,gBAAA,GACJ,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,qDAAA,GAAwD,qDAAA;AACpF,EAAA,MAAM,cAAA,GAAiB,qBAAqB,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA,CAAE,OAAA,CAAQ,oBAAoB,gBAAgB,CAAA;AACzH,EAAA,MAASE,yBAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,kBAAkB,CAAA,EAAG,gBAAgB,OAAO,CAAA;AAEjF,EAAA,MAAM,QAAA,GAAW,qBAAqB,QAAQ,CAAA;AAC9C,EAAA,MAAM,cAAA,GACJ,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,wDAAA,GAA2D,wDAAA;AACrF,EAAA,MAAM,YAAA,GAAe,mBAAmB,OAAA,CAAQ,WAAA,EAAa,QAAQ,CAAA,CAAE,OAAA,CAAQ,oBAAoB,cAAc,CAAA;AACjH,EAAA,MAASE,yBAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,gBAAgB,CAAA,EAAG,cAAc,OAAO,CAAA;AAE7E,EAAA,MAASE,yBAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA,EAAG,mBAAmB,OAAO,CAAA;AAEjF,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAA,EAAS,KAAA;AAAA,IACT,MAAM,CAAC,IAAA,EAAM,OAAYA,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAC;AAAA,GACxD;AACA,EAAA,MAASE,cAAA,CAAA,SAAA,CAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,UAAU,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAE3F,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,wEAAA;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,EAAE,KAAA,EAAO,uBAAA,EAAwB;AAAA,IAC1C,YAAA,EAAc;AAAA,MACZ,2BAAA,EAA6B,SAAA;AAAA,MAC7B,UAAA,EAAY,SAAA;AAAA,MACZ,GAAA,EAAK;AAAA;AACP,GACF;AACA,EAAA,MAASE,cAAA,CAAA,SAAA,CAAeF,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAEnG,EAAA,OAAO;AAAA,IACL,SAAA,EAAgBA,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IAC5C,WAAA,EAAkBA,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,UAAU;AAAA,GAC3C;AACF;;;AC3IA,eAAsB,eAAA,CAAgB,OAAA,GAAwB,EAAC,EAAyB;AACtF,EAAA,MAAM,cAAmBG,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,KAAK,CAAA;AACrE,EAAA,MAAM,MAAA,GAAcA,gBAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,UAAU,MAAM,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,CAAC,SAAS,CAAA;AAC7C,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAE7B,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,WAAA,EAAa;AAAA,IACpD,OAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAED,EAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,WAA0B,UAAA,CAAW,KAAA;AAE3C,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,MAAM,QAAA,CAAS;AAAA,IAChD,KAAA,EAAO,QAAA;AAAA,IACP,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAW,QAAA,CAAS,MAAA;AAAA,IACpB,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,IAAM,mBAAA,GAAsB;AChDnC,eAAsB,YAAA,CAAa,OAAA,GAAsB,EAAC,EAAmD;AAC3G,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,GAAA,EAAI;AACzC,EAAA,MAAM,UAAA,GAAa;AAAA,IACZC,gBAAA,CAAA,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,IAC1BA,gBAAA,CAAA,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,IAC1BA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,eAAe,CAAA;AAAA,IAClCA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,eAAe,CAAA;AAAA,IAClCA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,eAAe,CAAA;AAAA,IACvCA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,eAAe;AAAA,GAC9C;AACA,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAASC,sBAAO,CAAC,CAAA;AACjB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uHAAA,EAA0H,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACjJ;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAWD,yBAAQ,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQE,oBAAM,KAAA,EAAO,CAAC,MAAM,KAAA,EAAYF,gBAAA,CAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG;AAAA,IAC9D,GAAA,EAAK,GAAA;AAAA,IACL,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA;AAAA,IACjC,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;AAGO,IAAM,eAAA,GAAkB","file":"chunk-Z7TGIG77.cjs","sourcesContent":["/**\n * Scaffold a new MCP tool project: @tool TS, SKILL sample, tsconfig, README.\n * Use: init → build → run.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface InitOptions {\n /** Target directory to create project (default: cwd). */\n targetPath?: string;\n}\n\nconst TEMPLATES = {\n \"package.json\": `{\n \"name\": \"my-mcp-tools\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"start\": \"node start.mjs\"\n },\n \"devDependencies\": {\n \"@easynet/agent-tool\": \"latest\"\n }\n}\n`,\n \"build.mjs\": `import { buildMcpPackage } from \"@easynet/agent-tool\";\n\nconst result = await buildMcpPackage({ outDir: \"dist\" });\nconsole.log(\"Built\", result.toolCount, \"tool(s) ->\", result.outDir);\n`,\n \"start.mjs\": `import { runMcpServer } from \"@easynet/agent-tool\";\n\nconst { process: child } = await runMcpServer({ path: \"./dist\" });\nchild.stdin?.pipe(process.stdin);\nchild.stdout?.pipe(process.stdout);\nchild.stderr?.pipe(process.stderr);\nprocess.stdin?.ref();\nchild.on(\"close\", (code) => process.exit(code ?? 0));\n`,\n \"tsconfig.json\": `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n`,\n \"src/tools/example.ts\": `/**\n * Add two numbers.\n * @tool\n */\nexport async function add(a: number, b: number): Promise<number> {\n return a + b;\n}\n`,\n \"skills/hello-skill/SKILL.md\": `---\nname: hello-skill\ndescription: Say hello with a name.\n---\n\n# Hello Skill\n\nReturns a greeting for the given name.\n`,\n \"skills/hello-skill/handler.js\": `export default async function handler(args, ctx) {\n const name = args?.name ?? \"World\";\n return { message: \\`Hello, \\${name}!\\` };\n}\n`,\n \"README.md\": `# MCP Tool Project\n\nScaffolded by \\`agent-tool init\\`. Workflow:\n\n1. **init** — create project template (you are here)\n2. **npm install** — install dependencies\n3. **npm run build** — generate MCP package under \\`dist/\\`\n4. **npm start** — start the MCP server for testing\n\n## Quick start\n\n\\`\\`\\`bash\nnpm install\nnpm run build\nnpm start\n\\`\\`\\`\n\nEdit \\`src/tools/*.ts\\` (add \\`@tool\\` JSDoc) and/or \\`skills/*/SKILL.md\\`, then \\`npm run build\\` again.\n`,\n};\n\n/**\n * Create project template at targetPath. Writes tsconfig, src/tools/example.ts,\n * skills/hello-skill (SKILL.md + handler.js), and README.\n */\nexport async function initProject(options: InitOptions = {}): Promise<{ targetPath: string; filesCreated: string[] }> {\n const targetPath = path.resolve(options.targetPath ?? process.cwd());\n const filesCreated: string[] = [];\n\n await fs.mkdir(targetPath, { recursive: true });\n\n for (const [relPath, content] of Object.entries(TEMPLATES)) {\n const fullPath = path.join(targetPath, relPath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n try {\n await fs.access(fullPath);\n if (relPath === \"package.json\") continue; // skip so we don't overwrite existing\n } catch {\n // file doesn't exist, write it\n }\n await fs.writeFile(fullPath, content, \"utf8\");\n filesCreated.push(relPath);\n }\n\n return { targetPath, filesCreated };\n}\n","/**\n * Shared scan utilities for directory-based tool discovery.\n * Used by discovery (DirectoryScanner) and codegen (scanSkill, scanN8n, etc.).\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * Recursively find all directories under rootPath that contain a file named fileName.\n * Skips node_modules and dot-directories.\n */\nexport async function findDirsContainingFile(\n rootPath: string,\n fileName: string,\n): Promise<string[]> {\n const found: string[] = [];\n await collectDirsWithFile(rootPath, fileName, found);\n return found;\n}\n\nasync function collectDirsWithFile(\n dir: string,\n fileName: string,\n found: string[],\n): Promise<void> {\n let entries: Array<{ name: string; isDirectory: boolean; isFile: boolean }>;\n try {\n const e = await readdir(dir, { withFileTypes: true });\n entries = e.map((x) => ({\n name: x.name,\n isDirectory: x.isDirectory(),\n isFile: x.isFile(),\n }));\n } catch {\n return;\n }\n\n if (entries.some((x) => x.isFile && x.name === fileName)) {\n found.push(dir);\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory || entry.name === \"node_modules\" || entry.name.startsWith(\".\")) {\n continue;\n }\n await collectDirsWithFile(join(dir, entry.name), fileName, found);\n }\n}\n\n/**\n * Build tool display name from relative path + program/export name.\n * e.g. \"skill-dir\" + \"my-skill\" → \"skill-dir.my-skill\";\n * \"src/tools/example.ts\" + \"add\" → \"src.tools.example.add\"\n */\nexport function pathToToolName(sourcePath: string, programName: string): string {\n const normalized = sourcePath\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(ts|tsx|js|mjs|json)$/i, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return programName;\n const pathPart = segments.join(\".\");\n return `${pathPart}.${programName}`;\n}\n","/**\n * Build JSON Schema from TypeScript parameter types using the compiler API.\n * MVP: primitives, optional, array, object. Complex types fallback to {} with warn.\n */\n\nimport * as ts from \"typescript\";\n\n/**\n * Build output JSON Schema from function return type (unwrap Promise if present).\n * For use in codegen when auto-deriving schema.\n */\nexport function buildOutputSchemaFromReturnType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const sig = typeChecker.getSignatureFromDeclaration(node as ts.SignatureDeclaration);\n if (!sig) {\n onWarn?.(\"Could not get signature for return type, using object\");\n return { type: \"object\", additionalProperties: true };\n }\n let returnType = typeChecker.getReturnTypeOfSignature(sig);\n // Unwrap Promise<T> to T\n if (returnType.getSymbol?.()?.getName() === \"Promise\") {\n const typeArgs = (returnType as ts.TypeReference).typeArguments;\n if (typeArgs?.[0]) returnType = typeArgs[0];\n }\n const schema = typeToJsonSchema(returnType, typeChecker, onWarn);\n const hasProps =\n typeof schema === \"object\" &&\n (schema as { type?: string; properties?: object }).type === \"object\" &&\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0;\n return hasProps ? schema : { type: \"object\", additionalProperties: true };\n}\n\n/** Build { type: \"object\", properties, required } from function parameters. */\nexport function buildInputSchemaFromParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): { schema: object; required: string[] } {\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n if (!node.parameters.length) {\n return { schema: { type: \"object\", properties: {} }, required: [] };\n }\n\n for (const param of node.parameters) {\n const name = (param.name as ts.Identifier).getText();\n if (name.startsWith(\"_\") && name.length <= 2) continue;\n const sym = (param as ts.ParameterDeclaration & { symbol?: ts.Symbol }).symbol;\n const paramType = sym\n ? typeChecker.getTypeOfSymbolAtLocation(sym, param)\n : typeChecker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || param.initializer !== undefined;\n const propSchema = typeToJsonSchema(paramType, typeChecker, onWarn);\n properties[name] = propSchema;\n if (!isOptional) required.push(name);\n }\n\n return {\n schema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n required,\n };\n}\n\nfunction typeToJsonSchema(\n type: ts.Type,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const flags = type.flags;\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & ts.TypeFlags.Undefined || flags & ts.TypeFlags.Void) return {};\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {\n onWarn?.(`Unsupported type: any/unknown, using empty schema`);\n return {};\n }\n\n if (type.isUnion?.()) {\n const union = type as ts.UnionType;\n const types = union.types;\n const withoutUndef = types.filter(\n (t) => !(t.flags & ts.TypeFlags.Undefined) && !(t.flags & ts.TypeFlags.Void),\n );\n if (withoutUndef.length === 1) return typeToJsonSchema(withoutUndef[0]!, typeChecker, onWarn);\n if (withoutUndef.length === 0) return {};\n }\n\n if (typeChecker.isArrayType(type)) {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, typeChecker, onWarn) : {};\n return { type: \"array\", items: Object.keys(items).length ? items : {} };\n }\n\n const str = typeChecker.typeToString(type);\n if (str === \"string\") return { type: \"string\" };\n if (str === \"number\") return { type: \"number\" };\n if (str === \"boolean\") return { type: \"boolean\" };\n if (str.endsWith(\"[]\")) {\n const inner = str.slice(0, -2).trim();\n const itemType =\n inner === \"string\" ? { type: \"string\" as const } : inner === \"number\" ? { type: \"number\" as const } : {};\n return { type: \"array\", items: itemType };\n }\n\n if (type.getProperties && type.getProperties().length >= 0) {\n const props = type.getProperties();\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const p of props) {\n const decl = p.valueDeclaration;\n const propType = decl\n ? typeChecker.getTypeAtLocation(decl)\n : typeChecker.getTypeOfSymbolAtLocation(p, (p as unknown as { valueDeclaration: ts.Node }).valueDeclaration);\n const optional = decl && ts.isPropertySignature(decl) ? !!decl.questionToken : false;\n properties[p.name] = typeToJsonSchema(propType, typeChecker, onWarn);\n if (!optional) required.push(p.name);\n }\n return { type: \"object\", properties, ...(required.length ? { required } : {}) };\n }\n\n onWarn?.(`Unsupported type: ${str}, using object`);\n return { type: \"object\" };\n}\n","/**\n * Scan TypeScript source files for exported functions with @tool JSDoc.\n * Extracts description, @effect, and builds inputSchema from param types.\n * Reuses discovery pathToToolName for consistent tool naming.\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as ts from \"typescript\";\nimport { pathToToolName } from \"../../discovery/scan/scanUtil.js\";\nimport { buildInputSchemaFromParams, buildOutputSchemaFromReturnType } from \"./schemaFromTs.js\";\nimport type { FunctionToolSpec } from \"../types.js\";\nimport type { SideEffect } from \"../types.js\";\n\nconst TOOL_TAG = \"@tool\";\nconst EFFECT_TAG = \"@effect\";\nconst EFFECT_VALUES: SideEffect[] = [\"none\", \"local_write\", \"external_write\", \"destructive\"];\n\nexport interface ScanResult {\n specs: FunctionToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\n/**\n * Scan a project folder for exported functions annotated with @tool.\n */\nexport function scanForTools(options: {\n projectPath: string;\n include?: string[];\n tsconfigPath?: string;\n}): ScanResult {\n const projectPath = path.resolve(options.projectPath);\n const tsconfigPath =\n options.tsconfigPath ?? path.join(projectPath, \"tsconfig.json\");\n const include = options.include ?? [\"**/*.ts\"];\n const errors: Array<{ file: string; message: string }> = [];\n const warnings: Array<{ file: string; message: string }> = [];\n\n let config: ts.ParsedCommandLine;\n let configPathResolved = path.resolve(projectPath, tsconfigPath);\n if (!fs.existsSync(configPathResolved)) {\n configPathResolved = path.join(projectPath, \"tsconfig.json\");\n }\n if (fs.existsSync(configPathResolved)) {\n const configFile = ts.readConfigFile(configPathResolved, ts.sys.readFile);\n if (configFile.error) {\n errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });\n return { specs: [], errors, warnings };\n }\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPathResolved),\n );\n if (parsed.errors.length) {\n for (const e of parsed.errors) {\n errors.push({ file: e.file?.fileName ?? \"tsconfig\", message: String(e.messageText) });\n }\n return { specs: [], errors, warnings };\n }\n config = parsed;\n } else {\n config = {\n options: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n fileNames: resolveGlob(projectPath, include),\n errors: [],\n } as ts.ParsedCommandLine;\n }\n\n const program = ts.createProgram(config.fileNames, config.options);\n const typeChecker = program.getTypeChecker();\n const specs: FunctionToolSpec[] = [];\n\n for (const sourceFile of program.getSourceFiles()) {\n const fileName = sourceFile.fileName;\n if (fileName.includes(\"node_modules\") || fileName.endsWith(\".d.ts\")) continue;\n if (!config.fileNames.some((f) => path.resolve(f) === path.resolve(fileName))) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n const decl = getExportedFunctionDeclaration(node, sourceFile);\n if (!decl) return;\n const func = decl.func;\n const name = decl.name;\n if (!name) return;\n\n const host = getJSDocHost(func);\n if (!hasToolTag(host)) return;\n const jsDoc = getJSDocComments(host);\n\n const description = getDescription(jsDoc, name);\n if (!description) {\n warnings.push({ file: fileName, message: `Tool ${name}: missing description, using humanized name` });\n }\n const sideEffect = getEffect(host);\n\n const onWarn = (msg: string) => warnings.push({ file: fileName, message: `${name}: ${msg}` });\n const { schema } = buildInputSchemaFromParams(func, typeChecker, onWarn);\n\n const inputSchema =\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0\n ? schema\n : { type: \"object\" as const, properties: {} };\n\n const outputSchema = buildOutputSchemaFromReturnType(func, typeChecker, onWarn);\n\n const sourcePath = path.relative(projectPath, fileName) || path.basename(fileName);\n const toolName = pathToToolName(sourcePath, name);\n\n specs.push({\n kind: \"function\",\n name: toolName,\n description: description || humanize(name),\n inputSchema,\n outputSchema,\n _meta: { hitl: { sideEffect } },\n sourcePath,\n exportName: name,\n });\n });\n }\n\n return { specs, errors, warnings };\n}\n\nfunction resolveGlob(projectPath: string, patterns: string[]): string[] {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (f: string) => {\n const abs = path.resolve(f);\n if (f.endsWith(\".ts\") && !f.endsWith(\".d.ts\") && !seen.has(abs)) {\n seen.add(abs);\n result.push(abs);\n }\n };\n for (const p of patterns) {\n const full = path.join(projectPath, p);\n if (full.includes(\"*\")) {\n const baseDir = full.replace(/\\*\\*\\/.*$/, \"\").replace(/\\*.*$/, \"\").replace(/\\/?$/, \"\") || \".\";\n const dir = path.resolve(projectPath, baseDir);\n if (fs.existsSync(dir)) walk(dir, add);\n } else {\n const resolved = path.resolve(projectPath, full);\n if (fs.existsSync(resolved)) {\n if (fs.statSync(resolved).isFile()) add(resolved);\n else walk(resolved, add);\n }\n }\n }\n if (result.length > 0) return result;\n const srcDir = path.join(projectPath, \"src\");\n if (fs.existsSync(srcDir)) return walkCollect(srcDir);\n return [];\n}\n\nfunction walkCollect(dir: string): string[] {\n const out: string[] = [];\n walk(dir, (fullPath) => {\n if (fullPath.endsWith(\".ts\") && !fullPath.endsWith(\".d.ts\")) out.push(path.resolve(fullPath));\n });\n return out;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"generated\", \"dist\"]);\n\nfunction walk(dir: string, visit: (fullPath: string) => void): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory() && !SKIP_DIRS.has(e.name)) walk(full, visit);\n else if (e.isFile()) visit(full);\n }\n } catch {\n // ignore\n }\n}\n\nfunction getExportedFunctionDeclaration(\n node: ts.Node,\n _sourceFile: ts.SourceFile,\n): { func: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression; name: string } | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (exported) return { func: node, name: node.name.getText() };\n return null;\n }\n if (ts.isVariableStatement(node)) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!exported) return null;\n for (const decl of node.declarationList.declarations) {\n const init = decl.initializer;\n if (init && ts.isArrowFunction(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n if (init && ts.isFunctionExpression(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n }\n }\n return null;\n}\n\nfunction getJSDocHost(node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression): ts.Node {\n const parent = node.parent;\n if (ts.isVariableDeclaration(parent)) {\n const gp = parent.parent;\n if (ts.isVariableDeclarationList(gp) && gp.parent && ts.isVariableStatement(gp.parent)) return gp.parent;\n }\n return node as ts.Node;\n}\n\nfunction getJSDocComments(host: ts.Node): ts.JSDoc[] {\n const all = ts.getJSDocCommentsAndTags(host);\n return all.filter((t): t is ts.JSDoc => ts.isJSDoc(t));\n}\n\nfunction hasToolTag(host: ts.Node): boolean {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"tool\") return true;\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n if (full.includes(TOOL_TAG)) return true;\n }\n }\n return false;\n}\n\nfunction getDescription(jsDocs: ts.JSDoc[], fallbackName: string): string {\n for (const doc of jsDocs) {\n const comment = doc.comment;\n if (typeof comment === \"string\") {\n const first = comment.split(/\\n/)[0]?.trim() ?? \"\";\n if (first && !first.startsWith(\"@\")) return first;\n }\n if (Array.isArray(comment)) {\n const first = comment[0];\n if (first && typeof first === \"object\" && \"text\" in first) {\n const t = (first as { text: string }).text.trim();\n if (t && !t.startsWith(\"@\")) return t;\n }\n }\n const full = doc.getFullText();\n const match = full.match(/\\*\\s*@tool\\s+(.+?)(?=\\n|$|\\*\\/)/s);\n if (match?.[1]) return match[1].trim();\n }\n return \"\";\n}\n\nfunction getEffect(host: ts.Node): SideEffect {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"effect\") {\n const comment = (tag as ts.JSDocUnknownTag).comment;\n const v = (typeof comment === \"string\" ? comment : \"\").trim().toLowerCase();\n if (EFFECT_VALUES.includes(v as SideEffect)) return v as SideEffect;\n }\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n const match = full.match(/\\*\\s*@effect\\s+(\\w+)/);\n if (match && EFFECT_VALUES.includes(match[1] as SideEffect)) return match[1] as SideEffect;\n }\n }\n return \"none\";\n}\n\nfunction humanize(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase()).trim();\n}\n","/**\n * Parsed SKILL.md manifest following Anthropic's Agent Skills specification.\n *\n * A SKILL.md file has:\n * - YAML frontmatter with `name` and `description` (Level 1: metadata, always loaded)\n * - Markdown body with instructions (Level 2: loaded when triggered)\n * - Bundled resource files referenced from the body (Level 3: loaded as needed)\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\n\n/**\n * YAML frontmatter from SKILL.md (Agent Skills spec).\n * Level 1 (metadata) — always loaded at startup for discovery.\n * @see https://agentskills.io/specification\n */\nexport interface SkillFrontmatter {\n /**\n * Skill name identifier (required).\n * - Max 64 characters; lowercase letters, numbers, hyphens only\n * - Must not start or end with hyphen; no consecutive hyphens\n */\n name: string;\n\n /**\n * What the skill does and when to use it (required).\n * - Max 1024 characters\n */\n description: string;\n\n /** Optional: license name or reference (e.g. Apache-2.0, LICENSE.txt). */\n license?: string;\n\n /** Optional: environment requirements, max 500 characters. */\n compatibility?: string;\n\n /** Optional: arbitrary key-value metadata. */\n metadata?: Record<string, string>;\n\n /** Optional: space-delimited list of pre-approved tools (experimental). */\n allowedTools?: string;\n}\n\n/**\n * A resource file bundled with the skill.\n * Resources are Level 3 — loaded only as needed during execution.\n */\nexport interface SkillResource {\n /** Relative path from the skill directory */\n relativePath: string;\n /** Absolute path on disk */\n absolutePath: string;\n /** File extension (e.g., \".md\", \".py\", \".json\") */\n extension: string;\n /** Resource type inferred from extension */\n type: \"instructions\" | \"code\" | \"data\";\n}\n\n/**\n * Full parsed SKILL.md with progressive disclosure levels.\n */\nexport interface SkillDefinition {\n /** Level 1: Metadata from YAML frontmatter (always loaded, ~100 tokens) */\n frontmatter: SkillFrontmatter;\n\n /** Level 2: Markdown body instructions (loaded when skill triggered, <5k tokens recommended) */\n instructions: string;\n\n /** Level 3: Bundled resource files (loaded as needed, effectively unlimited) */\n resources: SkillResource[];\n\n /** Absolute path to the skill directory */\n dirPath: string;\n\n /** Absolute path to the SKILL.md file */\n skillMdPath: string;\n}\n\n/**\n * Validation error for SKILL.md parsing.\n */\nexport class SkillManifestError extends Error {\n constructor(\n public readonly path: string,\n public readonly field: string,\n message: string,\n ) {\n super(`SKILL.md error in ${path}: ${message}`);\n this.name = \"SkillManifestError\";\n }\n}\n\n// --- Validation helpers ---\n\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\nconst NAME_MAX_LENGTH = 64;\nconst DESCRIPTION_MAX_LENGTH = 1024;\nconst COMPATIBILITY_MAX_LENGTH = 500;\nconst RESERVED_WORDS = [\"anthropic\", \"claude\"];\nconst XML_TAG_PATTERN = /<\\/?[a-zA-Z][^>]*>/;\n\n/**\n * Validate a SkillFrontmatter object.\n * Throws SkillManifestError if invalid.\n */\nexport function validateFrontmatter(\n fm: Partial<SkillFrontmatter>,\n filePath: string,\n): asserts fm is SkillFrontmatter {\n // name: required\n if (!fm.name || typeof fm.name !== \"string\") {\n throw new SkillManifestError(filePath, \"name\", \"name is required\");\n }\n if (fm.name.length > NAME_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name must be at most ${NAME_MAX_LENGTH} characters (got ${fm.name.length})`,\n );\n }\n if (!NAME_PATTERN.test(fm.name)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must contain only lowercase letters, numbers, and hyphens\",\n );\n }\n if (fm.name.startsWith(\"-\") || fm.name.endsWith(\"-\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not start or end with a hyphen\",\n );\n }\n if (fm.name.includes(\"--\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not contain consecutive hyphens\",\n );\n }\n if (XML_TAG_PATTERN.test(fm.name)) {\n throw new SkillManifestError(filePath, \"name\", \"name cannot contain XML tags\");\n }\n for (const reserved of RESERVED_WORDS) {\n if (fm.name.includes(reserved)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name cannot contain reserved word \"${reserved}\"`,\n );\n }\n }\n\n // description: required\n if (!fm.description || typeof fm.description !== \"string\") {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description is required and must be non-empty\",\n );\n }\n if (fm.description.length > DESCRIPTION_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n `description must be at most ${DESCRIPTION_MAX_LENGTH} characters (got ${fm.description.length})`,\n );\n }\n if (XML_TAG_PATTERN.test(fm.description)) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description cannot contain XML tags\",\n );\n }\n\n // Optional: compatibility max 500 characters\n if (fm.compatibility != null && typeof fm.compatibility === \"string\") {\n if (fm.compatibility.length > COMPATIBILITY_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"compatibility\",\n `compatibility must be at most ${COMPATIBILITY_MAX_LENGTH} characters (got ${fm.compatibility.length})`,\n );\n }\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport type {\n SkillDefinition,\n SkillFrontmatter,\n SkillResource,\n} from \"./SkillManifest.js\";\nimport { SkillManifestError, validateFrontmatter } from \"./SkillManifest.js\";\n\n/**\n * File extensions categorized by resource type.\n */\nconst CODE_EXTENSIONS = new Set([\n \".py\", \".js\", \".mjs\", \".ts\", \".sh\", \".bash\", \".rb\", \".go\",\n]);\nconst INSTRUCTION_EXTENSIONS = new Set([\".md\", \".markdown\", \".txt\"]);\n\n/**\n * Files to exclude from resource scanning.\n */\nconst EXCLUDED_FILES = new Set([\"SKILL.md\", \"tool.json\"]);\n\n/**\n * Parse a SKILL.md file into its constituent parts:\n * - YAML frontmatter (metadata)\n * - Markdown body (instructions)\n *\n * Supports the standard YAML frontmatter format:\n * ```\n * ---\n * name: my-skill\n * description: Does something useful\n * ---\n *\n * # Instructions here...\n * ```\n */\nexport function parseSkillMd(\n content: string,\n filePath: string,\n): { frontmatter: SkillFrontmatter; instructions: string } {\n const trimmed = content.trimStart();\n\n if (!trimmed.startsWith(\"---\")) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md must start with YAML frontmatter (---)\",\n );\n }\n\n // Find the closing ---\n const endIndex = trimmed.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md frontmatter is not closed (missing closing ---)\",\n );\n }\n\n const yamlBlock = trimmed.slice(4, endIndex).trim();\n const body = trimmed.slice(endIndex + 4).trim();\n\n let raw: Record<string, unknown>;\n try {\n const parsed = yaml.load(yamlBlock);\n if (parsed == null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"YAML frontmatter must be an object (key: value)\",\n );\n }\n raw = parsed as Record<string, unknown>;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Invalid YAML frontmatter: ${message}`,\n );\n }\n\n const name = stringField(raw, \"name\", filePath);\n const description = stringField(raw, \"description\", filePath);\n if (!name || !description) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n !name ? \"name is required\" : \"description is required\",\n );\n }\n\n const license = stringField(raw, \"license\");\n const compatibility = stringField(raw, \"compatibility\");\n const allowedTools = stringField(raw, \"allowed-tools\");\n const metadata = normalizeMetadata(raw.metadata);\n\n const frontmatter: SkillFrontmatter = {\n name,\n description,\n ...(license && { license }),\n ...(compatibility && { compatibility }),\n ...(allowedTools && { allowedTools }),\n ...(metadata && Object.keys(metadata).length > 0 && { metadata }),\n };\n validateFrontmatter(frontmatter, filePath);\n\n return { frontmatter, instructions: body };\n}\n\nfunction stringField(\n raw: Record<string, unknown>,\n key: string,\n filePath?: string,\n): string {\n const v = raw[key];\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) {\n return v.map((x) => (typeof x === \"string\" ? x : String(x))).join(\"\\n\");\n }\n if (filePath) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Frontmatter field \"${key}\" must be a string, number, boolean, or array`,\n );\n }\n return String(v);\n}\n\n/**\n * Normalize frontmatter `metadata` to Record<string, string>.\n * Supports nested YAML: { author: \"...\", version: \"...\" } → flat string values.\n */\nfunction normalizeMetadata(val: unknown): Record<string, string> | undefined {\n if (val == null) return undefined;\n if (typeof val === \"object\" && !Array.isArray(val)) {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(val)) {\n if (typeof k === \"string\" && v !== undefined && v !== null) {\n out[k] = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n }\n }\n return Object.keys(out).length ? out : undefined;\n }\n if (typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\") {\n return { value: String(val) };\n }\n return undefined;\n}\n\n\n/**\n * Scan a skill directory for bundled resource files (Level 3).\n * Recursively finds all files except SKILL.md and tool.json.\n */\nexport async function scanSkillResources(dirPath: string): Promise<SkillResource[]> {\n const resources: SkillResource[] = [];\n await scanDir(dirPath, dirPath, resources);\n return resources;\n}\n\nasync function scanDir(\n basePath: string,\n currentPath: string,\n resources: SkillResource[],\n): Promise<void> {\n let entries;\n try {\n entries = await readdir(currentPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and hidden directories\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") {\n continue;\n }\n await scanDir(basePath, fullPath, resources);\n } else if (entry.isFile()) {\n // Skip excluded files\n if (EXCLUDED_FILES.has(entry.name)) {\n continue;\n }\n\n const ext = extname(entry.name).toLowerCase();\n const relPath = relative(basePath, fullPath);\n\n resources.push({\n relativePath: relPath,\n absolutePath: fullPath,\n extension: ext,\n type: inferResourceType(ext),\n });\n }\n }\n}\n\nfunction inferResourceType(ext: string): SkillResource[\"type\"] {\n if (CODE_EXTENSIONS.has(ext)) return \"code\";\n if (INSTRUCTION_EXTENSIONS.has(ext)) return \"instructions\";\n return \"data\";\n}\n\n/**\n * Load and parse a complete skill from a directory containing SKILL.md.\n * Returns the full SkillDefinition with all three progressive disclosure levels.\n */\nexport async function loadSkillDefinition(dirPath: string): Promise<SkillDefinition> {\n const skillMdPath = join(dirPath, \"SKILL.md\");\n\n let content: string;\n try {\n content = await readFile(skillMdPath, \"utf-8\");\n } catch (err) {\n throw new SkillManifestError(\n skillMdPath,\n \"file\",\n `Cannot read SKILL.md: ${(err as Error).message}`,\n );\n }\n\n const { frontmatter, instructions } = parseSkillMd(content, skillMdPath);\n const resources = await scanSkillResources(dirPath);\n\n return {\n frontmatter,\n instructions,\n resources,\n dirPath,\n skillMdPath,\n };\n}\n","/**\n * Error thrown during directory-based tool discovery.\n */\nexport class DiscoveryError extends Error {\n /** Absolute path to the tool directory that caused the error */\n readonly toolDir: string;\n /** Phase in which the error occurred */\n readonly phase: \"manifest\" | \"load\" | \"validate\";\n /** The underlying cause */\n readonly cause?: Error;\n\n constructor(\n toolDir: string,\n phase: \"manifest\" | \"load\" | \"validate\",\n message: string,\n cause?: Error,\n ) {\n super(`[${phase}] ${toolDir}: ${message}`);\n this.name = \"DiscoveryError\";\n this.toolDir = toolDir;\n this.phase = phase;\n this.cause = cause;\n }\n}\n","/**\n * Scan project for SKILL.md directories; produce MCP tool specs.\n * Reuses discovery: findDirsContainingFile, pathToToolName, loadSkillDefinition.\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../../discovery/scan/scanUtil.js\";\nimport { loadSkillDefinition } from \"../../discovery/load/SkillMdParser.js\";\nimport type { SkillToolSpec } from \"../types.js\";\n\nexport interface ScanSkillResult {\n skills: SkillToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for SKILL.md directories; return skill tool specs.\n */\nexport async function scanForSkill(projectPath: string): Promise<ScanSkillResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"SKILL.md\");\n\n const skills: SkillToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const skillDef = await loadSkillDefinition(dirPath);\n const name = pathToToolName(relativePath, skillDef.frontmatter.name);\n skills.push({\n kind: \"skill\",\n name,\n description: skillDef.frontmatter.description,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"none\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { skills, errors };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\n\n/** Metadata extracted from workflow.json for spec building (used by N8nLoader and codegen scanN8n). */\nexport interface WorkflowMeta {\n name: string;\n description: string;\n webhookUrl?: string;\n workflowDef: Record<string, unknown>;\n}\n\n/**\n * Read and parse workflow.json in dirPath; return metadata and raw workflow.\n * Shared by loadN8nTool (runtime) and codegen scanN8n.\n */\nexport async function readWorkflowMeta(\n dirPath: string,\n workflowFileName: string = \"workflow.json\",\n): Promise<WorkflowMeta> {\n const workflowPath = join(dirPath, workflowFileName);\n let raw: string;\n try {\n raw = await readFile(workflowPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read workflow: ${workflowPath}`,\n err as Error,\n );\n }\n let workflowDef: Record<string, unknown>;\n try {\n workflowDef = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${workflowPath}`,\n err as Error,\n );\n }\n if (!workflowDef.nodes || !Array.isArray(workflowDef.nodes)) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `workflow.json must have a \"nodes\" array`,\n );\n }\n const meta = workflowDef.meta as Record<string, unknown> | undefined;\n const name =\n (workflowDef.name as string) ||\n (meta?.name as string) ||\n basename(dirPath);\n const description =\n (workflowDef.description as string) ||\n (meta?.description as string) ||\n `n8n workflow: ${name}`;\n let webhookUrl: string | undefined;\n const nodes = workflowDef.nodes as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(nodes)) {\n const webhookNode = nodes.find(\n (n) =>\n n.type === \"n8n-nodes-base.webhook\" || (n.type as string)?.includes(\"webhook\"),\n );\n if (webhookNode?.parameters && typeof webhookNode.parameters === \"object\") {\n const params = webhookNode.parameters as Record<string, unknown>;\n const pathVal = params.path ?? params.webhookPath;\n if (typeof pathVal === \"string\" && pathVal.startsWith(\"http\")) {\n webhookUrl = pathVal;\n }\n }\n }\n return { name, description, webhookUrl, workflowDef };\n}\n\n/**\n * Load an n8n tool from its directory.\n * Reads workflow.json and validates it has a \"nodes\" array.\n *\n * Description for the tool spec is taken (in order) from:\n * 1. tool.json \"description\" (if present)\n * 2. workflow.json \"description\" or \"meta.description\"\n * 3. workflow.json \"name\" (n8n workflow name)\n * 4. Fallback: \"n8n tool: <dirName>\"\n */\nexport async function loadN8nTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const { workflowDef } = await readWorkflowMeta(\n dirPath,\n manifest.entryPoint ?? \"workflow.json\",\n );\n return { manifest, dirPath, workflowDef };\n}\n","/**\n * Scan project for workflow.json (n8n) directories; produce MCP tool specs.\n * Reuses discovery: findDirsContainingFile, pathToToolName, readWorkflowMeta (N8nLoader).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../../discovery/scan/scanUtil.js\";\nimport { readWorkflowMeta } from \"../../discovery/load/N8nLoader.js\";\nimport type { N8nToolSpec } from \"../types.js\";\n\nexport interface ScanN8nResult {\n n8n: N8nToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for workflow.json directories; return n8n tool specs.\n */\nexport async function scanForN8n(projectPath: string): Promise<ScanN8nResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"workflow.json\");\n\n const n8n: N8nToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const { name: wfName, description: wfDesc, webhookUrl } = await readWorkflowMeta(dirPath);\n const toolName = pathToToolName(relativePath, wfName);\n n8n.push({\n kind: \"n8n\",\n name: toolName,\n description: wfDesc,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"external_write\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n webhookUrl,\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { n8n, errors };\n}\n","/**\n * Scan project for all tools: @tool (TypeScript), SKILL.md directories, workflow.json (n8n).\n * Single entry for MCP build; aggregates specs from scanner, scanSkill, scanN8n.\n */\n\nimport { scanForTools } from \"./scanner.js\";\nimport { scanForSkill } from \"./scanSkill.js\";\nimport { scanForN8n } from \"./scanN8n.js\";\nimport type { MCPToolSpec } from \"../types.js\";\n\nexport interface ScanAllToolsResult {\n /** All tools from function, skill, and n8n sources. */\n specs: MCPToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\nexport interface ScanAllToolsOptions {\n /** Glob patterns for TS files (default: [\"**\\/*.ts\"]). Used for @tool (TypeScript) scanning only. */\n include?: string[];\n /** Path to tsconfig.json (default: projectPath/tsconfig.json). Used for @tool scanning only. */\n tsconfigPath?: string;\n /** Include n8n (workflow.json) tools. Default false: we do not start or install n8n-local; set true if you use n8n. */\n includeN8n?: boolean;\n}\n\n/**\n * Scan projectPath for all tools (function, SKILL, and optionally n8n); return unified specs and errors.\n * By default n8n is not scanned (includeN8n: false); we do not start or install n8n-local.\n */\nexport async function scanForAllTools(\n projectPath: string,\n options: ScanAllToolsOptions = {},\n): Promise<ScanAllToolsResult> {\n const include = options.include ?? [\"**/*.ts\"];\n const tsconfigPath = options.tsconfigPath;\n const includeN8n = options.includeN8n === true;\n\n const [functionResult, skillResult, n8nResult] = await Promise.all([\n Promise.resolve(scanForTools({ projectPath, include, tsconfigPath })),\n scanForSkill(projectPath),\n includeN8n ? scanForN8n(projectPath) : Promise.resolve({ n8n: [], errors: [] }),\n ]);\n\n const specs: MCPToolSpec[] = [\n ...functionResult.specs,\n ...skillResult.skills,\n ...n8nResult.n8n,\n ];\n\n const errors: Array<{ file: string; message: string }> = [\n ...functionResult.errors,\n ...skillResult.errors.map((e) => ({ file: e.dir, message: e.message })),\n ...(includeN8n ? n8nResult.errors.map((e) => ({ file: e.dir, message: e.message })) : []),\n ];\n\n const warnings = [...functionResult.warnings];\n\n return { specs, errors, warnings };\n}\n","/**\n * Generate MCP server entrypoint, tool-specs.json, invokers for function/skill/n8n.\n * Templates are loaded from ./templates/ (shipped next to this module or in dist/templates).\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { MCPToolSpec, FunctionToolSpec, SkillToolSpec, N8nToolSpec } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nasync function loadTemplate(name: string): Promise<string> {\n for (const dir of [\n path.join(__dirname, \"templates\"),\n path.join(__dirname, \"..\", \"templates\"),\n ]) {\n try {\n return await fs.readFile(path.join(dir, name), \"utf-8\");\n } catch {\n continue;\n }\n }\n throw new Error(`Template not found: ${name}. Tried templates/ next to generator and ../templates.`);\n}\n\nconst TEMPLATE_NAMES = {\n mcpServer: \"mcp-server.js\",\n toolIndex: \"tool-index.js\",\n skillInvoker: \"skill-invoker.js\",\n n8nInvoker: \"n8n-invoker.js\",\n} as const;\n\nfunction buildToolIndexCases(specs: FunctionToolSpec[], fromGeneratedToProject: string): string {\n return specs\n .map((s) => {\n const modPath = path.join(fromGeneratedToProject, s.sourcePath).replace(/\\\\/g, \"/\");\n return ` case \"${s.name}\": return (await import(\"${modPath}\")).${s.exportName};`;\n })\n .join(\"\\n\");\n}\n\nfunction buildSkillInvokerCases(specs: SkillToolSpec[], fromGeneratedToProject: string): string {\n return specs\n .map((s) => {\n const handlerPath = path.join(fromGeneratedToProject, s.sourcePath, \"handler\").replace(/\\\\/g, \"/\");\n const descEscaped = s.description.replace(/\"/g, '\\\\\"');\n return ` case \"${s.name}\": {\n const mod = await import(\"${handlerPath}.js\").catch(() => import(\"${handlerPath}.mjs\"));\n const fn = mod.default ?? mod.handler;\n if (typeof fn !== \"function\") return { result: null, error: \"No handler\" };\n const ctx = { requestId: \"mcp\", taskId: \"mcp\", skill: { name: \"${s.name}\", description: \"${descEscaped}\", instructions: \"\", resources: [], readResource: async () => \"\", getResourcesByType: () => [], dirPath: \"\" } };\n const out = await fn(args, ctx);\n return out?.result !== undefined ? out.result : out;\n }`;\n })\n .join(\"\\n\");\n}\n\nfunction buildN8nInvokerCases(specs: N8nToolSpec[]): string {\n return specs\n .map((s) => {\n const url =\n s.webhookUrl\n ? `\"${s.webhookUrl}\"`\n : \"process.env.N8N_WEBHOOK_\" + s.name.replace(/[^a-zA-Z0-9]/g, \"_\").toUpperCase() + \" ?? null\";\n return ` case \"${s.name}\": {\n const url = ${url};\n if (!url) throw new Error(\"n8n webhook not configured for ${s.name}. Set N8N_WEBHOOK_* or add webhook to workflow.\");\n const res = await fetch(url, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(args) });\n if (!res.ok) throw new Error(\"n8n request failed: \" + res.status);\n return res.json().catch(() => ({}));\n }`;\n })\n .join(\"\\n\");\n}\n\n/** Write generated files into outDir. projectPath is the folder containing source. */\nexport async function generate(options: {\n specs: MCPToolSpec[];\n outDir: string;\n projectPath: string;\n}): Promise<{ entryPath: string; mcpJsonPath: string }> {\n const { specs, outDir, projectPath } = options;\n await fs.mkdir(outDir, { recursive: true });\n\n const functionSpecs = specs.filter((s): s is FunctionToolSpec => s.kind === \"function\");\n const skillSpecs = specs.filter((s): s is SkillToolSpec => s.kind === \"skill\");\n const n8nSpecs = specs.filter((s): s is N8nToolSpec => s.kind === \"n8n\");\n\n const toolSpecsJson = specs.map((s) => ({\n kind: s.kind,\n name: s.name,\n description: s.description,\n inputSchema: s.inputSchema,\n ...(s.kind === \"function\" && {\n outputSchema: s.outputSchema ?? { type: \"object\", additionalProperties: true },\n sourcePath: s.sourcePath,\n exportName: s.exportName,\n }),\n _meta: s._meta,\n ...(s.kind === \"skill\" && { sourcePath: s.sourcePath }),\n ...(s.kind === \"n8n\" && { sourcePath: s.sourcePath, webhookUrl: s.webhookUrl }),\n }));\n await fs.writeFile(\n path.join(outDir, \"tool-specs.json\"),\n JSON.stringify(toolSpecsJson, null, 2),\n \"utf-8\",\n );\n\n const configJson = { projectPath: path.resolve(projectPath) };\n await fs.writeFile(path.join(outDir, \"config.json\"), JSON.stringify(configJson, null, 2), \"utf-8\");\n\n const rel = path.relative(outDir, projectPath) || \".\";\n const fromGeneratedToProject = rel.split(path.sep).length ? rel : \".\";\n\n const [mcpServerTemplate, toolIndexTemplate, skillInvokerTemplate, n8nInvokerTemplate] = await Promise.all([\n loadTemplate(TEMPLATE_NAMES.mcpServer),\n loadTemplate(TEMPLATE_NAMES.toolIndex),\n loadTemplate(TEMPLATE_NAMES.skillInvoker),\n loadTemplate(TEMPLATE_NAMES.n8nInvoker),\n ]);\n\n const toolIndexTs = toolIndexTemplate.replace(\"{{CASES}}\", buildToolIndexCases(functionSpecs, fromGeneratedToProject));\n await fs.writeFile(path.join(outDir, \"tool-index.ts\"), toolIndexTs, \"utf-8\");\n\n const skillCases = buildSkillInvokerCases(skillSpecs, fromGeneratedToProject);\n const skillDefaultCase =\n skillSpecs.length === 0 ? \"default: throw new Error('Unknown skill: ' + name);\" : 'default: throw new Error(\"Unknown skill: \" + name);';\n const skillInvokerTs = skillInvokerTemplate.replace(\"{{CASES}}\", skillCases).replace(\"{{DEFAULT_CASE}}\", skillDefaultCase);\n await fs.writeFile(path.join(outDir, \"skill-invoker.ts\"), skillInvokerTs, \"utf-8\");\n\n const n8nCases = buildN8nInvokerCases(n8nSpecs);\n const n8nDefaultCase =\n n8nSpecs.length === 0 ? \"default: throw new Error('Unknown n8n tool: ' + name);\" : 'default: throw new Error(\"Unknown n8n tool: \" + name);';\n const n8nInvokerTs = n8nInvokerTemplate.replace(\"{{CASES}}\", n8nCases).replace(\"{{DEFAULT_CASE}}\", n8nDefaultCase);\n await fs.writeFile(path.join(outDir, \"n8n-invoker.ts\"), n8nInvokerTs, \"utf-8\");\n\n await fs.writeFile(path.join(outDir, \"mcp-server.ts\"), mcpServerTemplate, \"utf-8\");\n\n const mcpJson = {\n command: \"npx\",\n args: [\"-y\", \"tsx\", path.join(outDir, \"mcp-server.ts\")],\n };\n await fs.writeFile(path.join(outDir, \"mcp.json\"), JSON.stringify(mcpJson, null, 2), \"utf-8\");\n\n const packageJson = {\n name: \"function-tools-mcp\",\n version: \"1.0.0\",\n type: \"module\",\n description: \"MCP server generated from @tool functions, SKILL.md, and workflow.json\",\n main: \"mcp-server.ts\",\n scripts: { start: \"npx tsx mcp-server.ts\" },\n dependencies: {\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n typescript: \">=5.0.0\",\n tsx: \">=4.0.0\",\n },\n };\n await fs.writeFile(path.join(outDir, \"package.json\"), JSON.stringify(packageJson, null, 2), \"utf-8\");\n\n return {\n entryPath: path.join(outDir, \"mcp-server.ts\"),\n mcpJsonPath: path.join(outDir, \"mcp.json\"),\n };\n}\n","/**\n * MCP build: scan project for @tool, SKILL, n8n; generate MCP entrypoint and npm package.\n */\n\nimport * as path from \"node:path\";\nimport { scanForAllTools } from \"./scan/scanTools.js\";\nimport { generate } from \"./generator.js\";\nimport type { BuildResult } from \"./types.js\";\nimport type { MCPToolSpec } from \"./types.js\";\n\nexport interface BuildOptions {\n /** Project root (folder to scan; default: cwd). */\n projectPath?: string;\n /** Output directory for generated files (default: projectPath/dist). */\n outDir?: string;\n /** Glob patterns for TS files (default: [\"**\\/*.ts\"]). Used for @tool (TypeScript) scanning only. */\n include?: string[];\n /** Path to tsconfig.json (default: projectPath/tsconfig.json). Used for @tool scanning only. */\n tsconfigPath?: string;\n /** Include n8n (workflow.json) tools. Default false: we do not start or install n8n-local; set true if you use n8n. */\n includeN8n?: boolean;\n}\n\n/**\n * Scan project for all tools (@tool, SKILL, n8n); generate MCP server + tool-specs + invokers (npm package).\n */\nexport async function buildMcpPackage(options: BuildOptions = {}): Promise<BuildResult> {\n const projectPath = path.resolve(options.projectPath ?? process.cwd());\n const outDir = path.resolve(projectPath, options.outDir ?? \"dist\");\n const include = options.include ?? [\"**/*.ts\"];\n const tsconfigPath = options.tsconfigPath;\n\n const scanResult = await scanForAllTools(projectPath, {\n include,\n tsconfigPath,\n includeN8n: options.includeN8n,\n });\n\n if (scanResult.errors.length > 0) {\n const msg = scanResult.errors.map((e) => `${e.file}: ${e.message}`).join(\"; \");\n throw new Error(`Scan failed: ${msg}`);\n }\n\n const allSpecs: MCPToolSpec[] = scanResult.specs;\n\n if (allSpecs.length === 0) {\n throw new Error(\n \"No tools found. Add @tool functions (JSDoc), SKILL.md directories, or workflow.json directories.\",\n );\n }\n\n const { entryPath, mcpJsonPath } = await generate({\n specs: allSpecs,\n outDir,\n projectPath,\n });\n\n return {\n outDir,\n toolCount: allSpecs.length,\n entryPath,\n mcpJsonPath,\n };\n}\n\n/** @deprecated Use buildMcpPackage. */\nexport const buildFunctionToTool = buildMcpPackage;\n","/**\n * Run step: start the generated MCP server (stdio) for testing. Spawns entrypoint via npx tsx.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\n\nexport interface RunOptions {\n /** Directory containing generated mcp-server (default: cwd or cwd/dist). */\n path?: string;\n}\n\n/**\n * Start the MCP server from the given directory.\n * Expects mcp-server.ts and tool-specs.json there; runs via npx tsx mcp-server.ts.\n * Returns a child process; caller should handle stdin/stdout and cleanup.\n */\nexport async function runMcpServer(options: RunOptions = {}): Promise<{ process: ReturnType<typeof spawn> }> {\n const base = options.path ?? process.cwd();\n const candidates = [\n path.join(base, \"mcp-server.ts\"),\n path.join(base, \"mcp-server.js\"),\n path.join(base, \"dist\", \"mcp-server.ts\"),\n path.join(base, \"dist\", \"mcp-server.js\"),\n path.join(base, \"generated\", \"mcp-server.ts\"),\n path.join(base, \"generated\", \"mcp-server.js\"),\n ];\n let entry = \"\";\n for (const p of candidates) {\n try {\n await fs.access(p);\n entry = p;\n break;\n } catch {\n // continue\n }\n }\n if (!entry) {\n throw new Error(\n `MCP entrypoint not found. Run \"agent-tool build\" first, or pass --path to a directory containing mcp-server.ts. Tried: ${candidates.join(\", \")}`,\n );\n }\n\n const dir = path.dirname(entry);\n const child = spawn(\"npx\", [\"-y\", \"tsx\", path.basename(entry)], {\n cwd: dir,\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n shell: false,\n });\n\n return { process: child };\n}\n\n/** @deprecated Use runMcpServer. */\nexport const runGeneratedMCP = runMcpServer;\n"]}
package/dist/cli.cjs ADDED
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var chunkZ7TGIG77_cjs = require('./chunk-Z7TGIG77.cjs');
5
+ var path = require('path');
6
+ var fs = require('fs');
7
+ var url = require('url');
8
+
9
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var path__default = /*#__PURE__*/_interopDefault(path);
13
+
14
+ function parseArgv(argv) {
15
+ const args = argv.slice(2);
16
+ let command = "help";
17
+ let help = false;
18
+ let pathOpt = "";
19
+ let outDir = "";
20
+ let include = [];
21
+ let includeN8n = false;
22
+ for (let i = 0; i < args.length; i++) {
23
+ const arg = args[i];
24
+ if (arg === "--help" || arg === "-h") {
25
+ help = true;
26
+ } else if (arg === "--path" || arg === "-p") {
27
+ pathOpt = path__default.default.resolve(process.cwd(), args[++i] ?? "");
28
+ } else if (arg === "--out" || arg === "-o") {
29
+ outDir = path__default.default.resolve(process.cwd(), args[++i] ?? "");
30
+ } else if (arg === "--include" || arg === "-i") {
31
+ const v = args[++i];
32
+ if (v) include.push(v);
33
+ } else if (arg === "--include-n8n") {
34
+ includeN8n = true;
35
+ } else if (arg && !arg.startsWith("-")) {
36
+ if (arg === "init" || arg === "build" || arg === "serve" || arg === "help") {
37
+ command = arg;
38
+ }
39
+ }
40
+ }
41
+ return { command, help, pathOpt, outDir, include, includeN8n };
42
+ }
43
+ function printHelp() {
44
+ const bin = "agent-tool";
45
+ process.stdout.write(`
46
+ Usage: ${bin} <command> [options]
47
+
48
+ Commands:
49
+ init Create project template (package.json, tsconfig, @tool sample, SKILL sample). Then npm install && npm run build.
50
+ build Scan folder for @tool / SKILL (and optionally n8n with --include-n8n), generate MCP npm package.
51
+ serve Start the generated MCP server (stdio) for testing.
52
+ help Show this help.
53
+
54
+ For agent run (ReAct + agent.yaml), use: npx @easynet/agent-orchestra run "task" -c agent.yaml
55
+
56
+ Options:
57
+ --path, -p <path> For init: target dir; for build: project root; for serve: generated dir (default: cwd).
58
+ --out, -o <path> For build: output directory (default: <projectPath>/dist).
59
+ --include, -i <glob> For build: glob for TS files (default: **/*.ts).
60
+ --include-n8n For build: include n8n (workflow.json) tools (default: off).
61
+ --help, -h Show this help.
62
+
63
+ Examples:
64
+ ${bin} init
65
+ ${bin} build
66
+ ${bin} serve
67
+ ${bin} serve -p ./dist
68
+ `);
69
+ }
70
+ async function cmdInit(pathOpt) {
71
+ try {
72
+ const { targetPath, filesCreated } = await chunkZ7TGIG77_cjs.initProject({ targetPath: pathOpt || void 0 });
73
+ process.stdout.write(`Initialized project at ${targetPath}
74
+ Created: ${filesCreated.join(", ")}
75
+ Next: npm install && npm run build
76
+ `);
77
+ return 0;
78
+ } catch (err) {
79
+ process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}
80
+ `);
81
+ return 1;
82
+ }
83
+ }
84
+ async function cmdBuild(pathOpt, outDir, include, includeN8n) {
85
+ try {
86
+ const result = await chunkZ7TGIG77_cjs.buildMcpPackage({
87
+ projectPath: pathOpt || void 0,
88
+ outDir: outDir || void 0,
89
+ include: include.length > 0 ? include : void 0,
90
+ includeN8n: includeN8n || void 0
91
+ });
92
+ process.stdout.write(
93
+ `Built ${result.toolCount} tool(s) -> ${result.outDir}
94
+ Entry: ${result.entryPath}
95
+ mcp.json: ${result.mcpJsonPath}
96
+ `
97
+ );
98
+ return 0;
99
+ } catch (err) {
100
+ process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}
101
+ `);
102
+ return 1;
103
+ }
104
+ }
105
+ async function cmdServe(pathOpt) {
106
+ try {
107
+ const { process: child } = await chunkZ7TGIG77_cjs.runMcpServer({ path: pathOpt || void 0 });
108
+ child.stdin?.pipe(process.stdin);
109
+ child.stdout?.pipe(process.stdout);
110
+ process.stdin?.unref();
111
+ const exit = new Promise((resolve) => {
112
+ child.on("close", (code) => resolve(code ?? 0));
113
+ });
114
+ return exit;
115
+ } catch (err) {
116
+ process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}
117
+ `);
118
+ return 1;
119
+ }
120
+ }
121
+ async function main(argv = process.argv) {
122
+ const { command, help, pathOpt, outDir, include, includeN8n } = parseArgv(argv);
123
+ if (help || command === "help") {
124
+ printHelp();
125
+ return 0;
126
+ }
127
+ if (command === "init") return cmdInit(pathOpt);
128
+ if (command === "build") return cmdBuild(pathOpt, outDir, include, includeN8n);
129
+ if (command === "serve") return cmdServe(pathOpt);
130
+ printHelp();
131
+ return 1;
132
+ }
133
+ async function run(argv) {
134
+ return main(argv);
135
+ }
136
+ var scriptPath = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli.cjs', document.baseURI).href)));
137
+ var invokedPath = process.argv[1];
138
+ var isMain = typeof process !== "undefined" && invokedPath !== void 0 && invokedPath === scriptPath;
139
+ if (!isMain && invokedPath) {
140
+ try {
141
+ isMain = fs.realpathSync(invokedPath) === fs.realpathSync(scriptPath);
142
+ } catch {
143
+ }
144
+ }
145
+ if (isMain) {
146
+ main().then((code) => process.exit(code)).catch((err) => {
147
+ process.stderr.write(String(err?.message ?? err) + "\n");
148
+ process.exit(1);
149
+ });
150
+ }
151
+
152
+ exports.run = run;
153
+ //# sourceMappingURL=cli.cjs.map
154
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"names":["path","initProject","buildMcpPackage","runMcpServer","fileURLToPath","realpathSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI for @easynet/agent-tool: init → build | serve.\n * Usage: agent-tool <command> [options]\n * Commands: init | build | serve | help\n * For agent run (ReAct + agent.yaml), use @easynet/agent-orchestra.\n */\n\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { initProject } from \"./codegen/init.js\";\nimport { buildMcpPackage } from \"./codegen/build.js\";\nimport { runMcpServer } from \"./codegen/run.js\";\n\ninterface CliArgs {\n command: \"init\" | \"build\" | \"serve\" | \"help\";\n help: boolean;\n /** For init: target dir; for build: project path; for serve: path to generated dir. */\n pathOpt: string;\n /** For build: output directory. */\n outDir: string;\n /** For build: glob(s) for TS files (default **\\/*.ts). */\n include: string[];\n /** For build: include n8n (workflow.json) tools. Default off to keep package small. */\n includeN8n: boolean;\n}\n\nfunction parseArgv(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let command: CliArgs[\"command\"] = \"help\";\n let help = false;\n let pathOpt = \"\";\n let outDir = \"\";\n let include: string[] = [];\n let includeN8n = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--path\" || arg === \"-p\") {\n pathOpt = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--out\" || arg === \"-o\") {\n outDir = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--include\" || arg === \"-i\") {\n const v = args[++i];\n if (v) include.push(v);\n } else if (arg === \"--include-n8n\") {\n includeN8n = true;\n } else if (arg && !arg.startsWith(\"-\")) {\n if (arg === \"init\" || arg === \"build\" || arg === \"serve\" || arg === \"help\") {\n command = arg;\n }\n }\n }\n\n return { command, help, pathOpt, outDir, include, includeN8n };\n}\n\nfunction printHelp(): void {\n const bin = \"agent-tool\";\n process.stdout.write(`\nUsage: ${bin} <command> [options]\n\nCommands:\n init Create project template (package.json, tsconfig, @tool sample, SKILL sample). Then npm install && npm run build.\n build Scan folder for @tool / SKILL (and optionally n8n with --include-n8n), generate MCP npm package.\n serve Start the generated MCP server (stdio) for testing.\n help Show this help.\n\nFor agent run (ReAct + agent.yaml), use: npx @easynet/agent-orchestra run \"task\" -c agent.yaml\n\nOptions:\n --path, -p <path> For init: target dir; for build: project root; for serve: generated dir (default: cwd).\n --out, -o <path> For build: output directory (default: <projectPath>/dist).\n --include, -i <glob> For build: glob for TS files (default: **/*.ts).\n --include-n8n For build: include n8n (workflow.json) tools (default: off).\n --help, -h Show this help.\n\nExamples:\n ${bin} init\n ${bin} build\n ${bin} serve\n ${bin} serve -p ./dist\n`);\n}\n\nasync function cmdInit(pathOpt: string): Promise<number> {\n try {\n const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || undefined });\n process.stdout.write(`Initialized project at ${targetPath}\\nCreated: ${filesCreated.join(\", \")}\\nNext: npm install && npm run build\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdBuild(\n pathOpt: string,\n outDir: string,\n include: string[],\n includeN8n: boolean,\n): Promise<number> {\n try {\n const result = await buildMcpPackage({\n projectPath: pathOpt || undefined,\n outDir: outDir || undefined,\n include: include.length > 0 ? include : undefined,\n includeN8n: includeN8n || undefined,\n });\n process.stdout.write(\n `Built ${result.toolCount} tool(s) -> ${result.outDir}\\nEntry: ${result.entryPath}\\nmcp.json: ${result.mcpJsonPath}\\n`,\n );\n return 0;\n } catch (err) {\n process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdServe(pathOpt: string): Promise<number> {\n try {\n const { process: child } = await runMcpServer({ path: pathOpt || undefined });\n child.stdin?.pipe(process.stdin);\n child.stdout?.pipe(process.stdout);\n process.stdin?.unref();\n const exit = new Promise<number>((resolve) => {\n child.on(\"close\", (code) => resolve(code ?? 0));\n });\n return exit;\n } catch (err) {\n process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function main(argv: string[] = process.argv): Promise<number> {\n const { command, help, pathOpt, outDir, include, includeN8n } = parseArgv(argv);\n\n if (help || command === \"help\") {\n printHelp();\n return 0;\n }\n\n if (command === \"init\") return cmdInit(pathOpt);\n if (command === \"build\") return cmdBuild(pathOpt, outDir, include, includeN8n);\n if (command === \"serve\") return cmdServe(pathOpt);\n\n printHelp();\n return 1;\n}\n\n/** Run CLI with the given argv (same shape as process.argv). Exported for tests. */\nexport async function run(argv: string[]): Promise<number> {\n return main(argv);\n}\n\nconst scriptPath = fileURLToPath(import.meta.url);\nconst invokedPath = process.argv[1];\nlet isMain = typeof process !== \"undefined\" && invokedPath !== undefined && invokedPath === scriptPath;\nif (!isMain && invokedPath) {\n try {\n isMain = realpathSync(invokedPath) === realpathSync(scriptPath);\n } catch {\n // keep isMain false if realpath fails\n }\n}\n\nif (isMain) {\n main()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(String(err?.message ?? err) + \"\\n\");\n process.exit(1);\n });\n}\n"]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for @easynet/agent-tool: init → build | serve.
4
+ * Usage: agent-tool <command> [options]
5
+ * Commands: init | build | serve | help
6
+ * For agent run (ReAct + agent.yaml), use @easynet/agent-orchestra.
7
+ */
8
+ /** Run CLI with the given argv (same shape as process.argv). Exported for tests. */
9
+ export declare function run(argv: string[]): Promise<number>;
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAoJH,oFAAoF;AACpF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEzD"}
package/dist/cli.js ADDED
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env node
2
+ import { initProject, buildMcpPackage, runMcpServer } from './chunk-BM4EVYI5.js';
3
+ import path from 'path';
4
+ import { realpathSync } from 'fs';
5
+ import { fileURLToPath } from 'url';
6
+
7
+ function parseArgv(argv) {
8
+ const args = argv.slice(2);
9
+ let command = "help";
10
+ let help = false;
11
+ let pathOpt = "";
12
+ let outDir = "";
13
+ let include = [];
14
+ let includeN8n = false;
15
+ for (let i = 0; i < args.length; i++) {
16
+ const arg = args[i];
17
+ if (arg === "--help" || arg === "-h") {
18
+ help = true;
19
+ } else if (arg === "--path" || arg === "-p") {
20
+ pathOpt = path.resolve(process.cwd(), args[++i] ?? "");
21
+ } else if (arg === "--out" || arg === "-o") {
22
+ outDir = path.resolve(process.cwd(), args[++i] ?? "");
23
+ } else if (arg === "--include" || arg === "-i") {
24
+ const v = args[++i];
25
+ if (v) include.push(v);
26
+ } else if (arg === "--include-n8n") {
27
+ includeN8n = true;
28
+ } else if (arg && !arg.startsWith("-")) {
29
+ if (arg === "init" || arg === "build" || arg === "serve" || arg === "help") {
30
+ command = arg;
31
+ }
32
+ }
33
+ }
34
+ return { command, help, pathOpt, outDir, include, includeN8n };
35
+ }
36
+ function printHelp() {
37
+ const bin = "agent-tool";
38
+ process.stdout.write(`
39
+ Usage: ${bin} <command> [options]
40
+
41
+ Commands:
42
+ init Create project template (package.json, tsconfig, @tool sample, SKILL sample). Then npm install && npm run build.
43
+ build Scan folder for @tool / SKILL (and optionally n8n with --include-n8n), generate MCP npm package.
44
+ serve Start the generated MCP server (stdio) for testing.
45
+ help Show this help.
46
+
47
+ For agent run (ReAct + agent.yaml), use: npx @easynet/agent-orchestra run "task" -c agent.yaml
48
+
49
+ Options:
50
+ --path, -p <path> For init: target dir; for build: project root; for serve: generated dir (default: cwd).
51
+ --out, -o <path> For build: output directory (default: <projectPath>/dist).
52
+ --include, -i <glob> For build: glob for TS files (default: **/*.ts).
53
+ --include-n8n For build: include n8n (workflow.json) tools (default: off).
54
+ --help, -h Show this help.
55
+
56
+ Examples:
57
+ ${bin} init
58
+ ${bin} build
59
+ ${bin} serve
60
+ ${bin} serve -p ./dist
61
+ `);
62
+ }
63
+ async function cmdInit(pathOpt) {
64
+ try {
65
+ const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || void 0 });
66
+ process.stdout.write(`Initialized project at ${targetPath}
67
+ Created: ${filesCreated.join(", ")}
68
+ Next: npm install && npm run build
69
+ `);
70
+ return 0;
71
+ } catch (err) {
72
+ process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}
73
+ `);
74
+ return 1;
75
+ }
76
+ }
77
+ async function cmdBuild(pathOpt, outDir, include, includeN8n) {
78
+ try {
79
+ const result = await buildMcpPackage({
80
+ projectPath: pathOpt || void 0,
81
+ outDir: outDir || void 0,
82
+ include: include.length > 0 ? include : void 0,
83
+ includeN8n: includeN8n || void 0
84
+ });
85
+ process.stdout.write(
86
+ `Built ${result.toolCount} tool(s) -> ${result.outDir}
87
+ Entry: ${result.entryPath}
88
+ mcp.json: ${result.mcpJsonPath}
89
+ `
90
+ );
91
+ return 0;
92
+ } catch (err) {
93
+ process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}
94
+ `);
95
+ return 1;
96
+ }
97
+ }
98
+ async function cmdServe(pathOpt) {
99
+ try {
100
+ const { process: child } = await runMcpServer({ path: pathOpt || void 0 });
101
+ child.stdin?.pipe(process.stdin);
102
+ child.stdout?.pipe(process.stdout);
103
+ process.stdin?.unref();
104
+ const exit = new Promise((resolve) => {
105
+ child.on("close", (code) => resolve(code ?? 0));
106
+ });
107
+ return exit;
108
+ } catch (err) {
109
+ process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}
110
+ `);
111
+ return 1;
112
+ }
113
+ }
114
+ async function main(argv = process.argv) {
115
+ const { command, help, pathOpt, outDir, include, includeN8n } = parseArgv(argv);
116
+ if (help || command === "help") {
117
+ printHelp();
118
+ return 0;
119
+ }
120
+ if (command === "init") return cmdInit(pathOpt);
121
+ if (command === "build") return cmdBuild(pathOpt, outDir, include, includeN8n);
122
+ if (command === "serve") return cmdServe(pathOpt);
123
+ printHelp();
124
+ return 1;
125
+ }
126
+ async function run(argv) {
127
+ return main(argv);
128
+ }
129
+ var scriptPath = fileURLToPath(import.meta.url);
130
+ var invokedPath = process.argv[1];
131
+ var isMain = typeof process !== "undefined" && invokedPath !== void 0 && invokedPath === scriptPath;
132
+ if (!isMain && invokedPath) {
133
+ try {
134
+ isMain = realpathSync(invokedPath) === realpathSync(scriptPath);
135
+ } catch {
136
+ }
137
+ }
138
+ if (isMain) {
139
+ main().then((code) => process.exit(code)).catch((err) => {
140
+ process.stderr.write(String(err?.message ?? err) + "\n");
141
+ process.exit(1);
142
+ });
143
+ }
144
+
145
+ export { run };
146
+ //# sourceMappingURL=cli.js.map
147
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI for @easynet/agent-tool: init → build | serve.\n * Usage: agent-tool <command> [options]\n * Commands: init | build | serve | help\n * For agent run (ReAct + agent.yaml), use @easynet/agent-orchestra.\n */\n\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { initProject } from \"./codegen/init.js\";\nimport { buildMcpPackage } from \"./codegen/build.js\";\nimport { runMcpServer } from \"./codegen/run.js\";\n\ninterface CliArgs {\n command: \"init\" | \"build\" | \"serve\" | \"help\";\n help: boolean;\n /** For init: target dir; for build: project path; for serve: path to generated dir. */\n pathOpt: string;\n /** For build: output directory. */\n outDir: string;\n /** For build: glob(s) for TS files (default **\\/*.ts). */\n include: string[];\n /** For build: include n8n (workflow.json) tools. Default off to keep package small. */\n includeN8n: boolean;\n}\n\nfunction parseArgv(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let command: CliArgs[\"command\"] = \"help\";\n let help = false;\n let pathOpt = \"\";\n let outDir = \"\";\n let include: string[] = [];\n let includeN8n = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--path\" || arg === \"-p\") {\n pathOpt = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--out\" || arg === \"-o\") {\n outDir = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--include\" || arg === \"-i\") {\n const v = args[++i];\n if (v) include.push(v);\n } else if (arg === \"--include-n8n\") {\n includeN8n = true;\n } else if (arg && !arg.startsWith(\"-\")) {\n if (arg === \"init\" || arg === \"build\" || arg === \"serve\" || arg === \"help\") {\n command = arg;\n }\n }\n }\n\n return { command, help, pathOpt, outDir, include, includeN8n };\n}\n\nfunction printHelp(): void {\n const bin = \"agent-tool\";\n process.stdout.write(`\nUsage: ${bin} <command> [options]\n\nCommands:\n init Create project template (package.json, tsconfig, @tool sample, SKILL sample). Then npm install && npm run build.\n build Scan folder for @tool / SKILL (and optionally n8n with --include-n8n), generate MCP npm package.\n serve Start the generated MCP server (stdio) for testing.\n help Show this help.\n\nFor agent run (ReAct + agent.yaml), use: npx @easynet/agent-orchestra run \"task\" -c agent.yaml\n\nOptions:\n --path, -p <path> For init: target dir; for build: project root; for serve: generated dir (default: cwd).\n --out, -o <path> For build: output directory (default: <projectPath>/dist).\n --include, -i <glob> For build: glob for TS files (default: **/*.ts).\n --include-n8n For build: include n8n (workflow.json) tools (default: off).\n --help, -h Show this help.\n\nExamples:\n ${bin} init\n ${bin} build\n ${bin} serve\n ${bin} serve -p ./dist\n`);\n}\n\nasync function cmdInit(pathOpt: string): Promise<number> {\n try {\n const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || undefined });\n process.stdout.write(`Initialized project at ${targetPath}\\nCreated: ${filesCreated.join(\", \")}\\nNext: npm install && npm run build\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdBuild(\n pathOpt: string,\n outDir: string,\n include: string[],\n includeN8n: boolean,\n): Promise<number> {\n try {\n const result = await buildMcpPackage({\n projectPath: pathOpt || undefined,\n outDir: outDir || undefined,\n include: include.length > 0 ? include : undefined,\n includeN8n: includeN8n || undefined,\n });\n process.stdout.write(\n `Built ${result.toolCount} tool(s) -> ${result.outDir}\\nEntry: ${result.entryPath}\\nmcp.json: ${result.mcpJsonPath}\\n`,\n );\n return 0;\n } catch (err) {\n process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdServe(pathOpt: string): Promise<number> {\n try {\n const { process: child } = await runMcpServer({ path: pathOpt || undefined });\n child.stdin?.pipe(process.stdin);\n child.stdout?.pipe(process.stdout);\n process.stdin?.unref();\n const exit = new Promise<number>((resolve) => {\n child.on(\"close\", (code) => resolve(code ?? 0));\n });\n return exit;\n } catch (err) {\n process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function main(argv: string[] = process.argv): Promise<number> {\n const { command, help, pathOpt, outDir, include, includeN8n } = parseArgv(argv);\n\n if (help || command === \"help\") {\n printHelp();\n return 0;\n }\n\n if (command === \"init\") return cmdInit(pathOpt);\n if (command === \"build\") return cmdBuild(pathOpt, outDir, include, includeN8n);\n if (command === \"serve\") return cmdServe(pathOpt);\n\n printHelp();\n return 1;\n}\n\n/** Run CLI with the given argv (same shape as process.argv). Exported for tests. */\nexport async function run(argv: string[]): Promise<number> {\n return main(argv);\n}\n\nconst scriptPath = fileURLToPath(import.meta.url);\nconst invokedPath = process.argv[1];\nlet isMain = typeof process !== \"undefined\" && invokedPath !== undefined && invokedPath === scriptPath;\nif (!isMain && invokedPath) {\n try {\n isMain = realpathSync(invokedPath) === realpathSync(scriptPath);\n } catch {\n // keep isMain false if realpath fails\n }\n}\n\nif (isMain) {\n main()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(String(err?.message ?? err) + \"\\n\");\n process.exit(1);\n });\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * MCP build: scan project for @tool, SKILL, n8n; generate MCP entrypoint and npm package.
3
+ */
4
+ import type { BuildResult } from "./types.js";
5
+ export interface BuildOptions {
6
+ /** Project root (folder to scan; default: cwd). */
7
+ projectPath?: string;
8
+ /** Output directory for generated files (default: projectPath/dist). */
9
+ outDir?: string;
10
+ /** Glob patterns for TS files (default: ["**\/*.ts"]). Used for @tool (TypeScript) scanning only. */
11
+ include?: string[];
12
+ /** Path to tsconfig.json (default: projectPath/tsconfig.json). Used for @tool scanning only. */
13
+ tsconfigPath?: string;
14
+ /** Include n8n (workflow.json) tools. Default false: we do not start or install n8n-local; set true if you use n8n. */
15
+ includeN8n?: boolean;
16
+ }
17
+ /**
18
+ * Scan project for all tools (@tool, SKILL, n8n); generate MCP server + tool-specs + invokers (npm package).
19
+ */
20
+ export declare function buildMcpPackage(options?: BuildOptions): Promise<BuildResult>;
21
+ /** @deprecated Use buildMcpPackage. */
22
+ export declare const buildFunctionToTool: typeof buildMcpPackage;
23
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/codegen/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uHAAuH;IACvH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqCtF;AAED,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,wBAAkB,CAAC"}