@obov/mext 0.5.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/approval.d.ts +33 -0
  2. package/dist/approval.js +36 -0
  3. package/dist/approval.js.map +1 -0
  4. package/dist/audit.d.ts +123 -0
  5. package/dist/audit.js +221 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/build-cli.d.ts +1 -0
  8. package/dist/build-cli.js.map +1 -1
  9. package/dist/build.d.ts +2 -0
  10. package/dist/build.js +46 -5
  11. package/dist/build.js.map +1 -1
  12. package/dist/caller.d.ts +53 -0
  13. package/dist/caller.js +51 -0
  14. package/dist/caller.js.map +1 -0
  15. package/dist/cli/args.js +1 -2
  16. package/dist/cli/args.js.map +1 -1
  17. package/dist/cli/build.js +26 -4
  18. package/dist/cli/build.js.map +1 -1
  19. package/dist/cli/dev-audit.d.ts +25 -0
  20. package/dist/cli/dev-audit.js +84 -0
  21. package/dist/cli/dev-audit.js.map +1 -0
  22. package/dist/cli/dev-lock.d.ts +3 -1
  23. package/dist/cli/dev-lock.js +12 -5
  24. package/dist/cli/dev-lock.js.map +1 -1
  25. package/dist/cli/dev-server.d.ts +9 -0
  26. package/dist/cli/dev-server.js +27 -3
  27. package/dist/cli/dev-server.js.map +1 -1
  28. package/dist/cli/dev-tap.d.ts +20 -0
  29. package/dist/cli/dev-tap.js +70 -0
  30. package/dist/cli/dev-tap.js.map +1 -0
  31. package/dist/cli/dev.d.ts +6 -0
  32. package/dist/cli/dev.js +20 -8
  33. package/dist/cli/dev.js.map +1 -1
  34. package/dist/cli/help.js +2 -0
  35. package/dist/cli/help.js.map +1 -1
  36. package/dist/cli/inspect.d.ts +7 -0
  37. package/dist/cli/inspect.js +699 -0
  38. package/dist/cli/inspect.js.map +1 -0
  39. package/dist/cli/main.js +10 -0
  40. package/dist/cli/main.js.map +1 -1
  41. package/dist/cli/media.d.ts +19 -0
  42. package/dist/cli/media.js +77 -0
  43. package/dist/cli/media.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -1
  45. package/dist/cli/output.js +3 -2
  46. package/dist/cli/output.js.map +1 -1
  47. package/dist/cli/run.js +33 -4
  48. package/dist/cli/run.js.map +1 -1
  49. package/dist/cli/serve.d.ts +10 -0
  50. package/dist/cli/serve.js +114 -0
  51. package/dist/cli/serve.js.map +1 -0
  52. package/dist/cli/types.d.ts +9 -0
  53. package/dist/cli/types.js +77 -0
  54. package/dist/cli/types.js.map +1 -0
  55. package/dist/client/index.d.ts +11 -0
  56. package/dist/client/index.js +7 -0
  57. package/dist/client/index.js.map +1 -0
  58. package/dist/client/manifest.js +6 -2
  59. package/dist/client/manifest.js.map +1 -1
  60. package/dist/client/runner.js +40 -3
  61. package/dist/client/runner.js.map +1 -1
  62. package/dist/client/typed.d.ts +56 -0
  63. package/dist/client/typed.js +526 -0
  64. package/dist/client/typed.js.map +1 -0
  65. package/dist/client/types.d.ts +225 -0
  66. package/dist/client/types.js +2 -0
  67. package/dist/client/types.js.map +1 -0
  68. package/dist/command.d.ts +61 -5
  69. package/dist/command.js +42 -1
  70. package/dist/command.js.map +1 -1
  71. package/dist/config.d.ts +59 -10
  72. package/dist/config.js +67 -7
  73. package/dist/config.js.map +1 -1
  74. package/dist/content.d.ts +65 -0
  75. package/dist/content.js +99 -0
  76. package/dist/content.js.map +1 -0
  77. package/dist/errors.d.ts +21 -3
  78. package/dist/errors.js +13 -0
  79. package/dist/errors.js.map +1 -1
  80. package/dist/expose.d.ts +9 -0
  81. package/dist/expose.js +52 -0
  82. package/dist/expose.js.map +1 -0
  83. package/dist/index.d.ts +18 -7
  84. package/dist/index.js +8 -2
  85. package/dist/index.js.map +1 -1
  86. package/dist/inspect/agent.d.ts +104 -0
  87. package/dist/inspect/agent.js +125 -0
  88. package/dist/inspect/agent.js.map +1 -0
  89. package/dist/inspect/audit.d.ts +46 -0
  90. package/dist/inspect/audit.js +133 -0
  91. package/dist/inspect/audit.js.map +1 -0
  92. package/dist/inspect/compare.d.ts +12 -0
  93. package/dist/inspect/compare.js +31 -0
  94. package/dist/inspect/compare.js.map +1 -0
  95. package/dist/inspect/index.d.ts +17 -0
  96. package/dist/inspect/index.js +12 -0
  97. package/dist/inspect/index.js.map +1 -0
  98. package/dist/inspect/inspector.d.ts +168 -0
  99. package/dist/inspect/inspector.js +392 -0
  100. package/dist/inspect/inspector.js.map +1 -0
  101. package/dist/inspect/profiles.d.ts +95 -0
  102. package/dist/inspect/profiles.js +235 -0
  103. package/dist/inspect/profiles.js.map +1 -0
  104. package/dist/inspect/scenario.d.ts +126 -0
  105. package/dist/inspect/scenario.js +555 -0
  106. package/dist/inspect/scenario.js.map +1 -0
  107. package/dist/inspect/ui-server.d.ts +31 -0
  108. package/dist/inspect/ui-server.js +378 -0
  109. package/dist/inspect/ui-server.js.map +1 -0
  110. package/dist/inspect/ui.html +917 -0
  111. package/dist/instrumentation.d.ts +13 -2
  112. package/dist/instrumentation.js +11 -1
  113. package/dist/instrumentation.js.map +1 -1
  114. package/dist/invoke.d.ts +36 -5
  115. package/dist/invoke.js +162 -21
  116. package/dist/invoke.js.map +1 -1
  117. package/dist/manifest.d.ts +19 -3
  118. package/dist/manifest.js +5 -1
  119. package/dist/manifest.js.map +1 -1
  120. package/dist/mcp/constants.d.ts +7 -0
  121. package/dist/mcp/constants.js +7 -0
  122. package/dist/mcp/constants.js.map +1 -1
  123. package/dist/mcp/dispatch.d.ts +10 -4
  124. package/dist/mcp/dispatch.js +24 -7
  125. package/dist/mcp/dispatch.js.map +1 -1
  126. package/dist/mcp/help.d.ts +2 -0
  127. package/dist/mcp/help.js +6 -1
  128. package/dist/mcp/help.js.map +1 -1
  129. package/dist/mcp/host.d.ts +14 -0
  130. package/dist/mcp/host.js +48 -0
  131. package/dist/mcp/host.js.map +1 -0
  132. package/dist/mcp/http.d.ts +38 -7
  133. package/dist/mcp/http.js +199 -23
  134. package/dist/mcp/http.js.map +1 -1
  135. package/dist/mcp/index.d.ts +2 -1
  136. package/dist/mcp/index.js +2 -1
  137. package/dist/mcp/index.js.map +1 -1
  138. package/dist/mcp/server.d.ts +12 -1
  139. package/dist/mcp/server.js +63 -17
  140. package/dist/mcp/server.js.map +1 -1
  141. package/dist/mcp/stdio.d.ts +4 -0
  142. package/dist/mcp/stdio.js +3 -0
  143. package/dist/mcp/stdio.js.map +1 -1
  144. package/dist/mcp/tasks.d.ts +3 -1
  145. package/dist/mcp/tasks.js +7 -4
  146. package/dist/mcp/tasks.js.map +1 -1
  147. package/dist/principal.d.ts +22 -0
  148. package/dist/principal.js +29 -0
  149. package/dist/principal.js.map +1 -1
  150. package/dist/registry.d.ts +5 -0
  151. package/dist/registry.js +21 -0
  152. package/dist/registry.js.map +1 -1
  153. package/dist/remote/client.d.ts +26 -1
  154. package/dist/remote/client.js +180 -55
  155. package/dist/remote/client.js.map +1 -1
  156. package/dist/remote/index.d.ts +1 -1
  157. package/dist/remote/index.js.map +1 -1
  158. package/dist/remote/oauth.d.ts +1 -1
  159. package/dist/remote/oauth.js +1 -1
  160. package/dist/remote/oauth.js.map +1 -1
  161. package/dist/route.d.ts +40 -2
  162. package/dist/route.js +128 -8
  163. package/dist/route.js.map +1 -1
  164. package/dist/start.js +9 -4
  165. package/dist/start.js.map +1 -1
  166. package/dist/suggest.js +1 -1
  167. package/dist/suggest.js.map +1 -1
  168. package/dist/typegen.d.ts +27 -0
  169. package/dist/typegen.js +62 -0
  170. package/dist/typegen.js.map +1 -0
  171. package/dist/version-constant.d.ts +5 -0
  172. package/dist/version-constant.js +6 -0
  173. package/dist/version-constant.js.map +1 -0
  174. package/dist/version.d.ts +1 -2
  175. package/dist/version.js +1 -2
  176. package/dist/version.js.map +1 -1
  177. package/package.json +12 -2
@@ -1 +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"]}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","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\"])\n/** 플래그 · JSON 문자열로 표현할 수 없는 타입 (빌드 오류). any · unknown 은 여기 없다 = JSON 문자열 (analyze 의 json) */\nconst UNCONVERTIBLE = new Set([\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\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"]}
package/dist/cli/build.js CHANGED
@@ -44,7 +44,19 @@ export function formatBuildSummary(result, cwd) {
44
44
  ]).map((l) => ` ${l}`),
45
45
  "",
46
46
  ...(manifest.routes?.length
47
- ? [...table([["Route", "Methods"], ...manifest.routes.map((r) => [r.path, r.methods.join(" · ")])]).map((l) => ` ${l}`), ""]
47
+ ? [
48
+ ...table([
49
+ ["Route", "Methods", "Auth", "Origin", "Body"],
50
+ ...manifest.routes.map((r) => [
51
+ r.path,
52
+ r.methods.join(" · "),
53
+ r.auth === "optional" ? "optional" : r.auth === true ? "yes" : "-",
54
+ r.origin === true ? "yes" : "-",
55
+ typeof r.maxBodyBytes === "number" ? formatBytes(r.maxBodyBytes) : "-",
56
+ ]),
57
+ ]).map((l) => ` ${l}`),
58
+ "",
59
+ ]
48
60
  : []),
49
61
  `Start: ${runtimeExec} ${dir}/server.js [--stdio]`,
50
62
  ];
@@ -56,14 +68,16 @@ export function formatBuildSummary(result, cwd) {
56
68
  const local = result.localBin;
57
69
  if (local)
58
70
  lines.push(`Local bin: ${dir}/bin.js (bin ${local.bin}@${local.version}). Run: ${local.bin} help (after npm link · npm install -g)`);
71
+ if (result.types !== undefined)
72
+ lines.push(`Types: ${relative(cwd, result.types) || result.types} (createClient<Commands>() from "@obov/mext/client")`);
59
73
  return `${lines.join("\n")}\n`;
60
74
  }
61
- /** readOnly · destructive · confirm. 아무것도 없으면 write */
75
+ /** readOnly · destructive · confirm (조건식 = confirm?). 아무것도 없으면 write */
62
76
  function safetyOf(c) {
63
77
  const flags = [
64
78
  ...(c.readOnly ? ["readOnly"] : []),
65
79
  ...(c.destructive ? ["destructive"] : []),
66
- ...(c.requiresConfirmation ? ["confirm"] : []),
80
+ ...(c.requiresConfirmation ? ["confirm"] : c.needsApproval !== undefined ? ["confirm?"] : []),
67
81
  ];
68
82
  return flags.length === 0 ? "write" : flags.join(" · ");
69
83
  }
@@ -76,7 +90,7 @@ export function buildHelp() {
76
90
  "",
77
91
  "Output (.mext/):",
78
92
  ...table([
79
- ["manifest.json", "schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module)"],
93
+ ["manifest.json", "schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module · auth · origin · maxBodyBytes)"],
80
94
  ["server.js", "node .mext/server.js [--stdio]. PORT · HOST environment variables"],
81
95
  ["handler.js", "export default { fetch(request) } (Web Request → Response)"],
82
96
  ["config.js", "mext.config.ts bundle (when present)"],
@@ -96,4 +110,12 @@ export function buildHelp() {
96
110
  ];
97
111
  return `${lines.join("\n")}\n`;
98
112
  }
113
+ /** 본문 상한 표시: 1 KiB · 1 MiB 단위로 나누어 떨어지면 그 단위, 아니면 바이트 */
114
+ function formatBytes(bytes) {
115
+ if (bytes % (1024 * 1024) === 0)
116
+ return `${bytes / 1024 / 1024} MiB`;
117
+ if (bytes % 1024 === 0)
118
+ return `${bytes / 1024} KiB`;
119
+ return `${bytes} B`;
120
+ }
99
121
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAuC,MAAM,aAAa,CAAA;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE3D,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAA;AAEtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAuB,EAAE,EAAS,EAAE,OAAO,GAA8B,EAAE;IACxG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;YAC5B,OAAO,IAAI,CAAC,EAAE,CAAA;QAChB,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,WAAW,UAAU,uBAAuB,CAAC,CAAA;QAC/F,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,IAAI,MAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;QAC/C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;QAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;IAC3E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,EAAE,CAAA;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,MAAmB,EAAE,GAAW;IACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;IAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAA;IAClC,MAAM,KAAK,GAAG;QACZ,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,QAAQ,CAAC,OAAO,GAAG;QAChF,EAAE;QACF,GAAG,KAAK,CAAC;YACP,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;YAC/B,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;SACjF,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,EAAE;QACF,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;YACzB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7H,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,WAAW,IAAI,GAAG,sBAAsB;KACnD,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACvC,KAAK,CAAC,IAAI,CACR,iBAAiB,GAAG,UAAU,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,SAAS,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,EAAE,8BAA8B,GAAG,MAAM,CACxI,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC7B,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,WAAW,KAAK,CAAC,GAAG,yCAAyC,CAAC,CAAA;IAC/I,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,uDAAuD;AACvD,SAAS,QAAQ,CAAC,CAAuB;IACvC,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAA;IACD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG;QACZ,iFAAiF;QACjF,EAAE;QACF,QAAQ;QACR,KAAK,UAAU,EAAE;QACjB,EAAE;QACF,kBAAkB;QAClB,GAAG,KAAK,CAAC;YACP,CAAC,eAAe,EAAE,wHAAwH,CAAC;YAC3I,CAAC,WAAW,EAAE,mEAAmE,CAAC;YAClF,CAAC,YAAY,EAAE,4DAA4D,CAAC;YAC5E,CAAC,WAAW,EAAE,sCAAsC,CAAC;YACrD,CAAC,oBAAoB,EAAE,0CAA0C,CAAC;YAClE,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;YAC9C,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;YAC/E,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;YACzE,CAAC,gBAAgB,EAAE,mDAAmD,CAAC;YACvE,CAAC,SAAS,EAAE,aAAa,CAAC;YAC1B,CAAC,MAAM,EAAE,2FAA2F,CAAC;YACrG,CAAC,QAAQ,EAAE,4EAA4E,CAAC;YACxF,CAAC,eAAe,EAAE,qCAAqC,CAAC;SACzD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,EAAE;QACF,qFAAqF;QACrF,sDAAsD;KACvD,CAAA;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC","sourcesContent":["import { relative } from \"node:path\"\nimport { buildProject, type BuildOptions, type BuildResult } from \"../build.ts\"\nimport type { BuildManifestCommand } from \"../manifest.ts\"\nimport { runtimeExec } from \"../runtime.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 ...(manifest.routes?.length\n ? [...table([[\"Route\", \"Methods\"], ...manifest.routes.map((r) => [r.path, r.methods.join(\" · \")])]).map((l) => ` ${l}`), \"\"]\n : []),\n `Start: ${runtimeExec} ${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 const local = result.localBin\n if (local) lines.push(`Local bin: ${dir}/bin.js (bin ${local.bin}@${local.version}). Run: ${local.bin} help (after npm link · npm install -g)`)\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 · resources · prompts · routes (+ 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 [\"resources/**/*.js\", \"one module per MCP resource (resources/, when present)\"],\n [\"prompts/**/*.js\", \"one module per MCP prompt (prompts/, when present)\"],\n [\"routes/**/*.js\", \"one module per HTTP route (routes/, when present)\"],\n [\"chunks/\", \"shared code\"],\n [\"cli/\", \"customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md\"],\n [\"bin.js\", \"local bin (cli.local: true, instead of cli/). package.json bin points here\"],\n [\"cli-errors.js\", \"cli.errors bundle for the local bin\"],\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"]}
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 { runtimeExec } from \"../runtime.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 ...(manifest.routes?.length\n ? [\n ...table([\n [\"Route\", \"Methods\", \"Auth\", \"Origin\", \"Body\"],\n ...manifest.routes.map((r) => [\n r.path,\n r.methods.join(\" · \"),\n r.auth === \"optional\" ? \"optional\" : r.auth === true ? \"yes\" : \"-\",\n r.origin === true ? \"yes\" : \"-\",\n typeof r.maxBodyBytes === \"number\" ? formatBytes(r.maxBodyBytes) : \"-\",\n ]),\n ]).map((l) => ` ${l}`),\n \"\",\n ]\n : []),\n `Start: ${runtimeExec} ${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 const local = result.localBin\n if (local) lines.push(`Local bin: ${dir}/bin.js (bin ${local.bin}@${local.version}). Run: ${local.bin} help (after npm link · npm install -g)`)\n if (result.types !== undefined) lines.push(`Types: ${relative(cwd, result.types) || result.types} (createClient<Commands>() from \"@obov/mext/client\")`)\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** readOnly · destructive · confirm (조건식 = confirm?). 아무것도 없으면 write */\nfunction safetyOf(c: BuildManifestCommand): string {\n const flags = [\n ...(c.readOnly ? [\"readOnly\"] : []),\n ...(c.destructive ? [\"destructive\"] : []),\n ...(c.requiresConfirmation ? [\"confirm\"] : c.needsApproval !== undefined ? [\"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 · resources · prompts · routes (+ module · auth · origin · maxBodyBytes)\"],\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 [\"resources/**/*.js\", \"one module per MCP resource (resources/, when present)\"],\n [\"prompts/**/*.js\", \"one module per MCP prompt (prompts/, when present)\"],\n [\"routes/**/*.js\", \"one module per HTTP route (routes/, when present)\"],\n [\"chunks/\", \"shared code\"],\n [\"cli/\", \"customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md\"],\n [\"bin.js\", \"local bin (cli.local: true, instead of cli/). package.json bin points here\"],\n [\"cli-errors.js\", \"cli.errors bundle for the local bin\"],\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\n/** 본문 상한 표시: 1 KiB · 1 MiB 단위로 나누어 떨어지면 그 단위, 아니면 바이트 */\nfunction formatBytes(bytes: number): string {\n if (bytes % (1024 * 1024) === 0) return `${bytes / 1024 / 1024} MiB`\n if (bytes % 1024 === 0) return `${bytes / 1024} KiB`\n return `${bytes} B`\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { AuditEvent } from "../audit.ts";
3
+ /**
4
+ * mext dev 의 감사 tap, 감독 프로세스 쪽 (spec §10 감사 tap): 자식이 넘긴 이벤트를 메모리에 보관하고
5
+ * dev 전용 endpoint 로 내보낸다. 디스크에 쓰지 않는다. mext dev (HTTP) 만 만든다
6
+ */
7
+ /** 감독 프로세스의 endpoint 경로. routes/ 는 `_` 접두 폴더를 건너뛰므로 이 경로를 만들 수 없다 */
8
+ export declare const DEV_AUDIT_PATH = "/__mext/dev/audit";
9
+ /** 보관하는 이벤트 수 */
10
+ export declare const DEV_AUDIT_LIMIT = 200;
11
+ /** endpoint 한 줄 */
12
+ export interface DevAuditLine {
13
+ /** 1부터 증가 (dev 실행 동안) */
14
+ seq: number;
15
+ event: AuditEvent;
16
+ }
17
+ export interface DevAuditHub {
18
+ push(event: AuditEvent): void;
19
+ /** DEV_AUDIT_PATH 요청이면 처리하고 true */
20
+ handle(req: IncomingMessage, res: ServerResponse): boolean;
21
+ close(): void;
22
+ }
23
+ /** 실행마다 새 토큰 (lock 파일의 auditToken) */
24
+ export declare function newAuditToken(): string;
25
+ export declare function createDevAuditHub(token: string): DevAuditHub;
@@ -0,0 +1,84 @@
1
+ import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ /**
3
+ * mext dev 의 감사 tap, 감독 프로세스 쪽 (spec §10 감사 tap): 자식이 넘긴 이벤트를 메모리에 보관하고
4
+ * dev 전용 endpoint 로 내보낸다. 디스크에 쓰지 않는다. mext dev (HTTP) 만 만든다
5
+ */
6
+ /** 감독 프로세스의 endpoint 경로. routes/ 는 `_` 접두 폴더를 건너뛰므로 이 경로를 만들 수 없다 */
7
+ export const DEV_AUDIT_PATH = "/__mext/dev/audit";
8
+ /** 보관하는 이벤트 수 */
9
+ export const DEV_AUDIT_LIMIT = 200;
10
+ const KEEPALIVE_MS = 15_000;
11
+ const LOOPBACK = new Set(["localhost", "127.0.0.1", "[::1]"]);
12
+ /** 실행마다 새 토큰 (lock 파일의 auditToken) */
13
+ export function newAuditToken() {
14
+ return randomBytes(24).toString("base64url");
15
+ }
16
+ export function createDevAuditHub(token) {
17
+ const lines = [];
18
+ const streams = new Set();
19
+ let seq = 0;
20
+ const expected = Buffer.from(`Bearer ${token}`);
21
+ const authorized = (header) => {
22
+ const given = Buffer.from(header ?? "");
23
+ return given.length === expected.length && timingSafeEqual(given, expected);
24
+ };
25
+ const keepalive = setInterval(() => {
26
+ for (const res of streams)
27
+ res.write("\n");
28
+ }, KEEPALIVE_MS);
29
+ keepalive.unref();
30
+ return {
31
+ push(event) {
32
+ const line = { seq: ++seq, event };
33
+ lines.push(line);
34
+ if (lines.length > DEV_AUDIT_LIMIT)
35
+ lines.splice(0, lines.length - DEV_AUDIT_LIMIT);
36
+ const text = `${JSON.stringify(line)}\n`;
37
+ for (const res of streams)
38
+ res.write(text);
39
+ },
40
+ handle(req, res) {
41
+ const url = new URL(req.url ?? "/", "http://localhost");
42
+ if (url.pathname !== DEV_AUDIT_PATH)
43
+ return false;
44
+ req.resume();
45
+ const deny = (status, message, headers = {}) => {
46
+ res.writeHead(status, { "content-type": "application/json", "cache-control": "no-store", ...headers });
47
+ res.end(`${JSON.stringify({ error: message })}\n`);
48
+ return true;
49
+ };
50
+ if (req.method !== "GET")
51
+ return deny(405, "Method not allowed.", { allow: "GET" });
52
+ const origin = req.headers.origin;
53
+ if (origin !== undefined && origin !== "" && !loopbackOrigin(origin))
54
+ return deny(403, "Forbidden.");
55
+ if (!authorized(req.headers.authorization))
56
+ return deny(403, "Forbidden.");
57
+ const after = Number(url.searchParams.get("after") ?? 0);
58
+ res.writeHead(200, { "content-type": "application/x-ndjson", "cache-control": "no-store", "x-accel-buffering": "no" });
59
+ res.flushHeaders();
60
+ for (const line of lines)
61
+ if (!(line.seq <= after))
62
+ res.write(`${JSON.stringify(line)}\n`);
63
+ streams.add(res);
64
+ res.on("close", () => streams.delete(res));
65
+ return true;
66
+ },
67
+ close() {
68
+ clearInterval(keepalive);
69
+ for (const res of streams)
70
+ res.end();
71
+ streams.clear();
72
+ },
73
+ };
74
+ }
75
+ function loopbackOrigin(origin) {
76
+ try {
77
+ const url = new URL(origin);
78
+ return (url.protocol === "http:" || url.protocol === "https:") && LOOPBACK.has(url.hostname);
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ //# sourceMappingURL=dev-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-audit.js","sourceRoot":"","sources":["../../src/cli/dev-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, timingSafeEqual } from \"node:crypto\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { AuditEvent } from \"../audit.ts\"\n\n/**\n * mext dev 의 감사 tap, 감독 프로세스 쪽 (spec §10 감사 tap): 자식이 넘긴 이벤트를 메모리에 보관하고\n * dev 전용 endpoint 로 내보낸다. 디스크에 쓰지 않는다. mext dev (HTTP) 만 만든다\n */\n\n/** 감독 프로세스의 endpoint 경로. routes/ 는 `_` 접두 폴더를 건너뛰므로 이 경로를 만들 수 없다 */\nexport const DEV_AUDIT_PATH = \"/__mext/dev/audit\"\n/** 보관하는 이벤트 수 */\nexport const DEV_AUDIT_LIMIT = 200\nconst KEEPALIVE_MS = 15_000\nconst LOOPBACK = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"])\n\n/** endpoint 한 줄 */\nexport interface DevAuditLine {\n /** 1부터 증가 (dev 실행 동안) */\n seq: number\n event: AuditEvent\n}\n\nexport interface DevAuditHub {\n push(event: AuditEvent): void\n /** DEV_AUDIT_PATH 요청이면 처리하고 true */\n handle(req: IncomingMessage, res: ServerResponse): boolean\n close(): void\n}\n\n/** 실행마다 새 토큰 (lock 파일의 auditToken) */\nexport function newAuditToken(): string {\n return randomBytes(24).toString(\"base64url\")\n}\n\nexport function createDevAuditHub(token: string): DevAuditHub {\n const lines: DevAuditLine[] = []\n const streams = new Set<ServerResponse>()\n let seq = 0\n const expected = Buffer.from(`Bearer ${token}`)\n const authorized = (header: string | undefined): boolean => {\n const given = Buffer.from(header ?? \"\")\n return given.length === expected.length && timingSafeEqual(given, expected)\n }\n const keepalive = setInterval(() => {\n for (const res of streams) res.write(\"\\n\")\n }, KEEPALIVE_MS)\n keepalive.unref()\n\n return {\n push(event) {\n const line: DevAuditLine = { seq: ++seq, event }\n lines.push(line)\n if (lines.length > DEV_AUDIT_LIMIT) lines.splice(0, lines.length - DEV_AUDIT_LIMIT)\n const text = `${JSON.stringify(line)}\\n`\n for (const res of streams) res.write(text)\n },\n handle(req, res) {\n const url = new URL(req.url ?? \"/\", \"http://localhost\")\n if (url.pathname !== DEV_AUDIT_PATH) return false\n req.resume()\n const deny = (status: number, message: string, headers: Record<string, string> = {}): true => {\n res.writeHead(status, { \"content-type\": \"application/json\", \"cache-control\": \"no-store\", ...headers })\n res.end(`${JSON.stringify({ error: message })}\\n`)\n return true\n }\n if (req.method !== \"GET\") return deny(405, \"Method not allowed.\", { allow: \"GET\" })\n const origin = req.headers.origin\n if (origin !== undefined && origin !== \"\" && !loopbackOrigin(origin)) return deny(403, \"Forbidden.\")\n if (!authorized(req.headers.authorization)) return deny(403, \"Forbidden.\")\n const after = Number(url.searchParams.get(\"after\") ?? 0)\n res.writeHead(200, { \"content-type\": \"application/x-ndjson\", \"cache-control\": \"no-store\", \"x-accel-buffering\": \"no\" })\n res.flushHeaders()\n for (const line of lines) if (!(line.seq <= after)) res.write(`${JSON.stringify(line)}\\n`)\n streams.add(res)\n res.on(\"close\", () => streams.delete(res))\n return true\n },\n close() {\n clearInterval(keepalive)\n for (const res of streams) res.end()\n streams.clear()\n },\n }\n}\n\nfunction loopbackOrigin(origin: string): boolean {\n try {\n const url = new URL(origin)\n return (url.protocol === \"http:\" || url.protocol === \"https:\") && LOOPBACK.has(url.hostname)\n } catch {\n return false\n }\n}\n"]}
@@ -3,6 +3,8 @@ export interface DevLock {
3
3
  pid: number;
4
4
  url: string | null;
5
5
  startedAt: string;
6
+ /** 감사 tap endpoint 의 토큰 (spec §10). 이전 버전의 잠금 = 없음. 로그 · 오류 메시지에 출력하지 않는다 */
7
+ auditToken?: string;
6
8
  }
7
9
  /** <cwd>/.mext/dev/lock */
8
10
  export declare function devLockPath(cwd: string): string;
@@ -12,7 +14,7 @@ export declare function readDevLock(cwd: string): DevLock | undefined;
12
14
  * 잠금 획득 (O_EXCL 생성). 이미 살아 있는 다른 프로세스의 잠금 = { running }.
13
15
  * 죽은 pid · 깨진 파일 = 오래된 잠금으로 보고 교체
14
16
  */
15
- export declare function acquireDevLock(cwd: string, url?: string | null): {
17
+ export declare function acquireDevLock(cwd: string, url?: string | null, auditToken?: string): {
16
18
  acquired: DevLock;
17
19
  } | {
18
20
  running: DevLock;
@@ -1,5 +1,7 @@
1
1
  import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
+ /** 잠금 파일 권한: 소유자만 (auditToken 이 들어 있다) */
4
+ const LOCK_MODE = 0o600;
3
5
  /** <cwd>/.mext/dev/lock */
4
6
  export function devLockPath(cwd) {
5
7
  return join(resolve(cwd), ".mext", "dev", "lock");
@@ -13,13 +15,13 @@ export function readDevLock(cwd) {
13
15
  * 잠금 획득 (O_EXCL 생성). 이미 살아 있는 다른 프로세스의 잠금 = { running }.
14
16
  * 죽은 pid · 깨진 파일 = 오래된 잠금으로 보고 교체
15
17
  */
16
- export function acquireDevLock(cwd, url = null) {
18
+ export function acquireDevLock(cwd, url = null, auditToken) {
17
19
  const path = devLockPath(cwd);
18
20
  mkdirSync(dirname(path), { recursive: true });
19
- const lock = { pid: process.pid, url, startedAt: new Date().toISOString() };
21
+ const lock = { pid: process.pid, url, startedAt: new Date().toISOString(), ...(auditToken !== undefined ? { auditToken } : {}) };
20
22
  for (let attempt = 0;; attempt++) {
21
23
  try {
22
- writeFileSync(path, `${JSON.stringify(lock)}\n`, { flag: "wx" });
24
+ writeFileSync(path, `${JSON.stringify(lock)}\n`, { flag: "wx", mode: LOCK_MODE });
23
25
  return { acquired: lock };
24
26
  }
25
27
  catch (error) {
@@ -36,7 +38,7 @@ export function acquireDevLock(cwd, url = null) {
36
38
  export function updateDevLock(cwd, lock) {
37
39
  const path = devLockPath(cwd);
38
40
  const tmp = `${path}.${process.pid}.tmp`;
39
- writeFileSync(tmp, `${JSON.stringify(lock)}\n`);
41
+ writeFileSync(tmp, `${JSON.stringify(lock)}\n`, { mode: LOCK_MODE });
40
42
  renameSync(tmp, path);
41
43
  }
42
44
  /** 이 프로세스의 잠금이면 삭제 (동기. process exit 처리기에서도 호출) */
@@ -50,7 +52,12 @@ function parseLock(path) {
50
52
  const value = JSON.parse(readFileSync(path, "utf8"));
51
53
  if (typeof value.pid !== "number")
52
54
  return undefined;
53
- return { pid: value.pid, url: typeof value.url === "string" ? value.url : null, startedAt: String(value.startedAt ?? "") };
55
+ return {
56
+ pid: value.pid,
57
+ url: typeof value.url === "string" ? value.url : null,
58
+ startedAt: String(value.startedAt ?? ""),
59
+ ...(typeof value.auditToken === "string" && value.auditToken !== "" ? { auditToken: value.auditToken } : {}),
60
+ };
54
61
  }
55
62
  catch {
56
63
  return undefined;
@@ -1 +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"]}
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 /** 감사 tap endpoint 의 토큰 (spec §10). 이전 버전의 잠금 = 없음. 로그 · 오류 메시지에 출력하지 않는다 */\n auditToken?: string\n}\n\n/** 잠금 파일 권한: 소유자만 (auditToken 이 들어 있다) */\nconst LOCK_MODE = 0o600\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, auditToken?: string): { 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(), ...(auditToken !== undefined ? { auditToken } : {}) }\n for (let attempt = 0; ; attempt++) {\n try {\n writeFileSync(path, `${JSON.stringify(lock)}\\n`, { flag: \"wx\", mode: LOCK_MODE })\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`, { mode: LOCK_MODE })\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 {\n pid: value.pid,\n url: typeof value.url === \"string\" ? value.url : null,\n startedAt: String(value.startedAt ?? \"\"),\n ...(typeof value.auditToken === \"string\" && value.auditToken !== \"\" ? { auditToken: value.auditToken } : {}),\n }\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"]}