@sfmc-bds/cli 0.2.0-beta.0 → 0.2.0-beta.10

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 (183) hide show
  1. package/dist/argv-parse.d.ts +11 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +28 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +46 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/command-palette.d.ts +61 -0
  10. package/dist/command-palette.d.ts.map +1 -0
  11. package/dist/command-palette.js +352 -0
  12. package/dist/command-palette.js.map +7 -0
  13. package/dist/command-surface.d.ts +85 -0
  14. package/dist/command-surface.d.ts.map +1 -0
  15. package/dist/command-surface.js +292 -0
  16. package/dist/command-surface.js.map +7 -0
  17. package/dist/commands-reload.js +2 -2
  18. package/dist/commands-reload.js.map +2 -2
  19. package/dist/commands.d.ts +1 -1
  20. package/dist/commands.d.ts.map +1 -1
  21. package/dist/commands.js +196 -21
  22. package/dist/commands.js.map +2 -2
  23. package/dist/debug-command.d.ts +5 -0
  24. package/dist/debug-command.d.ts.map +1 -0
  25. package/dist/debug-command.js +118 -0
  26. package/dist/debug-command.js.map +7 -0
  27. package/dist/help-text.d.ts +3 -0
  28. package/dist/help-text.d.ts.map +1 -0
  29. package/dist/help-text.js +160 -0
  30. package/dist/help-text.js.map +7 -0
  31. package/dist/i18n/locales/en.d.ts +103 -89
  32. package/dist/i18n/locales/en.d.ts.map +1 -1
  33. package/dist/i18n/locales/en.js +105 -91
  34. package/dist/i18n/locales/en.js.map +2 -2
  35. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  36. package/dist/i18n/locales/zh-CN.js +138 -118
  37. package/dist/i18n/locales/zh-CN.js.map +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -4
  41. package/dist/index.js.map +2 -2
  42. package/dist/llbot-launch.d.ts +20 -0
  43. package/dist/llbot-launch.d.ts.map +1 -0
  44. package/dist/llbot-launch.js +40 -0
  45. package/dist/llbot-launch.js.map +7 -0
  46. package/dist/log-filter.d.ts +69 -0
  47. package/dist/log-filter.d.ts.map +1 -0
  48. package/dist/log-filter.js +150 -0
  49. package/dist/log-filter.js.map +7 -0
  50. package/dist/logs.d.ts +29 -7
  51. package/dist/logs.d.ts.map +1 -1
  52. package/dist/logs.js +164 -72
  53. package/dist/logs.js.map +3 -3
  54. package/dist/main.js +55 -46
  55. package/dist/main.js.map +2 -2
  56. package/dist/module-commands.d.ts +17 -40
  57. package/dist/module-commands.d.ts.map +1 -1
  58. package/dist/module-commands.js +129 -85
  59. package/dist/module-commands.js.map +2 -2
  60. package/dist/module-pack-build.d.ts +10 -0
  61. package/dist/module-pack-build.d.ts.map +1 -0
  62. package/dist/module-pack-build.js +434 -0
  63. package/dist/module-pack-build.js.map +7 -0
  64. package/dist/module-toggle.d.ts +33 -0
  65. package/dist/module-toggle.d.ts.map +1 -0
  66. package/dist/module-toggle.js +28 -0
  67. package/dist/module-toggle.js.map +7 -0
  68. package/dist/node-service-probe.d.ts +18 -0
  69. package/dist/node-service-probe.d.ts.map +1 -0
  70. package/dist/node-service-probe.js +97 -0
  71. package/dist/node-service-probe.js.map +7 -0
  72. package/dist/pack-lifecycle.d.ts +1 -1
  73. package/dist/pack-lifecycle.d.ts.map +1 -1
  74. package/dist/pack-lifecycle.js +14 -4
  75. package/dist/pack-lifecycle.js.map +2 -2
  76. package/dist/pack-update/index.d.ts +18 -0
  77. package/dist/pack-update/index.d.ts.map +1 -0
  78. package/dist/pack-update/index.js +113 -0
  79. package/dist/pack-update/index.js.map +7 -0
  80. package/dist/registry.d.ts +7 -4
  81. package/dist/registry.d.ts.map +1 -1
  82. package/dist/registry.js +15 -3
  83. package/dist/registry.js.map +2 -2
  84. package/dist/repl-windows/format-display.d.ts +10 -0
  85. package/dist/repl-windows/format-display.d.ts.map +1 -0
  86. package/dist/repl-windows/format-display.js +57 -0
  87. package/dist/repl-windows/format-display.js.map +7 -0
  88. package/dist/repl-windows/host.d.ts +60 -0
  89. package/dist/repl-windows/host.d.ts.map +1 -0
  90. package/dist/repl-windows/host.js +179 -0
  91. package/dist/repl-windows/host.js.map +7 -0
  92. package/dist/repl-windows/index.d.ts +9 -0
  93. package/dist/repl-windows/index.d.ts.map +1 -0
  94. package/dist/repl-windows/index.js +13 -0
  95. package/dist/repl-windows/index.js.map +7 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  97. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  98. package/dist/repl-windows/logs-filter-window.js +77 -0
  99. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  100. package/dist/repl-windows/service-window.d.ts +4 -0
  101. package/dist/repl-windows/service-window.d.ts.map +1 -0
  102. package/dist/repl-windows/service-window.js +35 -0
  103. package/dist/repl-windows/service-window.js.map +7 -0
  104. package/dist/repl-windows/types.d.ts +56 -0
  105. package/dist/repl-windows/types.d.ts.map +1 -0
  106. package/dist/repl-windows/types.js +1 -0
  107. package/dist/repl-windows/types.js.map +7 -0
  108. package/dist/repl.d.ts +6 -9
  109. package/dist/repl.d.ts.map +1 -1
  110. package/dist/repl.js +698 -427
  111. package/dist/repl.js.map +3 -3
  112. package/dist/runtime.d.ts +6 -13
  113. package/dist/runtime.d.ts.map +1 -1
  114. package/dist/runtime.js +23 -28
  115. package/dist/runtime.js.map +2 -2
  116. package/dist/send-target.d.ts +11 -0
  117. package/dist/send-target.d.ts.map +1 -0
  118. package/dist/send-target.js +42 -0
  119. package/dist/send-target.js.map +7 -0
  120. package/dist/services.d.ts +50 -4
  121. package/dist/services.d.ts.map +1 -1
  122. package/dist/services.js +244 -20
  123. package/dist/services.js.map +2 -2
  124. package/dist/theme.js +1 -1
  125. package/dist/theme.js.map +2 -2
  126. package/dist/wizard.d.ts.map +1 -1
  127. package/dist/wizard.js +76 -16
  128. package/dist/wizard.js.map +2 -2
  129. package/dist/world-packs.d.ts +15 -0
  130. package/dist/world-packs.d.ts.map +1 -1
  131. package/dist/world-packs.js +90 -87
  132. package/dist/world-packs.js.map +2 -2
  133. package/package.json +24 -21
  134. package/scripts/module-install/check-modules.mjs +204 -0
  135. package/scripts/module-install/fetch-module.mjs +1007 -0
  136. package/scripts/module-install/install-resolver.test.mjs +48 -0
  137. package/scripts/module-install/lib/catalog.mjs +96 -0
  138. package/scripts/module-install/lib/io.mjs +37 -0
  139. package/scripts/module-install/lib/link-from.mjs +80 -0
  140. package/scripts/module-install/lib/lock.mjs +78 -0
  141. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  142. package/scripts/module-install/lib/packages.mjs +142 -0
  143. package/scripts/module-install/lib/paths.mjs +48 -0
  144. package/scripts/module-install/lib/registry-index.mjs +50 -0
  145. package/scripts/module-install/link-local.test.mjs +51 -0
  146. package/scripts/module-install/local-resolver.test.mjs +51 -0
  147. package/scripts/module-install/registry-index.test.mjs +28 -0
  148. package/dist/module-wizard.d.ts +0 -14
  149. package/dist/module-wizard.d.ts.map +0 -1
  150. package/dist/module-wizard.js +0 -313
  151. package/dist/module-wizard.js.map +0 -7
  152. package/dist/pack-update/bindings.d.ts +0 -12
  153. package/dist/pack-update/bindings.d.ts.map +0 -1
  154. package/dist/pack-update/bindings.js +0 -64
  155. package/dist/pack-update/bindings.js.map +0 -7
  156. package/dist/pack-update/config.d.ts +0 -22
  157. package/dist/pack-update/config.d.ts.map +0 -1
  158. package/dist/pack-update/config.js +0 -141
  159. package/dist/pack-update/config.js.map +0 -7
  160. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  161. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  162. package/dist/pack-update/providers/curseforge.js +0 -209
  163. package/dist/pack-update/providers/curseforge.js.map +0 -7
  164. package/dist/pack-update/providers/index.d.ts +0 -16
  165. package/dist/pack-update/providers/index.d.ts.map +0 -1
  166. package/dist/pack-update/providers/index.js +0 -37
  167. package/dist/pack-update/providers/index.js.map +0 -7
  168. package/dist/pack-update/service.d.ts +0 -21
  169. package/dist/pack-update/service.d.ts.map +0 -1
  170. package/dist/pack-update/service.js +0 -567
  171. package/dist/pack-update/service.js.map +0 -7
  172. package/dist/pack-update/types.d.ts +0 -126
  173. package/dist/pack-update/types.d.ts.map +0 -1
  174. package/dist/pack-update/types.js +0 -8
  175. package/dist/pack-update/types.js.map +0 -7
  176. package/dist/pack-update/version-policy.d.ts +0 -80
  177. package/dist/pack-update/version-policy.d.ts.map +0 -1
  178. package/dist/pack-update/version-policy.js +0 -216
  179. package/dist/pack-update/version-policy.js.map +0 -7
  180. package/dist/remote-agent.d.ts +0 -18
  181. package/dist/remote-agent.d.ts.map +0 -1
  182. package/dist/remote-agent.js +0 -196
  183. package/dist/remote-agent.js.map +0 -7
package/dist/repl.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/repl.ts"],
4
- "sourcesContent": ["import process, { stdin, stdout } from \"node:process\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport {\n cmdLogs,\n cmdRestart,\n cmdSend,\n cmdStart,\n cmdStartAll,\n cmdStatus,\n cmdStop,\n cmdStopAll,\n cmdUpdate,\n} from \"./commands.js\";\nimport {\n formatLog,\n getAllLogs,\n getRecentLogs,\n logPrefixWidth,\n onLog,\n SOURCE_META,\n wrapLogLine,\n type LogLevel,\n type LogSource,\n type UnifiedLog,\n} from \"./logs.js\";\nimport { pauseAllProgress, resumeAllProgress } from \"@sfmc-bds/sdk/logs\";\nimport {\n dispatchModuleCommand,\n isModuleCommand,\n listInstalledModuleIdsSync,\n MODULE_CMD_NAMES,\n MODULE_SUBCOMMANDS,\n} from \"./module-commands.js\";\nimport { listRegistryModuleIdsSync } from \"./registry.js\";\nimport { disableRemoteAgent, enrollRemoteAgent, remoteStatus, startRemoteAgent } from \"./remote-agent.js\";\nimport { forceStopAll, SERVICE_NAMES, stopAll } from \"./services.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { t } from \"./i18n/index.js\";\nimport { listSfmcModulePackages, resolveSfmcModulesRoot } from \"./sfmc-modules-root.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand, PACKS_SUBCOMMANDS } from \"./world-packs.js\";\n\nfunction setRaw(v: boolean): void {\n try {\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") stdin.setRawMode(v);\n } catch {}\n}\n\nconst welcome = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`help \u00B7 Ctrl+L \u00B7 \u21B9 \u00B7 \u2192 \u00B7 \u2191\u2193`)}\\n\n`;\n\nconst version = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${c.dim(`https://github.com/DogeLakeDev/ScriptsForMinecraftServer`)}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}\\n\n`;\n\n/** \u6309\u5F53\u524D\u8BED\u8A00\u751F\u6210\u5E2E\u52A9\uFF08\u52FF\u7F13\u5B58\u4E3A\u5E38\u91CF\uFF0Clocale \u53EF\u5207\u6362\uFF09\u3002 */\nexport function getHelp(): string {\n return `\n${c.bold(\"\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\")}\n${c.bold(\"\u2502\")} ${c.green(t(\"help.title\"))}${\" \".repeat(Math.max(1, 52 - t(\"help.title\").length))}${c.bold(\"\u2502\")}\n${c.bold(\"\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\")}\n\n${c.bold(t(\"help.section.service\"))}\n ${c.green(\"status\")} ${t(\"help.status\")}\n ${c.green(\"logs\")} <svc> [-n N] [-f] ${t(\"help.logs\")}\n ${c.green(\"start\")} <svc>|-all ${t(\"help.start\")}\n ${c.green(\"stop\")} <svc>|-all ${t(\"help.stop\")}\n ${c.green(\"restart\")}<svc>|-all ${t(\"help.restart\")}\n ${c.green(\"send\")} <svc> <msg> ${t(\"help.send\")}\n\n${c.bold(t(\"help.section.update\"))}\n ${c.green(\"update\")} [--check-only] [--channel=release|preview]\n ${t(\"help.update\")}\n\n${c.bold(t(\"help.section.remote\"))} ${c.dim(\"[beta]\")}\n ${c.green(\"remote\")} status ${t(\"help.remote.status\")}\n ${c.green(\"remote\")} enroll <url> <token> [name]\n ${t(\"help.remote.enroll\")}\n ${c.green(\"remote\")} disable ${t(\"help.remote.disable\")}\n\n${c.bold(t(\"help.section.module\"))}\n ${c.green(\"module\")}/${c.green(\"mod\")} list\n ${t(\"help.module.list\")}\n ${c.green(\"module\")} search [id] ${t(\"help.module.search\")}\n ${c.green(\"module\")} install <id> [--from <source>] [--link]\n ${t(\"help.module.install\")}\n ${c.green(\"module\")} uninstall <id> ${t(\"help.module.uninstall\")}\n ${c.green(\"module\")} verify [id] ${t(\"help.module.verify\")}\n ${c.green(\"module\")} info <id> ${t(\"help.module.info\")}\n ${c.green(\"module\")} enable|disable <id>\n ${t(\"help.module.toggle\")}\n ${c.green(\"module\")} create ${t(\"help.module.create\")}\n ${c.green(\"module\")} link [id] ${t(\"help.module.link\")}\n ${c.green(\"module\")} dev ${t(\"help.module.dev\")}\n ${c.green(\"module\")} build ${t(\"help.module.build\")}\n ${c.green(\"module\")} reload [--build-only]\n ${t(\"help.module.reload\")}\n\n${c.bold(t(\"help.section.addon\"))}\n ${c.green(\"addon\")}/${c.green(\"packs\")} list|search|enable|disable|bump|install|scan|doctor|path\n ${t(\"help.addon\")}\n\n${c.bold(t(\"help.section.general\"))}\n ${c.green(\"init\")} ${t(\"help.init\")}\n ${c.green(\"locale\")} [zh|en] ${t(\"help.locale\")}\n ${c.green(\"version\")} ${t(\"help.version\")}\n ${c.green(\"help\")} ${t(\"help.help\")}\n ${c.green(\"quit\")} / ${c.green(\"exit\")} ${t(\"help.quit\")}\n\n${c.dim(\"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\")}\n${c.dim(t(\"help.shortcuts\"))}\n ${c.dim(\"Tab\")} ${t(\"help.shortcut.tab\")}\n ${c.dim(\"\u2192\")} ${t(\"help.shortcut.right\")}\n ${c.dim(\"Ctrl+L\")} ${t(\"help.shortcut.ctrll\")}\n ${c.dim(\"\u2191\u2193\")} ${t(\"help.shortcut.history\")}\n`;\n}\n\n/** @deprecated \u8BF7\u7528 getHelp()\uFF1B\u4FDD\u7559\u522B\u540D\u4EE5\u517C\u5BB9\u65E7\u5BFC\u5165\u3002 */\nexport const HELP = {\n toString() {\n return getHelp();\n },\n valueOf() {\n return getHelp();\n },\n} as unknown as string;\n\nconst COMMANDS = [\n \"status\",\n \"logs\",\n \"start\",\n \"stop\",\n \"restart\",\n \"send\",\n \"init\",\n \"locale\",\n \"lang\",\n \"update\",\n \"remote\",\n ...MODULE_CMD_NAMES,\n \"packs\",\n \"addon\",\n \"version\",\n \"help\",\n \"quit\",\n \"exit\",\n];\n\n/* ==================================================================\n * Context-aware completion\n * ================================================================== */\ninterface ParsedLine {\n cmd: string;\n /** cmd \u4E4B\u540E\u7684\u5168\u90E8 token(\u4E0D\u542B\u6B63\u5728\u8F93\u5165\u7684 current,\u82E5\u672B\u5C3E\u65E0\u7A7A\u683C\u5219\u4E0D\u542B\u6700\u540E\u4E00\u4E2A\u534A\u8BCD) */\n words: string[];\n argIndex: number;\n current: string;\n}\n\n/**\n * \u89E3\u6790\u5F53\u524D\u8F93\u5165\u884C,\u63D0\u53D6\u547D\u4EE4\u540D\u3001\u53C2\u6570\u4F4D\u7F6E\u3001\u6B63\u5728\u8F93\u5165\u7684 word\u3002\n * \u672B\u5C3E\u7A7A\u683C\u89C6\u4E3A\"\u521A\u7ED3\u675F\u4E00\u4E2A word,\u51C6\u5907\u8F93\u5165\u4E0B\u4E00\u4E2A\"\u3002\n */\nfunction parseLine(line: string): ParsedLine {\n const endsWithSpace = line.length > 0 && /\\s$/.test(line);\n const trimmed = line.trim();\n if (!trimmed) return { cmd: \"\", words: [], argIndex: 0, current: \"\" };\n const tokens = trimmed.split(/\\s+/);\n if (endsWithSpace) {\n return {\n cmd: tokens[0] ?? \"\",\n words: tokens.slice(1),\n argIndex: tokens.length - 1,\n current: \"\",\n };\n }\n if (tokens.length === 1) return { cmd: \"\", words: [], argIndex: 0, current: tokens[0]! };\n return {\n cmd: tokens[0]!,\n words: tokens.slice(1, -1),\n argIndex: tokens.length - 2,\n current: tokens[tokens.length - 1]!,\n };\n}\n\n/**\n * \u6839\u636E\u547D\u4EE4 + \u53C2\u6570\u4F4D\u7F6E\u8FD4\u56DE\u8865\u5168\u5019\u9009 (\u533A\u5206\u547D\u4EE4,\u4E0D\u518D\u628A\u670D\u52A1\u540D\u5F53\u6210\u6240\u6709\u6307\u4EE4\u7684\u4E8C\u7EA7\u53C2\u6570)\u3002\n */\nfunction getCompletions(parsed: ParsedLine): string[] {\n const { cmd, words, argIndex, current } = parsed;\n const sw = (s: string): boolean => s.startsWith(current);\n if (!cmd) return COMMANDS.filter(sw);\n switch (cmd) {\n case \"logs\":\n case \"log\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n if (argIndex === 1) return [\"-n\", \"-f\"].filter(sw);\n return [];\n case \"start\":\n case \"stop\":\n case \"restart\":\n if (argIndex === 0) return [\"-all\", ...SERVICE_NAMES].filter(sw);\n return [];\n case \"send\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n return [];\n case \"update\":\n return [\"--check-only\", \"--force\", \"--channel=release\", \"--channel=preview\"].filter(sw);\n case \"remote\":\n if (argIndex === 0) return [\"status\", \"enroll\", \"disable\"].filter(sw);\n return [];\n case \"packs\":\n case \"addon\":\n if (argIndex === 0) return [...PACKS_SUBCOMMANDS].filter(sw);\n if (argIndex === 1 && [\"list\"].includes(words[0] ?? \"\")) {\n return [\"--kind\", \"--search\"].filter(sw);\n }\n return [];\n default: {\n /* \u4E0E MODULE_CMD_NAMES \u5BF9\u9F50,\u65B0\u589E\u522B\u540D\u65E0\u9700\u518D\u6539 case(OCP/DRY) */\n if (!isModuleCommand(cmd)) return [];\n if (argIndex === 0) return [...MODULE_SUBCOMMANDS].filter(sw);\n const verb = words[0] ?? \"\";\n /* search:\u8865\u5168 registry \u7F13\u5B58\u4E2D\u7684 id;\u5176\u4F59\u672C\u5730\u5DF2\u88C5 id */\n if (argIndex === 1 && verb === \"search\") {\n return listRegistryModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && [\"info\", \"uninstall\", \"remove\", \"verify\", \"enable\", \"disable\"].includes(verb)) {\n return listInstalledModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && verb === \"reload\") {\n return [\"--build-only\"].filter(sw);\n }\n if (argIndex === 1 && verb === \"link\") {\n const root = resolveSfmcModulesRoot();\n if (root) {\n const ids = listSfmcModulePackages(root)\n .map((p) => p.id)\n .filter(sw);\n if (ids.length) return ids;\n }\n return [\"--from\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"install\") {\n return [\"--from\", \"--sha256\", \"--link\"].filter(sw);\n }\n if (argIndex >= 2 && verb === \"link\") {\n return [\"--from\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"list\") {\n return [\"--from\", \"--sha256\"].filter(sw);\n }\n return [];\n }\n }\n}\n\n/* ==================================================================\n * Escape sequence consumer\n * ================================================================== */\nfunction consumeEscapeSeq(chunk: Buffer, i: number): number | null {\n if (chunk[i] !== 0x1b) return null;\n const rem = chunk.length - i - 1;\n if (rem >= 2 && chunk[i + 1] === 0x5b) {\n let j = i + 2;\n while (j < chunk.length && chunk[j]! >= 0x30 && chunk[j]! <= 0x3f) j++;\n while (j < chunk.length && chunk[j]! >= 0x20 && chunk[j]! <= 0x2f) j++;\n if (j < chunk.length && chunk[j]! >= 0x40 && chunk[j]! <= 0x7e) j++;\n return j;\n }\n if (rem >= 2 && chunk[i + 1] === 0x4f) return i + 3;\n if (rem >= 1) return i + 2;\n return i + 1;\n}\n\n/* ==================================================================\n * Simple select\n * ================================================================== */\ninterface SelectItem {\n label: string;\n value: string;\n}\n\nasync function simpleSelect(items: SelectItem[]): Promise<string | null> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n let selected = 0;\n const h = Math.min(items.length, 8);\n let lastLines = h;\n function render(first: boolean): void {\n if (!first) {\n stdout.write(`\\x1B[${lastLines}A\\x1B[J`);\n } else {\n stdout.write(\"\\x1B[J\");\n }\n lastLines = h;\n let out = \"\";\n for (let i = 0; i < h; i++) {\n const cur = i === selected ? `\u25C9 ${c.text(items[i]!.label)}` : `\u25CB ${c.text(items[i]!.label)}`;\n out += `${cur}\\n`;\n }\n stdout.write(out);\n }\n\n function clear(): void {\n stdout.write(`\\x1B[${lastLines}A\\x1B[J`);\n }\n\n render(true);\n\n return new Promise<string | null>((resolve) => {\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const rem = chunk.length - i - 1;\n if (rem === 0) {\n clear();\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n resolve(null);\n return;\n }\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const c = next - i;\n if (c === 3 && chunk[i + 1] === 0x5b) {\n if (chunk[i + 2] === 0x41 && selected > 0) {\n selected--;\n render(false);\n }\n if (chunk[i + 2] === 0x42 && selected < items.length - 1) {\n selected++;\n render(false);\n }\n }\n i = next;\n } else i++;\n continue;\n }\n const byte = chunk[i];\n i++;\n if (byte === 0x0d || byte === 0x0a) {\n clear();\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n resolve(items[selected]?.value ?? null);\n return;\n }\n if (byte === 0x03) {\n clear();\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n resolve(null);\n return;\n }\n }\n };\n stdin.on(\"data\", handler);\n });\n}\n\n/* ==================================================================\n * Line reader\n * ================================================================== */\nconst history: string[] = [];\nlet historyIdx = -1;\n\n/** \u5F53\u524D readLine \u7684\u91CD\u7ED8\u51FD\u6570 (\u7A97\u53E3 resize \u65F6\u8C03\u7528,\u91CD\u7ED8\u8F93\u5165\u884C) */\nlet currentRedraw: (() => void) | null = null;\n\nasync function readLine(prompt: string, initial = \"\"): Promise<string | null> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n\n let line = initial;\n let suggestion = \"\";\n let tabState: { candidates: string[]; idx: number; wordStart: number; completedLine: string } | null = null;\n\n /**\n * \u91CD\u7ED8\u5F53\u524D\u884C:prompt + line + \u7070\u8272 autosuggestion,\u5149\u6807\u505C\u5728 line \u672B\u5C3E\u3002\n * autosuggestion \u53D6\u5F53\u524D word \u7684\u7B2C\u4E00\u4E2A\u8865\u5168\u5019\u9009\u7684\u5269\u4F59\u90E8\u5206 (\u4EC5\u5F53 current \u975E\u7A7A\u65F6)\u3002\n */\n function redraw(): void {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n const first = candidates[0];\n suggestion =\n parsed.current && first && first !== parsed.current && first.startsWith(parsed.current)\n ? first.slice(parsed.current.length)\n : \"\";\n stdout.write(\"\\r\\x1B[K\" + prompt + line);\n if (suggestion) {\n stdout.write(c.dim(suggestion));\n stdout.write(\"\\x1B[\" + suggestion.length + \"D\");\n }\n }\n\n redraw();\n\n currentRedraw = redraw;\n return new Promise<string | null>((resolve) => {\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const len = next - i;\n if (len === 3 && chunk[i + 1] === 0x5b) {\n const fin = chunk[i + 2];\n if (fin === 0x41 && historyIdx > 0) {\n historyIdx--;\n line = history[historyIdx] ?? \"\";\n tabState = null;\n redraw();\n } else if (fin === 0x42) {\n if (historyIdx < history.length - 1) {\n historyIdx++;\n line = history[historyIdx] ?? \"\";\n tabState = null;\n redraw();\n } else if (historyIdx === history.length - 1) {\n historyIdx = history.length;\n line = \"\";\n tabState = null;\n redraw();\n }\n } else if (fin === 0x43 && suggestion) {\n /* \u2192 \u63A5\u53D7 autosuggestion */\n line += suggestion;\n tabState = null;\n redraw();\n }\n }\n i = next;\n } else i++;\n continue;\n }\n\n const byte = chunk[i];\n i++;\n\n if (byte === 0x0d || byte === 0x0a) {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n /* \u6E05\u6389\u7070\u8272 suggestion,\u7559\u4E0B\u5E72\u51C0\u7684 prompt+line \u518D\u6362\u884C */\n stdout.write(\"\\r\\x1B[K\" + prompt + line + \"\\r\\n\");\n if (line.length > 0) {\n history.push(line);\n if (history.length > 100) history.shift();\n }\n historyIdx = history.length;\n resolve(line);\n return;\n }\n\n if (byte === 0x03) {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n if (line.length > 0) {\n line = \"\";\n tabState = null;\n /* Ctrl+C \u6E05\u7A7A\u5F53\u524D\u8F93\u5165,\u4E0D\u5F39 suggestion */\n stdout.write(\"\\r\\x1B[K\" + prompt);\n continue;\n }\n stdout.write(\"\\r\\n\");\n resolve(null);\n return;\n }\n\n /* Tab \u2014 context-aware completion, cycle on repeated Tab, no auto-space */\n if (byte === 0x09) {\n if (tabState && line === tabState.completedLine) {\n tabState.idx = (tabState.idx + 1) % tabState.candidates.length;\n } else {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n if (candidates.length === 0) {\n tabState = null;\n redraw();\n continue;\n }\n tabState = {\n candidates,\n idx: 0,\n wordStart: line.length - parsed.current.length,\n completedLine: \"\",\n };\n }\n const match = tabState.candidates[tabState.idx]!;\n line = line.slice(0, tabState.wordStart) + match;\n tabState.completedLine = line;\n redraw();\n continue;\n }\n\n /* Ctrl+L */\n if (byte === 0x0c) {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n resolve(\"__CTRLL__\" + line);\n return;\n }\n\n if (byte === 0x7f || byte === 0x08) {\n if (line.length > 0) {\n line = line.slice(0, -1);\n }\n tabState = null;\n redraw();\n continue;\n }\n\n if (byte! >= 0x20 && byte! <= 0x7e) {\n line += String.fromCharCode(byte!);\n tabState = null;\n redraw();\n continue;\n }\n }\n };\n stdin.on(\"data\", handler);\n }).finally(() => {\n currentRedraw = null;\n });\n}\n\n/* ==================================================================\n * REPL\n * ================================================================== */\ninterface LogFilter {\n levels: LogLevel[];\n sources: LogSource[];\n}\n\nconst LEVEL_ITEMS: SelectItem[] = [\n { label: c.blue(\"INFO\"), value: \"info\" },\n { label: c.yellow(\"WARN\"), value: \"warn\" },\n { label: c.red(\"ERROR\"), value: \"error\" },\n { label: c.dim(\"DEBUG\"), value: \"debug\" },\n { label: c.green(\"SUCCESS\"), value: \"success\" },\n];\n\n/** \u6765\u6E90\u9009\u62E9\u9879:\u6807\u7B7E\u6574\u6BB5\u67D3\u8272(\u542B\u540E\u7EED formatSourceTag \u7684\u65B9\u62EC\u53F7\u98CE\u683C) */\nexport const SOURCE_ITEMS: SelectItem[] = SOURCE_META.map((m) => ({\n label: m.paint(m.name),\n value: m.value,\n}));\n\n/**\n * \u5386\u53F2\u56DE\u653E\u6863\u4F4D \u2014 \u590D\u7528 createMemoryBuffer(5000) \u5185\u5B58\u843D\u76D8\u3002\n * value \u7EA6\u5B9A: none | all | count:N | time:MS\n */\nfunction historyItems(): SelectItem[] {\n return [\n { label: t(\"repl.history.live\"), value: \"none\" },\n { label: t(\"repl.history.last50\"), value: \"count:50\" },\n { label: t(\"repl.history.last100\"), value: \"count:100\" },\n { label: t(\"repl.history.last500\"), value: \"count:500\" },\n { label: t(\"repl.history.last1000\"), value: \"count:1000\" },\n { label: t(\"repl.history.last1min\"), value: \"time:60000\" },\n { label: t(\"repl.history.last5min\"), value: \"time:300000\" },\n { label: t(\"repl.history.last15min\"), value: \"time:900000\" },\n { label: t(\"repl.history.last1hour\"), value: \"time:3600000\" },\n { label: t(\"repl.history.all\"), value: \"all\" },\n ];\n}\n\n/** \u6309\u5F53\u524D\u8FC7\u6EE4\u6761\u4EF6\u4ECE\u5185\u5B58\u7F13\u51B2\u53D6\u5386\u53F2\u65E5\u5FD7 */\nfunction queryHistory(filter: LogFilter, window: string): UnifiedLog[] {\n if (!window || window === \"none\") return [];\n\n const match = (l: UnifiedLog): boolean => {\n if (filter.levels.length && !filter.levels.includes(l.level)) return false;\n if (filter.sources.length && !filter.sources.includes(l.source)) return false;\n return true;\n };\n\n if (window === \"all\") return getAllLogs().filter(match);\n\n if (window.startsWith(\"count:\")) {\n const n = Number(window.slice(\"count:\".length));\n if (!Number.isFinite(n) || n <= 0) return [];\n return getRecentLogs(n, filter.levels, filter.sources);\n }\n\n if (window.startsWith(\"time:\")) {\n const ms = Number(window.slice(\"time:\".length));\n if (!Number.isFinite(ms) || ms <= 0) return [];\n const since = Date.now() - ms;\n return getAllLogs().filter((l) => match(l) && l.time.getTime() >= since);\n }\n\n return [];\n}\n\nfunction pushAndRender(log: UnifiedLog, filter: LogFilter): void {\n if (filter.levels.length && !filter.levels.includes(log.level)) return;\n if (filter.sources.length && !filter.sources.includes(log.source)) return;\n /* \u8FDB\u5EA6\u6761 pause \u2192 \u6E05\u8F93\u5165\u884C\u5199\u65E5\u5FD7 \u2192 resume \u2192 \u91CD\u7ED8 \u276F */\n pauseAllProgress();\n try {\n stdout.write(`\\r\\x1B[K${wrapLogLine(formatLog(log), logPrefixWidth(log))}\\n`);\n } finally {\n resumeAllProgress();\n }\n currentRedraw?.();\n}\n\n/* ==================================================================\n * START REPL\n * ================================================================== */\n\nexport async function startRepl(): Promise<void> {\n let stopping = false;\n const shutdown = async (): Promise<void> => {\n if (stopping) return;\n stopping = true;\n stdout.write(c.dim(t(\"repl.stopping\") + \"\\n\"));\n await stopAll();\n stdout.write(c.dim(t(\"repl.bye\") + \"\\n\"));\n };\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.forceStop\") + \"\\n\"));\n forceStopAll();\n process.exit(130);\n };\n process.on(\"SIGINT\", onSigint);\n\n if (!stdin.isTTY) {\n console.log(c.dim(t(\"repl.nonInteractive\")));\n for await (const line of (await import(\"node:readline/promises\")).createInterface({\n input: stdin,\n output: stdout,\n terminal: false,\n })) {\n const t = line.trim();\n if (!t) continue;\n const p = t.split(/\\s+/);\n if ([\"quit\", \"exit\", \"q\"].includes(p[0]!)) break;\n if (p[0] === \"init\") {\n (await import(\"./wizard.js\")).runWizard();\n continue;\n }\n await execCmd(p);\n }\n await shutdown();\n process.off(\"SIGINT\", onSigint);\n return;\n }\n console.clear();\n stdout.write(welcome);\n\n let filter: LogFilter = { levels: [], sources: [] };\n\n const unsub = onLog((log) => pushAndRender(log, filter));\n\n /** \u7A97\u53E3\u5927\u5C0F\u53D8\u5316\u65F6\u91CD\u7ED8\u53EF\u89C1\u65E5\u5FD7 + \u8F93\u5165\u884C (\u6309\u65B0\u5BBD\u5EA6\u6362\u884C) */\n function onResize(): void {\n if (!currentRedraw) return;\n const rows = process.stdout.rows || 24;\n stdout.write(\"\\x1B[H\\x1B[2J\");\n const all = getAllLogs();\n const out: string[] = [];\n let usedRows = 0;\n for (let i = all.length - 1; i >= 0; i--) {\n const log = all[i]!;\n if (filter.levels.length && !filter.levels.includes(log.level)) continue;\n if (filter.sources.length && !filter.sources.includes(log.source)) continue;\n const wrapped = wrapLogLine(formatLog(log), logPrefixWidth(log));\n const logRows = wrapped.split(\"\\n\").length;\n if (usedRows + logRows > rows - 2) break;\n out.unshift(wrapped);\n usedRows += logRows;\n }\n for (const l of out) stdout.write(l + \"\\n\");\n currentRedraw();\n }\n\n process.stdout.on(\"resize\", onResize);\n\n let pendingInput = \"\";\n\n while (true) {\n const raw = await readLine(c.text(\" \u276F \"), pendingInput);\n pendingInput = \"\";\n\n if (raw === null) break;\n\n /* Ctrl+L \u2014 filter level / source / history window */\n if (raw.startsWith(\"__CTRLL__\")) {\n stdout.write(c.dim(`\\nLEVEL\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500SOURCE\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500HISTORY\\n`));\n const histChoices = historyItems();\n const lvl = await simpleSelect([{ label: t(\"common.all\"), value: \"\" }, ...LEVEL_ITEMS]);\n if (lvl === null) continue;\n const src = await simpleSelect([{ label: t(\"common.all\"), value: \"\" }, ...SOURCE_ITEMS]);\n if (src === null) continue;\n const hist = await simpleSelect(histChoices);\n if (hist === null) continue;\n\n filter = { levels: lvl ? [lvl as LogLevel] : [], sources: src ? [src as LogSource] : [] };\n\n const replay = queryHistory(filter, hist);\n if (replay.length > 0) {\n stdout.write(c.dim(t(\"repl.historyHeader\", { count: replay.length }) + \"\\n\"));\n for (const log of replay) {\n stdout.write(`${wrapLogLine(formatLog(log), logPrefixWidth(log))}\\n`);\n }\n }\n\n const histLabel = histChoices.find((i) => i.value === hist)?.label ?? hist;\n stdout.write(\n c.dim(t(\"repl.filter\", { level: lvl || \"*\", source: src || \"*\", history: histLabel }) + \"\\n\")\n );\n continue;\n }\n\n const trimmed = raw.trim();\n if (!trimmed) continue;\n\n try {\n await execCmd(trimmed.split(/\\s+/));\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n }\n\n process.stdout.off(\"resize\", onResize);\n unsub();\n await shutdown();\n process.off(\"SIGINT\", onSigint);\n}\n\nasync function execCmd(parts: string[]): Promise<void> {\n const [cmd, ...args] = parts;\n\n switch (cmd) {\n case \"help\":\n case \"h\":\n case \"?\":\n stdout.write(getHelp());\n break;\n case \"version\":\n stdout.write(`${version}\\n`);\n break;\n case \"locale\":\n case \"lang\":\n stdout.write(cmdLocale(args) + \"\\n\");\n break;\n case \"status\":\n stdout.write(cmdStatus() + \"\\n\");\n break;\n case \"logs\":\n case \"log\": {\n const out = cmdLogs(args, () => {\n if (!stdin.isTTY) {\n stdout.write(c.yellow(t(\"repl.followRequiresTty\") + \"\\n\"));\n return;\n }\n });\n if (out) stdout.write(out + \"\\n\");\n break;\n }\n case \"start\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStartAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.start.usageShort\") + \"\\n\"));\n break;\n case \"stop\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStopAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStop(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.stop.usageShort\") + \"\\n\"));\n break;\n case \"restart\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") {\n await cmdStopAll();\n stdout.write((await cmdStartAll()) + \"\\n\");\n } else if (args[0]) stdout.write((await cmdRestart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.restart.usageShort\") + \"\\n\"));\n break;\n case \"send\": {\n const svc = args[0] ?? \"\";\n const msg = args.slice(1).join(\" \");\n stdout.write((await cmdSend(svc, msg)) + \"\\n\");\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n case \"update\":\n await cmdUpdate(args);\n break;\n case \"remote\": {\n const [subcommand, controllerUrl, enrollmentToken, name] = args;\n if (subcommand === \"status\") {\n stdout.write(JSON.stringify(remoteStatus(), null, 2) + \"\\n\");\n } else if (subcommand === \"enroll\" && controllerUrl && enrollmentToken) {\n const agentName = name ?? process.env.COMPUTERNAME ?? \"sfmc-agent\";\n const id = await enrollRemoteAgent(controllerUrl, enrollmentToken, agentName);\n stdout.write(t(\"remote.enrolled\", { id }) + \"\\n\");\n startRemoteAgent();\n } else if (subcommand === \"disable\") {\n disableRemoteAgent();\n stdout.write(c.dim(t(\"remote.disabled\") + \"\\n\"));\n } else {\n stdout.write(t(\"remote.usageShort\") + \"\\n\");\n }\n break;\n }\n case \"quit\":\n case \"exit\":\n case \"q\":\n throw \"QUIT\";\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = args;\n stdout.write((await dispatchModuleCommand(sub, subRest)) + \"\\n\");\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = args;\n stdout.write((await dispatchPacksCommand(sub, subRest)) + \"\\n\");\n break;\n }\n stdout.write(c.yellow(t(\"common.unknownShort\", { cmd: cmd ?? \"\" }) + \"\\n\"));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["c", "t"]
4
+ "sourcesContent": ["import { pauseAllProgress, resumeAllProgress } from \"@sfmc-bds/sdk/logs\";\nimport chalk from \"chalk\";\nimport process, { stdin, stdout } from \"node:process\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport {\n activeNode,\n clampPaletteSelection,\n commitSelection,\n formatPaletteCascadeLines,\n paletteGhost,\n promptSlashColumn,\n resolvePaletteView,\n} from \"./command-palette.js\";\nimport {\n listVisiblePacksSubs,\n listVisibleTopLevelNames,\n resolveModuleTopShorthand,\n type CommandMode,\n} from \"./command-surface.js\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { getHelp as buildHelp } from \"./help-text.js\";\nimport { t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport {\n formatLog,\n getAllLogs,\n logPrefixWidth,\n onLog,\n readDiskLogs,\n SOURCE_META,\n wrapLogLine,\n type LogLevel,\n type UnifiedLog,\n} from \"./logs.js\";\nimport {\n dispatchModuleCommand,\n getVisibleModuleSubcommands,\n isModuleCommand,\n listInstalledModuleIdsSync,\n} from \"./module-commands.js\";\nimport { listRegistryModuleIdsSync } from \"./registry.js\";\nimport {\n createLogsFilterWindow,\n createServiceWindow,\n serviceWindowId,\n WindowHost,\n type LogsFilterState,\n type WindowChrome,\n type WindowKeyEvent,\n type WindowKeyResult,\n} from \"./repl-windows/index.js\";\nimport { listActiveSendTargets, paintSendPrompt, plainPrompt } from \"./send-target.js\";\nimport { forceStopAll, onServiceStateChange, SERVICE_NAMES, stopAll, type ServiceName } from \"./services.js\";\nimport { c, T } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst REPL_MODE: CommandMode = \"repl\";\n\nfunction getDisplayWidth(str: string) {\n // \u5148\u53BB\u9664 ANSI \u7801\n const plain = str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let width = 0;\n for (const ch of plain) {\n // \u7C97\u7565\u5224\u65AD\uFF1A\u975E ASCII \u5B57\u7B26\uFF08\u5982\u4E2D\u6587\uFF09\u89C6\u4E3A\u5360 2 \u5217\n if (ch.codePointAt(0)! > 127) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction charDisplayWidth(ch: string): number {\n return ch.codePointAt(0)! > 127 ? 2 : 1;\n}\n\nfunction setRaw(v: boolean): void {\n try {\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") stdin.setRawMode(v);\n } catch {}\n}\n\n/** \u5DE6\u4FA7 SFMC logo \u4E09\u884C\uFF08\u5E95\u884C\u542B\u63A5\u6A2A\u7EBF\u7684 \u2570\u2500\u2500\u2500\uFF0C\u4E0E\u6700\u7EC8\u5E03\u5C40\u4E00\u81F4\uFF09 */\nconst LOGO_ROWS = [\"\u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574\", \"\u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 \", \"\u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500\"] as const;\nconst LOGO_PAD = \" \";\nconst LOGO_TOP_GAP = \" \";\nconst LOGO_MID_GAP = \" \";\nconst SHORTCUT_HINT = ` / \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`;\n/** S\u2192F\u2192M\u2192C \u624B\u5199\u7B14\u987A\uFF08row, col\uFF09\uFF1B\u7A7A\u683C\u683C\u5728\u6784\u5EFA\u65F6\u8FC7\u6EE4 */\nconst LOGO_STROKE_RAW: ReadonlyArray<readonly [number, number]> = [\n // S\n [0, 1],\n [0, 2],\n [0, 0],\n [1, 0],\n [1, 1],\n [1, 2],\n [2, 2],\n [2, 1],\n [2, 0],\n // F\n [0, 3],\n [1, 3],\n [2, 3],\n [0, 4],\n [0, 5],\n [1, 4],\n // M\n [0, 6],\n [1, 6],\n [2, 6],\n [0, 7],\n [1, 7],\n [0, 8],\n [1, 8],\n [2, 8],\n // C\uFF08\u672B\u7B14\u843D\u5230 \u2570\u2500\u2500\u2500\uFF0C\u968F\u540E\u65E0\u7F1D\u63A5\u6A2A\u7EBF\u5EF6\u957F\uFF09\n [0, 10],\n [0, 11],\n [0, 9],\n [1, 9],\n [2, 9],\n [2, 10],\n [2, 11],\n [2, 12],\n];\nconst LOGO_STROKES = LOGO_STROKE_RAW.filter(([r, col]) => {\n const ch = LOGO_ROWS[r]?.[col];\n return ch !== undefined && ch !== \" \";\n});\n\n/** \u6B22\u8FCE\u6761\u7EAF\u6587\u672C\uFF08\u4E0E\u4E0B\u65B9\u6837\u5F0F\u5316 meta \u5185\u5BB9\u4E00\u81F4\uFF09 */\nconst metaPlain = `Scripts For Minecraft Server v${pkg.version}`;\n/** \u5F3A\u8C03\u9996\u5B57\u6BCD\u4E0B\u6807\uFF1AS / F / M / c */\nconst META_ACCENT_INDEX = new Set([0, 8, 12, 16]);\nconst metaUnlit = chalk.hex(T.subtle);\nconst meta = `${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}`;\nconst metaWidth = getDisplayWidth(metaPlain);\nconst lineLength = metaWidth + 5;\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE\u7EAF\u6587\u672C\uFF1BpaintLit \u51B3\u5B9A\u5DF2\u4EAE\u5B57\u7B26\u6837\u5F0F */\nfunction buildTextAtProgress(\n plain: string,\n litColumns: number,\n paintLit: (ch: string, index: number) => string\n): string {\n let cols = 0;\n let out = \"\";\n for (let i = 0; i < plain.length; i++) {\n const ch = plain[i]!;\n const w = charDisplayWidth(ch);\n if (cols + w <= litColumns) {\n out += paintLit(ch, i);\n } else {\n out += metaUnlit(ch);\n }\n cols += w;\n }\n return out;\n}\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE meta\uFF1A\u5DF2\u4EAE\u4FDD\u7559\u6700\u7EC8\u6837\u5F0F\uFF0C\u672A\u4EAE\u7528 subtle */\nfunction buildMetaAtProgress(litColumns: number): string {\n return buildTextAtProgress(metaPlain, litColumns, (ch, i) => (META_ACCENT_INDEX.has(i) ? c.text(ch) : c.dim(ch)));\n}\n\n/** \u5FEB\u6377\u952E\u63D0\u793A\u4E0E\u6A2A\u7EBF/meta \u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6 */\nfunction buildShortcutsAtProgress(litColumns: number): string {\n return buildTextAtProgress(SHORTCUT_HINT, litColumns, (ch) => c.dim(ch));\n}\n\n/** \u6309\u7B14\u987A\u8FDB\u5EA6\u6E32\u67D3 logo\uFF1B\u672A\u5199\u51FA\u7684\u58A8\u8FF9\u7528\u7A7A\u683C\u5360\u4F4D\uFF0C\u4FDD\u6301\u5E03\u5C40\u7A33\u5B9A */\nfunction buildLogoRows(strokeCount: number): [string, string, string] {\n const lit = new Set<string>();\n const n = Math.min(Math.max(0, strokeCount), LOGO_STROKES.length);\n for (let i = 0; i < n; i++) {\n const [r, col] = LOGO_STROKES[i]!;\n lit.add(`${r},${col}`);\n }\n return LOGO_ROWS.map((row, r) => {\n let out = \"\";\n for (let col = 0; col < row.length; col++) {\n const ch = row[col]!;\n if (ch === \" \") {\n out += \" \";\n } else if (lit.has(`${r},${col}`)) {\n out += c.text(ch);\n } else {\n out += \" \";\n }\n }\n return out;\n }) as [string, string, string];\n}\n\nfunction buildWelcomeLines(\n strokeCount: number,\n lineProgress: number,\n metaContent: string,\n shortcutContent: string\n): string[] {\n const [topLogo, midLogo, botLogo] = buildLogoRows(strokeCount);\n const line = \"\u2500\".repeat(Math.max(0, lineProgress));\n return [\n `\\n`,\n `${LOGO_PAD}${topLogo}${LOGO_TOP_GAP}${shortcutContent}`,\n `${LOGO_PAD}${midLogo}${LOGO_MID_GAP}${metaContent}`,\n `${LOGO_PAD}${botLogo}${line}`,\n ];\n}\n\n/** \u56DE\u5377\u91CD\u7ED8\uFF1A\u9996\u5E27\u76F4\u63A5\u5199\uFF0C\u4E4B\u540E\u5149\u6807\u4E0A\u79FB\u5E76\u9010\u884C ESC[2K \u6E05\u884C\u91CD\u5199 */\nfunction paintWelcomeLines(lines: string[], firstFrame: boolean): void {\n if (!firstFrame) {\n process.stdout.write(`\\x1b[${lines.length}A`);\n }\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\x1b[2K\\r${lines[i]}`);\n if (i < lines.length - 1) process.stdout.write(\"\\n\");\n }\n}\n\nexport async function playWelcomeAnimation(): Promise<void> {\n const strokeTotal = LOGO_STROKES.length;\n const totalSteps = strokeTotal + lineLength;\n const finalShortcuts = c.dim(SHORTCUT_HINT);\n\n // \u975E TTY\uFF1A\u76F4\u63A5\u8F93\u51FA\u6700\u7EC8\u5E27\uFF0C\u907F\u514D\u63A7\u5236\u5E8F\u5217\u6C61\u67D3\u7BA1\u9053\u8F93\u51FA\n if (!process.stdout.isTTY) {\n const lines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n process.stdout.write(`\\n${lines.join(\"\\n\")}\\n\\n`);\n return;\n }\n\n let step = 0;\n let firstFrame = true;\n\n process.stdout.write(\"\\x1b[?25l\");\n // \u5148\u7A7A\u4E00\u884C\uFF0C\u628A\u6B22\u8FCE\u5757\u4E0E\u4E0A\u65B9\u8F93\u51FA\u9694\u5F00\n process.stdout.write(\"\\n\");\n\n return new Promise((resolve) => {\n const done = (): void => {\n const finalLines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n paintWelcomeLines(finalLines, firstFrame);\n process.stdout.write(\"\\x1b[?25h\\n\\n\");\n resolve();\n };\n\n const tick = (): void => {\n const inLogo = step < strokeTotal;\n const strokeCount = Math.min(step + 1, strokeTotal);\n // \u53F3\u4FA7\u4E09\u884C\uFF08shortcut / meta / \u6A2A\u7EBF\uFF09\u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6\n const lineProgress = inLogo ? 0 : Math.min(step - strokeTotal + 1, lineLength);\n const metaContent = buildMetaAtProgress(Math.min(lineProgress, metaWidth));\n const shortcutContent = buildShortcutsAtProgress(lineProgress);\n const lines = buildWelcomeLines(strokeCount, lineProgress, metaContent, shortcutContent);\n paintWelcomeLines(lines, firstFrame);\n firstFrame = false;\n\n if (step >= totalSteps - 1) {\n done();\n return;\n }\n step += 1;\n // logo \u7B14\u987A\u7A0D\u6162\uFF1B\u63A5\u4E0A\u6A2A\u7EBF\u540E\u6062\u590D\u8F83\u5FEB\u8282\u594F\n setTimeout(tick, step < strokeTotal ? 22 : 5);\n };\n\n setTimeout(tick, 22);\n });\n}\n\n/* let welcome = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${meta}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\\n\n`; */\n\n/* welcome = `\\n\n \u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574 ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\n \u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 ${meta}\n \u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500${\"\u2500\".repeat(getDisplayWidth(meta) + 3)}\\n`; */\n\nexport function getHelp(mode: CommandMode = \"argv\"): string {\n return buildHelp(mode);\n}\n\nfunction getCommands(): string[] {\n return listVisibleTopLevelNames(REPL_MODE);\n}\n\n/* ==================================================================\n * Context-aware completion\n * ================================================================== */\ninterface ParsedLine {\n cmd: string;\n /** cmd \u4E4B\u540E\u7684\u5168\u90E8 token(\u4E0D\u542B\u6B63\u5728\u8F93\u5165\u7684 current,\u82E5\u672B\u5C3E\u65E0\u7A7A\u683C\u5219\u4E0D\u542B\u6700\u540E\u4E00\u4E2A\u534A\u8BCD) */\n words: string[];\n argIndex: number;\n current: string;\n}\n\n/**\n * \u89E3\u6790\u5F53\u524D\u8F93\u5165\u884C,\u63D0\u53D6\u547D\u4EE4\u540D\u3001\u53C2\u6570\u4F4D\u7F6E\u3001\u6B63\u5728\u8F93\u5165\u7684 word\u3002\n * \u672B\u5C3E\u7A7A\u683C\u89C6\u4E3A\"\u521A\u7ED3\u675F\u4E00\u4E2A word,\u51C6\u5907\u8F93\u5165\u4E0B\u4E00\u4E2A\"\u3002\n */\nfunction parseLine(line: string): ParsedLine {\n const endsWithSpace = line.length > 0 && /\\s$/.test(line);\n const trimmed = line.trim();\n if (!trimmed) return { cmd: \"\", words: [], argIndex: 0, current: \"\" };\n const tokens = trimmed.split(/\\s+/);\n if (endsWithSpace) {\n return {\n cmd: tokens[0] ?? \"\",\n words: tokens.slice(1),\n argIndex: tokens.length - 1,\n current: \"\",\n };\n }\n if (tokens.length === 1) return { cmd: \"\", words: [], argIndex: 0, current: tokens[0]! };\n return {\n cmd: tokens[0]!,\n words: tokens.slice(1, -1),\n argIndex: tokens.length - 2,\n current: tokens[tokens.length - 1]!,\n };\n}\n\n/**\n * \u6839\u636E\u547D\u4EE4 + \u53C2\u6570\u4F4D\u7F6E\u8FD4\u56DE\u8865\u5168\u5019\u9009 (\u533A\u5206\u547D\u4EE4,\u4E0D\u518D\u628A\u670D\u52A1\u540D\u5F53\u6210\u6240\u6709\u6307\u4EE4\u7684\u4E8C\u7EA7\u53C2\u6570)\u3002\n */\nfunction getCompletions(parsed: ParsedLine): string[] {\n const { words, argIndex, current } = parsed;\n const cmd = parsed.cmd.startsWith(\"/\") ? parsed.cmd.slice(1) : parsed.cmd;\n const sw = (s: string): boolean => s.startsWith(current);\n if (!cmd) {\n const cmds = getCommands().map((n) => (n.startsWith(\"/\") ? n : n));\n return [\"/\", ...cmds].filter(sw);\n }\n switch (cmd) {\n case \"logs\":\n case \"log\":\n return [];\n case \"start\":\n case \"stop\":\n case \"restart\":\n if (argIndex === 0) return [\"-all\", ...SERVICE_NAMES].filter(sw);\n return [];\n case \"send\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n return [];\n case \"update\":\n return [\"--check-only\", \"--force\", \"--channel=release\", \"--channel=preview\"].filter(sw);\n case \"packs\":\n case \"addon\":\n if (argIndex === 0) return [...listVisiblePacksSubs(REPL_MODE)].filter(sw);\n if (argIndex === 1 && [\"list\"].includes(words[0] ?? \"\")) {\n return [\"--kind\", \"--search\"].filter(sw);\n }\n return [];\n default: {\n if (!isModuleCommand(cmd)) return [];\n if (argIndex === 0) return [...getVisibleModuleSubcommands(REPL_MODE)].filter(sw);\n const verb = words[0] ?? \"\";\n if (argIndex === 1 && verb === \"search\") {\n return listRegistryModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && [\"info\", \"uninstall\", \"remove\", \"verify\", \"enable\", \"disable\"].includes(verb)) {\n return listInstalledModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && verb === \"reload\") {\n return [\"--build-only\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"install\") {\n return [\"--from\", \"--sha256\", \"--link\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"list\") {\n return [\"--from\", \"--sha256\"].filter(sw);\n }\n return [];\n }\n }\n}\n\n/* ==================================================================\n * Escape sequence consumer\n * ================================================================== */\nfunction consumeEscapeSeq(chunk: Buffer, i: number): number | null {\n if (chunk[i] !== 0x1b) return null;\n const rem = chunk.length - i - 1;\n if (rem >= 2 && chunk[i + 1] === 0x5b) {\n let j = i + 2;\n while (j < chunk.length && chunk[j]! >= 0x30 && chunk[j]! <= 0x3f) j++;\n while (j < chunk.length && chunk[j]! >= 0x20 && chunk[j]! <= 0x2f) j++;\n if (j < chunk.length && chunk[j]! >= 0x40 && chunk[j]! <= 0x7e) j++;\n return j;\n }\n if (rem >= 2 && chunk[i + 1] === 0x4f) return i + 3;\n if (rem >= 1) return i + 2;\n return i + 1;\n}\n\n/* ==================================================================\n * Line reader\n * ================================================================== */\nconst history: string[] = [];\nlet historyIdx = -1;\n\n/** \u5F53\u524D readLine \u7684\u91CD\u7ED8\u51FD\u6570 (\u7A97\u53E3 resize / \u65E5\u5FD7\u63A8\u9001\u65F6\u8C03\u7528) */\nlet currentRedraw: (() => void) | null = null;\n\ntype ReadLineOpts = {\n getPrompt: () => string;\n /** \u65E0\u6D3B\u8DC3\u670D\u52A1\u65F6\uFF0C\u666E\u901A\u5B57\u7B26\u81EA\u52A8\u524D\u7F6E /\uFF1B\u53EF\u4E3A getter \u4EE5\u4FBF\u670D\u52A1\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: boolean | (() => boolean);\n /** Tab\uFF1A\u5728\u975E / \u884C\u4E0A\u5207\u6362\u53D1\u9001\u76EE\u6807\uFF1B\u8FD4\u56DE true \u8868\u793A\u5DF2\u5904\u7406 */\n cycleSendTarget: () => boolean;\n /** \u5F53\u524D\u7A97\u53E3 chrome\uFF08\u65E0\u8F93\u5165\u7A97\u753B shortcut \u6761\uFF09 */\n getChrome?: () => WindowChrome;\n /** \u4EA4\u7ED9\u6D3B\u52A8\u7A97\u7684\u6309\u952E\uFF08Esc / L / S \u7B49\uFF09 */\n onWindowKey?: (ev: WindowKeyEvent) => WindowKeyResult;\n initial?: string;\n};\n\ntype ReadLineResult =\n | { kind: \"line\"; value: string }\n | { kind: \"cancel\" }\n | { kind: \"open-logs\"; pending: string }\n | { kind: \"run\"; parts: string[] };\n\nasync function readLine(opts: ReadLineOpts): Promise<ReadLineResult> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n\n let line = opts.initial ?? \"\";\n let cursor = line.length;\n let suggestion = \"\";\n /** \u5404\u7EA7\u5217\u9009\u4E2D / \u6EDA\u52A8\uFF08\u4EC5\u6700\u53F3\u5217\u53EF\u5BFC\u822A\uFF09 */\n let palSels: number[] = [0];\n let palScrolls: number[] = [0];\n let overlayRows = 0;\n\n function prompt(): string {\n return opts.getPrompt();\n }\n\n function showsInput(): boolean {\n return opts.getChrome?.().showsInput !== false;\n }\n\n function slashMode(): boolean {\n return showsInput() && line.startsWith(\"/\");\n }\n\n function paletteView() {\n return resolvePaletteView(line, palSels, palScrolls);\n }\n\n function syncPaletteState(view: ReturnType<typeof resolvePaletteView>): void {\n for (let i = 0; i < view.columns.length; i++) {\n palSels[i] = view.columns[i]!.selected;\n palScrolls[i] = view.columns[i]!.scroll;\n }\n }\n\n function resetPalette(): void {\n palSels = [0];\n palScrolls = [0];\n }\n\n function clearOverlay(): void {\n stdout.write(\"\\r\\x1B[J\");\n overlayRows = 0;\n }\n\n function applyWindowKey(ev: WindowKeyEvent): boolean {\n if (!opts.onWindowKey) return false;\n const r = opts.onWindowKey(ev);\n if (r.action === \"none\") return false;\n if (r.action === \"redraw\") redraw();\n return true;\n }\n\n function redraw(): void {\n const chrome = opts.getChrome?.();\n if (chrome && !chrome.showsInput) {\n clearOverlay();\n const foot = chrome.footerShortcuts || \"\";\n stdout.write(foot);\n stdout.write(\"\\r\");\n return;\n }\n\n const p = prompt();\n suggestion = \"\";\n\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (cursor === line.length) {\n suggestion = paletteGhost(view);\n }\n } else {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n const first = candidates[0];\n if (\n cursor === line.length &&\n parsed.current &&\n first &&\n first !== parsed.current &&\n first.startsWith(parsed.current)\n ) {\n suggestion = first.slice(parsed.current.length);\n }\n }\n\n clearOverlay();\n stdout.write(p + line);\n if (suggestion) stdout.write(c.dim(suggestion));\n\n if (slashMode()) {\n const view = paletteView();\n const indent = promptSlashColumn(p);\n const list = formatPaletteCascadeLines(view, indent);\n if (list.length > 0) {\n stdout.write(\"\\n\" + list.join(\"\\n\"));\n overlayRows = list.length;\n stdout.write(`\\x1B[${overlayRows}A`);\n }\n }\n\n const col = promptSlashColumn(p) + cursor + 1;\n stdout.write(`\\r\\x1B[${col}G`);\n }\n\n redraw();\n currentRedraw = redraw;\n\n return new Promise<ReadLineResult>((resolve) => {\n const done = (value: ReadLineResult): void => {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n currentRedraw = null;\n resolve(value);\n };\n\n const finishLine = (value: string): void => {\n clearOverlay();\n stdout.write(prompt() + value + \"\\r\\n\");\n if (value.length > 0) {\n history.push(value);\n if (history.length > 100) history.shift();\n }\n historyIdx = history.length;\n done({ kind: \"line\", value });\n };\n\n /** \u2191\u2193/Tab\uFF1A\u4EC5\u5728\u6700\u53F3\u5217\u8F6E\u6362\u9009\u4E2D\uFF0C\u5199\u5165\u7070\u5B57\uFF0C\u4E0D\u6539\u8F93\u5165\u6846 */\n const movePalSel = (delta: number): boolean => {\n const view = paletteView();\n if (view.hidden) return false;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return false;\n const len = col.items.length;\n const cur = clampPaletteSelection(col.selected, len);\n const next = (((cur + delta) % len) + len) % len;\n palSels[view.active] = next;\n redraw();\n return true;\n };\n\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const len = next - i;\n /* \u5355\u72EC Esc \u2192 \u4EA4\u7ED9\u7A97\u53E3\uFF08/logs \u8FD4\u56DE\uFF09 */\n if (len === 1) {\n if (applyWindowKey({ type: \"escape\" })) {\n i = next;\n continue;\n }\n i = next;\n continue;\n }\n if (!showsInput()) {\n i = next;\n continue;\n }\n if (len === 3 && chunk[i + 1] === 0x5b) {\n const fin = chunk[i + 2];\n if (fin === 0x41) {\n /* \u2191 */\n if (slashMode() && movePalSel(-1)) {\n i = next;\n continue;\n }\n if (historyIdx > 0) {\n historyIdx--;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x42) {\n /* \u2193 */\n if (slashMode() && movePalSel(1)) {\n i = next;\n continue;\n }\n if (historyIdx < history.length - 1) {\n historyIdx++;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n } else if (historyIdx === history.length - 1) {\n historyIdx = history.length;\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x43) {\n /* \u2192\uFF1A\u63A5\u53D7\u7070\u5B57\u6216\u79FB\u5149\u6807\uFF08\u4E0D\u5207\u6362\u9762\u677F\u7126\u70B9\uFF09 */\n if (cursor < line.length) {\n cursor++;\n redraw();\n } else if (suggestion) {\n line += suggestion;\n cursor = line.length;\n redraw();\n }\n } else if (fin === 0x44) {\n if (cursor > 0) {\n cursor--;\n redraw();\n }\n } else if (fin === 0x48) {\n cursor = 0;\n redraw();\n } else if (fin === 0x46) {\n cursor = line.length;\n redraw();\n }\n }\n i = next;\n } else i++;\n continue;\n }\n\n const byte = chunk[i]!;\n i++;\n\n if (byte === 0x0d || byte === 0x0a) {\n if (!showsInput()) continue;\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (!view.hidden && view.columns.some((col) => col.items.length > 0) && activeNode(view)) {\n const acc = commitSelection(line, view);\n if (acc.submit) {\n finishLine(acc.line);\n return;\n }\n line = acc.line;\n cursor = line.length;\n /* \u65B0\u5C42\u9009\u4E2D\u5F52\u96F6 */\n const depth = Math.max(0, acc.line.trimEnd().split(/\\s+/).length - 1);\n while (palSels.length <= depth + 1) palSels.push(0);\n while (palScrolls.length <= depth + 1) palScrolls.push(0);\n palSels[depth + 1] = 0;\n palScrolls[depth + 1] = 0;\n redraw();\n continue;\n }\n }\n finishLine(line);\n return;\n }\n\n if (byte === 0x03) {\n if (!showsInput()) {\n /* \u65E0\u8F93\u5165\u7A97\uFF1ACtrl+C \u8FD4\u56DE\u4E0A\u4E00\u7A97\uFF0C\u518D\u6309\u624D\u9000\u51FA */\n if (applyWindowKey({ type: \"escape\" })) continue;\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n if (line.length > 0) {\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n continue;\n }\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n\n /* Ctrl+P \u2014 \u786E\u4FDD\u4EE5 / \u5F00\u5934 */\n if (byte === 0x10) {\n if (!showsInput()) continue;\n if (!line.startsWith(\"/\")) {\n line = \"/\" + line;\n cursor = Math.min(cursor + 1, line.length);\n }\n resetPalette();\n redraw();\n continue;\n }\n\n if (byte === 0x09) {\n /* Tab\uFF1A/ \u6A21\u5F0F = \u5217\u8868\u8F6E\u6362\uFF1B\u5426\u5219\u5207\u6362\u670D\u52A1\u7A97 */\n if (slashMode()) {\n movePalSel(1);\n continue;\n }\n if (opts.cycleSendTarget()) {\n redraw();\n continue;\n }\n continue;\n }\n\n if (byte === 0x0c) {\n /* Ctrl+L \u2192 \u6253\u5F00 /logs \u7B5B\u9009\u7A97 */\n clearOverlay();\n done({ kind: \"open-logs\", pending: showsInput() ? line : \"\" });\n return;\n }\n\n if (byte === 0x7f || byte === 0x08) {\n if (!showsInput()) continue;\n if (cursor > 0) {\n line = line.slice(0, cursor - 1) + line.slice(cursor);\n cursor--;\n }\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n\n if (byte >= 0x20 && byte <= 0x7e) {\n const ch = String.fromCharCode(byte);\n if (!showsInput()) {\n applyWindowKey({ type: \"char\", ch });\n continue;\n }\n let insert = ch;\n const autoSlash =\n typeof opts.autoSlash === \"function\" ? opts.autoSlash() : opts.autoSlash;\n if (autoSlash && line.length === 0 && insert !== \"/\") {\n insert = \"/\" + insert;\n }\n line = line.slice(0, cursor) + insert + line.slice(cursor);\n cursor += insert.length;\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n }\n };\n stdin.on(\"data\", handler);\n });\n}\n\n/** \u6765\u6E90\u9009\u62E9\u9879:\u65B9\u62EC\u53F7 3 \u5B57\u7B26\u6807\u7B7E\u67D3\u8272\uFF08\u4F9B\u5916\u90E8/\u6D4B\u8BD5\u590D\u7528\uFF09 */\nexport const SOURCE_ITEMS: Array<{ label: string; value: string }> = SOURCE_META.map((m) => ({\n label: m.paint(`[${m.name}]`),\n value: m.value,\n}));\n\n/** REPL \u4EA4\u4E92\u6001\uFF1A\u65E0\u53C2 /logs \u6253\u5F00\u7B5B\u9009\u7A97\uFF08\u7531 startRepl \u6CE8\u5165\uFF09 */\nlet openLogsWindowHook: (() => void) | null = null;\n\nfunction writeLogLineToTty(wrapped: string): void {\n pauseAllProgress();\n try {\n stdout.write(`\\r\\x1B[K${wrapped}\\n`);\n } finally {\n resumeAllProgress();\n }\n currentRedraw?.();\n}\n\n/* ==================================================================\n * START REPL\n * ================================================================== */\n\nexport async function startRepl(): Promise<void> {\n let stopping = false;\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.forceStop\") + \"\\n\"));\n forceStopAll();\n process.exit(130);\n };\n const shutdown = async (): Promise<void> => {\n if (stopping) return;\n stopping = true;\n process.off(\"SIGINT\", onSigint);\n openLogsWindowHook = null;\n stdout.write(c.dim(t(\"repl.stopping\") + \"\\n\"));\n await stopAll();\n try {\n setRaw(false);\n stdin.pause();\n } catch {\n /* ignore */\n }\n stdout.write(c.dim(t(\"repl.bye\") + \"\\n\"));\n process.exit(0);\n };\n process.on(\"SIGINT\", onSigint);\n\n if (!stdin.isTTY) {\n console.log(c.dim(t(\"repl.nonInteractive\")));\n for await (const line of (await import(\"node:readline/promises\")).createInterface({\n input: stdin,\n output: stdout,\n terminal: false,\n })) {\n const t = line.trim();\n if (!t) continue;\n const p = t.split(/\\s+/);\n if ([\"quit\", \"exit\", \"q\"].includes(p[0]!)) break;\n if (p[0] === \"init\") {\n (await import(\"./wizard.js\")).runWizard();\n continue;\n }\n await execCmd(p);\n }\n await shutdown();\n return;\n }\n console.clear();\n await playWelcomeAnimation();\n\n let logsFilterState: LogsFilterState = { levels: [], sources: [] };\n let preferredTarget: ServiceName | null = null;\n let activeTargets: ServiceName[] = [];\n let pendingInput = \"\";\n\n const host = new WindowHost({\n writeLog: writeLogLineToTty,\n onChromeChange: () => currentRedraw?.(),\n });\n\n function clearTerminal(): void {\n /* \u6E05\u89C6\u53E3\uFF1B\u518D\u6E05 scrollback\uFF0C\u907F\u514D\u5F80\u4E0A\u6ED1\u4ECD\u770B\u5230\u4E0A\u4E00\u7A97\u5185\u5BB9 */\n console.clear();\n stdout.write(\"\\x1B[3J\");\n }\n\n /** \u9996\u6B21\u8FDB\u5165\u7A97\u53E3\uFF1A\u4ECE\u5185\u5B58/\u843D\u76D8\u62C9\u4E00\u6B21\u4F5C\u4E3A\u79CD\u5B50\u7F13\u5B58 */\n function seedWindowBuffer(w: {\n id: string;\n acceptLog: (l: UnifiedLog) => boolean;\n formatLogLine: (l: UnifiedLog) => { text: string; indent: number };\n getReplayFilter?: () => { levels: string[]; sources: string[] };\n }): string[] {\n const lines: string[] = [];\n if (w.id === \"logs\") {\n const f = w.getReplayFilter?.() ?? { levels: [], sources: [] };\n const disk = readDiskLogs({\n levels: f.levels as LogLevel[],\n sources: f.sources,\n });\n for (const log of disk) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n } else {\n for (const log of getAllLogs()) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n }\n host.setBuffer(w.id, lines);\n return lines;\n }\n\n /**\n * \u5C55\u793A\u6D3B\u52A8\u7A97\uFF1A\u5148\u6E05\u5C4F\uFF0C\u518D\u6062\u590D/seed\u3002\n * - /logs\uFF1A\u7528\u843D\u76D8\u79CD\u5B50\u7F13\u5B58\uFF08\u6539\u7B5B\u9009\u624D reseed\uFF09\uFF0C\u907F\u514D\u91CD\u590D\u8BFB\u6587\u4EF6\n * - \u670D\u52A1\u4E3B\u9762\u677F\uFF1A\u6BCF\u6B21\u4ECE\u5185\u5B58\u91CD seed\uFF0C\u4FDD\u8BC1\u79BB\u5F00 /logs \u6216 Tab \u56DE\u6765\u65F6\u5185\u5BB9\u5B9E\u65F6\n */\n function showActiveWindow(opts?: { reseed?: boolean }): void {\n clearTerminal();\n const w = host.getActive();\n if (!w) {\n currentRedraw?.();\n return;\n }\n let lines: readonly string[];\n if (w.id === \"logs\") {\n if (opts?.reseed) host.invalidateBuffer(w.id);\n lines = host.hasBuffer(w.id) ? host.getBuffer(w.id) : seedWindowBuffer(w);\n } else {\n /* \u4E3B\u9762\u677F\u5B9E\u65F6\uFF1A\u4E0D\u4F5C\u5E9F\u4E5F\u65E0\u59A8\uFF0C\u76F4\u63A5\u91CD\u62C9\u5185\u5B58\u7F13\u51B2 */\n host.invalidateBuffer(w.id);\n lines = seedWindowBuffer(w);\n }\n for (const l of lines) stdout.write(l + \"\\n\");\n currentRedraw?.();\n }\n\n host.register(\n createLogsFilterWindow({\n getState: () => logsFilterState,\n setState: (next) => {\n logsFilterState = next;\n },\n /* \u7B5B\u9009\u53D8\u66F4\uFF1A\u4F5C\u5E9F /logs \u7F13\u5B58\u5E76\u91CD\u65B0\u8BFB\u76D8\u4E00\u6B21 */\n onFilterChanged: () => showActiveWindow({ reseed: true }),\n })\n );\n\n function syncServiceWindows(targets: ServiceName[]): void {\n for (const name of targets) {\n const id = serviceWindowId(name);\n if (!host.has(id)) host.register(createServiceWindow(name));\n }\n host.setServiceOrder(targets.map(serviceWindowId));\n const svc = host.getActive()?.serviceName;\n if (svc) preferredTarget = svc;\n }\n\n function openLogsWindow(): void {\n /* \u79BB\u5F00\u4E3B\u9762\u677F\uFF1A\u5176\u7F13\u5B58\u53EF\u7559\u7740\uFF0C\u4F46\u5C55\u793A\u4E0A\u5148\u6E05\u5C4F\u518D\u8FDB /logs\uFF1BEsc \u56DE\u6765\u4F1A\u6309\u5B9E\u65F6\u91CD seed \u4E3B\u9762\u677F */\n host.open(\"logs\");\n showActiveWindow();\n }\n\n openLogsWindowHook = openLogsWindow;\n\n const unsub = onLog((log) => {\n if (host.getActive()) {\n host.routeLog(log);\n return;\n }\n /* \u65E0\u6D3B\u52A8\u7A97\uFF1A\u5168\u91CF\u5C55\u793A\uFF08\u5E26\u6E90\u6807\u7B7E\uFF09\uFF0C\u4E0E\u65E7\u7A7A\u95F2\u884C\u4E3A\u4E00\u81F4 */\n writeLogLineToTty(wrapLogLine(formatLog(log), logPrefixWidth(log)));\n });\n\n async function refreshTargetsFromRuntime(): Promise<void> {\n const prevId = host.getActiveId();\n activeTargets = await listActiveSendTargets();\n syncServiceWindows(activeTargets);\n if (preferredTarget && !activeTargets.includes(preferredTarget)) {\n preferredTarget = activeTargets[0] ?? null;\n }\n const nextId = host.getActiveId();\n /* \u65B0\u6FC0\u6D3B\u7A97\u6216\u9996\u6B21\u5C1A\u65E0\u7F13\u5B58\uFF1A\u6E05\u5C4F\u5E76 seed/\u6062\u590D */\n if (nextId && (nextId !== prevId || !host.hasBuffer(nextId))) {\n showActiveWindow();\n } else if (!nextId && prevId) {\n clearTerminal();\n currentRedraw?.();\n } else {\n currentRedraw?.();\n }\n }\n\n const unsubState = onServiceStateChange(() => {\n void refreshTargetsFromRuntime();\n });\n\n function onResize(): void {\n if (!currentRedraw) return;\n const id = host.getActiveId();\n if (id) host.invalidateBuffer(id);\n showActiveWindow();\n }\n\n process.stdout.on(\"resize\", onResize);\n\n function currentTarget(): ServiceName | null {\n if (activeTargets.length === 0) return null;\n const fromWin = host.getActive()?.serviceName;\n if (fromWin && activeTargets.includes(fromWin)) {\n preferredTarget = fromWin;\n return fromWin;\n }\n if (preferredTarget && activeTargets.includes(preferredTarget)) return preferredTarget;\n preferredTarget = activeTargets[0]!;\n return preferredTarget;\n }\n\n function buildPrompt(): string {\n const tgt = currentTarget();\n return tgt ? paintSendPrompt(tgt) : plainPrompt();\n }\n\n while (true) {\n await refreshTargetsFromRuntime();\n const result = await readLine({\n getPrompt: buildPrompt,\n /* \u65E0\u670D\u52A1\u65F6\u9ED8\u8BA4\u52A0 /\uFF08\u4E0E\u7A97\u53E3\u7CFB\u7EDF\u524D\u884C\u4E3A\u4E00\u81F4\uFF09\uFF1B\u7528 getter \u4EE5\u4FBF\u8FDB\u7A0B\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: () => activeTargets.length === 0,\n getChrome: () => host.getChrome(),\n onWindowKey: (ev) => {\n const r = host.onKey(ev);\n if (r.action === \"redraw\") showActiveWindow();\n return r;\n },\n cycleSendTarget: () => {\n const name = host.cycleServiceWindows();\n if (!name) return false;\n preferredTarget = name;\n showActiveWindow();\n return true;\n },\n initial: pendingInput,\n });\n pendingInput = \"\";\n\n if (result.kind === \"cancel\") break;\n\n if (result.kind === \"open-logs\") {\n pendingInput = result.pending;\n openLogsWindow();\n continue;\n }\n\n if (result.kind === \"run\") {\n try {\n await execCmd(result.parts);\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n continue;\n }\n\n const trimmed = result.value.trim();\n if (!trimmed) continue;\n\n try {\n if (trimmed.startsWith(\"/\")) {\n await execCmd(trimmed.split(/\\s+/));\n } else {\n const tgt = currentTarget();\n if (!tgt) {\n await execCmd((\"/\" + trimmed).split(/\\s+/));\n } else {\n const sent = await cmdSend(tgt, trimmed);\n if (sent) stdout.write(sent + \"\\n\");\n }\n }\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n }\n\n process.stdout.off(\"resize\", onResize);\n unsubState();\n unsub();\n await shutdown();\n}\n\nasync function execCmd(parts: string[]): Promise<void> {\n const normalized = parts.map((p, i) => (i === 0 && p.startsWith(\"/\") ? p.slice(1) : p));\n const [cmd, ...args] = normalized;\n\n if (cmd && ![\"help\", \"h\", \"?\", \"version\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, REPL_MODE);\n if (topGate) {\n stdout.write(topGate + \"\\n\");\n return;\n }\n }\n\n switch (cmd) {\n case \"help\":\n case \"h\":\n case \"?\":\n stdout.write(getHelp(REPL_MODE));\n break;\n case \"version\":\n await playWelcomeAnimation();\n break;\n case \"status\":\n stdout.write((await cmdStatus()) + \"\\n\");\n break;\n case \"logs\":\n case \"log\": {\n /* \u65E0\u53C2\u53F6\u547D\u4EE4\uFF1A\u6253\u5F00\u7B5B\u9009\u7A97 */\n if (openLogsWindowHook) {\n openLogsWindowHook();\n break;\n }\n stdout.write(c.yellow(t(\"repl.logsReplOnly\") + \"\\n\"));\n break;\n }\n case \"start\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStartAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.start.usageShort\") + \"\\n\"));\n break;\n case \"stop\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStopAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStop(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.stop.usageShort\") + \"\\n\"));\n break;\n case \"restart\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") {\n await cmdStopAll();\n stdout.write((await cmdStartAll()) + \"\\n\");\n } else if (args[0]) stdout.write((await cmdRestart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.restart.usageShort\") + \"\\n\"));\n break;\n case \"send\": {\n const svc = args[0] ?? \"\";\n const msg = args.slice(1).join(\" \");\n {\n const sent = await cmdSend(svc, msg);\n if (sent) stdout.write(sent + \"\\n\");\n }\n break;\n }\n case \"update\":\n stdout.write((await cmdUpdate(args)) + \"\\n\");\n break;\n case \"locale\":\n case \"lang\":\n stdout.write(cmdLocale(args) + \"\\n\");\n break;\n case \"debug\":\n stdout.write((await cmdDebug(args)) + \"\\n\");\n break;\n case \"init\": {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(false);\n try {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n } finally {\n setRaw(wasRaw);\n }\n break;\n }\n case \"quit\":\n case \"exit\":\n case \"q\":\n throw \"QUIT\";\n default: {\n const modShort = resolveModuleTopShorthand(cmd);\n if (modShort) {\n const g = gateModuleSub(modShort, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchModuleCommand(modShort, args)) + \"\\n\");\n break;\n }\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gateModuleSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchModuleCommand(sub, subRest)) + \"\\n\");\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gatePacksSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchPacksCommand(sub, subRest)) + \"\\n\");\n break;\n }\n stdout.write(c.yellow(t(\"common.unknownShort\", { cmd: cmd ?? \"\" }) + \"\\n\"));\n }\n }\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": ["t"]
7
7
  }
package/dist/runtime.d.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import { type SpawnOptions, type SpawnSyncOptions } from "node:child_process";
2
2
  /**
3
- * 是否为 monorepo 布局(仓根同时有 db-server/sfmc/)。
3
+ * 是否为 monorepo 布局(仓根同时有 packages/db-server 与 packages/cli)。
4
4
  * npm 全局/本地安装时 ROOT 通常是 cwd,不满足此条件。
5
5
  */
6
6
  export declare function isMonorepoLayout(root: string): boolean;
7
7
  /**
8
8
  * 项目根目录。优先级:`process.env.SFMC_ROOT` > fallback。
9
- * - monorepo:`sfmc/` 上一级
9
+ * - monorepo: walk-up 到 sfmc-monorepo
10
10
  * - npm 聚合包 / 全局安装:cwd(配置与数据落在当前目录)
11
11
  */
12
12
  export declare const ROOT: string;
13
+ /** 每次调用重新解析(尊重运行中变更的 `SFMC_ROOT`;单测/子进程友好)。 */
14
+ export declare function getRoot(): string;
13
15
  /**
14
16
  * 是否已完成首次向导初始化。
15
17
  * 以 `configs/runtime.json#initialized_at` 为准(wizard 写入);
@@ -24,24 +26,15 @@ export type ServiceId = "db" | "qq" | "update" | "manager" | "pack-manager";
24
26
  */
25
27
  export declare function resolveServiceScript(service: ServiceId): string;
26
28
  /**
27
- * 解析 tools/fetch-module.mjs。
28
- * 优先级: SFMC_FETCH_MODULE > ROOT/tools/ > @sfmc-bds/tools
29
+ * 解析 fetch-module(@sfmc-bds/cli/scripts/module-install)。
30
+ * 优先级: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export
29
31
  */
30
32
  export declare function resolveFetchModule(): string | null;
31
- /**
32
- * 解析 tools/new-module.mjs。
33
- * 优先级: SFMC_NEW_MODULE > ROOT/tools/ > @sfmc-bds/tools。
34
- */
35
- export declare function resolveNewModule(): string | null;
36
33
  /**
37
34
  * 解析 `@sfmc-bds/sdk` 包根目录(含 package.json)。
38
35
  * 优先级: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > 公开 export 向上找 > monorepo。
39
36
  */
40
37
  export declare function resolveSdkPackageRoot(): string;
41
- /** @deprecated 已移除 configs-default 播种;保留空实现以免外部旧调用炸掉 */
42
- export declare function resolveDefaultsDir(): string | null;
43
- /** @deprecated 配置改由各服务 ensure + SDK DEFAULT 生成 */
44
- export declare function seedMissingConfigsFromDefaults(_rootDir?: string): string[];
45
38
  /**
46
39
  * 启动一个子服务。
47
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAQlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAQhD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAgE9C;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED,kDAAkD;AAClD,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,MAAa,GAAG,MAAM,EAAE,CAEhF;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,YAAiB,6CAI5F;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,gBAAqB,2EAIpG"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAWlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,YAAiB,6CAI5F;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,gBAAqB,2EAIpG"}
package/dist/runtime.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  configPath,
3
+ findMonorepoRoot,
3
4
  readJson,
4
5
  resolveRuntimeRoot
5
6
  } from "@sfmc-bds/sdk/node/config";
@@ -13,25 +14,28 @@ const __filename = fileURLToPath(import.meta.url);
13
14
  const __dirname = dirname(__filename);
14
15
  const requireFromCli = createRequire(import.meta.url);
15
16
  function isMonorepoLayout(root) {
16
- return fs.existsSync(path.join(root, "db-server", "package.json")) && fs.existsSync(path.join(root, "sfmc", "package.json"));
17
+ return fs.existsSync(path.join(root, "packages", "db-server", "package.json")) && fs.existsSync(path.join(root, "packages", "cli", "package.json"));
17
18
  }
18
19
  function detectFallbackRoot() {
19
- const monoCandidate = path.resolve(__dirname, "..", "..");
20
- if (isMonorepoLayout(monoCandidate)) return monoCandidate;
20
+ const found = findMonorepoRoot(__dirname);
21
+ if (found && isMonorepoLayout(found)) return found;
21
22
  return process.cwd();
22
23
  }
23
24
  const ROOT = resolveRuntimeRoot(detectFallbackRoot());
25
+ function getRoot() {
26
+ return resolveRuntimeRoot(detectFallbackRoot());
27
+ }
24
28
  function isRuntimeInitialized(root = ROOT) {
25
29
  const runtime = readJson(configPath(root, "runtime.json"));
26
30
  return Boolean(runtime?.initialized_at);
27
31
  }
28
32
  const PACKAGES_DIR = path.join(ROOT, "modules", "packages");
29
33
  const SERVICE_SCRIPT = {
30
- db: "db-server/dist/index.js",
31
- qq: "qq-bridge/dist/index.js",
32
- update: "bds-tools/dist/check-update.js",
33
- manager: "bds-tools/dist/bds-manager.js",
34
- "pack-manager": "bds-tools/dist/cli-pack-manager.js"
34
+ db: "packages/db-server/dist/index.js",
35
+ qq: "packages/qq-bridge/dist/index.js",
36
+ update: "packages/bds-tools/dist/check-update.js",
37
+ manager: "packages/bds-tools/dist/bds-manager.js",
38
+ "pack-manager": "packages/bds-tools/dist/cli-pack-manager.js"
35
39
  };
36
40
  const SERVICE_ENV = {
37
41
  db: "SFMC_SERVICE_DB_ENTRY",
@@ -87,16 +91,12 @@ function resolveServiceScript(service) {
87
91
  function resolveFetchModule() {
88
92
  const fromEnv = process.env.SFMC_FETCH_MODULE;
89
93
  if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;
90
- const mono = path.join(ROOT, "tools", "fetch-module.mjs");
94
+ const mono = path.join(ROOT, "packages", "cli", "scripts", "module-install", "fetch-module.mjs");
91
95
  if (fs.existsSync(mono)) return mono;
92
- return tryResolveNpm("@sfmc-bds/tools", { rel: "fetch-module.mjs", exportPath: "@sfmc-bds/tools/fetch-module.mjs" });
93
- }
94
- function resolveNewModule() {
95
- const fromEnv = process.env.SFMC_NEW_MODULE;
96
- if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;
97
- const mono = path.join(ROOT, "tools", "new-module.mjs");
98
- if (fs.existsSync(mono)) return mono;
99
- return tryResolveNpm("@sfmc-bds/tools", { rel: "new-module.mjs", exportPath: "@sfmc-bds/tools/new-module.mjs" });
96
+ return tryResolveNpm("@sfmc-bds/cli", {
97
+ rel: "scripts/module-install/fetch-module.mjs",
98
+ exportPath: "@sfmc-bds/cli/fetch-module.mjs"
99
+ });
100
100
  }
101
101
  function resolveSdkPackageRoot() {
102
102
  const fromEnv = process.env.SFMC_SDK_ROOT;
@@ -146,18 +146,15 @@ function resolveSdkPackageRoot() {
146
146
  }
147
147
  const mono = path.join(ROOT, "modules", "sdk", "@sfmc-sdk");
148
148
  if (fs.existsSync(path.join(mono, "package.json"))) return mono;
149
- const fromCli = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "modules", "sdk", "@sfmc-sdk");
150
- if (fs.existsSync(path.join(fromCli, "package.json"))) return fromCli;
149
+ const monoFromCli = findMonorepoRoot(__dirname);
150
+ if (monoFromCli) {
151
+ const fromCli = path.join(monoFromCli, "modules", "sdk", "@sfmc-sdk");
152
+ if (fs.existsSync(path.join(fromCli, "package.json"))) return fromCli;
153
+ }
151
154
  throw new Error(
152
155
  `Cannot resolve @sfmc-bds/sdk for behavior-pack build. Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`
153
156
  );
154
157
  }
155
- function resolveDefaultsDir() {
156
- return null;
157
- }
158
- function seedMissingConfigsFromDefaults(_rootDir = ROOT) {
159
- return [];
160
- }
161
158
  function nodeBinary() {
162
159
  return process.execPath;
163
160
  }
@@ -183,14 +180,12 @@ function spawnServiceSync(service, args = [], opts = {}) {
183
180
  export {
184
181
  PACKAGES_DIR,
185
182
  ROOT,
183
+ getRoot,
186
184
  isMonorepoLayout,
187
185
  isRuntimeInitialized,
188
- resolveDefaultsDir,
189
186
  resolveFetchModule,
190
- resolveNewModule,
191
187
  resolveSdkPackageRoot,
192
188
  resolveServiceScript,
193
- seedMissingConfigsFromDefaults,
194
189
  spawnService,
195
190
  spawnServiceSync
196
191
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/runtime.ts"],
4
- "sourcesContent": ["import {\n configPath,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40(\u4ED3\u6839\u540C\u65F6\u6709 db-server/ \u4E0E sfmc/)\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"sfmc\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const monoCandidate = path.resolve(__dirname, \"..\", \"..\");\n if (isMonorepoLayout(monoCandidate)) return monoCandidate;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo:`sfmc/` \u4E0A\u4E00\u7EA7\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"db-server/dist/index.js\",\n qq: \"qq-bridge/dist/index.js\",\n update: \"bds-tools/dist/check-update.js\",\n manager: \"bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 tools/fetch-module.mjs\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > ROOT/tools/ > @sfmc-bds/tools\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"tools\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n return tryResolveNpm(\"@sfmc-bds/tools\", { rel: \"fetch-module.mjs\", exportPath: \"@sfmc-bds/tools/fetch-module.mjs\" });\n}\n\n/**\n * \u89E3\u6790 tools/new-module.mjs\u3002\n * \u4F18\u5148\u7EA7: SFMC_NEW_MODULE > ROOT/tools/ > @sfmc-bds/tools\u3002\n */\nexport function resolveNewModule(): string | null {\n const fromEnv = process.env.SFMC_NEW_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"tools\", \"new-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n return tryResolveNpm(\"@sfmc-bds/tools\", { rel: \"new-module.mjs\", exportPath: \"@sfmc-bds/tools/new-module.mjs\" });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u8BD5 monorepo \u76F8\u5BF9 CLI \u7684\u8DEF\u5F84\n const fromCli = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\n/** @deprecated \u5DF2\u79FB\u9664 configs-default \u64AD\u79CD\uFF1B\u4FDD\u7559\u7A7A\u5B9E\u73B0\u4EE5\u514D\u5916\u90E8\u65E7\u8C03\u7528\u70B8\u6389 */\nexport function resolveDefaultsDir(): string | null {\n return null;\n}\n\n/** @deprecated \u914D\u7F6E\u6539\u7531\u5404\u670D\u52A1 ensure + SDK DEFAULT \u751F\u6210 */\nexport function seedMissingConfigsFromDefaults(_rootDir: string = ROOT): string[] {\n return [];\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n configPath,\n findMonorepoRoot,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40\uFF08\u4ED3\u6839\u540C\u65F6\u6709 packages/db-server \u4E0E packages/cli\uFF09\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"packages\", \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"packages\", \"cli\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const found = findMonorepoRoot(__dirname);\n if (found && isMonorepoLayout(found)) return found;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo: walk-up \u5230 sfmc-monorepo\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/** \u6BCF\u6B21\u8C03\u7528\u91CD\u65B0\u89E3\u6790\uFF08\u5C0A\u91CD\u8FD0\u884C\u4E2D\u53D8\u66F4\u7684 `SFMC_ROOT`\uFF1B\u5355\u6D4B/\u5B50\u8FDB\u7A0B\u53CB\u597D\uFF09\u3002 */\nexport function getRoot(): string {\n return resolveRuntimeRoot(detectFallbackRoot());\n}\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"packages/db-server/dist/index.js\",\n qq: \"packages/qq-bridge/dist/index.js\",\n update: \"packages/bds-tools/dist/check-update.js\",\n manager: \"packages/bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"packages/bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 fetch-module\uFF08@sfmc-bds/cli/scripts/module-install\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n return tryResolveNpm(\"@sfmc-bds/cli\", {\n rel: \"scripts/module-install/fetch-module.mjs\",\n exportPath: \"@sfmc-bds/cli/fetch-module.mjs\",\n });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const fromCli = path.join(monoFromCli, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n }\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,11 @@
1
+ import { type ServiceName } from "./services.js";
2
+ /** 可发送目标顺序 */
3
+ export declare const SEND_TARGET_ORDER: readonly ServiceName[];
4
+ export declare function sendTargetShort(name: ServiceName): string;
5
+ /** ` BDS ❯ ` 整块底色高亮;块后再加空格,避免与输入粘连 */
6
+ export declare function paintSendPrompt(name: ServiceName): string;
7
+ /** 无发送目标时:纯提示符(命令仍可用 / 或 autoSlash) */
8
+ export declare function plainPrompt(): string;
9
+ /** 当前可发送的活跃服务(走统一运行态查询,含 OS 探测回写) */
10
+ export declare function listActiveSendTargets(): Promise<ServiceName[]>;
11
+ //# sourceMappingURL=send-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-target.d.ts","sourceRoot":"","sources":["../src/send-target.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGzF,cAAc;AACd,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAAiC,CAAC;AAiBtF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAKzD;AAED,sCAAsC;AACtC,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAGzD;AAED,uCAAuC;AACvC,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,qCAAqC;AACrC,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAIpE"}
@@ -0,0 +1,42 @@
1
+ import chalk from "chalk";
2
+ import { getQqBackendMode, queryServicesRuntime } from "./services.js";
3
+ import { T } from "./theme.js";
4
+ const SEND_TARGET_ORDER = ["bds", "db", "qq", "llbot"];
5
+ const SHORT = {
6
+ bds: "BDS",
7
+ db: "DB",
8
+ qq: "QQ",
9
+ llbot: "LLBOT"
10
+ };
11
+ const BG = {
12
+ bds: T.green,
13
+ db: T.blue,
14
+ qq: T.purple,
15
+ llbot: T.yellow
16
+ };
17
+ function sendTargetShort(name) {
18
+ if (name === "qq") {
19
+ return getQqBackendMode() === "llbot" ? "QQ\xB7L" : "QQ\xB7O";
20
+ }
21
+ return SHORT[name];
22
+ }
23
+ function paintSendPrompt(name) {
24
+ const label = sendTargetShort(name);
25
+ return chalk.bgHex(BG[name]).hex(T.bg)(` ${label} \u276F `) + " ";
26
+ }
27
+ function plainPrompt() {
28
+ return chalk.hex(T.text)("\u276F ");
29
+ }
30
+ async function listActiveSendTargets() {
31
+ const rows = await queryServicesRuntime();
32
+ const running = new Set(rows.filter((r) => r.running).map((r) => r.name));
33
+ return SEND_TARGET_ORDER.filter((n) => running.has(n));
34
+ }
35
+ export {
36
+ SEND_TARGET_ORDER,
37
+ listActiveSendTargets,
38
+ paintSendPrompt,
39
+ plainPrompt,
40
+ sendTargetShort
41
+ };
42
+ //# sourceMappingURL=send-target.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/send-target.ts"],
4
+ "sourcesContent": ["/**\r\n * send-target.ts \u2014 REPL \u53D1\u9001\u76EE\u6807\uFF08\u6D3B\u8DC3\u670D\u52A1\u95F4 Tab \u5207\u6362\uFF09\r\n */\r\nimport chalk from \"chalk\";\r\nimport { getQqBackendMode, queryServicesRuntime, type ServiceName } from \"./services.js\";\r\nimport { T } from \"./theme.js\";\r\n\r\n/** \u53EF\u53D1\u9001\u76EE\u6807\u987A\u5E8F */\r\nexport const SEND_TARGET_ORDER: readonly ServiceName[] = [\"bds\", \"db\", \"qq\", \"llbot\"];\r\n\r\nconst SHORT: Record<ServiceName, string> = {\r\n bds: \"BDS\",\r\n db: \"DB\",\r\n qq: \"QQ\",\r\n llbot: \"LLBOT\",\r\n};\r\n\r\n/** \u4E0E log \u6E90\u914D\u8272\u4E00\u81F4\uFF0C\u7528\u4F5C\u63D0\u793A\u7B26\u5E95\u8272 */\r\nconst BG: Record<ServiceName, string> = {\r\n bds: T.green,\r\n db: T.blue,\r\n qq: T.purple,\r\n llbot: T.yellow,\r\n};\r\n\r\nexport function sendTargetShort(name: ServiceName): string {\r\n if (name === \"qq\") {\r\n return getQqBackendMode() === \"llbot\" ? \"QQ\u00B7L\" : \"QQ\u00B7O\";\r\n }\r\n return SHORT[name];\r\n}\r\n\r\n/** ` BDS \u276F ` \u6574\u5757\u5E95\u8272\u9AD8\u4EAE\uFF1B\u5757\u540E\u518D\u52A0\u7A7A\u683C\uFF0C\u907F\u514D\u4E0E\u8F93\u5165\u7C98\u8FDE */\r\nexport function paintSendPrompt(name: ServiceName): string {\r\n const label = sendTargetShort(name);\r\n return chalk.bgHex(BG[name]).hex(T.bg)(` ${label} \u276F `) + \" \";\r\n}\r\n\r\n/** \u65E0\u53D1\u9001\u76EE\u6807\u65F6\uFF1A\u7EAF\u63D0\u793A\u7B26\uFF08\u547D\u4EE4\u4ECD\u53EF\u7528 / \u6216 autoSlash\uFF09 */\r\nexport function plainPrompt(): string {\r\n return chalk.hex(T.text)(\"\u276F \");\r\n}\r\n\r\n/** \u5F53\u524D\u53EF\u53D1\u9001\u7684\u6D3B\u8DC3\u670D\u52A1\uFF08\u8D70\u7EDF\u4E00\u8FD0\u884C\u6001\u67E5\u8BE2\uFF0C\u542B OS \u63A2\u6D4B\u56DE\u5199\uFF09 */\r\nexport async function listActiveSendTargets(): Promise<ServiceName[]> {\r\n const rows = await queryServicesRuntime();\r\n const running = new Set(rows.filter((r) => r.running).map((r) => r.name));\r\n return SEND_TARGET_ORDER.filter((n) => running.has(n));\r\n}\r\n\r"],
5
+ "mappings": "AAGA,OAAO,WAAW;AAClB,SAAS,kBAAkB,4BAA8C;AACzE,SAAS,SAAS;AAGX,MAAM,oBAA4C,CAAC,OAAO,MAAM,MAAM,OAAO;AAEpF,MAAM,QAAqC;AAAA,EACzC,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACT;AAGA,MAAM,KAAkC;AAAA,EACtC,KAAK,EAAE;AAAA,EACP,IAAI,EAAE;AAAA,EACN,IAAI,EAAE;AAAA,EACN,OAAO,EAAE;AACX;AAEO,SAAS,gBAAgB,MAA2B;AACzD,MAAI,SAAS,MAAM;AACjB,WAAO,iBAAiB,MAAM,UAAU,YAAS;AAAA,EACnD;AACA,SAAO,MAAM,IAAI;AACnB;AAGO,SAAS,gBAAgB,MAA2B;AACzD,QAAM,QAAQ,gBAAgB,IAAI;AAClC,SAAO,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,UAAK,IAAI;AAC3D;AAGO,SAAS,cAAsB;AACpC,SAAO,MAAM,IAAI,EAAE,IAAI,EAAE,SAAI;AAC/B;AAGA,eAAsB,wBAAgD;AACpE,QAAM,OAAO,MAAM,qBAAqB;AACxC,QAAM,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACxE,SAAO,kBAAkB,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACvD;",
6
+ "names": []
7
+ }