@obov/mext 0.0.0-stage → 0.2.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 (155) hide show
  1. package/dist/build-cli.d.ts +39 -0
  2. package/dist/build-cli.js +167 -0
  3. package/dist/build-cli.js.map +1 -0
  4. package/dist/build.d.ts +65 -0
  5. package/dist/build.js +252 -0
  6. package/dist/build.js.map +1 -0
  7. package/dist/cli/args.d.ts +107 -0
  8. package/dist/cli/args.js +621 -0
  9. package/dist/cli/args.js.map +1 -0
  10. package/dist/cli/bin.d.ts +2 -0
  11. package/dist/cli/bin.js +13 -0
  12. package/dist/cli/bin.js.map +1 -0
  13. package/dist/cli/build.d.ts +11 -0
  14. package/dist/cli/build.js +87 -0
  15. package/dist/cli/build.js.map +1 -0
  16. package/dist/cli/dev-lock.d.ts +23 -0
  17. package/dist/cli/dev-lock.js +68 -0
  18. package/dist/cli/dev-lock.js.map +1 -0
  19. package/dist/cli/dev-server.d.ts +20 -0
  20. package/dist/cli/dev-server.js +75 -0
  21. package/dist/cli/dev-server.js.map +1 -0
  22. package/dist/cli/dev.d.ts +21 -0
  23. package/dist/cli/dev.js +565 -0
  24. package/dist/cli/dev.js.map +1 -0
  25. package/dist/cli/help.d.ts +31 -0
  26. package/dist/cli/help.js +238 -0
  27. package/dist/cli/help.js.map +1 -0
  28. package/dist/cli/io.d.ts +26 -0
  29. package/dist/cli/io.js +74 -0
  30. package/dist/cli/io.js.map +1 -0
  31. package/dist/cli/login.d.ts +32 -0
  32. package/dist/cli/login.js +284 -0
  33. package/dist/cli/login.js.map +1 -0
  34. package/dist/cli/logout.d.ts +9 -0
  35. package/dist/cli/logout.js +105 -0
  36. package/dist/cli/logout.js.map +1 -0
  37. package/dist/cli/main.d.ts +19 -0
  38. package/dist/cli/main.js +77 -0
  39. package/dist/cli/main.js.map +1 -0
  40. package/dist/cli/mcp.d.ts +16 -0
  41. package/dist/cli/mcp.js +92 -0
  42. package/dist/cli/mcp.js.map +1 -0
  43. package/dist/cli/output.d.ts +78 -0
  44. package/dist/cli/output.js +229 -0
  45. package/dist/cli/output.js.map +1 -0
  46. package/dist/cli/remote.d.ts +17 -0
  47. package/dist/cli/remote.js +35 -0
  48. package/dist/cli/remote.js.map +1 -0
  49. package/dist/cli/run.d.ts +14 -0
  50. package/dist/cli/run.js +218 -0
  51. package/dist/cli/run.js.map +1 -0
  52. package/dist/cli/start.d.ts +8 -0
  53. package/dist/cli/start.js +37 -0
  54. package/dist/cli/start.js.map +1 -0
  55. package/dist/client/cache.d.ts +104 -0
  56. package/dist/client/cache.js +208 -0
  57. package/dist/client/cache.js.map +1 -0
  58. package/dist/client/main.d.ts +31 -0
  59. package/dist/client/main.js +101 -0
  60. package/dist/client/main.js.map +1 -0
  61. package/dist/client/manifest.d.ts +19 -0
  62. package/dist/client/manifest.js +68 -0
  63. package/dist/client/manifest.js.map +1 -0
  64. package/dist/client/runner.d.ts +52 -0
  65. package/dist/client/runner.js +563 -0
  66. package/dist/client/runner.js.map +1 -0
  67. package/dist/command.d.ts +75 -0
  68. package/dist/command.js +44 -0
  69. package/dist/command.js.map +1 -0
  70. package/dist/config.d.ts +111 -0
  71. package/dist/config.js +197 -0
  72. package/dist/config.js.map +1 -0
  73. package/dist/errors.d.ts +74 -0
  74. package/dist/errors.js +38 -0
  75. package/dist/errors.js.map +1 -0
  76. package/dist/ids.d.ts +6 -0
  77. package/dist/ids.js +12 -0
  78. package/dist/ids.js.map +1 -0
  79. package/dist/index.d.ts +46 -0
  80. package/dist/index.js +27 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/instrumentation.d.ts +97 -0
  83. package/dist/instrumentation.js +165 -0
  84. package/dist/instrumentation.js.map +1 -0
  85. package/dist/invoke.d.ts +64 -0
  86. package/dist/invoke.js +152 -0
  87. package/dist/invoke.js.map +1 -0
  88. package/dist/lookup.d.ts +9 -0
  89. package/dist/lookup.js +27 -0
  90. package/dist/lookup.js.map +1 -0
  91. package/dist/manifest.d.ts +68 -0
  92. package/dist/manifest.js +77 -0
  93. package/dist/manifest.js.map +1 -0
  94. package/dist/mcp/constants.d.ts +9 -0
  95. package/dist/mcp/constants.js +10 -0
  96. package/dist/mcp/constants.js.map +1 -0
  97. package/dist/mcp/dispatch.d.ts +66 -0
  98. package/dist/mcp/dispatch.js +249 -0
  99. package/dist/mcp/dispatch.js.map +1 -0
  100. package/dist/mcp/help.d.ts +57 -0
  101. package/dist/mcp/help.js +136 -0
  102. package/dist/mcp/help.js.map +1 -0
  103. package/dist/mcp/http.d.ts +96 -0
  104. package/dist/mcp/http.js +368 -0
  105. package/dist/mcp/http.js.map +1 -0
  106. package/dist/mcp/index.d.ts +15 -0
  107. package/dist/mcp/index.js +9 -0
  108. package/dist/mcp/index.js.map +1 -0
  109. package/dist/mcp/install.d.ts +17 -0
  110. package/dist/mcp/install.js +36 -0
  111. package/dist/mcp/install.js.map +1 -0
  112. package/dist/mcp/mrtr.d.ts +82 -0
  113. package/dist/mcp/mrtr.js +130 -0
  114. package/dist/mcp/mrtr.js.map +1 -0
  115. package/dist/mcp/server.d.ts +63 -0
  116. package/dist/mcp/server.js +210 -0
  117. package/dist/mcp/server.js.map +1 -0
  118. package/dist/mcp/stdio.d.ts +75 -0
  119. package/dist/mcp/stdio.js +222 -0
  120. package/dist/mcp/stdio.js.map +1 -0
  121. package/dist/principal.d.ts +16 -0
  122. package/dist/principal.js +24 -0
  123. package/dist/principal.js.map +1 -0
  124. package/dist/registry.d.ts +90 -0
  125. package/dist/registry.js +169 -0
  126. package/dist/registry.js.map +1 -0
  127. package/dist/remote/browser.d.ts +15 -0
  128. package/dist/remote/browser.js +47 -0
  129. package/dist/remote/browser.js.map +1 -0
  130. package/dist/remote/client.d.ts +113 -0
  131. package/dist/remote/client.js +312 -0
  132. package/dist/remote/client.js.map +1 -0
  133. package/dist/remote/credentials.d.ts +48 -0
  134. package/dist/remote/credentials.js +196 -0
  135. package/dist/remote/credentials.js.map +1 -0
  136. package/dist/remote/index.d.ts +8 -0
  137. package/dist/remote/index.js +5 -0
  138. package/dist/remote/index.js.map +1 -0
  139. package/dist/remote/oauth.d.ts +186 -0
  140. package/dist/remote/oauth.js +507 -0
  141. package/dist/remote/oauth.js.map +1 -0
  142. package/dist/scan.d.ts +34 -0
  143. package/dist/scan.js +155 -0
  144. package/dist/scan.js.map +1 -0
  145. package/dist/start.d.ts +63 -0
  146. package/dist/start.js +269 -0
  147. package/dist/start.js.map +1 -0
  148. package/dist/suggest.d.ts +7 -0
  149. package/dist/suggest.js +45 -0
  150. package/dist/suggest.js.map +1 -0
  151. package/dist/version.d.ts +4 -0
  152. package/dist/version.js +13 -0
  153. package/dist/version.js.map +1 -0
  154. package/package.json +49 -4
  155. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAuC,MAAM,cAAc,CAAA;AAE7F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AA2CvC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;AAkCtF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;AAC7G,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,KAAK;IACL,SAAS;IACT,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,QAAQ;IACR,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;CACP,CAAC,CAAA;AAEF,SAAS,KAAK,CAAC,MAAe;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAA;AACxB,CAAC;AAED,qEAAqE;AACrE,SAAS,MAAM,CAAC,MAAe;IAC7B,IAAI,GAAG,GAAG,MAAM,CAAA;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS;YAAE,GAAG,GAAG,GAAG,CAAC,SAAS,CAAA;aAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;YAAE,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;aACzG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAA;;YACzD,OAAO,GAAG,CAAA;IACjB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAID,SAAS,QAAQ,CAAC,MAAe;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IACvB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,kBAAkB;YACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC3B,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC3B,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACtD,CAAC;IACH,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IACpF,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,qDAAqD;AACrD,SAAS,aAAa,CAAC,MAAe;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACjC,IAAI,GAAc,CAAA;IAClB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;SAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAA;SACzD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,GAAG,GAAG,EAAE,CAAA;QACR,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAA;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;;QAAM,OAAO,SAAS,CAAA;IACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACjH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAkB,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,OAAO,CAAC,MAAe,EAAE,QAAiB;IACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAClC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC3F,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,MAAM,GAAe,EAAE,CAAA;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;YAC5G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IACnC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,KAAK,CAAC,GAAW,EAAE,IAAe,EAAE,IAA4B,EAAE,QAAQ,GAAG,KAAK;IACzF,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAChE,OAAO;QACL,GAAG;QACH,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;QAClB,IAAI;QACJ,WAAW,EAAE,OAAO,IAAI,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QACjF,QAAQ;QACR,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KACzC,CAAA;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG;SACP,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;SACxC,WAAW,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,YAAY,GAAG,+BAA+B,CAAA;AAEpD,6CAA6C;AAC7C,SAAS,YAAY,CAAC,IAA4B;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3B,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAChF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,YAAY,IAAI,CAAC,CAA2B,CAAA;YAClH,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAA4B;IAChD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO;QACL,KAAK,EAAG,GAAG,EAAE,UAAqD,IAAI,EAAE;QACxE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAE,GAAI,CAAC,QAAqB,CAAC,CAAC,CAAC,EAAE;KAC1E,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAmB,EACnB,UAAkC,EAClC,UAAU,GAAsB,EAAE;IAElC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IACpD,MAAM,KAAK,GAAI,MAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAA;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEvC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,IAAI,CAAC,OAAO,oCAAoC,CAAC,CAAA;YACpF,SAAQ;QACV,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,gEAAgE,CAAC,CAAA;YAC5F,SAAQ;QACV,CAAC;QACD,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAA;YACnE,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,IAAI,yBAAyB,KAAK,GAAG,CAAC,CAAA;YAC3E,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;YAClC,MAAM,IAAI,GAAe,EAAE,CAAA;YAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC/E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,gEAAgE,CAAC,CAAA;oBACrG,SAAQ;gBACV,CAAC;gBACD,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,4BAA4B,CAAC,CAAA;oBAC1F,SAAQ;gBACV,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;gBACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACf,CAAC;YACD,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACpG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,oCAAoC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnG,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAA;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,IAA2B;IAChD,OAAO,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;AAC7F,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,OAAO,EAA4D,CAAA;AAEzF,SAAS,QAAQ,CAAC,KAAwB;IACxC,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACvF,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAwB,EAAE,IAAa;IACnE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,uFAAuF;AAEvF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAsB,EAAE,UAAU,GAAsB,EAAE;IAC9F,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IACpD,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACvD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAQ;QAChG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;YACjD,MAAM,IAAI,GAAe,EAAE,CAAA;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;YAClC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACzF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;gBACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACf,CAAC;YACD,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1F,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAA;AAC7F,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,MAAkB;IACvC,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAQ;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAA;QACxE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAA;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7G,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAQ;QAClC,MAAM,GAAG,GAAgB,EAAE,CAAA;QAC3B,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACtE,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAA;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;QACrB,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC3B,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC9B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY,EAAE,QAAiB;IAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC1D,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAe,EAAE,CAAA;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACjC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;YAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IACnC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,OAAO,CAAC,KAAwB;IAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAA;AAC7B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;AACzD,CAAC;AAUD,SAAS,WAAW,CAAC,IAAa,EAAE,IAAY;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACpD,IAAI,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACrE,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YAC1E,IAAI,GAAG;gBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC/F,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,6BAA6B;AAC7B,SAAS,QAAQ,CAAC,IAAa;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/B,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,cAAc,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB,EAAE,GAAW;IACjD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAA;QACZ,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YACrB,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC1D,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;QAC9D,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,GAAW;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA;IACnF,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,aAAa,CAAC,KAAwB,EAAE,MAAuB;IAC7E,OAAO,IAAI,SAAS,CAClB,kBAAkB,EAClB,yBAAyB,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/E;QACE,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,cAAc,EAAE,EAAE;QAClB,MAAM;QACN,eAAe,EAAE,KAAK,CAAC,WAAW;QAClC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;KACtC,CACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAwB,EACxB,IAAuB,EACvB,OAAO,GAAqB,EAAE;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe,EAAS,EAAE;QAClE,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IACvD,CAAC,CAAA;IACD,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA,CAAC,+DAA+D;IAC/F,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACtD,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,IAAI,MAAsE,CAAA;IAC1E,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,MAAM,QAAQ,GAAG,CAAC,IAAgC,EAAE,KAAa,EAAQ,EAAE;QACzE,IAAI,MAAM;YAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,GAAG,KAAK,uDAAuD,CAAC,CAAA;QACxG,MAAM,GAAG,IAAI,CAAA;IACf,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,KAAc,EAAE,KAAa,EAAQ,EAAE;QAClE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAA;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;QAChE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,8BAA8B,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAA;QACjH,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,qCAAqC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAA;QAC3F,CAAC;QACD,IAAI,SAAS,GAAG,MAAM,CAAA;QACtB,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;YACtD,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;gBACpC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACpC,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,KAAK,uBAAuB,CAAC,CAAA;QAClF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACf,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,GAAW,EAAE,KAAa,EAAW,EAAE;QAClE,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,KAAK,2BAA2B,CAAC,CAAA;QACvH,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC,CAAA;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,IAAI,IAAI,EAAE,CAAC;YACT,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrB,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,GAAG,IAAI,CAAA;YACX,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;YAChC,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;YACjB,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACtD,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAA;YACzB,MAAM,SAAS,GAAG,GAAW,EAAE;gBAC7B,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,MAAM,CAAA;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACxB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrE,OAAO,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAA;gBAC/D,CAAC;gBACD,CAAC,EAAE,CAAA;gBACH,OAAO,IAAI,CAAA;YACb,CAAC,CAAA;YACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACzD,IAAI,MAAM,KAAK,SAAS;oBAAE,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAA;gBACxF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;gBAClB,SAAQ;YACV,CAAC;YACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAA;gBACxB,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;gBAC1E,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACjC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC3E,OAAO,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,gBAAgB,KAAK,IAAI,IAAI,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAA;YACpC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,IAAI,MAAM,KAAK,SAAS;wBAAE,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAA;oBACxF,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;gBACzB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC3F,CAAC;gBACD,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;YAC/C,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,gBAAgB,GAAG,kCAAkC,CAAC,CAAA;QACjF,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,aAAa;IACb,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/D,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,MAAM,CAAC,GAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAA;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;QAC5E,GAAG,CAAC;YACF,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;YACnD,CAAC,EAAE,CAAA;QACL,CAAC,QAAQ,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAC;IAC9C,CAAC;IACD,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM;QAAE,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,wBAAwB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAEtG,IAAI,KAAK,GAAY,MAAM,CAAA;IAC3B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QACpG,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,oBAAoB,CAAC,CAAA;QAC5G,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,GAAG,IAAI,CAAA;aAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,yDAAyD,CAAC,CAAA;QACrF,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAA;YACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,6CAA6C;gBAC7C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;gBAChG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;YAC/G,CAAC;YACD,KAAK,GAAG,MAAM,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;AAC5B,CAAC","sourcesContent":["import type { InputSchema } from \"../command.ts\"\nimport { MextBuildError, MextError, type ArgumentIssue, type BuildIssue } from \"../errors.ts\"\nimport type { JsonSchema, RegisteredCommand, Registry } from \"../registry.ts\"\nimport { closest } from \"../suggest.ts\"\n\n/**\n * CLI 입력 변환 (spec §4).\n * 필드 종류는 Zod def 로, 설명 · 기본값 · 필수 여부는 input JSON Schema 로 판단한다.\n * 파서는 문자열을 객체로 모으기만 하고 (스키마 모양에 따른 number · boolean · enum 변환 포함) 검증은 invoke 의 Zod safeParse 1회.\n */\n\nexport type Primitive = string | number | boolean\n\nexport type ScalarKind =\n | { type: \"string\" }\n | { type: \"number\" }\n | { type: \"boolean\" }\n | { type: \"enum\"; values: readonly Primitive[] }\n\nexport type FieldKind =\n | ScalarKind\n /** 원시 타입 배열. 플래그 반복 */\n | { type: \"array\"; item: ScalarKind }\n /** z.object 1단. 점 플래그 (--filter.status) 또는 JSON 문자열 */\n | { type: \"object\"; fields: readonly CliField[] }\n /** 2단 이상 · union · record 등. JSON 문자열 */\n | { type: \"json\" }\n\nexport interface CliField {\n /** input 키 (camelCase) */\n key: string\n /** 플래그 이름 (kebab-case, \"--\" 제외) */\n flag: string\n kind: FieldKind\n description: string | undefined\n required: boolean\n hasDefault: boolean\n default: unknown\n}\n\nexport interface CliSpec {\n fields: readonly CliField[]\n /** positional 로 받는 input 키 순서 */\n positional: readonly string[]\n}\n\n/** mext run 이 명령어 플래그 위치에서도 가로채는 플래그. input 키와 겹치면 빌드 오류 */\nexport const RESERVED_FLAGS: readonly string[] = [\"help\", \"json\", \"yes\", \"input-json\"]\n\nexport interface ParsedArgs {\n /** invoke 에 넘길 원본 입력 (검증 전) */\n input: unknown\n json: boolean\n yes: boolean\n help: boolean\n}\n\nexport interface ParseArgsOptions {\n /** stdin (-) · --input-json - 입력. 기본 = 빈 문자열 */\n readStdin?: () => Promise<string>\n}\n\n// ---------------------------------------------------------------- 스키마 분석\n\ninterface ZodLike {\n _zod: { def: ZodDef }\n}\n\ninterface ZodDef {\n type: string\n innerType?: ZodLike\n in?: ZodLike\n out?: ZodLike\n getter?: () => ZodLike\n element?: ZodLike\n shape?: Record<string, ZodLike>\n options?: readonly ZodLike[]\n values?: readonly unknown[]\n entries?: Record<string, unknown>\n}\n\nconst WRAPPERS = new Set([\"optional\", \"nullable\", \"default\", \"prefault\", \"catch\", \"readonly\", \"nonoptional\"])\nconst UNCONVERTIBLE = new Set([\n \"any\",\n \"unknown\",\n \"function\",\n \"promise\",\n \"symbol\",\n \"custom\",\n \"transform\",\n \"never\",\n \"void\",\n \"undefined\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"file\",\n])\n\nfunction defOf(schema: ZodLike): ZodDef {\n return schema._zod.def\n}\n\n/** optional · nullable · default · pipe (입력 쪽) · lazy 등을 벗긴 실제 타입 */\nfunction unwrap(schema: ZodLike): ZodLike {\n let cur = schema\n for (let depth = 0; depth < 32; depth++) {\n const def = defOf(cur)\n if (WRAPPERS.has(def.type) && def.innerType) cur = def.innerType\n else if (def.type === \"pipe\" && def.in && def.out) cur = defOf(def.in).type === \"transform\" ? def.out : def.in\n else if (def.type === \"lazy\" && def.getter) cur = def.getter()\n else return cur\n }\n return cur\n}\n\ntype Analysis = FieldKind | { type: \"unconvertible\"; zodType: string }\n\nfunction scalarOf(schema: ZodLike): ScalarKind | { type: \"unconvertible\"; zodType: string } | undefined {\n const base = unwrap(schema)\n const def = defOf(base)\n switch (def.type) {\n case \"string\":\n case \"template_literal\":\n return { type: \"string\" }\n case \"number\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n case \"enum\":\n case \"literal\":\n case \"union\": {\n const values = literalValues(base)\n return values ? { type: \"enum\", values } : undefined\n }\n }\n if (UNCONVERTIBLE.has(def.type)) return { type: \"unconvertible\", zodType: def.type }\n return undefined\n}\n\n/** enum · 리터럴 · 리터럴만의 union → 값 목록. 그 외 undefined */\nfunction literalValues(schema: ZodLike): Primitive[] | undefined {\n const def = defOf(unwrap(schema))\n let raw: unknown[]\n if (def.type === \"enum\") raw = Object.values(def.entries ?? {})\n else if (def.type === \"literal\") raw = [...(def.values ?? [])]\n else if (def.type === \"union\") {\n raw = []\n for (const option of def.options ?? []) {\n const values = literalValues(option)\n if (!values) return undefined\n raw.push(...values)\n }\n } else return undefined\n if (!raw.every((v) => typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\")) return undefined\n return [...new Set(raw as Primitive[])]\n}\n\nfunction analyze(schema: ZodLike, topLevel: boolean): Analysis {\n const scalar = scalarOf(schema)\n if (scalar) return scalar\n const base = unwrap(schema)\n const def = defOf(base)\n if (def.type === \"array\" && def.element) {\n const item = scalarOf(def.element)\n return item && item.type !== \"unconvertible\" ? { type: \"array\", item } : { type: \"json\" }\n }\n if (def.type === \"object\" && topLevel) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(def.shape ?? {})) {\n const kind = analyze(sub, false)\n if (kind.type === \"unconvertible\" || kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\nfunction field(key: string, kind: FieldKind, json: JsonSchema | undefined, required = false): CliField {\n const has = json !== undefined && Object.hasOwn(json, \"default\")\n return {\n key,\n flag: toKebab(key),\n kind,\n description: typeof json?.description === \"string\" ? json.description : undefined,\n required,\n hasDefault: has,\n default: has ? json!.default : undefined,\n }\n}\n\n/** camelCase → kebab-case (userId → user-id · URLPath → url-path) */\nexport function toKebab(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase()\n}\n\nconst FLAG_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/\n\n/** JSON Schema 의 객체 (nullable 이면 anyOf 안) */\nfunction objectSchema(json: JsonSchema | undefined): JsonSchema | undefined {\n if (!json) return undefined\n if (typeof json.properties === \"object\" && json.properties !== null) return json\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = json[key]\n if (Array.isArray(list)) {\n const found = list.find((s) => typeof s === \"object\" && s !== null && \"properties\" in s) as JsonSchema | undefined\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction propertiesOf(json: JsonSchema | undefined): { props: Record<string, JsonSchema>; required: string[] } {\n const obj = objectSchema(json)\n return {\n props: (obj?.properties as Record<string, JsonSchema> | undefined) ?? {},\n required: Array.isArray(obj?.required) ? (obj!.required as string[]) : [],\n }\n}\n\n/**\n * input 스키마 → CLI 필드. problems = 변환 불가 (any · 함수 등) · 플래그로 쓸 수 없는 키 · 플래그 충돌 · 예약 플래그.\n * jsonSchema = input JSON Schema (io input). 설명 · 기본값 · 필수 여부의 원본\n */\nexport function analyzeInput(\n schema: InputSchema,\n jsonSchema: JsonSchema | undefined,\n positional: readonly string[] = [],\n): { spec: CliSpec; problems: string[] } {\n const problems: string[] = []\n const fields: CliField[] = []\n const { props, required } = propertiesOf(jsonSchema)\n const shape = (schema as unknown as ZodLike)._zod.def.shape ?? {}\n const flags = new Map<string, string>()\n\n for (const [key, sub] of Object.entries(shape)) {\n const kind = analyze(sub, true)\n if (kind.type === \"unconvertible\") {\n problems.push(`input \"${key}\": z.${kind.zodType}() is not convertible to CLI flags`)\n continue\n }\n const f = field(key, kind, props[key], required.includes(key))\n if (!FLAG_PATTERN.test(f.flag)) {\n problems.push(`input \"${key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (RESERVED_FLAGS.includes(f.flag)) {\n problems.push(`input \"${key}\": --${f.flag} is reserved by the CLI`)\n continue\n }\n const other = flags.get(f.flag)\n if (other !== undefined) {\n problems.push(`input \"${key}\": --${f.flag} collides with input \"${other}\"`)\n continue\n }\n if (kind.type === \"object\") {\n const sub = propertiesOf(props[key])\n const subFlags = new Set<string>()\n const subs: CliField[] = []\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, sub.props[s.key], sub.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (subFlags.has(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": --${f.flag}.${sf.flag} collides with another key`)\n continue\n }\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.set(f.flag, key)\n fields.push(f)\n }\n\n // --no-x 와 같은 이름의 플래그가 있으면 모호\n for (const f of fields) {\n if (f.flag.startsWith(\"no-\") && isBooleanKind(fields.find((g) => g.flag === f.flag.slice(3))?.kind)) {\n problems.push(`input \"${f.key}\": --${f.flag} collides with the negation of --${f.flag.slice(3)}`)\n }\n }\n\n return { spec: { fields, positional: [...positional] }, problems }\n}\n\nfunction isBooleanKind(kind: FieldKind | undefined): boolean {\n return kind?.type === \"boolean\" || (kind?.type === \"array\" && kind.item.type === \"boolean\")\n}\n\nconst specCache = new WeakMap<RegisteredCommand, { spec: CliSpec; problems: string[] }>()\n\nfunction analyzed(entry: RegisteredCommand): { spec: CliSpec; problems: string[] } {\n let result = specCache.get(entry)\n if (!result) {\n result = analyzeInput(entry.command.input, entry.inputSchema, entry.command.positional)\n specCache.set(entry, result)\n }\n return result\n}\n\n/**\n * Registry 밖 명령어 (원격 help 로 만든 항목) 의 CLI 필드 지정. 이후 cliSpec · parseArgs · help 가 이 값을 쓴다.\n * 로컬 명령어는 Zod 스키마로 분석하므로 쓰지 않는다\n */\nexport function defineCliSpec(entry: RegisteredCommand, spec: CliSpec): void {\n specCache.set(entry, { spec, problems: [] })\n}\n\n// ---------------------------------------------------------------- JSON Schema 분석 (원격)\n\n/**\n * input JSON Schema (원격 help 의 inputSchema) → CLI 필드. 로컬 (Zod) 분석과 같은 규칙을 JSON Schema 모양으로:\n * type string · number · integer · boolean · enum · const · 리터럴 anyOf = 원시, nullable (anyOf null) 은 벗김,\n * 원시 배열 = 반복, 최상위 1단 객체 (하위 전부 원시 · 원시 배열) = 점 플래그, 그 외 = JSON 문자열.\n * 플래그로 쓸 수 없는 키 · 예약 플래그 · 충돌 키는 건너뛴다 (--input-json 으로 전달)\n */\nexport function cliSpecFromJsonSchema(jsonSchema: JsonSchema, positional: readonly string[] = []): CliSpec {\n const { props, required } = propertiesOf(jsonSchema)\n const fields: CliField[] = []\n const flags = new Set<string>()\n for (const [key, sub] of Object.entries(props)) {\n const kind = jsonKind(sub, true)\n const f = field(key, kind, sub, required.includes(key))\n if (!FLAG_PATTERN.test(f.flag) || RESERVED_FLAGS.includes(f.flag) || flags.has(f.flag)) continue\n if (kind.type === \"object\") {\n const subProps = propertiesOf(stripNullable(sub))\n const subs: CliField[] = []\n const subFlags = new Set<string>()\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, subProps.props[s.key], subProps.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag) || subFlags.has(sf.flag)) continue\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.add(f.flag)\n fields.push(f)\n }\n return { fields, positional: positional.filter((k) => fields.some((f) => f.key === k)) }\n}\n\nfunction isJsonObject(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isPrimitive(value: unknown): value is Primitive {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n}\n\n/** anyOf · oneOf 에서 { type: \"null\" } 을 뺀 나머지가 하나면 그것, type 배열의 \"null\" 제거 */\nfunction stripNullable(schema: JsonSchema): JsonSchema {\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const rest = list.filter((s) => !(isJsonObject(s) && s.type === \"null\"))\n if (rest.length === 1 && rest.length < list.length && isJsonObject(rest[0])) return rest[0]\n }\n if (Array.isArray(schema.type)) {\n const types = schema.type.filter((t) => t !== \"null\")\n if (types.length === 1) return { ...schema, type: types[0] }\n }\n return schema\n}\n\nfunction jsonLiterals(schema: JsonSchema): Primitive[] | undefined {\n if (Array.isArray(schema.enum)) return schema.enum.every(isPrimitive) ? [...new Set(schema.enum)] : undefined\n if (\"const\" in schema) return isPrimitive(schema.const) ? [schema.const] : undefined\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const out: Primitive[] = []\n for (const option of list) {\n const values = isJsonObject(option) ? jsonLiterals(option) : undefined\n if (!values) return undefined\n out.push(...values)\n }\n return [...new Set(out)]\n }\n return undefined\n}\n\nfunction jsonScalar(raw: unknown): ScalarKind | undefined {\n if (!isJsonObject(raw)) return undefined\n const schema = stripNullable(raw)\n const values = jsonLiterals(schema)\n if (values) return { type: \"enum\", values }\n switch (schema.type) {\n case \"string\":\n return { type: \"string\" }\n case \"number\":\n case \"integer\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n }\n return undefined\n}\n\nfunction jsonKind(raw: unknown, topLevel: boolean): FieldKind {\n const scalar = jsonScalar(raw)\n if (scalar) return scalar\n if (!isJsonObject(raw)) return { type: \"json\" }\n const schema = stripNullable(raw)\n if (schema.type === \"array\" && isJsonObject(schema.items)) {\n const item = jsonScalar(schema.items)\n return item ? { type: \"array\", item } : { type: \"json\" }\n }\n if (topLevel && schema.type === \"object\" && isJsonObject(schema.properties)) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(schema.properties)) {\n const kind = jsonKind(sub, false)\n if (kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\n/** 명령어의 CLI 필드 (캐시) */\nexport function cliSpec(entry: RegisteredCommand): CliSpec {\n return analyzed(entry).spec\n}\n\n/** Registry 전체의 CLI 변환 불가 문제 (빌드 오류 issues) */\nexport function cliBuildIssues(registry: Registry): BuildIssue[] {\n const issues: BuildIssue[] = []\n for (const entry of registry.commands.values()) {\n for (const message of analyzed(entry).problems) {\n issues.push({ code: \"CLI_UNCONVERTIBLE\", message, id: entry.id, file: entry.file })\n }\n }\n return issues\n}\n\n/** 변환 불가 타입이 있으면 MextBuildError */\nexport function assertCliConvertible(registry: Registry): void {\n const issues = cliBuildIssues(registry)\n if (issues.length > 0) throw new MextBuildError(issues)\n}\n\n// ---------------------------------------------------------------- 파서\n\ninterface Resolved {\n field: CliField\n sub?: CliField\n negated: boolean\n}\n\nfunction resolveFlag(spec: CliSpec, name: string): Resolved | undefined {\n const top = spec.fields.find((f) => f.flag === name)\n if (top) return { field: top, negated: false }\n const dot = name.indexOf(\".\")\n if (dot > 0) {\n const parent = spec.fields.find((f) => f.flag === name.slice(0, dot))\n if (parent?.kind.type === \"object\") {\n const sub = parent.kind.fields.find((f) => f.flag === name.slice(dot + 1))\n if (sub) return { field: parent, sub, negated: false }\n }\n }\n if (name.startsWith(\"no-\")) {\n const r = resolveFlag(spec, name.slice(3))\n if (r && !r.negated && isBooleanKind((r.sub ?? r.field).kind)) return { ...r, negated: true }\n }\n return undefined\n}\n\n/** 사용 가능한 플래그 이름 전체 (제안용) */\nfunction allFlags(spec: CliSpec): string[] {\n const out: string[] = []\n for (const f of spec.fields) {\n out.push(f.flag)\n if (isBooleanKind(f.kind)) out.push(`no-${f.flag}`)\n if (f.kind.type === \"object\") {\n for (const s of f.kind.fields) {\n out.push(`${f.flag}.${s.flag}`)\n if (isBooleanKind(s.kind)) out.push(`no-${f.flag}.${s.flag}`)\n }\n }\n }\n return [...out, ...RESERVED_FLAGS]\n}\n\nfunction coerceScalar(kind: ScalarKind, raw: string): unknown {\n switch (kind.type) {\n case \"string\":\n return raw\n case \"number\": {\n const n = Number(raw)\n return raw.trim() !== \"\" && Number.isFinite(n) ? n : raw\n }\n case \"boolean\":\n return raw === \"true\" ? true : raw === \"false\" ? false : raw\n case \"enum\":\n return kind.values.find((v) => String(v) === raw) ?? raw\n }\n}\n\n/** 원시 · 배열 · 객체 · JSON 필드 종류에 맞춘 문자열 변환. JSON 파싱 실패 = undefined (호출자가 오류) */\nexport function coerceValue(kind: FieldKind, raw: string): { ok: true; value: unknown } | { ok: false } {\n if (kind.type === \"array\") return { ok: true, value: coerceScalar(kind.item, raw) }\n if (kind.type === \"object\" || kind.type === \"json\") {\n try {\n return { ok: true, value: JSON.parse(raw) }\n } catch {\n return { ok: false }\n }\n }\n return { ok: true, value: coerceScalar(kind, raw) }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/** 파서 단계 INVALID_ARGUMENT */\nexport function argumentError(entry: RegisteredCommand, issues: ArgumentIssue[]): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\n \"INVALID_ARGUMENT\",\n `Invalid arguments for ${entry.id}: ${issues.map((i) => i.message).join(\"; \")}`,\n {\n command: entry.id,\n missing_fields: [],\n issues,\n expected_schema: entry.inputSchema,\n examples: [...entry.command.examples],\n },\n )\n}\n\n/**\n * 명령어 경로 뒤의 argv → 원본 입력.\n * --flag v · --flag=v · boolean --x · --x=true|false · --no-x · 반복 (배열) · --obj.key v · JSON 문자열 ·\n * --input-json <json|-> · - (stdin) · positional · -- 이후 = positional. 모르는 플래그는 항상 오류.\n * 개별 플래그는 --input-json · stdin 입력의 같은 키를 덮어쓴다 (점 플래그는 객체 안에 병합).\n */\nexport async function parseArgs(\n entry: RegisteredCommand,\n argv: readonly string[],\n options: ParseArgsOptions = {},\n): Promise<ParsedArgs> {\n const spec = cliSpec(entry)\n const fail = (path: string, code: string, message: string): never => {\n throw argumentError(entry, [{ path, code, message }])\n }\n const values: Record<string, unknown> = {}\n const given = new Set<string>() // 지정된 경로 (배열 제외). \"filter\" = JSON 전체 · \"filter.status\" = 점 플래그\n const flags = { json: false, yes: false, help: false }\n const positionals: string[] = []\n let source: { kind: \"json\"; text: string } | { kind: \"stdin\" } | undefined\n let rest = false\n\n const setInput = (next: NonNullable<typeof source>, label: string): void => {\n if (source) fail(\"\", \"duplicate_input\", `${label}: whole input given more than once (--input-json · -)`)\n source = next\n }\n\n const assign = (r: Resolved, value: unknown, label: string): void => {\n const target = r.sub ?? r.field\n const path = r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key\n if (r.sub) {\n if (given.has(r.field.key)) fail(path, \"conflict\", `${label} cannot be combined with --${r.field.flag} <json>`)\n } else if (r.field.kind.type === \"object\" && [...given].some((p) => p.startsWith(`${r.field.key}.`))) {\n fail(path, \"conflict\", `${label} <json> cannot be combined with --${r.field.flag}.<key>`)\n }\n let container = values\n if (r.sub) {\n const existing = values[r.field.key]\n if (!isPlainObject(existing)) values[r.field.key] = {}\n container = values[r.field.key] as Record<string, unknown>\n }\n if (target.kind.type === \"array\") {\n const list = container[target.key]\n if (Array.isArray(list)) list.push(value)\n else container[target.key] = [value]\n return\n }\n if (given.has(path)) fail(path, \"duplicate_flag\", `${label} given more than once`)\n given.add(path)\n container[target.key] = value\n }\n\n const coerce = (r: Resolved, raw: string, label: string): unknown => {\n const kind = r.sub ? r.sub.kind : r.field.kind\n const result = coerceValue(kind, raw)\n if (!result.ok) {\n return fail(r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key, \"invalid_json\", `${label}: value is not valid JSON`)\n }\n return result.value\n }\n\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (rest) {\n positionals.push(tok)\n continue\n }\n if (tok === \"--\") {\n rest = true\n continue\n }\n if (tok === \"-\") {\n setInput({ kind: \"stdin\" }, \"-\")\n continue\n }\n if (tok === \"-h\") {\n flags.help = true\n continue\n }\n if (tok.startsWith(\"--\")) {\n const body = tok.slice(2)\n const eq = body.indexOf(\"=\")\n const name = eq < 0 ? body : body.slice(0, eq)\n const inline = eq < 0 ? undefined : body.slice(eq + 1)\n const label = `--${name}`\n const takeValue = (): string => {\n if (inline !== undefined) return inline\n const next = argv[i + 1]\n if (next === undefined || (next.startsWith(\"--\") && next.length > 2)) {\n return fail(\"\", \"missing_value\", `${label} requires a value`)\n }\n i++\n return next\n }\n if (name === \"help\" || name === \"json\" || name === \"yes\") {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n flags[name] = true\n continue\n }\n if (name === \"input-json\") {\n const text = takeValue()\n setInput(text === \"-\" ? { kind: \"stdin\" } : { kind: \"json\", text }, label)\n continue\n }\n const r = resolveFlag(spec, name)\n if (!r) {\n const suggested = closest(name, allFlags(spec).map((f): [string, string] => [f, f]))\n const hint = suggested.length > 0 ? ` Did you mean --${suggested[0]}?` : \"\"\n return fail(\"\", \"unknown_flag\", `unknown flag ${label}.${hint}`)\n }\n const kind = (r.sub ?? r.field).kind\n if (isBooleanKind(kind)) {\n if (r.negated) {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n assign(r, false, label)\n } else {\n assign(r, inline === undefined ? true : coerceScalar({ type: \"boolean\" }, inline), label)\n }\n continue\n }\n assign(r, coerce(r, takeValue(), label), label)\n continue\n }\n if (tok.startsWith(\"-\") && !/^-[\\d.]/.test(tok)) {\n fail(\"\", \"unknown_flag\", `unknown flag ${tok} (short flags are not supported)`)\n }\n positionals.push(tok)\n }\n\n // positional\n let p = 0\n for (let k = 0; k < spec.positional.length && p < positionals.length; k++) {\n const f = spec.fields.find((x) => x.key === spec.positional[k])\n if (!f) continue\n const r: Resolved = { field: f, negated: false }\n const label = `<${f.flag}>`\n const variadic = f.kind.type === \"array\" && k === spec.positional.length - 1\n do {\n assign(r, coerce(r, positionals[p]!, label), label)\n p++\n } while (variadic && p < positionals.length)\n }\n if (p < positionals.length) fail(\"\", \"unexpected_argument\", `unexpected argument \"${positionals[p]}\"`)\n\n let input: unknown = values\n if (source) {\n const text = source.kind === \"stdin\" ? await (options.readStdin ?? (async () => \"\"))() : source.text\n let base: unknown\n try {\n base = JSON.parse(text)\n } catch {\n return fail(\"\", \"invalid_json\", `${source.kind === \"stdin\" ? \"stdin\" : \"--input-json\"} is not valid JSON`)\n }\n if (Object.keys(values).length === 0) input = base\n else if (!isPlainObject(base)) {\n fail(\"\", \"invalid_json\", \"whole input must be a JSON object to combine with flags\")\n } else {\n const merged: Record<string, unknown> = { ...base }\n for (const [key, value] of Object.entries(values)) {\n // 점 플래그로 모은 객체는 병합, 그 외 (JSON 문자열 포함) 는 덮어쓰기\n const dotted = !given.has(key) && spec.fields.find((x) => x.key === key)?.kind.type === \"object\"\n merged[key] = dotted && isPlainObject(base[key]) && isPlainObject(value) ? { ...base[key], ...value } : value\n }\n input = merged\n }\n }\n\n return { input, ...flags }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./main.js";
3
+ // 첫 SIGINT = ctx.signal abort (핸들러 정리 후 exit 130), 두 번째 = 즉시 종료
4
+ const controller = new AbortController();
5
+ process.on("SIGINT", () => {
6
+ if (controller.signal.aborted)
7
+ process.exit(130);
8
+ controller.abort();
9
+ });
10
+ const code = await runCli(process.argv.slice(2), { signal: controller.signal });
11
+ // 파이프 출력이 비워진 뒤 종료 (남은 핸들이 프로세스를 붙잡지 않게)
12
+ process.stdout.write("", () => process.stderr.write("", () => process.exit(code)));
13
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,gEAAgE;AAChE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;AACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChD,UAAU,CAAC,KAAK,EAAE,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/E,yCAAyC;AACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA","sourcesContent":["#!/usr/bin/env node\nimport { runCli } from \"./main.ts\"\n\n// 첫 SIGINT = ctx.signal abort (핸들러 정리 후 exit 130), 두 번째 = 즉시 종료\nconst controller = new AbortController()\nprocess.on(\"SIGINT\", () => {\n if (controller.signal.aborted) process.exit(130)\n controller.abort()\n})\n\nconst code = await runCli(process.argv.slice(2), { signal: controller.signal })\n// 파이프 출력이 비워진 뒤 종료 (남은 핸들이 프로세스를 붙잡지 않게)\nprocess.stdout.write(\"\", () => process.stderr.write(\"\", () => process.exit(code)))\n"]}
@@ -0,0 +1,11 @@
1
+ import { type BuildOptions, type BuildResult } from "../build.ts";
2
+ import type { CliIo } from "./io.ts";
3
+ export declare const BUILD_PROG = "mext build";
4
+ /**
5
+ * mext build: commands/ → .mext/. 경고 · 오류 = stderr, 성공 요약 · 명령어 표 = stdout.
6
+ * 검증 오류는 MextBuildError 하나에 모아 한 번에 출력, exit 1
7
+ */
8
+ export declare function runBuild(argv: readonly string[], io: CliIo, options?: Omit<BuildOptions, "cwd">): Promise<number>;
9
+ /** 성공 요약 + 명령어 표 (ID · 안전성 · scopes), next build 의 route 표와 같은 역할 */
10
+ export declare function formatBuildSummary(result: BuildResult, cwd: string): string;
11
+ export declare function buildHelp(): string;
@@ -0,0 +1,87 @@
1
+ import { relative } from "node:path";
2
+ import { buildProject } from "../build.js";
3
+ import { table } from "./help.js";
4
+ import { EXIT, exitCodeOf, formatError } from "./output.js";
5
+ export const BUILD_PROG = "mext build";
6
+ /**
7
+ * mext build: commands/ → .mext/. 경고 · 오류 = stderr, 성공 요약 · 명령어 표 = stdout.
8
+ * 검증 오류는 MextBuildError 하나에 모아 한 번에 출력, exit 1
9
+ */
10
+ export async function runBuild(argv, io, options = {}) {
11
+ for (const tok of argv) {
12
+ if (tok === "--help" || tok === "-h") {
13
+ io.stdout.write(buildHelp());
14
+ return EXIT.ok;
15
+ }
16
+ io.stderr.write(`error: unexpected argument "${tok}"\nRun "${BUILD_PROG} --help" for usage.\n`);
17
+ return EXIT.usage;
18
+ }
19
+ let result;
20
+ try {
21
+ result = await buildProject({ ...options, cwd: io.cwd });
22
+ }
23
+ catch (error) {
24
+ io.stderr.write(formatError(error, BUILD_PROG));
25
+ return exitCodeOf(error);
26
+ }
27
+ for (const w of result.warnings)
28
+ io.stderr.write(`warning: ${w.message}\n`);
29
+ io.stdout.write(formatBuildSummary(result, io.cwd));
30
+ return EXIT.ok;
31
+ }
32
+ /** 성공 요약 + 명령어 표 (ID · 안전성 · scopes), next build 의 route 표와 같은 역할 */
33
+ export function formatBuildSummary(result, cwd) {
34
+ const { manifest } = result;
35
+ const dir = relative(cwd, result.outDir) || ".";
36
+ const n = manifest.commands.length;
37
+ const lines = [
38
+ `Built ${dir}/ (${n} command${n === 1 ? "" : "s"}, buildId ${manifest.buildId})`,
39
+ "",
40
+ ...table([
41
+ ["Command", "Safety", "Scopes"],
42
+ ...manifest.commands.map((c) => [c.id, safetyOf(c), c.scopes.join(", ") || "-"]),
43
+ ]).map((l) => ` ${l}`),
44
+ "",
45
+ `Start: node ${dir}/server.js [--stdio]`,
46
+ ];
47
+ const cli = result.cli;
48
+ if (cli) {
49
+ const kb = (cli.size / 1024).toFixed(1);
50
+ lines.push(`Customer CLI: ${dir}/cli/ (${cli.packageName}@${cli.version}, bin ${cli.bin}, ${cli.form}, ${kb} KB). Publish: npm publish ${dir}/cli`);
51
+ }
52
+ return `${lines.join("\n")}\n`;
53
+ }
54
+ /** readOnly · destructive · confirm. 아무것도 없으면 write */
55
+ function safetyOf(c) {
56
+ const flags = [
57
+ ...(c.readOnly ? ["readOnly"] : []),
58
+ ...(c.destructive ? ["destructive"] : []),
59
+ ...(c.requiresConfirmation ? ["confirm"] : []),
60
+ ];
61
+ return flags.length === 0 ? "write" : flags.join(" · ");
62
+ }
63
+ export function buildHelp() {
64
+ const lines = [
65
+ "Build commands/ into .mext/ for production (mext start · node .mext/server.js).",
66
+ "",
67
+ "Usage:",
68
+ ` ${BUILD_PROG}`,
69
+ "",
70
+ "Output (.mext/):",
71
+ ...table([
72
+ ["manifest.json", "schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands (+ module)"],
73
+ ["server.js", "node .mext/server.js [--stdio]. PORT · HOST environment variables"],
74
+ ["handler.js", "export default { fetch(request) } (Web Request → Response)"],
75
+ ["config.js", "mext.config.ts bundle (when present)"],
76
+ ["instrumentation.js", "instrumentation.ts bundle (when present)"],
77
+ ["commands/**/*.js", "one module per command"],
78
+ ["chunks/", "shared code"],
79
+ ["cli/", "customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md"],
80
+ ]).map((l) => ` ${l}`),
81
+ "",
82
+ "Requires rolldown (npm install --save-dev rolldown). Package imports stay external.",
83
+ "All validation errors are reported at once (exit 1).",
84
+ ];
85
+ return `${lines.join("\n")}\n`;
86
+ }
87
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\"\nimport { buildProject, type BuildOptions, type BuildResult } from \"../build.ts\"\nimport type { BuildManifestCommand } from \"../manifest.ts\"\nimport { table } from \"./help.ts\"\nimport type { CliIo } from \"./io.ts\"\nimport { EXIT, exitCodeOf, formatError } from \"./output.ts\"\n\nexport const BUILD_PROG = \"mext build\"\n\n/**\n * mext build: commands/ → .mext/. 경고 · 오류 = stderr, 성공 요약 · 명령어 표 = stdout.\n * 검증 오류는 MextBuildError 하나에 모아 한 번에 출력, exit 1\n */\nexport async function runBuild(argv: readonly string[], io: CliIo, options: Omit<BuildOptions, \"cwd\"> = {}): Promise<number> {\n for (const tok of argv) {\n if (tok === \"--help\" || tok === \"-h\") {\n io.stdout.write(buildHelp())\n return EXIT.ok\n }\n io.stderr.write(`error: unexpected argument \"${tok}\"\\nRun \"${BUILD_PROG} --help\" for usage.\\n`)\n return EXIT.usage\n }\n let result: BuildResult\n try {\n result = await buildProject({ ...options, cwd: io.cwd })\n } catch (error) {\n io.stderr.write(formatError(error, BUILD_PROG))\n return exitCodeOf(error)\n }\n for (const w of result.warnings) io.stderr.write(`warning: ${w.message}\\n`)\n io.stdout.write(formatBuildSummary(result, io.cwd))\n return EXIT.ok\n}\n\n/** 성공 요약 + 명령어 표 (ID · 안전성 · scopes), next build 의 route 표와 같은 역할 */\nexport function formatBuildSummary(result: BuildResult, cwd: string): string {\n const { manifest } = result\n const dir = relative(cwd, result.outDir) || \".\"\n const n = manifest.commands.length\n const lines = [\n `Built ${dir}/ (${n} command${n === 1 ? \"\" : \"s\"}, buildId ${manifest.buildId})`,\n \"\",\n ...table([\n [\"Command\", \"Safety\", \"Scopes\"],\n ...manifest.commands.map((c) => [c.id, safetyOf(c), c.scopes.join(\", \") || \"-\"]),\n ]).map((l) => ` ${l}`),\n \"\",\n `Start: node ${dir}/server.js [--stdio]`,\n ]\n const cli = result.cli\n if (cli) {\n const kb = (cli.size / 1024).toFixed(1)\n lines.push(\n `Customer CLI: ${dir}/cli/ (${cli.packageName}@${cli.version}, bin ${cli.bin}, ${cli.form}, ${kb} KB). Publish: npm publish ${dir}/cli`,\n )\n }\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** readOnly · destructive · confirm. 아무것도 없으면 write */\nfunction safetyOf(c: BuildManifestCommand): string {\n const flags = [\n ...(c.readOnly ? [\"readOnly\"] : []),\n ...(c.destructive ? [\"destructive\"] : []),\n ...(c.requiresConfirmation ? [\"confirm\"] : []),\n ]\n return flags.length === 0 ? \"write\" : flags.join(\" · \")\n}\n\nexport function buildHelp(): string {\n const lines = [\n \"Build commands/ into .mext/ for production (mext start · node .mext/server.js).\",\n \"\",\n \"Usage:\",\n ` ${BUILD_PROG}`,\n \"\",\n \"Output (.mext/):\",\n ...table([\n [\"manifest.json\", \"schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands (+ module)\"],\n [\"server.js\", \"node .mext/server.js [--stdio]. PORT · HOST environment variables\"],\n [\"handler.js\", \"export default { fetch(request) } (Web Request → Response)\"],\n [\"config.js\", \"mext.config.ts bundle (when present)\"],\n [\"instrumentation.js\", \"instrumentation.ts bundle (when present)\"],\n [\"commands/**/*.js\", \"one module per command\"],\n [\"chunks/\", \"shared code\"],\n [\"cli/\", \"customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md\"],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Requires rolldown (npm install --save-dev rolldown). Package imports stay external.\",\n \"All validation errors are reported at once (exit 1).\",\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /** .mext/dev/lock 내용. url = listen 전에는 null */
2
+ export interface DevLock {
3
+ pid: number;
4
+ url: string | null;
5
+ startedAt: string;
6
+ }
7
+ /** <cwd>/.mext/dev/lock */
8
+ export declare function devLockPath(cwd: string): string;
9
+ /** 살아 있는 mext dev 의 잠금. 없음 · 죽은 pid · 읽을 수 없음 = undefined */
10
+ export declare function readDevLock(cwd: string): DevLock | undefined;
11
+ /**
12
+ * 잠금 획득 (O_EXCL 생성). 이미 살아 있는 다른 프로세스의 잠금 = { running }.
13
+ * 죽은 pid · 깨진 파일 = 오래된 잠금으로 보고 교체
14
+ */
15
+ export declare function acquireDevLock(cwd: string, url?: string | null): {
16
+ acquired: DevLock;
17
+ } | {
18
+ running: DevLock;
19
+ };
20
+ /** 획득한 잠금의 url 갱신 (임시 파일 rename) */
21
+ export declare function updateDevLock(cwd: string, lock: DevLock): void;
22
+ /** 이 프로세스의 잠금이면 삭제 (동기. process exit 처리기에서도 호출) */
23
+ export declare function releaseDevLock(cwd: string): void;
@@ -0,0 +1,68 @@
1
+ import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ /** <cwd>/.mext/dev/lock */
4
+ export function devLockPath(cwd) {
5
+ return join(resolve(cwd), ".mext", "dev", "lock");
6
+ }
7
+ /** 살아 있는 mext dev 의 잠금. 없음 · 죽은 pid · 읽을 수 없음 = undefined */
8
+ export function readDevLock(cwd) {
9
+ const lock = parseLock(devLockPath(cwd));
10
+ return lock && pidAlive(lock.pid) ? lock : undefined;
11
+ }
12
+ /**
13
+ * 잠금 획득 (O_EXCL 생성). 이미 살아 있는 다른 프로세스의 잠금 = { running }.
14
+ * 죽은 pid · 깨진 파일 = 오래된 잠금으로 보고 교체
15
+ */
16
+ export function acquireDevLock(cwd, url = null) {
17
+ const path = devLockPath(cwd);
18
+ mkdirSync(dirname(path), { recursive: true });
19
+ const lock = { pid: process.pid, url, startedAt: new Date().toISOString() };
20
+ for (let attempt = 0;; attempt++) {
21
+ try {
22
+ writeFileSync(path, `${JSON.stringify(lock)}\n`, { flag: "wx" });
23
+ return { acquired: lock };
24
+ }
25
+ catch (error) {
26
+ if (error.code !== "EEXIST" || attempt >= 3)
27
+ throw error;
28
+ }
29
+ const existing = parseLock(path);
30
+ if (existing && existing.pid !== process.pid && pidAlive(existing.pid))
31
+ return { running: existing };
32
+ rmSync(path, { force: true });
33
+ }
34
+ }
35
+ /** 획득한 잠금의 url 갱신 (임시 파일 rename) */
36
+ export function updateDevLock(cwd, lock) {
37
+ const path = devLockPath(cwd);
38
+ const tmp = `${path}.${process.pid}.tmp`;
39
+ writeFileSync(tmp, `${JSON.stringify(lock)}\n`);
40
+ renameSync(tmp, path);
41
+ }
42
+ /** 이 프로세스의 잠금이면 삭제 (동기. process exit 처리기에서도 호출) */
43
+ export function releaseDevLock(cwd) {
44
+ const path = devLockPath(cwd);
45
+ if (parseLock(path)?.pid === process.pid)
46
+ rmSync(path, { force: true });
47
+ }
48
+ function parseLock(path) {
49
+ try {
50
+ const value = JSON.parse(readFileSync(path, "utf8"));
51
+ if (typeof value.pid !== "number")
52
+ return undefined;
53
+ return { pid: value.pid, url: typeof value.url === "string" ? value.url : null, startedAt: String(value.startedAt ?? "") };
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ }
59
+ function pidAlive(pid) {
60
+ try {
61
+ process.kill(pid, 0);
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ return error.code === "EPERM";
66
+ }
67
+ }
68
+ //# sourceMappingURL=dev-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-lock.js","sourceRoot":"","sources":["../../src/cli/dev-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\n\n/** .mext/dev/lock 내용. url = listen 전에는 null */\nexport interface DevLock {\n pid: number\n url: string | null\n startedAt: string\n}\n\n/** <cwd>/.mext/dev/lock */\nexport function devLockPath(cwd: string): string {\n return join(resolve(cwd), \".mext\", \"dev\", \"lock\")\n}\n\n/** 살아 있는 mext dev 의 잠금. 없음 · 죽은 pid · 읽을 수 없음 = undefined */\nexport function readDevLock(cwd: string): DevLock | undefined {\n const lock = parseLock(devLockPath(cwd))\n return lock && pidAlive(lock.pid) ? lock : undefined\n}\n\n/**\n * 잠금 획득 (O_EXCL 생성). 이미 살아 있는 다른 프로세스의 잠금 = { running }.\n * 죽은 pid · 깨진 파일 = 오래된 잠금으로 보고 교체\n */\nexport function acquireDevLock(cwd: string, url: string | null = null): { acquired: DevLock } | { running: DevLock } {\n const path = devLockPath(cwd)\n mkdirSync(dirname(path), { recursive: true })\n const lock: DevLock = { pid: process.pid, url, startedAt: new Date().toISOString() }\n for (let attempt = 0; ; attempt++) {\n try {\n writeFileSync(path, `${JSON.stringify(lock)}\\n`, { flag: \"wx\" })\n return { acquired: lock }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\" || attempt >= 3) throw error\n }\n const existing = parseLock(path)\n if (existing && existing.pid !== process.pid && pidAlive(existing.pid)) return { running: existing }\n rmSync(path, { force: true })\n }\n}\n\n/** 획득한 잠금의 url 갱신 (임시 파일 rename) */\nexport function updateDevLock(cwd: string, lock: DevLock): void {\n const path = devLockPath(cwd)\n const tmp = `${path}.${process.pid}.tmp`\n writeFileSync(tmp, `${JSON.stringify(lock)}\\n`)\n renameSync(tmp, path)\n}\n\n/** 이 프로세스의 잠금이면 삭제 (동기. process exit 처리기에서도 호출) */\nexport function releaseDevLock(cwd: string): void {\n const path = devLockPath(cwd)\n if (parseLock(path)?.pid === process.pid) rmSync(path, { force: true })\n}\n\nfunction parseLock(path: string): DevLock | undefined {\n try {\n const value = JSON.parse(readFileSync(path, \"utf8\")) as Partial<DevLock>\n if (typeof value.pid !== \"number\") return undefined\n return { pid: value.pid, url: typeof value.url === \"string\" ? value.url : null, startedAt: String(value.startedAt ?? \"\") }\n } catch {\n return undefined\n }\n}\n\nfunction pidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\"\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /** 자식 → 부모 */
2
+ export type DevChildMessage = {
3
+ type: "config";
4
+ commandsDir: string;
5
+ server: {
6
+ host?: string;
7
+ port?: number;
8
+ };
9
+ } | {
10
+ type: "ready";
11
+ port: number;
12
+ commands: number;
13
+ } | {
14
+ type: "error";
15
+ message: string;
16
+ };
17
+ /** 부모 → 자식 */
18
+ export type DevParentMessage = {
19
+ type: "shutdown";
20
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * mext dev 의 서버 자식 프로세스 엔트리 (cli/dev.ts 가 fork). 직접 실행하지 않는다.
3
+ * cwd 의 mext.config.ts · commands/ 를 로드해 127.0.0.1 임의 포트에서 MCP HTTP 처리기를 띄우고 IPC 로 보고한다.
4
+ * 요청은 감독 프로세스 (부모) 가 받아 이 포트로 중계한다. 부모 IPC 가 끊기면 종료.
5
+ */
6
+ import { createServer } from "node:http";
7
+ import { loadConfig, mcpDeclarations, resolveCommandsDir } from "../config.js";
8
+ import { loadProjectInstrumentation } from "../instrumentation.js";
9
+ import { createMcpHttpHandler } from "../mcp/http.js";
10
+ import { loadRegistry } from "../scan.js";
11
+ const send = (message) => new Promise((resolve) => {
12
+ if (!process.connected)
13
+ return resolve();
14
+ process.send(message, undefined, {}, () => resolve());
15
+ });
16
+ // 터미널 Ctrl-C 는 프로세스 그룹 전체에 간다. 종료는 부모가 정한다 (shutdown · IPC 끊김)
17
+ process.on("SIGINT", () => { });
18
+ process.on("disconnect", () => process.exit(0));
19
+ async function main() {
20
+ const cwd = process.cwd();
21
+ // register() = 명령어 · config import 전
22
+ const instrumentation = await loadProjectInstrumentation(cwd);
23
+ const config = await loadConfig(cwd);
24
+ const commandsDir = resolveCommandsDir(cwd, config);
25
+ await send({
26
+ type: "config",
27
+ commandsDir,
28
+ server: {
29
+ ...(config.server?.host !== undefined ? { host: config.server.host } : {}),
30
+ ...(config.server?.port !== undefined ? { port: config.server.port } : {}),
31
+ },
32
+ });
33
+ const registry = await loadRegistry(commandsDir);
34
+ const listener = createMcpHttpHandler({
35
+ registry,
36
+ instrumentation,
37
+ ...(config.app ? { app: config.app } : {}),
38
+ ...(config.auth ? { auth: config.auth } : {}),
39
+ ...(config.tools ? { tools: config.tools } : {}),
40
+ ...(config.oauth ? { oauth: config.oauth } : {}),
41
+ ...mcpDeclarations(config),
42
+ server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},
43
+ onerror: (error) => process.stderr.write(`mcp: ${error.message}\n`),
44
+ });
45
+ const server = createServer(listener);
46
+ await new Promise((resolve, reject) => {
47
+ server.once("error", reject);
48
+ server.listen(0, "127.0.0.1", () => {
49
+ server.off("error", reject);
50
+ resolve();
51
+ });
52
+ });
53
+ process.on("message", (message) => {
54
+ if (message?.type !== "shutdown")
55
+ return;
56
+ void listener.close().finally(() => {
57
+ server.closeAllConnections();
58
+ server.close(() => process.exit(0));
59
+ });
60
+ });
61
+ await send({ type: "ready", port: server.address().port, commands: registry.commands.size });
62
+ }
63
+ main().catch(async (error) => {
64
+ await send({ type: "error", message: describeLoadError(error) });
65
+ process.exit(1);
66
+ });
67
+ /** SyntaxError 는 stack 첫 줄들에 파일 위치가 있다 (ESM 파싱 오류). 그 외는 message (MextBuildError = issue 목록) */
68
+ function describeLoadError(error) {
69
+ if (error instanceof SyntaxError && error.stack) {
70
+ const at = error.stack.indexOf("\n at ");
71
+ return (at < 0 ? error.stack : error.stack.slice(0, at)).trim();
72
+ }
73
+ return error instanceof Error ? error.message : String(error);
74
+ }
75
+ //# sourceMappingURL=dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/cli/dev-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mext dev 의 서버 자식 프로세스 엔트리 (cli/dev.ts 가 fork). 직접 실행하지 않는다.\n * cwd 의 mext.config.ts · commands/ 를 로드해 127.0.0.1 임의 포트에서 MCP HTTP 처리기를 띄우고 IPC 로 보고한다.\n * 요청은 감독 프로세스 (부모) 가 받아 이 포트로 중계한다. 부모 IPC 가 끊기면 종료.\n */\nimport { createServer } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport { loadConfig, mcpDeclarations, resolveCommandsDir } from \"../config.ts\"\nimport { loadProjectInstrumentation } from \"../instrumentation.ts\"\nimport { createMcpHttpHandler } from \"../mcp/http.ts\"\nimport { loadRegistry } from \"../scan.ts\"\n\n/** 자식 → 부모 */\nexport type DevChildMessage =\n | { type: \"config\"; commandsDir: string; server: { host?: string; port?: number } }\n | { type: \"ready\"; port: number; commands: number }\n | { type: \"error\"; message: string }\n\n/** 부모 → 자식 */\nexport type DevParentMessage = { type: \"shutdown\" }\n\nconst send = (message: DevChildMessage): Promise<void> =>\n new Promise((resolve) => {\n if (!process.connected) return resolve()\n process.send!(message, undefined, {}, () => resolve())\n })\n\n// 터미널 Ctrl-C 는 프로세스 그룹 전체에 간다. 종료는 부모가 정한다 (shutdown · IPC 끊김)\nprocess.on(\"SIGINT\", () => {})\nprocess.on(\"disconnect\", () => process.exit(0))\n\nasync function main(): Promise<void> {\n const cwd = process.cwd()\n // register() = 명령어 · config import 전\n const instrumentation = await loadProjectInstrumentation(cwd)\n const config = await loadConfig(cwd)\n const commandsDir = resolveCommandsDir(cwd, config)\n await send({\n type: \"config\",\n commandsDir,\n server: {\n ...(config.server?.host !== undefined ? { host: config.server.host } : {}),\n ...(config.server?.port !== undefined ? { port: config.server.port } : {}),\n },\n })\n const registry = await loadRegistry(commandsDir)\n const listener = createMcpHttpHandler({\n registry,\n instrumentation,\n ...(config.app ? { app: config.app } : {}),\n ...(config.auth ? { auth: config.auth } : {}),\n ...(config.tools ? { tools: config.tools } : {}),\n ...(config.oauth ? { oauth: config.oauth } : {}),\n ...mcpDeclarations(config),\n server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},\n onerror: (error) => process.stderr.write(`mcp: ${error.message}\\n`),\n })\n const server = createServer(listener)\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n process.on(\"message\", (message: DevParentMessage) => {\n if (message?.type !== \"shutdown\") return\n void listener.close().finally(() => {\n server.closeAllConnections()\n server.close(() => process.exit(0))\n })\n })\n await send({ type: \"ready\", port: (server.address() as AddressInfo).port, commands: registry.commands.size })\n}\n\nmain().catch(async (error: unknown) => {\n await send({ type: \"error\", message: describeLoadError(error) })\n process.exit(1)\n})\n\n/** SyntaxError 는 stack 첫 줄들에 파일 위치가 있다 (ESM 파싱 오류). 그 외는 message (MextBuildError = issue 목록) */\nfunction describeLoadError(error: unknown): string {\n if (error instanceof SyntaxError && error.stack) {\n const at = error.stack.indexOf(\"\\n at \")\n return (at < 0 ? error.stack : error.stack.slice(0, at)).trim()\n }\n return error instanceof Error ? error.message : String(error)\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { CliIo } from "./io.ts";
2
+ export declare const DEV_PROG = "mext dev";
3
+ /** 감시 대상 프로젝트 루트 파일 (commandsDir/** 와 함께) */
4
+ export declare const DEV_WATCHED_ROOT_FILES: readonly string[];
5
+ /** 파일 변경 → 재시작 debounce (ms) */
6
+ export declare const DEV_DEBOUNCE_MS = 100;
7
+ /**
8
+ * mext dev [--port <n>] [--host <h>] 개발 HTTP 서버. 감독 프로세스 + 서버 자식 (파일 변경 시 교체)
9
+ * mext dev --stdio stdio 서버 (감시 없음, 같은 프로세스)
10
+ */
11
+ export declare function devCommand(argv: readonly string[], io: CliIo): Promise<number>;
12
+ interface DevArgs {
13
+ help: boolean;
14
+ stdio: boolean;
15
+ port?: number;
16
+ host?: string;
17
+ }
18
+ /** 반환 문자열 = 사용법 오류 메시지 */
19
+ export declare function parseDevArgs(argv: readonly string[]): DevArgs | string;
20
+ export declare function devHelp(): string;
21
+ export {};