@sfmc-bds/cli 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/command-surface.d.ts.map +1 -1
  2. package/dist/command-surface.js +5 -6
  3. package/dist/command-surface.js.map +2 -2
  4. package/dist/commands.d.ts.map +1 -1
  5. package/dist/commands.js +1 -1
  6. package/dist/commands.js.map +2 -2
  7. package/dist/daemon/client.d.ts +3 -0
  8. package/dist/daemon/client.d.ts.map +1 -1
  9. package/dist/daemon/client.js +38 -8
  10. package/dist/daemon/client.js.map +2 -2
  11. package/dist/daemon/protocol.d.ts +9 -3
  12. package/dist/daemon/protocol.d.ts.map +1 -1
  13. package/dist/daemon/protocol.js.map +2 -2
  14. package/dist/daemon/server.d.ts.map +1 -1
  15. package/dist/daemon/server.js +82 -2
  16. package/dist/daemon/server.js.map +2 -2
  17. package/dist/i18n/locales/en.d.ts +12 -5
  18. package/dist/i18n/locales/en.d.ts.map +1 -1
  19. package/dist/i18n/locales/en.js +12 -5
  20. package/dist/i18n/locales/en.js.map +2 -2
  21. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  22. package/dist/i18n/locales/zh-CN.js +12 -5
  23. package/dist/i18n/locales/zh-CN.js.map +2 -2
  24. package/dist/interactive-prompts.d.ts +1 -1
  25. package/dist/interactive-prompts.d.ts.map +1 -1
  26. package/dist/interactive-prompts.js +4 -2
  27. package/dist/interactive-prompts.js.map +2 -2
  28. package/dist/logs.d.ts.map +1 -1
  29. package/dist/logs.js +13 -1
  30. package/dist/logs.js.map +2 -2
  31. package/dist/main.js +14 -184
  32. package/dist/main.js.map +2 -2
  33. package/dist/management/config.d.ts +8 -0
  34. package/dist/management/config.d.ts.map +1 -0
  35. package/dist/management/config.js +107 -0
  36. package/dist/management/config.js.map +7 -0
  37. package/dist/management/deployment.d.ts +7 -0
  38. package/dist/management/deployment.d.ts.map +1 -0
  39. package/dist/management/deployment.js +36 -0
  40. package/dist/management/deployment.js.map +7 -0
  41. package/dist/management/domain.d.ts +65 -0
  42. package/dist/management/domain.d.ts.map +1 -0
  43. package/dist/management/domain.js +137 -0
  44. package/dist/management/domain.js.map +7 -0
  45. package/dist/management/maintenance.d.ts +18 -0
  46. package/dist/management/maintenance.d.ts.map +1 -0
  47. package/dist/management/maintenance.js +214 -0
  48. package/dist/management/maintenance.js.map +7 -0
  49. package/dist/management/platform-worker.d.ts +2 -0
  50. package/dist/management/platform-worker.d.ts.map +1 -0
  51. package/dist/management/platform-worker.js +155 -0
  52. package/dist/management/platform-worker.js.map +7 -0
  53. package/dist/management/server.d.ts +7 -0
  54. package/dist/management/server.d.ts.map +1 -0
  55. package/dist/management/server.js +291 -0
  56. package/dist/management/server.js.map +7 -0
  57. package/dist/management/startup.d.ts +6 -0
  58. package/dist/management/startup.d.ts.map +1 -0
  59. package/dist/management/startup.js +67 -0
  60. package/dist/management/startup.js.map +7 -0
  61. package/dist/management/stdio.d.ts +3 -0
  62. package/dist/management/stdio.d.ts.map +1 -0
  63. package/dist/management/stdio.js +93 -0
  64. package/dist/management/stdio.js.map +7 -0
  65. package/dist/management/tasks.d.ts +21 -0
  66. package/dist/management/tasks.d.ts.map +1 -0
  67. package/dist/management/tasks.js +103 -0
  68. package/dist/management/tasks.js.map +7 -0
  69. package/dist/module-commands.d.ts +2 -2
  70. package/dist/module-commands.d.ts.map +1 -1
  71. package/dist/module-commands.js +28 -24
  72. package/dist/module-commands.js.map +2 -2
  73. package/dist/module-update/index.d.ts +2 -5
  74. package/dist/module-update/index.d.ts.map +1 -1
  75. package/dist/module-update/index.js +5 -29
  76. package/dist/module-update/index.js.map +2 -2
  77. package/dist/pack-lifecycle.d.ts.map +1 -1
  78. package/dist/pack-lifecycle.js +2 -0
  79. package/dist/pack-lifecycle.js.map +2 -2
  80. package/dist/runtime-main.d.ts +3 -0
  81. package/dist/runtime-main.d.ts.map +1 -0
  82. package/dist/runtime-main.js +188 -0
  83. package/dist/runtime-main.js.map +7 -0
  84. package/dist/runtime.d.ts +6 -0
  85. package/dist/runtime.d.ts.map +1 -1
  86. package/dist/runtime.js +6 -1
  87. package/dist/runtime.js.map +2 -2
  88. package/dist/services.d.ts +19 -10
  89. package/dist/services.d.ts.map +1 -1
  90. package/dist/services.js +24 -13
  91. package/dist/services.js.map +2 -2
  92. package/dist/wizard.d.ts.map +1 -1
  93. package/dist/wizard.js +213 -142
  94. package/dist/wizard.js.map +3 -3
  95. package/dist/world-packs.d.ts.map +1 -1
  96. package/dist/world-packs.js +7 -0
  97. package/dist/world-packs.js.map +2 -2
  98. package/package.json +8 -4
  99. package/scripts/module-install/.sfmc-registry-cache.json +95 -0
  100. package/scripts/module-install/fetch-module.mjs +9 -3
  101. package/scripts/module-install/lib/module-update-config.mjs +2 -2
  102. package/scripts/module-install/lib/module-update.mjs +94 -6
  103. package/scripts/module-install/lib/packages.mjs +3 -6
  104. package/scripts/module-install/lib/pins.mjs +15 -4
  105. package/scripts/module-install/lib/registry-cache.mjs +5 -1
  106. package/scripts/module-install/test/module-update.test.mjs +349 -0
@@ -1 +1 @@
1
- {"version":3,"file":"command-surface.d.ts","sourceRoot":"","sources":["../src/command-surface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-surface.d.ts","sourceRoot":"","sources":["../src/command-surface.ts"],"names":[],"mappings":"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"}
@@ -65,15 +65,11 @@ function findTopLevelSpec(cmd) {
65
65
  }
66
66
  function findModuleSubSpec(sub) {
67
67
  if (!sub) return void 0;
68
- return COMMAND_SPECS.find(
69
- (s) => s.name === "module" && (s.sub === sub || (s.aliases ?? []).includes(sub))
70
- );
68
+ return COMMAND_SPECS.find((s) => s.name === "module" && (s.sub === sub || (s.aliases ?? []).includes(sub)));
71
69
  }
72
70
  function findPacksSubSpec(sub) {
73
71
  if (!sub) return void 0;
74
- return COMMAND_SPECS.find(
75
- (s) => s.name === "packs" && (s.sub === sub || (s.aliases ?? []).includes(sub))
76
- );
72
+ return COMMAND_SPECS.find((s) => s.name === "packs" && (s.sub === sub || (s.aliases ?? []).includes(sub)));
77
73
  }
78
74
  function listVisibleModuleSubs(mode) {
79
75
  return listVisibleCommands(mode).filter((s) => s.name === "module" && s.sub).map((s) => s.sub);
@@ -101,9 +97,11 @@ const TOP_DESC = {
101
97
  install: "help.module.install",
102
98
  uninstall: "help.module.uninstall",
103
99
  search: "help.module.search",
100
+ submit: "help.module.submit",
104
101
  verify: "help.module.verify"
105
102
  };
106
103
  const MODULE_DESC = {
104
+ submit: "help.module.submit",
107
105
  list: "help.module.list",
108
106
  info: "help.module.info",
109
107
  build: "help.module.build",
@@ -365,6 +363,7 @@ const COMMAND_SPECS = [
365
363
  aliases: ["remove"]
366
364
  },
367
365
  { id: "module.search", name: "module", sub: "search", channel: "both" },
366
+ { id: "module.submit", name: "module", sub: "submit", channel: "both", accent: "dev" },
368
367
  { id: "module.verify", name: "module", sub: "verify", channel: "both" },
369
368
  { id: "module.enable", name: "module", sub: "enable", channel: "both" },
370
369
  { id: "module.disable", name: "module", sub: "disable", channel: "both" },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/command-surface.ts"],
4
- "sourcesContent": ["/**\n * command-surface.ts \u2014 sfmc CLI \u547D\u4EE4\u901A\u9053\u6CE8\u518C\u8868\uFF08\u5355\u4E00\u6743\u5A01\uFF09\n *\n * channel:\n * - both: argv\uFF08`sfmc <cmd>`\uFF09\u4E0E REPL \u5747\u53EF\u7528\uFF08\u9ED8\u8BA4\uFF09\n * - repl: \u4EC5 REPL\uFF1Bargv \u62D2\u7EDD\uFF08\u5982 send / quit\uFF09\n *\n * accent: \"dev\" \u4EC5\u5F71\u54CD\u5E2E\u52A9/\u8865\u5168\u84DD\u8272\u6837\u5F0F\uFF0C\u4E0D\u53C2\u4E0E canRun\uFF08OCP/DRY\uFF09\u3002\n * \u4E1A\u52A1\u5B9E\u73B0\u4E0D\u5728\u672C\u6587\u4EF6 / \u9762\u677F\u5185\uFF1A\u5206\u53D1\u5230 commands\u3001module-commands\u3001world-packs \u7B49\u3002\n */\nimport { stdin } from \"node:process\";\nimport { t } from \"./i18n/index.js\";\n\nexport type CommandChannel = \"repl\" | \"both\";\nexport type CommandMode = \"argv\" | \"repl\";\nexport type CommandAccent = \"dev\";\n\nexport type CommandSpec = {\n /** \u7A33\u5B9A id\uFF0C\u5982 \"module.install\" / \"send\" / \"debug\" */\n id: string;\n /** \u9876\u5C42\u547D\u4EE4\u540D\uFF08module \u5B50\u547D\u4EE4\u7528 \"module\"\uFF1B\u9876\u5C42\u522B\u540D\u89C1 TOP_LEVEL_ALIASES\uFF09 */\n name: string;\n /** \u5B50\u547D\u4EE4\uFF08\u4EC5 module/packs \u7B49\uFF09 */\n sub?: string;\n channel: CommandChannel;\n needsTty?: boolean;\n /** \u5E2E\u52A9\u67D3\u8272\uFF1B\u4E0D\u53C2\u4E0E canRun */\n accent?: CommandAccent;\n /** \u5B50\u547D\u4EE4\u540C\u4E49\u522B\u540D\uFF08\u5982 uninstall \u2192 remove\uFF09\uFF0C\u4E0D\u662F\u9876\u5C42\u522B\u540D */\n aliases?: string[];\n};\n\nexport type CanRunContext = {\n mode: CommandMode;\n isTty: boolean;\n};\n\nexport type CanRunFailReason = \"replOnly\" | \"needTty\";\n\nexport type CanRunResult = { ok: true } | { ok: false; reason: CanRunFailReason };\n\n/** \u9876\u5C42\u547D\u4EE4\u522B\u540D \u2192 \u89C4\u8303 name\uFF08DRY\uFF1A\u52FF\u5728\u5404 sub spec \u91CD\u590D\u5199 mod/addon\uFF09 */\nexport const TOP_LEVEL_ALIASES: Readonly<Record<string, string>> = {\n mod: \"module\",\n addon: \"packs\",\n log: \"logs\",\n lang: \"locale\",\n h: \"help\",\n \"?\": \"help\",\n exit: \"quit\",\n q: \"quit\",\n i: \"install\",\n remove: \"uninstall\",\n};\n\n/**\n * \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module \u5B50\u547D\u4EE4\uFF08argv / REPL \u5171\u7528\uFF0C\u907F\u514D\u5728 switch \u91CC\u6563\u843D\u6620\u5C04\uFF09\n * \u4E0D\u542B enable/disable\uFF08\u4E0E packs \u51B2\u7A81\uFF0C\u4ECD\u8D70 /module \u6216 /packs\uFF09\n *\n * \u4E0E packs \u5B50\u547D\u4EE4\u5BF9\u9F50\uFF1A`packs i` \u2192 `packs install`\uFF08mapPacksSubAlias\uFF09\uFF1B\n * module \u9876\u5C42\u540C\u6837\u652F\u6301 `i` \u2192 `install`\uFF08\u89C1 TOP_LEVEL_ALIASES \u4E0E\u672C\u8868\uFF09\u3002\n */\nexport const MODULE_TOP_SHORTHAND: Readonly<Record<string, string>> = {\n i: \"install\",\n install: \"install\",\n uninstall: \"uninstall\",\n search: \"search\",\n verify: \"verify\",\n};\n\nexport function resolveModuleTopShorthand(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n return MODULE_TOP_SHORTHAND[name];\n}\n\nexport function resolveTopLevelName(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n return TOP_LEVEL_ALIASES[cmd] ?? cmd;\n}\n\nfunction channelAllows(channel: CommandChannel, mode: CommandMode): boolean {\n if (channel === \"both\") return true;\n return mode === \"repl\";\n}\n\n/** \u5224\u5B9A\u5F53\u524D\u6A21\u5F0F\u4E0B\u80FD\u5426\u6267\u884C\u8BE5\u547D\u4EE4\uFF08accent \u4E0D\u53C2\u4E0E\uFF09\u3002 */\nexport function canRunCommand(spec: CommandSpec, ctx: CanRunContext): CanRunResult {\n if (!channelAllows(spec.channel, ctx.mode)) {\n return { ok: false, reason: \"replOnly\" };\n }\n if (spec.needsTty && !ctx.isTty) {\n return { ok: false, reason: \"needTty\" };\n }\n return { ok: true };\n}\n\n/** \u5F53\u524D\u6A21\u5F0F\u53EF\u89C1\u547D\u4EE4\uFF08help / Tab\uFF09\u3002 */\nexport function listVisibleCommands(mode: CommandMode): CommandSpec[] {\n return COMMAND_SPECS.filter((s) => channelAllows(s.channel, mode));\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u540D\uFF08\u542B\u522B\u540D\uFF09\uFF0C\u4F9B REPL COMMANDS / \u8865\u5168\u3002 */\nexport function listVisibleTopLevelNames(mode: CommandMode): string[] {\n const canonical = new Set<string>();\n for (const s of listVisibleCommands(mode)) {\n canonical.add(s.name);\n }\n const out = new Set<string>(canonical);\n for (const [alias, name] of Object.entries(TOP_LEVEL_ALIASES)) {\n if (canonical.has(name)) out.add(alias);\n }\n return [...out];\n}\n\n/** \u67E5\u627E\u9876\u5C42\u547D\u4EE4\uFF08\u65E0 sub\uFF09\u7684\u4EFB\u610F\u4E00\u6761\u540C\u540D spec\uFF08\u7528\u4E8E channel \u95E8\u7981\uFF09\u3002 */\nexport function findTopLevelSpec(cmd: string | undefined): CommandSpec | undefined {\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n /* \u4F18\u5148\u65E0 sub \u7684\u9876\u5C42\u6761\u76EE\uFF1B\u5426\u5219\u53D6\u8BE5 name \u4E0B\u4EFB\u610F\u53EF\u89C1 spec \u4EE3\u8868\u901A\u9053\uFF08module/packs\uFF09 */\n const top = COMMAND_SPECS.find((s) => !s.sub && s.name === name);\n if (top) return top;\n return COMMAND_SPECS.find((s) => s.name === name);\n}\n\n/** \u67E5\u627E module \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findModuleSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"module\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u67E5\u627E packs \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findPacksSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"packs\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 module \u5B50\u547D\u4EE4\u540D\uFF08\u89C4\u8303\u540D\uFF0C\u4E0D\u542B remove \u522B\u540D\uFF09\u3002 */\nexport function listVisibleModuleSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"module\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 packs \u5B50\u547D\u4EE4\u540D\u3002 */\nexport function listVisiblePacksSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"packs\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** REPL \u5FEB\u901F\u8865\u5168\uFF1A\u5C42\u7EA7\u8282\u70B9\uFF08\u4E3B\u9762\u677F \u2192 \u53F3\u4FA7\u5B50\u9762\u677F\uFF09 */\nexport type PaletteNode = {\n /** \u9762\u677F\u5185\u663E\u793A\u7684\u6807\u7B7E */\n label: string;\n /**\n * \u8FFD\u52A0\u5230\u547D\u4EE4\u884C\u7684 token\u3002\n * \u7A7A\u5B57\u7B26\u4E32\u8868\u793A\u300C\u76F4\u63A5\u8FD0\u884C\u300D\uFF1A\u4E0D\u8FFD\u52A0\u53C2\u6570\uFF0C\u56DE\u8F66\u63D0\u4EA4\u5DF2\u7ECF\u5199\u597D\u7684\u7236\u547D\u4EE4\u3002\n */\n token: string;\n /** i18n \u63CF\u8FF0\u952E */\n descKey?: string;\n accent?: CommandAccent;\n /** \u56FA\u5B9A\u4E0B\u4E00\u53C2\u9009\u9879\uFF1B\u56DE\u8F66\u540E\u5728\u53F3\u4FA7\u5C55\u5F00 */\n children?: PaletteNode[];\n /**\n * \u65E0 children \u65F6\u4ECD\u9700\u81EA\u7531\u8F93\u5165\uFF08\u56DE\u8F66\u540E\u586B\u5165\u7A7A\u683C\u7EE7\u7EED\u6253\u5B57\uFF09\u3002\n * token \u4EE5 `=` \u7ED3\u5C3E\u65F6\u4E0D\u8865\u7A7A\u683C\uFF0C\u540E\u7EED\u5B57\u7B26\u7C98\u5728\u540C\u4E00 token \u4E0A\uFF08\u5982 `--experiments=beta,upcoming`\uFF09\u3002\n */\n freeArgs?: boolean;\n};\n\nconst NO_ARG_TOP = new Set([\"status\", \"help\", \"version\", \"quit\", \"init\", \"logs\"]);\n\nconst TOP_DESC: Record<string, string> = {\n status: \"help.status\",\n logs: \"help.logs\",\n start: \"help.start\",\n stop: \"help.stop\",\n restart: \"help.restart\",\n send: \"help.send\",\n help: \"help.help\",\n version: \"help.version\",\n quit: \"help.quit\",\n init: \"help.init\",\n update: \"help.update\",\n locale: \"help.locale\",\n debug: \"help.debug.status\",\n ui: \"help.ui\",\n daemon: \"help.daemon\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n search: \"help.module.search\",\n verify: \"help.module.verify\",\n};\n\nconst MODULE_DESC: Record<string, string> = {\n list: \"help.module.list\",\n info: \"help.module.info\",\n build: \"help.module.build\",\n reload: \"help.module.reload\",\n search: \"help.module.search\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n verify: \"help.module.verify\",\n enable: \"help.module.toggle\",\n disable: \"help.module.toggle\",\n update: \"help.module.update\",\n pin: \"help.module.pin\",\n};\n\nconst PACKS_DESC: Record<string, string> = {\n list: \"help.packs.list\",\n search: \"help.packs.search\",\n enable: \"help.packs.enable\",\n disable: \"help.packs.disable\",\n doctor: \"help.packs.doctor\",\n path: \"help.packs.path\",\n install: \"help.addon\",\n scan: \"help.addon\",\n uninstall: \"help.addon\",\n bind: \"help.addon\",\n unbind: \"help.addon\",\n sources: \"help.addon\",\n check: \"help.addon\",\n update: \"help.addon\",\n bump: \"help.addon\",\n};\n\nfunction serviceArgNodes(): PaletteNode[] {\n return [\n { label: \"-all\", token: \"-all\" },\n ...([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({ label: n, token: n })),\n ];\n}\n\nfunction moduleChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"build\"]);\n return listVisibleModuleSubs(mode).map((sub) => {\n const spec = findModuleSubSpec(sub);\n const node: PaletteNode = {\n label: sub,\n token: sub,\n descKey: MODULE_DESC[sub] ?? \"help.module.list\",\n freeArgs: !noArg.has(sub),\n };\n if (spec?.accent) node.accent = spec.accent;\n return node;\n });\n}\n\n/**\n * \u300C\u76F4\u63A5\u8FD0\u884C\u300D\u9879\uFF1Atoken \u4E3A\u7A7A\uFF0C\u56DE\u8F66\u63D0\u4EA4\u5DF2\u7ECF\u5199\u597D\u7684\u7236\u547D\u4EE4\u3002\n * \u7528\u5728\u65E0\u53C2\u672C\u8EAB\u5C31\u662F\u5408\u6CD5\u547D\u4EE4\u3001\u540C\u65F6\u8FD8\u8981\u5C55\u5F00\u53EF\u9009\u5F00\u5173\u7684\u8282\u70B9\u4E0A\u3002\n */\nfunction asIsNode(descKey: string, labelKey: \"palette.asIs\" | \"palette.fixOnly\" | \"palette.localeCurrent\" = \"palette.asIs\"): PaletteNode {\n return { label: t(labelKey), token: \"\", descKey };\n}\n\n/** `/ui` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\uFF08studio \u542F\u52A8\u7F16\u8F91\u5668\uFF0Cstop \u505C\u6389\u5F53\u524D\u8FDB\u7A0B\u5185\u7684\u670D\u52A1\uFF09\u3002 */\nfunction uiChildNodes(): PaletteNode[] {\n return [\n { label: \"studio\", token: \"studio\", descKey: \"help.ui.studio\" },\n { label: \"stop\", token: \"stop\", descKey: \"help.ui.stop\" },\n ];\n}\n\n/** `/debug` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\uFF1Bsentry on \u4E4B\u540E\u8FD8\u8981\u7C98\u4E0A `--dsn=`\u3002 */\nfunction debugChildNodes(): PaletteNode[] {\n return [\n { label: \"status\", token: \"status\", descKey: \"help.debug.status\" },\n { label: \"enable\", token: \"enable\", descKey: \"help.debug.toggle\" },\n { label: \"disable\", token: \"disable\", descKey: \"help.debug.toggle\" },\n {\n label: \"sentry\",\n token: \"sentry\",\n descKey: \"help.debug.sentry\",\n children: [\n {\n label: \"on\",\n token: \"on\",\n descKey: \"help.debug.sentry.on\",\n children: [{ label: \"--dsn=\", token: \"--dsn=\", descKey: \"help.debug.sentry.on\", freeArgs: true }],\n },\n { label: \"off\", token: \"off\", descKey: \"help.debug.sentry.off\" },\n ],\n },\n ];\n}\n\n/** `/daemon` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\u3002\u65E0\u53C2\u7B49\u4EF7\u4E8E status\uFF0C\u9762\u677F\u91CC\u4ECD\u5355\u5217\u51FA\u6765\u3002 */\nfunction daemonChildNodes(): PaletteNode[] {\n return [\n { label: \"status\", token: \"status\", descKey: \"help.daemon.status\" },\n { label: \"stop\", token: \"stop\", descKey: \"help.daemon.stop\" },\n ];\n}\n\n/** `/locale` \u7684\u53EF\u9009\u8BED\u8A00\uFF1B\u7B2C\u4E00\u9879\u4E0D\u5E26\u53C2\u6570\uFF0C\u53EA\u6253\u5370\u5F53\u524D\u8BED\u8A00\u3002 */\nfunction localeChildNodes(): PaletteNode[] {\n return [\n asIsNode(\"help.locale\", \"palette.localeCurrent\"),\n { label: \"zh-CN\", token: \"zh-CN\", descKey: \"locale.opt.zh\" },\n { label: \"en\", token: \"en\", descKey: \"locale.opt.en\" },\n ];\n}\n\n/** `/update` \u7684\u5DF2\u77E5\u5F00\u5173\u3002\u65E0\u53C2\u5C31\u662F\u68C0\u67E5\u5E76\u66F4\u65B0\u3002 */\nfunction updateChildNodes(): PaletteNode[] {\n return [\n asIsNode(\"help.update\"),\n { label: \"--check-only\", token: \"--check-only\", descKey: \"help.update.checkOnly\" },\n { label: \"--force\", token: \"--force\", descKey: \"help.update.force\" },\n { label: \"--no-start\", token: \"--no-start\", descKey: \"help.update.noStart\" },\n { label: \"--channel=release\", token: \"--channel=release\", descKey: \"help.update.channelRelease\" },\n { label: \"--channel=preview\", token: \"--channel=preview\", descKey: \"help.update.channelPreview\" },\n ];\n}\n\n/**\n * `packs doctor` \u7684\u5F00\u5173\u3002\n * \u65E0\u53C2\u53EA\u8BCA\u65AD\uFF1B`--experiments=` \u540E\u9762\u7684\u522B\u540D\u7C98\u5728\u540C\u4E00\u4E2A token \u4E0A\u3002\n */\nfunction doctorNode(): PaletteNode {\n const experimentList: PaletteNode = {\n label: \"--experiments=\",\n token: \"--experiments=\",\n descKey: \"help.packs.doctor.experimentsList\",\n freeArgs: true,\n };\n const allExperiments: PaletteNode = {\n label: \"--all-experiments\",\n token: \"--all-experiments\",\n descKey: \"help.packs.doctor.allExperiments\",\n };\n return {\n label: \"doctor\",\n token: \"doctor\",\n descKey: \"help.packs.doctor\",\n children: [\n asIsNode(\"help.packs.doctor\"),\n {\n label: \"--fix\",\n token: \"--fix\",\n descKey: \"help.packs.doctor.fix\",\n children: [asIsNode(\"help.packs.doctor.fix\", \"palette.fixOnly\"), allExperiments, experimentList],\n },\n allExperiments,\n { label: \"--experiments\", token: \"--experiments\", descKey: \"help.packs.doctor.experiments\" },\n experimentList,\n ],\n };\n}\n\nfunction packsChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"path\", \"sources\"]);\n return listVisiblePacksSubs(mode).map((sub) => {\n if (sub === \"doctor\") return doctorNode();\n return {\n label: sub,\n token: sub,\n descKey: PACKS_DESC[sub] ?? \"help.addon\",\n freeArgs: !noArg.has(sub),\n };\n });\n}\n\n/** \u5C42\u7EA7\u547D\u4EE4\u6811\uFF08REPL \u9762\u677F\u4E3B\u5217\uFF09 */\nexport function listPaletteRoots(mode: CommandMode = \"repl\"): PaletteNode[] {\n const specs = listVisibleCommands(mode);\n const out: PaletteNode[] = [];\n const seen = new Set<string>();\n /** \u9762\u677F\u4E0D\u5C55\u793A\u9876\u5C42\u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u8D70 /module <sub>\uFF08argv \u77ED\u547D\u4EE4\u4ECD\u53EF\u7528\uFF09 */\n const skipTopShorthand = new Set(Object.keys(MODULE_TOP_SHORTHAND));\n\n for (const s of specs) {\n if (s.sub) continue;\n if (s.name === \"module\" || s.name === \"packs\") continue;\n if (skipTopShorthand.has(s.name)) continue;\n if (seen.has(s.name)) continue;\n seen.add(s.name);\n\n const node: PaletteNode = {\n label: `/${s.name}`,\n token: s.name,\n descKey: TOP_DESC[s.name] ?? \"help.help\",\n };\n if (s.accent) node.accent = s.accent;\n\n if (s.name === \"start\" || s.name === \"stop\" || s.name === \"restart\") {\n node.children = serviceArgNodes();\n } else if (s.name === \"send\") {\n node.children = ([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({\n label: n,\n token: n,\n freeArgs: true,\n }));\n } else if (s.name === \"ui\") {\n node.children = uiChildNodes();\n } else if (s.name === \"debug\") {\n node.children = debugChildNodes();\n } else if (s.name === \"daemon\") {\n node.children = daemonChildNodes();\n } else if (s.name === \"locale\") {\n node.children = localeChildNodes();\n } else if (s.name === \"update\") {\n node.children = updateChildNodes();\n } else if (!NO_ARG_TOP.has(s.name)) {\n node.freeArgs = true;\n }\n\n out.push(node);\n }\n\n const moduleSubs = moduleChildNodes(mode);\n if (moduleSubs.length > 0) {\n out.push({\n label: \"/module\",\n token: \"module\",\n descKey: \"help.module.list\",\n children: moduleSubs,\n });\n }\n\n const packsSubs = packsChildNodes(mode);\n if (packsSubs.length > 0) {\n out.push({\n label: \"/packs\",\n token: \"packs\",\n descKey: \"help.addon\",\n children: packsSubs,\n });\n }\n\n return out;\n}\n\n/**\n * \u5DF2\u63D0\u4EA4\u8DEF\u5F84\u7684\u4E0B\u4E00\u53C2 token\uFF0C\u4F9B\u975E `/` \u7070\u5B57\u8865\u5168\u4E0E\u9762\u677F\u5171\u7528\u540C\u4E00\u68F5\u6811\u3002\n * \u6CA1\u6709\u5BF9\u5E94\u8282\u70B9\u65F6\u8FD4\u56DE null\uFF1B\u8282\u70B9\u5B58\u5728\u4F46\u6CA1\u6709\u5B50\u9879\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u3002\n * \u300C\u76F4\u63A5\u8FD0\u884C\u300D\u7684\u7A7A token \u4E0D\u51FA\u73B0\u5728\u8865\u5168\u91CC\u3002\n */\nexport function listNextPaletteTokens(path: readonly string[], mode: CommandMode = \"repl\"): string[] | null {\n if (path.length === 0) return null;\n let current: PaletteNode | undefined = listPaletteRoots(mode).find((n) => n.token === path[0]);\n if (!current) return null;\n for (let i = 1; i < path.length; i++) {\n const token = path[i] ?? \"\";\n const children: readonly PaletteNode[] = current.children ?? [];\n current = children.find((child) => child.token === token);\n if (!current) return null;\n }\n const kids = current.children;\n if (!kids?.length) return [];\n return kids.map((child) => child.token).filter((token) => token.length > 0);\n}\n\nexport function isDevAccent(spec: CommandSpec | undefined): boolean {\n return spec?.accent === \"dev\";\n}\n\n/** sub \u662F\u5426\u4E3A\u5F00\u53D1\u8005\u6837\u5F0F\u547D\u4EE4\uFF08\u84DD\u6807\uFF09\u3002 */\nexport function isDevAccentModuleSub(sub: string | undefined): boolean {\n return isDevAccent(findModuleSubSpec(sub));\n}\n\n/** stdin TTY \u63A2\u6D4B\uFF08\u4F9B main/repl \u5171\u7528\uFF09\u3002 */\nexport function isCliTty(): boolean {\n return Boolean(stdin.isTTY);\n}\n\n/**\n * \u547D\u4EE4\u6CE8\u518C\u8868 \u2014\u2014 \u65B0\u589E\u547D\u4EE4\u53EA\u52A0\u6B64\u5904\uFF08OCP\uFF09\u3002\n * channel:\n * - both: argv + REPL\uFF08\u9ED8\u8BA4\uFF1B\u9762\u677F\u53EA\u8C03\u5EA6\u65E2\u6709 dispatcher\uFF09\n * - repl: \u4EC5 REPL\uFF08\u5982 send / quit\uFF09\n */\nexport const COMMAND_SPECS: readonly CommandSpec[] = [\n /* \u2500\u2500\u2500 both\uFF1A\u670D\u52A1 / \u6A21\u5757 / \u8D44\u6E90\u5305 / \u914D\u7F6E \u2500\u2500\u2500 */\n { id: \"status\", name: \"status\", channel: \"both\" },\n { id: \"start\", name: \"start\", channel: \"both\" },\n { id: \"stop\", name: \"stop\", channel: \"both\" },\n { id: \"restart\", name: \"restart\", channel: \"both\" },\n { id: \"logs\", name: \"logs\", channel: \"repl\" },\n { id: \"help\", name: \"help\", channel: \"both\" },\n { id: \"version\", name: \"version\", channel: \"both\" },\n { id: \"init\", name: \"init\", channel: \"both\", needsTty: true },\n { id: \"update\", name: \"update\", channel: \"both\" },\n { id: \"locale\", name: \"locale\", channel: \"both\" },\n { id: \"daemon\", name: \"daemon\", channel: \"both\" },\n { id: \"debug\", name: \"debug\", channel: \"both\", accent: \"dev\" },\n { id: \"ui\", name: \"ui\", channel: \"both\", accent: \"dev\" },\n\n /** \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module.*\uFF08\u5C11\u5199\u4E00\u5C42 module\uFF09 */\n { id: \"install\", name: \"install\", channel: \"both\" },\n { id: \"uninstall\", name: \"uninstall\", channel: \"both\", aliases: [\"remove\"] },\n { id: \"search\", name: \"search\", channel: \"both\" },\n { id: \"verify\", name: \"verify\", channel: \"both\" },\n\n { id: \"module.list\", name: \"module\", sub: \"list\", channel: \"both\" },\n { id: \"module.info\", name: \"module\", sub: \"info\", channel: \"both\" },\n { id: \"module.build\", name: \"module\", sub: \"build\", channel: \"both\", accent: \"dev\" },\n { id: \"module.reload\", name: \"module\", sub: \"reload\", channel: \"both\", accent: \"dev\" },\n { id: \"module.install\", name: \"module\", sub: \"install\", channel: \"both\" },\n {\n id: \"module.uninstall\",\n name: \"module\",\n sub: \"uninstall\",\n channel: \"both\",\n aliases: [\"remove\"],\n },\n { id: \"module.search\", name: \"module\", sub: \"search\", channel: \"both\" },\n { id: \"module.verify\", name: \"module\", sub: \"verify\", channel: \"both\" },\n { id: \"module.enable\", name: \"module\", sub: \"enable\", channel: \"both\" },\n { id: \"module.disable\", name: \"module\", sub: \"disable\", channel: \"both\" },\n { id: \"module.update\", name: \"module\", sub: \"update\", channel: \"both\" },\n { id: \"module.pin\", name: \"module\", sub: \"pin\", channel: \"both\" },\n\n { id: \"packs.list\", name: \"packs\", sub: \"list\", channel: \"both\" },\n { id: \"packs.search\", name: \"packs\", sub: \"search\", channel: \"both\" },\n { id: \"packs.enable\", name: \"packs\", sub: \"enable\", channel: \"both\" },\n { id: \"packs.disable\", name: \"packs\", sub: \"disable\", channel: \"both\" },\n { id: \"packs.doctor\", name: \"packs\", sub: \"doctor\", channel: \"both\" },\n { id: \"packs.path\", name: \"packs\", sub: \"path\", channel: \"both\" },\n { id: \"packs.install\", name: \"packs\", sub: \"install\", channel: \"both\" },\n { id: \"packs.scan\", name: \"packs\", sub: \"scan\", channel: \"both\" },\n { id: \"packs.uninstall\", name: \"packs\", sub: \"uninstall\", channel: \"both\" },\n { id: \"packs.bind\", name: \"packs\", sub: \"bind\", channel: \"both\" },\n { id: \"packs.unbind\", name: \"packs\", sub: \"unbind\", channel: \"both\" },\n { id: \"packs.sources\", name: \"packs\", sub: \"sources\", channel: \"both\" },\n { id: \"packs.check\", name: \"packs\", sub: \"check\", channel: \"both\" },\n { id: \"packs.update\", name: \"packs\", sub: \"update\", channel: \"both\" },\n { id: \"packs.bump\", name: \"packs\", sub: \"bump\", channel: \"both\" },\n\n /* \u2500\u2500\u2500 repl-only \u2500\u2500\u2500 */\n { id: \"send\", name: \"send\", channel: \"repl\" },\n { id: \"quit\", name: \"quit\", channel: \"repl\" },\n];\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * command-surface.ts \u2014 sfmc CLI \u547D\u4EE4\u901A\u9053\u6CE8\u518C\u8868\uFF08\u5355\u4E00\u6743\u5A01\uFF09\n *\n * channel:\n * - both: argv\uFF08`sfmc <cmd>`\uFF09\u4E0E REPL \u5747\u53EF\u7528\uFF08\u9ED8\u8BA4\uFF09\n * - repl: \u4EC5 REPL\uFF1Bargv \u62D2\u7EDD\uFF08\u5982 send / quit\uFF09\n *\n * accent: \"dev\" \u4EC5\u5F71\u54CD\u5E2E\u52A9/\u8865\u5168\u84DD\u8272\u6837\u5F0F\uFF0C\u4E0D\u53C2\u4E0E canRun\uFF08OCP/DRY\uFF09\u3002\n * \u4E1A\u52A1\u5B9E\u73B0\u4E0D\u5728\u672C\u6587\u4EF6 / \u9762\u677F\u5185\uFF1A\u5206\u53D1\u5230 commands\u3001module-commands\u3001world-packs \u7B49\u3002\n */\nimport { stdin } from \"node:process\";\nimport { t } from \"./i18n/index.js\";\n\nexport type CommandChannel = \"repl\" | \"both\";\nexport type CommandMode = \"argv\" | \"repl\";\nexport type CommandAccent = \"dev\";\n\nexport type CommandSpec = {\n /** \u7A33\u5B9A id\uFF0C\u5982 \"module.install\" / \"send\" / \"debug\" */\n id: string;\n /** \u9876\u5C42\u547D\u4EE4\u540D\uFF08module \u5B50\u547D\u4EE4\u7528 \"module\"\uFF1B\u9876\u5C42\u522B\u540D\u89C1 TOP_LEVEL_ALIASES\uFF09 */\n name: string;\n /** \u5B50\u547D\u4EE4\uFF08\u4EC5 module/packs \u7B49\uFF09 */\n sub?: string;\n channel: CommandChannel;\n needsTty?: boolean;\n /** \u5E2E\u52A9\u67D3\u8272\uFF1B\u4E0D\u53C2\u4E0E canRun */\n accent?: CommandAccent;\n /** \u5B50\u547D\u4EE4\u540C\u4E49\u522B\u540D\uFF08\u5982 uninstall \u2192 remove\uFF09\uFF0C\u4E0D\u662F\u9876\u5C42\u522B\u540D */\n aliases?: string[];\n};\n\nexport type CanRunContext = {\n mode: CommandMode;\n isTty: boolean;\n};\n\nexport type CanRunFailReason = \"replOnly\" | \"needTty\";\n\nexport type CanRunResult = { ok: true } | { ok: false; reason: CanRunFailReason };\n\n/** \u9876\u5C42\u547D\u4EE4\u522B\u540D \u2192 \u89C4\u8303 name\uFF08DRY\uFF1A\u52FF\u5728\u5404 sub spec \u91CD\u590D\u5199 mod/addon\uFF09 */\nexport const TOP_LEVEL_ALIASES: Readonly<Record<string, string>> = {\n mod: \"module\",\n addon: \"packs\",\n log: \"logs\",\n lang: \"locale\",\n h: \"help\",\n \"?\": \"help\",\n exit: \"quit\",\n q: \"quit\",\n i: \"install\",\n remove: \"uninstall\",\n};\n\n/**\n * \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module \u5B50\u547D\u4EE4\uFF08argv / REPL \u5171\u7528\uFF0C\u907F\u514D\u5728 switch \u91CC\u6563\u843D\u6620\u5C04\uFF09\n * \u4E0D\u542B enable/disable\uFF08\u4E0E packs \u51B2\u7A81\uFF0C\u4ECD\u8D70 /module \u6216 /packs\uFF09\n *\n * \u4E0E packs \u5B50\u547D\u4EE4\u5BF9\u9F50\uFF1A`packs i` \u2192 `packs install`\uFF08mapPacksSubAlias\uFF09\uFF1B\n * module \u9876\u5C42\u540C\u6837\u652F\u6301 `i` \u2192 `install`\uFF08\u89C1 TOP_LEVEL_ALIASES \u4E0E\u672C\u8868\uFF09\u3002\n */\nexport const MODULE_TOP_SHORTHAND: Readonly<Record<string, string>> = {\n i: \"install\",\n install: \"install\",\n uninstall: \"uninstall\",\n search: \"search\",\n verify: \"verify\",\n};\n\nexport function resolveModuleTopShorthand(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n return MODULE_TOP_SHORTHAND[name];\n}\n\nexport function resolveTopLevelName(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n return TOP_LEVEL_ALIASES[cmd] ?? cmd;\n}\n\nfunction channelAllows(channel: CommandChannel, mode: CommandMode): boolean {\n if (channel === \"both\") return true;\n return mode === \"repl\";\n}\n\n/** \u5224\u5B9A\u5F53\u524D\u6A21\u5F0F\u4E0B\u80FD\u5426\u6267\u884C\u8BE5\u547D\u4EE4\uFF08accent \u4E0D\u53C2\u4E0E\uFF09\u3002 */\nexport function canRunCommand(spec: CommandSpec, ctx: CanRunContext): CanRunResult {\n if (!channelAllows(spec.channel, ctx.mode)) {\n return { ok: false, reason: \"replOnly\" };\n }\n if (spec.needsTty && !ctx.isTty) {\n return { ok: false, reason: \"needTty\" };\n }\n return { ok: true };\n}\n\n/** \u5F53\u524D\u6A21\u5F0F\u53EF\u89C1\u547D\u4EE4\uFF08help / Tab\uFF09\u3002 */\nexport function listVisibleCommands(mode: CommandMode): CommandSpec[] {\n return COMMAND_SPECS.filter((s) => channelAllows(s.channel, mode));\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u540D\uFF08\u542B\u522B\u540D\uFF09\uFF0C\u4F9B REPL COMMANDS / \u8865\u5168\u3002 */\nexport function listVisibleTopLevelNames(mode: CommandMode): string[] {\n const canonical = new Set<string>();\n for (const s of listVisibleCommands(mode)) {\n canonical.add(s.name);\n }\n const out = new Set<string>(canonical);\n for (const [alias, name] of Object.entries(TOP_LEVEL_ALIASES)) {\n if (canonical.has(name)) out.add(alias);\n }\n return [...out];\n}\n\n/** \u67E5\u627E\u9876\u5C42\u547D\u4EE4\uFF08\u65E0 sub\uFF09\u7684\u4EFB\u610F\u4E00\u6761\u540C\u540D spec\uFF08\u7528\u4E8E channel \u95E8\u7981\uFF09\u3002 */\nexport function findTopLevelSpec(cmd: string | undefined): CommandSpec | undefined {\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n /* \u4F18\u5148\u65E0 sub \u7684\u9876\u5C42\u6761\u76EE\uFF1B\u5426\u5219\u53D6\u8BE5 name \u4E0B\u4EFB\u610F\u53EF\u89C1 spec \u4EE3\u8868\u901A\u9053\uFF08module/packs\uFF09 */\n const top = COMMAND_SPECS.find((s) => !s.sub && s.name === name);\n if (top) return top;\n return COMMAND_SPECS.find((s) => s.name === name);\n}\n\n/** \u67E5\u627E module \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findModuleSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find((s) => s.name === \"module\" && (s.sub === sub || (s.aliases ?? []).includes(sub)));\n}\n\n/** \u67E5\u627E packs \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findPacksSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find((s) => s.name === \"packs\" && (s.sub === sub || (s.aliases ?? []).includes(sub)));\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 module \u5B50\u547D\u4EE4\u540D\uFF08\u89C4\u8303\u540D\uFF0C\u4E0D\u542B remove \u522B\u540D\uFF09\u3002 */\nexport function listVisibleModuleSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"module\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 packs \u5B50\u547D\u4EE4\u540D\u3002 */\nexport function listVisiblePacksSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"packs\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** REPL \u5FEB\u901F\u8865\u5168\uFF1A\u5C42\u7EA7\u8282\u70B9\uFF08\u4E3B\u9762\u677F \u2192 \u53F3\u4FA7\u5B50\u9762\u677F\uFF09 */\nexport type PaletteNode = {\n /** \u9762\u677F\u5185\u663E\u793A\u7684\u6807\u7B7E */\n label: string;\n /**\n * \u8FFD\u52A0\u5230\u547D\u4EE4\u884C\u7684 token\u3002\n * \u7A7A\u5B57\u7B26\u4E32\u8868\u793A\u300C\u76F4\u63A5\u8FD0\u884C\u300D\uFF1A\u4E0D\u8FFD\u52A0\u53C2\u6570\uFF0C\u56DE\u8F66\u63D0\u4EA4\u5DF2\u7ECF\u5199\u597D\u7684\u7236\u547D\u4EE4\u3002\n */\n token: string;\n /** i18n \u63CF\u8FF0\u952E */\n descKey?: string;\n accent?: CommandAccent;\n /** \u56FA\u5B9A\u4E0B\u4E00\u53C2\u9009\u9879\uFF1B\u56DE\u8F66\u540E\u5728\u53F3\u4FA7\u5C55\u5F00 */\n children?: PaletteNode[];\n /**\n * \u65E0 children \u65F6\u4ECD\u9700\u81EA\u7531\u8F93\u5165\uFF08\u56DE\u8F66\u540E\u586B\u5165\u7A7A\u683C\u7EE7\u7EED\u6253\u5B57\uFF09\u3002\n * token \u4EE5 `=` \u7ED3\u5C3E\u65F6\u4E0D\u8865\u7A7A\u683C\uFF0C\u540E\u7EED\u5B57\u7B26\u7C98\u5728\u540C\u4E00 token \u4E0A\uFF08\u5982 `--experiments=beta,upcoming`\uFF09\u3002\n */\n freeArgs?: boolean;\n};\n\nconst NO_ARG_TOP = new Set([\"status\", \"help\", \"version\", \"quit\", \"init\", \"logs\"]);\n\nconst TOP_DESC: Record<string, string> = {\n status: \"help.status\",\n logs: \"help.logs\",\n start: \"help.start\",\n stop: \"help.stop\",\n restart: \"help.restart\",\n send: \"help.send\",\n help: \"help.help\",\n version: \"help.version\",\n quit: \"help.quit\",\n init: \"help.init\",\n update: \"help.update\",\n locale: \"help.locale\",\n debug: \"help.debug.status\",\n ui: \"help.ui\",\n daemon: \"help.daemon\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n search: \"help.module.search\",\n submit: \"help.module.submit\",\n verify: \"help.module.verify\",\n};\n\nconst MODULE_DESC: Record<string, string> = {\n submit: \"help.module.submit\",\n list: \"help.module.list\",\n info: \"help.module.info\",\n build: \"help.module.build\",\n reload: \"help.module.reload\",\n search: \"help.module.search\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n verify: \"help.module.verify\",\n enable: \"help.module.toggle\",\n disable: \"help.module.toggle\",\n update: \"help.module.update\",\n pin: \"help.module.pin\",\n};\n\nconst PACKS_DESC: Record<string, string> = {\n list: \"help.packs.list\",\n search: \"help.packs.search\",\n enable: \"help.packs.enable\",\n disable: \"help.packs.disable\",\n doctor: \"help.packs.doctor\",\n path: \"help.packs.path\",\n install: \"help.addon\",\n scan: \"help.addon\",\n uninstall: \"help.addon\",\n bind: \"help.addon\",\n unbind: \"help.addon\",\n sources: \"help.addon\",\n check: \"help.addon\",\n update: \"help.addon\",\n bump: \"help.addon\",\n};\n\nfunction serviceArgNodes(): PaletteNode[] {\n return [\n { label: \"-all\", token: \"-all\" },\n ...([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({ label: n, token: n })),\n ];\n}\n\nfunction moduleChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"build\"]);\n return listVisibleModuleSubs(mode).map((sub) => {\n const spec = findModuleSubSpec(sub);\n const node: PaletteNode = {\n label: sub,\n token: sub,\n descKey: MODULE_DESC[sub] ?? \"help.module.list\",\n freeArgs: !noArg.has(sub),\n };\n if (spec?.accent) node.accent = spec.accent;\n return node;\n });\n}\n\n/**\n * \u300C\u76F4\u63A5\u8FD0\u884C\u300D\u9879\uFF1Atoken \u4E3A\u7A7A\uFF0C\u56DE\u8F66\u63D0\u4EA4\u5DF2\u7ECF\u5199\u597D\u7684\u7236\u547D\u4EE4\u3002\n * \u7528\u5728\u65E0\u53C2\u672C\u8EAB\u5C31\u662F\u5408\u6CD5\u547D\u4EE4\u3001\u540C\u65F6\u8FD8\u8981\u5C55\u5F00\u53EF\u9009\u5F00\u5173\u7684\u8282\u70B9\u4E0A\u3002\n */\nfunction asIsNode(\n descKey: string,\n labelKey: \"palette.asIs\" | \"palette.fixOnly\" | \"palette.localeCurrent\" = \"palette.asIs\"\n): PaletteNode {\n return { label: t(labelKey), token: \"\", descKey };\n}\n\n/** `/ui` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\uFF08studio \u542F\u52A8\u7F16\u8F91\u5668\uFF0Cstop \u505C\u6389\u5F53\u524D\u8FDB\u7A0B\u5185\u7684\u670D\u52A1\uFF09\u3002 */\nfunction uiChildNodes(): PaletteNode[] {\n return [\n { label: \"studio\", token: \"studio\", descKey: \"help.ui.studio\" },\n { label: \"stop\", token: \"stop\", descKey: \"help.ui.stop\" },\n ];\n}\n\n/** `/debug` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\uFF1Bsentry on \u4E4B\u540E\u8FD8\u8981\u7C98\u4E0A `--dsn=`\u3002 */\nfunction debugChildNodes(): PaletteNode[] {\n return [\n { label: \"status\", token: \"status\", descKey: \"help.debug.status\" },\n { label: \"enable\", token: \"enable\", descKey: \"help.debug.toggle\" },\n { label: \"disable\", token: \"disable\", descKey: \"help.debug.toggle\" },\n {\n label: \"sentry\",\n token: \"sentry\",\n descKey: \"help.debug.sentry\",\n children: [\n {\n label: \"on\",\n token: \"on\",\n descKey: \"help.debug.sentry.on\",\n children: [{ label: \"--dsn=\", token: \"--dsn=\", descKey: \"help.debug.sentry.on\", freeArgs: true }],\n },\n { label: \"off\", token: \"off\", descKey: \"help.debug.sentry.off\" },\n ],\n },\n ];\n}\n\n/** `/daemon` \u7684\u56FA\u5B9A\u5B50\u547D\u4EE4\u3002\u65E0\u53C2\u7B49\u4EF7\u4E8E status\uFF0C\u9762\u677F\u91CC\u4ECD\u5355\u5217\u51FA\u6765\u3002 */\nfunction daemonChildNodes(): PaletteNode[] {\n return [\n { label: \"status\", token: \"status\", descKey: \"help.daemon.status\" },\n { label: \"stop\", token: \"stop\", descKey: \"help.daemon.stop\" },\n ];\n}\n\n/** `/locale` \u7684\u53EF\u9009\u8BED\u8A00\uFF1B\u7B2C\u4E00\u9879\u4E0D\u5E26\u53C2\u6570\uFF0C\u53EA\u6253\u5370\u5F53\u524D\u8BED\u8A00\u3002 */\nfunction localeChildNodes(): PaletteNode[] {\n return [\n asIsNode(\"help.locale\", \"palette.localeCurrent\"),\n { label: \"zh-CN\", token: \"zh-CN\", descKey: \"locale.opt.zh\" },\n { label: \"en\", token: \"en\", descKey: \"locale.opt.en\" },\n ];\n}\n\n/** `/update` \u7684\u5DF2\u77E5\u5F00\u5173\u3002\u65E0\u53C2\u5C31\u662F\u68C0\u67E5\u5E76\u66F4\u65B0\u3002 */\nfunction updateChildNodes(): PaletteNode[] {\n return [\n asIsNode(\"help.update\"),\n { label: \"--check-only\", token: \"--check-only\", descKey: \"help.update.checkOnly\" },\n { label: \"--force\", token: \"--force\", descKey: \"help.update.force\" },\n { label: \"--no-start\", token: \"--no-start\", descKey: \"help.update.noStart\" },\n { label: \"--channel=release\", token: \"--channel=release\", descKey: \"help.update.channelRelease\" },\n { label: \"--channel=preview\", token: \"--channel=preview\", descKey: \"help.update.channelPreview\" },\n ];\n}\n\n/**\n * `packs doctor` \u7684\u5F00\u5173\u3002\n * \u65E0\u53C2\u53EA\u8BCA\u65AD\uFF1B`--experiments=` \u540E\u9762\u7684\u522B\u540D\u7C98\u5728\u540C\u4E00\u4E2A token \u4E0A\u3002\n */\nfunction doctorNode(): PaletteNode {\n const experimentList: PaletteNode = {\n label: \"--experiments=\",\n token: \"--experiments=\",\n descKey: \"help.packs.doctor.experimentsList\",\n freeArgs: true,\n };\n const allExperiments: PaletteNode = {\n label: \"--all-experiments\",\n token: \"--all-experiments\",\n descKey: \"help.packs.doctor.allExperiments\",\n };\n return {\n label: \"doctor\",\n token: \"doctor\",\n descKey: \"help.packs.doctor\",\n children: [\n asIsNode(\"help.packs.doctor\"),\n {\n label: \"--fix\",\n token: \"--fix\",\n descKey: \"help.packs.doctor.fix\",\n children: [asIsNode(\"help.packs.doctor.fix\", \"palette.fixOnly\"), allExperiments, experimentList],\n },\n allExperiments,\n { label: \"--experiments\", token: \"--experiments\", descKey: \"help.packs.doctor.experiments\" },\n experimentList,\n ],\n };\n}\n\nfunction packsChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"path\", \"sources\"]);\n return listVisiblePacksSubs(mode).map((sub) => {\n if (sub === \"doctor\") return doctorNode();\n return {\n label: sub,\n token: sub,\n descKey: PACKS_DESC[sub] ?? \"help.addon\",\n freeArgs: !noArg.has(sub),\n };\n });\n}\n\n/** \u5C42\u7EA7\u547D\u4EE4\u6811\uFF08REPL \u9762\u677F\u4E3B\u5217\uFF09 */\nexport function listPaletteRoots(mode: CommandMode = \"repl\"): PaletteNode[] {\n const specs = listVisibleCommands(mode);\n const out: PaletteNode[] = [];\n const seen = new Set<string>();\n /** \u9762\u677F\u4E0D\u5C55\u793A\u9876\u5C42\u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u8D70 /module <sub>\uFF08argv \u77ED\u547D\u4EE4\u4ECD\u53EF\u7528\uFF09 */\n const skipTopShorthand = new Set(Object.keys(MODULE_TOP_SHORTHAND));\n\n for (const s of specs) {\n if (s.sub) continue;\n if (s.name === \"module\" || s.name === \"packs\") continue;\n if (skipTopShorthand.has(s.name)) continue;\n if (seen.has(s.name)) continue;\n seen.add(s.name);\n\n const node: PaletteNode = {\n label: `/${s.name}`,\n token: s.name,\n descKey: TOP_DESC[s.name] ?? \"help.help\",\n };\n if (s.accent) node.accent = s.accent;\n\n if (s.name === \"start\" || s.name === \"stop\" || s.name === \"restart\") {\n node.children = serviceArgNodes();\n } else if (s.name === \"send\") {\n node.children = ([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({\n label: n,\n token: n,\n freeArgs: true,\n }));\n } else if (s.name === \"ui\") {\n node.children = uiChildNodes();\n } else if (s.name === \"debug\") {\n node.children = debugChildNodes();\n } else if (s.name === \"daemon\") {\n node.children = daemonChildNodes();\n } else if (s.name === \"locale\") {\n node.children = localeChildNodes();\n } else if (s.name === \"update\") {\n node.children = updateChildNodes();\n } else if (!NO_ARG_TOP.has(s.name)) {\n node.freeArgs = true;\n }\n\n out.push(node);\n }\n\n const moduleSubs = moduleChildNodes(mode);\n if (moduleSubs.length > 0) {\n out.push({\n label: \"/module\",\n token: \"module\",\n descKey: \"help.module.list\",\n children: moduleSubs,\n });\n }\n\n const packsSubs = packsChildNodes(mode);\n if (packsSubs.length > 0) {\n out.push({\n label: \"/packs\",\n token: \"packs\",\n descKey: \"help.addon\",\n children: packsSubs,\n });\n }\n\n return out;\n}\n\n/**\n * \u5DF2\u63D0\u4EA4\u8DEF\u5F84\u7684\u4E0B\u4E00\u53C2 token\uFF0C\u4F9B\u975E `/` \u7070\u5B57\u8865\u5168\u4E0E\u9762\u677F\u5171\u7528\u540C\u4E00\u68F5\u6811\u3002\n * \u6CA1\u6709\u5BF9\u5E94\u8282\u70B9\u65F6\u8FD4\u56DE null\uFF1B\u8282\u70B9\u5B58\u5728\u4F46\u6CA1\u6709\u5B50\u9879\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u3002\n * \u300C\u76F4\u63A5\u8FD0\u884C\u300D\u7684\u7A7A token \u4E0D\u51FA\u73B0\u5728\u8865\u5168\u91CC\u3002\n */\nexport function listNextPaletteTokens(path: readonly string[], mode: CommandMode = \"repl\"): string[] | null {\n if (path.length === 0) return null;\n let current: PaletteNode | undefined = listPaletteRoots(mode).find((n) => n.token === path[0]);\n if (!current) return null;\n for (let i = 1; i < path.length; i++) {\n const token = path[i] ?? \"\";\n const children: readonly PaletteNode[] = current.children ?? [];\n current = children.find((child) => child.token === token);\n if (!current) return null;\n }\n const kids = current.children;\n if (!kids?.length) return [];\n return kids.map((child) => child.token).filter((token) => token.length > 0);\n}\n\nexport function isDevAccent(spec: CommandSpec | undefined): boolean {\n return spec?.accent === \"dev\";\n}\n\n/** sub \u662F\u5426\u4E3A\u5F00\u53D1\u8005\u6837\u5F0F\u547D\u4EE4\uFF08\u84DD\u6807\uFF09\u3002 */\nexport function isDevAccentModuleSub(sub: string | undefined): boolean {\n return isDevAccent(findModuleSubSpec(sub));\n}\n\n/** stdin TTY \u63A2\u6D4B\uFF08\u4F9B main/repl \u5171\u7528\uFF09\u3002 */\nexport function isCliTty(): boolean {\n return Boolean(stdin.isTTY);\n}\n\n/**\n * \u547D\u4EE4\u6CE8\u518C\u8868 \u2014\u2014 \u65B0\u589E\u547D\u4EE4\u53EA\u52A0\u6B64\u5904\uFF08OCP\uFF09\u3002\n * channel:\n * - both: argv + REPL\uFF08\u9ED8\u8BA4\uFF1B\u9762\u677F\u53EA\u8C03\u5EA6\u65E2\u6709 dispatcher\uFF09\n * - repl: \u4EC5 REPL\uFF08\u5982 send / quit\uFF09\n */\nexport const COMMAND_SPECS: readonly CommandSpec[] = [\n /* \u2500\u2500\u2500 both\uFF1A\u670D\u52A1 / \u6A21\u5757 / \u8D44\u6E90\u5305 / \u914D\u7F6E \u2500\u2500\u2500 */\n { id: \"status\", name: \"status\", channel: \"both\" },\n { id: \"start\", name: \"start\", channel: \"both\" },\n { id: \"stop\", name: \"stop\", channel: \"both\" },\n { id: \"restart\", name: \"restart\", channel: \"both\" },\n { id: \"logs\", name: \"logs\", channel: \"repl\" },\n { id: \"help\", name: \"help\", channel: \"both\" },\n { id: \"version\", name: \"version\", channel: \"both\" },\n { id: \"init\", name: \"init\", channel: \"both\", needsTty: true },\n { id: \"update\", name: \"update\", channel: \"both\" },\n { id: \"locale\", name: \"locale\", channel: \"both\" },\n { id: \"daemon\", name: \"daemon\", channel: \"both\" },\n { id: \"debug\", name: \"debug\", channel: \"both\", accent: \"dev\" },\n { id: \"ui\", name: \"ui\", channel: \"both\", accent: \"dev\" },\n\n /** \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module.*\uFF08\u5C11\u5199\u4E00\u5C42 module\uFF09 */\n { id: \"install\", name: \"install\", channel: \"both\" },\n { id: \"uninstall\", name: \"uninstall\", channel: \"both\", aliases: [\"remove\"] },\n { id: \"search\", name: \"search\", channel: \"both\" },\n { id: \"verify\", name: \"verify\", channel: \"both\" },\n\n { id: \"module.list\", name: \"module\", sub: \"list\", channel: \"both\" },\n { id: \"module.info\", name: \"module\", sub: \"info\", channel: \"both\" },\n { id: \"module.build\", name: \"module\", sub: \"build\", channel: \"both\", accent: \"dev\" },\n { id: \"module.reload\", name: \"module\", sub: \"reload\", channel: \"both\", accent: \"dev\" },\n { id: \"module.install\", name: \"module\", sub: \"install\", channel: \"both\" },\n {\n id: \"module.uninstall\",\n name: \"module\",\n sub: \"uninstall\",\n channel: \"both\",\n aliases: [\"remove\"],\n },\n { id: \"module.search\", name: \"module\", sub: \"search\", channel: \"both\" },\n { id: \"module.submit\", name: \"module\", sub: \"submit\", channel: \"both\", accent: \"dev\" },\n { id: \"module.verify\", name: \"module\", sub: \"verify\", channel: \"both\" },\n { id: \"module.enable\", name: \"module\", sub: \"enable\", channel: \"both\" },\n { id: \"module.disable\", name: \"module\", sub: \"disable\", channel: \"both\" },\n { id: \"module.update\", name: \"module\", sub: \"update\", channel: \"both\" },\n { id: \"module.pin\", name: \"module\", sub: \"pin\", channel: \"both\" },\n\n { id: \"packs.list\", name: \"packs\", sub: \"list\", channel: \"both\" },\n { id: \"packs.search\", name: \"packs\", sub: \"search\", channel: \"both\" },\n { id: \"packs.enable\", name: \"packs\", sub: \"enable\", channel: \"both\" },\n { id: \"packs.disable\", name: \"packs\", sub: \"disable\", channel: \"both\" },\n { id: \"packs.doctor\", name: \"packs\", sub: \"doctor\", channel: \"both\" },\n { id: \"packs.path\", name: \"packs\", sub: \"path\", channel: \"both\" },\n { id: \"packs.install\", name: \"packs\", sub: \"install\", channel: \"both\" },\n { id: \"packs.scan\", name: \"packs\", sub: \"scan\", channel: \"both\" },\n { id: \"packs.uninstall\", name: \"packs\", sub: \"uninstall\", channel: \"both\" },\n { id: \"packs.bind\", name: \"packs\", sub: \"bind\", channel: \"both\" },\n { id: \"packs.unbind\", name: \"packs\", sub: \"unbind\", channel: \"both\" },\n { id: \"packs.sources\", name: \"packs\", sub: \"sources\", channel: \"both\" },\n { id: \"packs.check\", name: \"packs\", sub: \"check\", channel: \"both\" },\n { id: \"packs.update\", name: \"packs\", sub: \"update\", channel: \"both\" },\n { id: \"packs.bump\", name: \"packs\", sub: \"bump\", channel: \"both\" },\n\n /* \u2500\u2500\u2500 repl-only \u2500\u2500\u2500 */\n { id: \"send\", name: \"send\", channel: \"repl\" },\n { id: \"quit\", name: \"quit\", channel: \"repl\" },\n];\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,EAAuD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAyCtG;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAYjD;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CA+C7F;AASD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;AA4CD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AA6BD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AA8BD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AA6BD;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAmCD;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAElD;AASD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,EAAuD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAyCtG;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAYjD;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CA+C7F;AASD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;AA4CD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AAiCD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AA8BD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AA6BD;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAmCD;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAElD;AAYD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE"}
package/dist/commands.js CHANGED
@@ -142,7 +142,7 @@ async function cmdStopLocal(raw) {
142
142
  if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
143
143
  STOPPING.add(svc);
144
144
  try {
145
- const kind = await svcObj.stop();
145
+ const kind = await svcObj.stop(true);
146
146
  return formatStopKind(svcObj.title, kind);
147
147
  } catch (e) {
148
148
  return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands.ts"],
4
- "sourcesContent": ["/**\n * commands.ts \u2014 CLI \u6838\u5FC3\u8FD0\u7EF4\u547D\u4EE4\u5B9E\u73B0\n *\n * \u63D0\u4F9B\u547D\u4EE4\u884C\u4E0E REPL \u5171\u4EAB\u7684\u7CFB\u7EDF\u7EA7\u8FD0\u7EF4\u6307\u4EE4\uFF1A\n * - `status`\uFF1A\u67E5\u8BE2\u5168\u90E8\u670D\u52A1\uFF08BDS\u3001db-server\u3001qq-bridge\u3001LLBot\uFF09\u8FD0\u884C\u72B6\u6001\u3001PID\u3001\u8FD0\u884C\u65F6\u957F\u4E0E\u6240\u6709\u6743\n * - `start` / `stop` / `restart`\uFF1A\u6309\u4F9D\u8D56\u987A\u5E8F\u6216\u5355\u4E2A\u63A7\u5236\u670D\u52A1\u542F\u505C\n * - `startAll` / `stopAll`\uFF1A\u6279\u91CF\u7F16\u6392\u63A7\u5236\u6240\u6709\u540E\u53F0\u670D\u52A1\n * - `logs`\uFF1A\u68C0\u7D22\u5E76\u5B9E\u65F6\u8FFD\u8E2A\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u65E5\u5FD7\u6D41\n * - `update`\uFF1A\u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\n */\n\nimport { probeBdsStatus } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\nimport { isDaemonServer } from \"./daemon/role.js\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { findNodeServicePids, type NodeServiceName } from \"./node-service-probe.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { queryServicesRuntime, ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\n\n/**\n * CLI \u4FA7\u7ECF\u5B88\u62A4\u8FDB\u7A0B\u6267\u884C\u5E76\u53D6\u56DE text\uFF1B\u5B88\u62A4\u8FDB\u7A0B\u5185\u76F4\u63A5\u8DD1 localFn\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Astatus/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u5206\u6D41\uFF0C\u907F\u514D CLI \u8FDB\u7A0B\u6301\u6709\u5B50\u8FDB\u7A0B\u3002\n */\nasync function viaDaemonText(\n method: \"status\" | \"start\" | \"stop\" | \"restart\" | \"startAll\" | \"stopAll\" | \"send\" | \"update\",\n localFn: () => Promise<string>,\n params?: { name?: string; message?: string; args?: string[] }\n): Promise<string> {\n if (isDaemonServer()) return localFn();\n const { textViaDaemon, statusTextViaDaemon } = await import(\"./daemon/client.js\");\n if (method === \"status\") return statusTextViaDaemon();\n return textViaDaemon(method, params);\n}\n\nfunction parseService(raw: string): ServiceName | null {\n const s = raw.toLowerCase() as ServiceName;\n if (SERVICE_NAMES.includes(s)) return s;\n return null;\n}\n\nfunction statusLine(\n name: string,\n running: boolean,\n pid: number,\n uptime: string,\n ownership?: \"managed\" | \"external\"\n): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const state = running ? c.green(t(\"svc.state.running\")) : c.dim(t(\"svc.state.stopped\"));\n let owner = c.dim(t(\"svc.owner.none\"));\n if (running && ownership === \"managed\") owner = c.cyan(t(\"svc.owner.managed\"));\n else if (running && ownership === \"external\") owner = c.yellow(t(\"svc.owner.external\"));\n const pidStr = pid ? c.dim(String(pid)) : c.dim(\"\u2014\");\n const upStr = uptime !== \"\u2014\" ? c.dim(uptime) : c.dim(\"\u2014\");\n return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;\n}\n\n/**\n * \u67E5\u8BE2\u5E76\u683C\u5F0F\u5316\u5C55\u793A\u6240\u6709\u540E\u53F0\u670D\u52A1\u7684\u5F53\u524D\u8FD0\u884C\u72B6\u6001\u77E9\u9635\u3002\n *\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u72B6\u6001\u6458\u8981\u6587\u672C\u8868\u683C\u3002\n */\nexport async function cmdStatus(): Promise<string> {\n return viaDaemonText(\"status\", async () => {\n const rows = await queryServicesRuntime();\n const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const ownerH = t(\"svc.col.owner\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return `\\n${c.bold(t(\"svc.header\"))}\\n` + c.dim(header) + \"\\n\" + DIVIDER + \"\\n\" + lines.join(\"\\n\");\n });\n}\n\n/**\n * \u68C0\u7D22\u5E76\u683C\u5F0F\u5316\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u5386\u53F2\u65E5\u5FD7\u884C\uFF08\u652F\u6301 `-n <\u884C\u6570>` \u53CA `-f` \u5B9E\u65F6\u8FFD\u8E2A\uFF09\u3002\n *\n * @param args \u53C2\u6570\u5217\u8868\u3002\n * @param onFollow \u53EF\u9009\u7684\u8DDF\u968F\u6A21\u5F0F\u56DE\u8C03\u3002\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u65E5\u5FD7\u8F93\u51FA\u6587\u672C\u3002\n */\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nfunction isNodeSvc(name: ServiceName): name is NodeServiceName {\n return name === \"db\" || name === \"qq\";\n}\n\n/**\n * \u542F\u52A8\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08bds / db / qq / llbot\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u542F\u52A8\u7ED3\u679C\u63CF\u8FF0\u6587\u672C\u3002\n */\nexport async function cmdStart(raw: string): Promise<string> {\n return viaDaemonText(\"start\", () => cmdStartLocal(raw), { name: raw });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u542F\u52A8\u5355\u670D\u52A1\uFF08\u542B\u5916\u90E8\u63A2\u6D3B\u9632\u53CC\u5F00\uFF09 */\nasync function cmdStartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({ rootDir: ROOT });\n if (probe.state !== \"stopped\") {\n return c.yellow(\n t(\"svc.bdsAlreadyRunning\", {\n pid: String(probe.pid),\n kind: probe.state === \"managed\" ? t(\"svc.running\") : t(\"svc.runningExternal\"),\n })\n );\n }\n }\n // \u5916\u90E8\u5DF2\u5728\u8DD1\uFF1A\u7981\u6B62\u518D spawn\uFF08\u907F\u514D\u53CC db / \u53CC qq\uFF09\n if (isNodeSvc(svc)) {\n const external = await findNodeServicePids(svc);\n if (external.length > 0) {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: String(external.join(\",\")) }));\n }\n }\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n const outcome = await svcObj.start();\n if (outcome.status === \"skipped\") {\n return c.yellow(t(\"svc.skipped\", { title: svcObj.title, reason: outcome.reason }));\n }\n if (outcome.status === \"already\") {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n }\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\n/**\n * \u505C\u6B62\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u652F\u6301\u5BF9\u5916\u90E8\u975E\u6258\u7BA1\u5B9E\u4F8B\u6267\u884C\u7CBE\u51C6\u6E05\u7406\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u505C\u6B62\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdStop(raw: string): Promise<string> {\n return viaDaemonText(\"stop\", () => cmdStopLocal(raw), { name: raw });\n}\n\n/**\n * \u628A Service.stop \u7684\u7ED3\u679C\u7FFB\u6210\u539F\u6765\u7684\u6587\u6848\u3002\n * \u5916\u90E8\u8FDB\u7A0B\u662F\u5426\u88AB\u6E05\u6389\u7531 Service.stop \u51B3\u5B9A\uFF0C\u8FD9\u91CC\u53EA\u8D1F\u8D23\u5C55\u793A\uFF0C\u907F\u514D\u548C stop all / restart \u5404\u5199\u4E00\u5957\u3002\n */\nfunction formatStopKind(title: string, kind: \"managed\" | \"external\" | \"idle\"): string {\n if (kind === \"external\") return c.dim(t(\"svc.stoppedExternal\", { title }));\n if (kind === \"idle\") return c.yellow(t(\"svc.alreadyStopped\", { title }));\n return c.dim(t(\"svc.stoppedMsg\", { title }));\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u505C\u6B62\u5355\u670D\u52A1\uFF08\u542B\u5916\u90E8\u5B9E\u4F8B\u6E05\u7406\uFF09 */\nasync function cmdStopLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n const kind = await svcObj.stop();\n return formatStopKind(svcObj.title, kind);\n } catch (e) {\n return c.red(t(\"svc.stopFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STOPPING.delete(svc);\n }\n}\n\nexport async function cmdSend(raw: string, message: string): Promise<string> {\n return viaDaemonText(\"send\", () => cmdSendLocal(raw, message), { name: raw, message });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u5411\u670D\u52A1 stdin \u5199\u5165\u4E00\u884C */\nasync function cmdSendLocal(raw: string, message: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (svc === \"tunnel\") return c.yellow(t(\"svc.stdinUnavailable\", { title: services[svc].title }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n /* \u5148\u7EDF\u4E00\u63A2\u6D4B\uFF0C\u907F\u514D\u5185\u5B58 running \u4E0E\u771F\u5B9E\u8FDB\u7A0B\u8131\u8282 */\n await queryServicesRuntime();\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n return c.yellow(t(\"svc.stdinUnavailable\", { title: svcObj.title }));\n }\n }\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return \"\";\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\n/**\n * \u91CD\u542F\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u9075\u5FAA stop \u2192 start \u4E25\u8C28\u65F6\u5E8F\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u91CD\u542F\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdRestart(raw: string): Promise<string> {\n return viaDaemonText(\"restart\", () => cmdRestartLocal(raw), { name: raw });\n}\n\n/**\n * \u505C\u6B62\u7ED3\u679C\u662F\u4E0D\u662F\u771F\u6B63\u7684\u5931\u8D25\u3002\n * \u300C\u5DF2\u505C\u6B62 / already stopped\u300D\u91CC\u4E5F\u53EF\u80FD\u5E26\u6709 failed \u5B57\u6837\u7684\u7FFB\u8BD1\u6B8B\u7559\uFF0C\u90A3\u79CD\u4E0D\u7B97\u5931\u8D25\u3002\n */\nfunction isStopFailure(msg: string): boolean {\n return /\u5931\u8D25|failed/i.test(msg) && !/\u5DF2\u505C\u6B62|stopped|already/i.test(msg);\n}\n\n/**\n * \u542F\u52A8\u6CA1\u6709\u771F\u6B63\u62C9\u8D77\u8FDB\u7A0B\uFF1A\u5931\u8D25\u3001\u4ECD\u88AB\u5916\u90E8\u5B9E\u4F8B\u5360\u7528\uFF0C\u6216\u6309\u914D\u7F6E\u8DF3\u8FC7\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Arestart \u4E0D\u80FD\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u62A5\u300C\u5DF2\u91CD\u542F\u300D\u3002\n */\nfunction isStartNotLaunched(msg: string): boolean {\n return /\u5931\u8D25|failed|\u5DF2\u5728\u8FD0\u884C|already running|\u5DF2\u8DF3\u8FC7|skipped/i.test(msg);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u91CD\u542F\u5355\u670D\u52A1\uFF08\u5148\u6309\u4E0E stop \u76F8\u540C\u7684\u89C4\u5219\u6E05\u6389\u5916\u90E8\u5B9E\u4F8B\uFF0C\u518D\u542F\u52A8\uFF09 */\nasync function cmdRestartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const stopMsg = await cmdStopLocal(svc);\n if (isStopFailure(stopMsg)) return stopMsg;\n const startMsg = await cmdStartLocal(svc);\n if (isStartNotLaunched(startMsg)) return startMsg;\n return c.green(t(\"svc.restarted\", { title: services[svc].title }));\n}\n\n/**\n * \u6309\u670D\u52A1\u62D3\u6251\u4F9D\u8D56\u6B21\u5E8F\u6279\u91CF\u542F\u52A8\u6240\u6709\u5DF2\u542F\u7528\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u542F\u52A8\u7ED3\u679C\u7EDF\u8BA1\u62A5\u544A\u6587\u672C\u3002\n */\nexport async function cmdStartAll(): Promise<string> {\n return viaDaemonText(\"startAll\", cmdStartAllLocal);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u542F\u52A8 */\nasync function cmdStartAllLocal(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n const result = await startAll();\n const parts: string[] = [];\n if (result.started.length > 0) {\n parts.push(c.green(t(\"svc.startAll.started\", { list: result.started.join(\", \") })));\n }\n if (result.skipped.length > 0) {\n parts.push(\n c.dim(\n t(\"svc.startAll.skipped\", {\n list: result.skipped.map((s) => `${s.name}(${s.reason})`).join(\"; \"),\n })\n )\n );\n }\n if (result.failed.length > 0) {\n parts.push(\n c.red(\n t(\"svc.startAll.failed\", {\n list: result.failed.map((s) => `${s.name}: ${s.reason}`).join(\"; \"),\n })\n )\n );\n }\n if (parts.length === 0) return c.dim(t(\"svc.startAll.empty\"));\n if (result.failed.length === 0 && result.skipped.length === 0) {\n return c.green(t(\"svc.allStarted\"));\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * \u6279\u91CF\u505C\u6B62\u6240\u6709\u5F53\u524D\u5904\u4E8E\u8FD0\u884C\u6001\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u505C\u6B62\u786E\u8BA4\u6587\u672C\u3002\n */\nexport async function cmdStopAll(): Promise<string> {\n return viaDaemonText(\"stopAll\", cmdStopAllLocal);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u505C\u6B62 */\nasync function cmdStopAllLocal(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * \u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\u6D41\u7A0B\u3002\n *\n * \u8FDB\u7A0B\u7BA1\u7406\u4E0E\u7F16\u6392\u7EA6\u675F\uFF1A\n * - updater \u5B50\u8FDB\u7A0B\u59CB\u7EC8\u9644\u52A0 `--no-start` \u53C2\u6570\uFF0C\u907F\u514D\u7531\u4E8E\u8FDB\u7A0B\u8131\u79BB\u5BFC\u81F4 REPL \u4E22\u5931 PID \u8DDF\u8E2A\u53CA\u6807\u51C6\u8F93\u51FA\n * - \u82E5\u66F4\u65B0\u524D BDS \u5904\u4E8E\u8FD0\u884C\u72B6\u6001\uFF0C\u4E14\u672A\u663E\u5F0F\u6307\u5B9A `--no-start`\uFF0C\u5728\u66F4\u65B0\u843D\u76D8\u90E8\u7F72\u5B8C\u6210\u540E\u7531\u76D1\u7763\u5668\u91CD\u65B0\u5524\u8D77 BDS\n *\n * @param args \u4F20\u9012\u7ED9\u66F4\u65B0\u5668\u7684\u547D\u4EE4\u884C\u53C2\u6570\u3002\n * @returns \u66F4\u65B0\u6267\u884C\u7ED3\u679C\u6458\u8981\u6587\u672C\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n return viaDaemonText(\"update\", () => cmdUpdateLocal(args), { args });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6267\u884C BDS \u66F4\u65B0\uFF08\u9700\u6301\u6709 bds Service \u53E5\u67C4\u4EE5 beginUpdate/endUpdate\uFF09 */\nasync function cmdUpdateLocal(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n // \u66F4\u65B0\u5668\u548C CLI \u5206\u5C5E\u4E0D\u540C\u8FDB\u7A0B\uFF1B\u5148\u6682\u505C CLI \u7684\u5D29\u6E83\u81EA\u542F\uFF0C\u518D\u4EA4\u7ED9\u66F4\u65B0\u5668\u505C\u670D\u3002\n bds.beginUpdate();\n try {\n const bdsProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n const bdsWasRunning = bdsProbe.state !== \"stopped\";\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n const afterProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n if (afterProbe.state !== \"stopped\") {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n bds.endUpdate();\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {\n const afterProbe = await probeBdsStatus({ rootDir: ROOT });\n if (afterProbe.state === \"stopped\") {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n }\n\n return result.out;\n } finally {\n bds.endUpdate();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * commands.ts \u2014 CLI \u6838\u5FC3\u8FD0\u7EF4\u547D\u4EE4\u5B9E\u73B0\n *\n * \u63D0\u4F9B\u547D\u4EE4\u884C\u4E0E REPL \u5171\u4EAB\u7684\u7CFB\u7EDF\u7EA7\u8FD0\u7EF4\u6307\u4EE4\uFF1A\n * - `status`\uFF1A\u67E5\u8BE2\u5168\u90E8\u670D\u52A1\uFF08BDS\u3001db-server\u3001qq-bridge\u3001LLBot\uFF09\u8FD0\u884C\u72B6\u6001\u3001PID\u3001\u8FD0\u884C\u65F6\u957F\u4E0E\u6240\u6709\u6743\n * - `start` / `stop` / `restart`\uFF1A\u6309\u4F9D\u8D56\u987A\u5E8F\u6216\u5355\u4E2A\u63A7\u5236\u670D\u52A1\u542F\u505C\n * - `startAll` / `stopAll`\uFF1A\u6279\u91CF\u7F16\u6392\u63A7\u5236\u6240\u6709\u540E\u53F0\u670D\u52A1\n * - `logs`\uFF1A\u68C0\u7D22\u5E76\u5B9E\u65F6\u8FFD\u8E2A\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u65E5\u5FD7\u6D41\n * - `update`\uFF1A\u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\n */\n\nimport { probeBdsStatus } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\nimport { isDaemonServer } from \"./daemon/role.js\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { findNodeServicePids, type NodeServiceName } from \"./node-service-probe.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { queryServicesRuntime, ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\n\n/**\n * CLI \u4FA7\u7ECF\u5B88\u62A4\u8FDB\u7A0B\u6267\u884C\u5E76\u53D6\u56DE text\uFF1B\u5B88\u62A4\u8FDB\u7A0B\u5185\u76F4\u63A5\u8DD1 localFn\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Astatus/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u5206\u6D41\uFF0C\u907F\u514D CLI \u8FDB\u7A0B\u6301\u6709\u5B50\u8FDB\u7A0B\u3002\n */\nasync function viaDaemonText(\n method: \"status\" | \"start\" | \"stop\" | \"restart\" | \"startAll\" | \"stopAll\" | \"send\" | \"update\",\n localFn: () => Promise<string>,\n params?: { name?: string; message?: string; args?: string[] }\n): Promise<string> {\n if (isDaemonServer()) return localFn();\n const { textViaDaemon, statusTextViaDaemon } = await import(\"./daemon/client.js\");\n if (method === \"status\") return statusTextViaDaemon();\n return textViaDaemon(method, params);\n}\n\nfunction parseService(raw: string): ServiceName | null {\n const s = raw.toLowerCase() as ServiceName;\n if (SERVICE_NAMES.includes(s)) return s;\n return null;\n}\n\nfunction statusLine(\n name: string,\n running: boolean,\n pid: number,\n uptime: string,\n ownership?: \"managed\" | \"external\"\n): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const state = running ? c.green(t(\"svc.state.running\")) : c.dim(t(\"svc.state.stopped\"));\n let owner = c.dim(t(\"svc.owner.none\"));\n if (running && ownership === \"managed\") owner = c.cyan(t(\"svc.owner.managed\"));\n else if (running && ownership === \"external\") owner = c.yellow(t(\"svc.owner.external\"));\n const pidStr = pid ? c.dim(String(pid)) : c.dim(\"\u2014\");\n const upStr = uptime !== \"\u2014\" ? c.dim(uptime) : c.dim(\"\u2014\");\n return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;\n}\n\n/**\n * \u67E5\u8BE2\u5E76\u683C\u5F0F\u5316\u5C55\u793A\u6240\u6709\u540E\u53F0\u670D\u52A1\u7684\u5F53\u524D\u8FD0\u884C\u72B6\u6001\u77E9\u9635\u3002\n *\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u72B6\u6001\u6458\u8981\u6587\u672C\u8868\u683C\u3002\n */\nexport async function cmdStatus(): Promise<string> {\n return viaDaemonText(\"status\", async () => {\n const rows = await queryServicesRuntime();\n const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const ownerH = t(\"svc.col.owner\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return `\\n${c.bold(t(\"svc.header\"))}\\n` + c.dim(header) + \"\\n\" + DIVIDER + \"\\n\" + lines.join(\"\\n\");\n });\n}\n\n/**\n * \u68C0\u7D22\u5E76\u683C\u5F0F\u5316\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u5386\u53F2\u65E5\u5FD7\u884C\uFF08\u652F\u6301 `-n <\u884C\u6570>` \u53CA `-f` \u5B9E\u65F6\u8FFD\u8E2A\uFF09\u3002\n *\n * @param args \u53C2\u6570\u5217\u8868\u3002\n * @param onFollow \u53EF\u9009\u7684\u8DDF\u968F\u6A21\u5F0F\u56DE\u8C03\u3002\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u65E5\u5FD7\u8F93\u51FA\u6587\u672C\u3002\n */\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nfunction isNodeSvc(name: ServiceName): name is NodeServiceName {\n return name === \"db\" || name === \"qq\";\n}\n\n/**\n * \u542F\u52A8\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08bds / db / qq / llbot\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u542F\u52A8\u7ED3\u679C\u63CF\u8FF0\u6587\u672C\u3002\n */\nexport async function cmdStart(raw: string): Promise<string> {\n return viaDaemonText(\"start\", () => cmdStartLocal(raw), { name: raw });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u542F\u52A8\u5355\u670D\u52A1\uFF08\u542B\u5916\u90E8\u63A2\u6D3B\u9632\u53CC\u5F00\uFF09 */\nasync function cmdStartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({ rootDir: ROOT });\n if (probe.state !== \"stopped\") {\n return c.yellow(\n t(\"svc.bdsAlreadyRunning\", {\n pid: String(probe.pid),\n kind: probe.state === \"managed\" ? t(\"svc.running\") : t(\"svc.runningExternal\"),\n })\n );\n }\n }\n // \u5916\u90E8\u5DF2\u5728\u8DD1\uFF1A\u7981\u6B62\u518D spawn\uFF08\u907F\u514D\u53CC db / \u53CC qq\uFF09\n if (isNodeSvc(svc)) {\n const external = await findNodeServicePids(svc);\n if (external.length > 0) {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: String(external.join(\",\")) }));\n }\n }\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n const outcome = await svcObj.start();\n if (outcome.status === \"skipped\") {\n return c.yellow(t(\"svc.skipped\", { title: svcObj.title, reason: outcome.reason }));\n }\n if (outcome.status === \"already\") {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n }\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\n/**\n * \u505C\u6B62\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u652F\u6301\u5BF9\u5916\u90E8\u975E\u6258\u7BA1\u5B9E\u4F8B\u6267\u884C\u7CBE\u51C6\u6E05\u7406\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u505C\u6B62\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdStop(raw: string): Promise<string> {\n return viaDaemonText(\"stop\", () => cmdStopLocal(raw), { name: raw });\n}\n\n/**\n * \u628A Service.stop \u7684\u7ED3\u679C\u7FFB\u6210\u539F\u6765\u7684\u6587\u6848\u3002\n * \u5355\u670D\u52A1\u505C\u6B62\u4F1A\u4F20 external true\uFF0C\u5916\u90E8\u8FDB\u7A0B\u662F\u5426\u88AB\u6E05\u6389\u7531\u8BE5\u6B21 stop \u51B3\u5B9A\uFF1B\u8FD9\u91CC\u53EA\u8D1F\u8D23\u5C55\u793A\u3002\n */\nfunction formatStopKind(title: string, kind: \"managed\" | \"external\" | \"idle\"): string {\n if (kind === \"external\") return c.dim(t(\"svc.stoppedExternal\", { title }));\n if (kind === \"idle\") return c.yellow(t(\"svc.alreadyStopped\", { title }));\n return c.dim(t(\"svc.stoppedMsg\", { title }));\n}\n\n/**\n * \u5B88\u62A4\u8FDB\u7A0B\u5185\u505C\u6B62\u5355\u670D\u52A1\u3002\n * \u4F20 external true\uFF1ABDS \u5916\u90E8\u8D70 killExternalBedrock\uFF0Cdb/qq \u5916\u90E8\u8D70 killNodeServiceByScript\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A`stop <name>`\uFF0C\u4EE5\u53CA `restart <name>`\uFF08cmdRestartLocal \u590D\u7528\u672C\u51FD\u6570\uFF09\u3002\n */\nasync function cmdStopLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n const kind = await svcObj.stop(true);\n return formatStopKind(svcObj.title, kind);\n } catch (e) {\n return c.red(t(\"svc.stopFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STOPPING.delete(svc);\n }\n}\n\nexport async function cmdSend(raw: string, message: string): Promise<string> {\n return viaDaemonText(\"send\", () => cmdSendLocal(raw, message), { name: raw, message });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u5411\u670D\u52A1 stdin \u5199\u5165\u4E00\u884C */\nasync function cmdSendLocal(raw: string, message: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (svc === \"tunnel\") return c.yellow(t(\"svc.stdinUnavailable\", { title: services[svc].title }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n /* \u5148\u7EDF\u4E00\u63A2\u6D4B\uFF0C\u907F\u514D\u5185\u5B58 running \u4E0E\u771F\u5B9E\u8FDB\u7A0B\u8131\u8282 */\n await queryServicesRuntime();\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n return c.yellow(t(\"svc.stdinUnavailable\", { title: svcObj.title }));\n }\n }\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return \"\";\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\n/**\n * \u91CD\u542F\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u9075\u5FAA stop \u2192 start \u4E25\u8C28\u65F6\u5E8F\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u91CD\u542F\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdRestart(raw: string): Promise<string> {\n return viaDaemonText(\"restart\", () => cmdRestartLocal(raw), { name: raw });\n}\n\n/**\n * \u505C\u6B62\u7ED3\u679C\u662F\u4E0D\u662F\u771F\u6B63\u7684\u5931\u8D25\u3002\n * \u300C\u5DF2\u505C\u6B62 / already stopped\u300D\u91CC\u4E5F\u53EF\u80FD\u5E26\u6709 failed \u5B57\u6837\u7684\u7FFB\u8BD1\u6B8B\u7559\uFF0C\u90A3\u79CD\u4E0D\u7B97\u5931\u8D25\u3002\n */\nfunction isStopFailure(msg: string): boolean {\n return /\u5931\u8D25|failed/i.test(msg) && !/\u5DF2\u505C\u6B62|stopped|already/i.test(msg);\n}\n\n/**\n * \u542F\u52A8\u6CA1\u6709\u771F\u6B63\u62C9\u8D77\u8FDB\u7A0B\uFF1A\u5931\u8D25\u3001\u4ECD\u88AB\u5916\u90E8\u5B9E\u4F8B\u5360\u7528\uFF0C\u6216\u6309\u914D\u7F6E\u8DF3\u8FC7\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Arestart \u4E0D\u80FD\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u62A5\u300C\u5DF2\u91CD\u542F\u300D\u3002\n */\nfunction isStartNotLaunched(msg: string): boolean {\n return /\u5931\u8D25|failed|\u5DF2\u5728\u8FD0\u884C|already running|\u5DF2\u8DF3\u8FC7|skipped/i.test(msg);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u91CD\u542F\u5355\u670D\u52A1\uFF08\u5148\u6309\u4E0E stop \u76F8\u540C\u7684\u89C4\u5219\u6E05\u6389\u5916\u90E8\u5B9E\u4F8B\uFF0C\u518D\u542F\u52A8\uFF09 */\nasync function cmdRestartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const stopMsg = await cmdStopLocal(svc);\n if (isStopFailure(stopMsg)) return stopMsg;\n const startMsg = await cmdStartLocal(svc);\n if (isStartNotLaunched(startMsg)) return startMsg;\n return c.green(t(\"svc.restarted\", { title: services[svc].title }));\n}\n\n/**\n * \u6309\u670D\u52A1\u62D3\u6251\u4F9D\u8D56\u6B21\u5E8F\u6279\u91CF\u542F\u52A8\u6240\u6709\u5DF2\u542F\u7528\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u542F\u52A8\u7ED3\u679C\u7EDF\u8BA1\u62A5\u544A\u6587\u672C\u3002\n */\nexport async function cmdStartAll(): Promise<string> {\n return viaDaemonText(\"startAll\", cmdStartAllLocal);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u542F\u52A8 */\nasync function cmdStartAllLocal(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n const result = await startAll();\n const parts: string[] = [];\n if (result.started.length > 0) {\n parts.push(c.green(t(\"svc.startAll.started\", { list: result.started.join(\", \") })));\n }\n if (result.skipped.length > 0) {\n parts.push(\n c.dim(\n t(\"svc.startAll.skipped\", {\n list: result.skipped.map((s) => `${s.name}(${s.reason})`).join(\"; \"),\n })\n )\n );\n }\n if (result.failed.length > 0) {\n parts.push(\n c.red(\n t(\"svc.startAll.failed\", {\n list: result.failed.map((s) => `${s.name}: ${s.reason}`).join(\"; \"),\n })\n )\n );\n }\n if (parts.length === 0) return c.dim(t(\"svc.startAll.empty\"));\n if (result.failed.length === 0 && result.skipped.length === 0) {\n return c.green(t(\"svc.allStarted\"));\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * \u6279\u91CF\u505C\u6B62\u6240\u6709\u5F53\u524D\u5904\u4E8E\u8FD0\u884C\u6001\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u505C\u6B62\u786E\u8BA4\u6587\u672C\u3002\n */\nexport async function cmdStopAll(): Promise<string> {\n return viaDaemonText(\"stopAll\", cmdStopAllLocal);\n}\n\n/**\n * \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u505C\u6B62\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A`stop all`\u3001`restart -all`\u3002\u53EA\u8C03 stopAll()\uFF0C\u7531\u5176\u4F20 external false\uFF0C\u4E0D\u6740\u5916\u90E8\u8FDB\u7A0B\u3002\n */\nasync function cmdStopAllLocal(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * \u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\u6D41\u7A0B\u3002\n *\n * \u8FDB\u7A0B\u7BA1\u7406\u4E0E\u7F16\u6392\u7EA6\u675F\uFF1A\n * - updater \u5B50\u8FDB\u7A0B\u59CB\u7EC8\u9644\u52A0 `--no-start` \u53C2\u6570\uFF0C\u907F\u514D\u7531\u4E8E\u8FDB\u7A0B\u8131\u79BB\u5BFC\u81F4 REPL \u4E22\u5931 PID \u8DDF\u8E2A\u53CA\u6807\u51C6\u8F93\u51FA\n * - \u82E5\u66F4\u65B0\u524D BDS \u5904\u4E8E\u8FD0\u884C\u72B6\u6001\uFF0C\u4E14\u672A\u663E\u5F0F\u6307\u5B9A `--no-start`\uFF0C\u5728\u66F4\u65B0\u843D\u76D8\u90E8\u7F72\u5B8C\u6210\u540E\u7531\u76D1\u7763\u5668\u91CD\u65B0\u5524\u8D77 BDS\n *\n * @param args \u4F20\u9012\u7ED9\u66F4\u65B0\u5668\u7684\u547D\u4EE4\u884C\u53C2\u6570\u3002\n * @returns \u66F4\u65B0\u6267\u884C\u7ED3\u679C\u6458\u8981\u6587\u672C\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n return viaDaemonText(\"update\", () => cmdUpdateLocal(args), { args });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6267\u884C BDS \u66F4\u65B0\uFF08\u9700\u6301\u6709 bds Service \u53E5\u67C4\u4EE5 beginUpdate/endUpdate\uFF09 */\nasync function cmdUpdateLocal(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n // \u66F4\u65B0\u5668\u548C CLI \u5206\u5C5E\u4E0D\u540C\u8FDB\u7A0B\uFF1B\u5148\u6682\u505C CLI \u7684\u5D29\u6E83\u81EA\u542F\uFF0C\u518D\u4EA4\u7ED9\u66F4\u65B0\u5668\u505C\u670D\u3002\n bds.beginUpdate();\n try {\n const bdsProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n const bdsWasRunning = bdsProbe.state !== \"stopped\";\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n const afterProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n if (afterProbe.state !== \"stopped\") {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n bds.endUpdate();\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {\n const afterProbe = await probeBdsStatus({ rootDir: ROOT });\n if (afterProbe.state === \"stopped\") {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n }\n\n return result.out;\n } finally {\n bds.endUpdate();\n }\n}\n"],
5
+ "mappings": "AAWA,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,SAAS;AAClB,SAAS,WAAW,sBAAsB;AAC1C,SAAS,2BAAiD;AAC1D,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB,MAAM,eAAe,gBAAkC;AACtF,SAAS,GAAG,SAAS,kBAAkB,gBAAgB;AAMvD,eAAe,cACb,QACA,SACA,QACiB;AACjB,MAAI,eAAe,EAAG,QAAO,QAAQ;AACrC,QAAM,EAAE,eAAe,oBAAoB,IAAI,MAAM,OAAO,oBAAoB;AAChF,MAAI,WAAW,SAAU,QAAO,oBAAoB;AACpD,SAAO,cAAc,QAAQ,MAAM;AACrC;AAEA,SAAS,aAAa,KAAiC;AACrD,QAAM,IAAI,IAAI,YAAY;AAC1B,MAAI,cAAc,SAAS,CAAC,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,WACP,MACA,SACA,KACA,QACA,WACQ;AACR,QAAM,MAAM,UAAU,EAAE,MAAM,QAAG,IAAI,EAAE,IAAI,QAAG;AAC9C,QAAM,QAAQ,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC;AACtF,MAAI,QAAQ,EAAE,IAAI,EAAE,gBAAgB,CAAC;AACrC,MAAI,WAAW,cAAc,UAAW,SAAQ,EAAE,KAAK,EAAE,mBAAmB,CAAC;AAAA,WACpE,WAAW,cAAc,WAAY,SAAQ,EAAE,OAAO,EAAE,oBAAoB,CAAC;AACtF,QAAM,SAAS,MAAM,EAAE,IAAI,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,QAAG;AACnD,QAAM,QAAQ,WAAW,WAAM,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,QAAG;AACxD,SAAO,KAAK,GAAG,IAAI,EAAE,KAAK,SAAS,MAAM,EAAE,CAAC,CAAC,IAAI,SAAS,OAAO,CAAC,CAAC,IAAI,SAAS,OAAO,CAAC,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC,IAAI,KAAK;AAC3H;AAOA,eAAsB,YAA6B;AACjD,SAAO,cAAc,UAAU,YAAY;AACzC,UAAM,OAAO,MAAM,qBAAqB;AACxC,UAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ,WAAW,IAAI,OAAO,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,CAAC;AACtG,UAAM,QAAQ,EAAE,cAAc;AAC9B,UAAM,UAAU,EAAE,gBAAgB;AAClC,UAAM,SAAS,EAAE,eAAe;AAChC,UAAM,OAAO,EAAE,aAAa;AAC5B,UAAM,MAAM,EAAE,gBAAgB;AAC9B,UAAM,SAAS,KAAK,SAAS,OAAO,EAAE,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC,GAAG,GAAG;AAC9G,WAAO;AAAA,EAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,IAAO,EAAE,IAAI,MAAM,IAAI,OAAO,UAAU,OAAO,MAAM,KAAK,IAAI;AAAA,EACnG,CAAC;AACH;AASO,SAAS,QAAQ,MAAgB,UAAuD;AAC7F,MAAI,IAAI;AACR,MAAI,SAAS;AACb,QAAM,aAAuB,CAAC;AAE9B,aAAW,KAAK,MAAM;AACpB,QAAI,MAAM,KAAM;AAChB,QAAI,MAAM,MAAM;AACd,eAAS;AACT;AAAA,IACF;AACA,eAAW,KAAK,CAAC;AAAA,EACnB;AAGA,QAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,MAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAQ,KAAI,SAAS,KAAK,OAAO,CAAC,KAAK,KAAK,EAAE;AAE/E,QAAM,SAAS,WAAW,CAAC;AAC3B,MAAI,CAAC,OAAQ,QAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC;AAEhD,QAAM,MAAM,aAAa,MAAM;AAC/B,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,QAAQ,MAAM,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AAEzF,QAAM,SAAS,SAAS,GAAG;AAE3B,QAAM,QAAQ,OAAO,cAAc,CAAC;AACpC,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;AAExD,QAAM,SAAS;AAAA,EAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC;AAC9F,QAAM,OAAO,MACV,IAAI,CAAC,MAAM;AACV,UAAM,KAAK,EAAE,IAAI,EAAE,KAAK,mBAAmB,CAAC;AAC5C,UAAM,OAAO,iBAAiB,EAAE,IAAI;AACpC,UAAM,SAAS,EAAE,WAAW,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG;AAC7D,WAAO,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI;AAAA,EAChC,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,SAAS,SAAS,OAAO,UAAU,OAAO,OAAO;AAEvD,MAAI,UAAU,UAAU;AACtB,aAAS,GAAG;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,MAAM,WAAW,oBAAI,IAAiB;AACtC,MAAM,WAAW,oBAAI,IAAiB;AAEtC,SAAS,UAAU,MAA4C;AAC7D,SAAO,SAAS,QAAQ,SAAS;AACnC;AAQA,eAAsB,SAAS,KAA8B;AAC3D,SAAO,cAAc,SAAS,MAAM,cAAc,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC;AACvE;AAGA,eAAe,cAAc,KAA8B;AACzD,QAAM,MAAM,aAAa,GAAG;AAC5B,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACtF,QAAM,SAAS,SAAS,GAAG;AAC3B,MAAI,QAAQ,OAAO;AACjB,UAAM,QAAQ,MAAM,eAAe,EAAE,SAAS,KAAK,CAAC;AACpD,QAAI,MAAM,UAAU,WAAW;AAC7B,aAAO,EAAE;AAAA,QACP,EAAE,yBAAyB;AAAA,UACzB,KAAK,OAAO,MAAM,GAAG;AAAA,UACrB,MAAM,MAAM,UAAU,YAAY,EAAE,aAAa,IAAI,EAAE,qBAAqB;AAAA,QAC9E,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,GAAG,GAAG;AAClB,UAAM,WAAW,MAAM,oBAAoB,GAAG;AAC9C,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;AAAA,IACnG;AAAA,EACF;AACA,MAAI,OAAO,QAAS,QAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC;AACrG,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC;AACrF,WAAS,IAAI,GAAG;AAChB,MAAI;AACF,UAAM,UAAU,MAAM,OAAO,MAAM;AACnC,QAAI,QAAQ,WAAW,WAAW;AAChC,aAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,OAAO,OAAO,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,IACnF;AACA,QAAI,QAAQ,WAAW,WAAW;AAChC,aAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,IACnF;AACA,WAAO,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EAC1D,SAAS,GAAG;AACV,WAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,OAAO,OAAO,SAAU,EAAY,QAAQ,CAAC,CAAC;AAAA,EAC3F,UAAE;AACA,aAAS,OAAO,GAAG;AAAA,EACrB;AACF;AAQA,eAAsB,QAAQ,KAA8B;AAC1D,SAAO,cAAc,QAAQ,MAAM,aAAa,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC;AACrE;AAMA,SAAS,eAAe,OAAe,MAA+C;AACpF,MAAI,SAAS,WAAY,QAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACzE,MAAI,SAAS,OAAQ,QAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,CAAC,CAAC;AACvE,SAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC7C;AAOA,eAAe,aAAa,KAA8B;AACxD,QAAM,MAAM,aAAa,GAAG;AAC5B,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACtF,QAAM,SAAS,SAAS,GAAG;AAC3B,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC;AACrF,WAAS,IAAI,GAAG;AAChB,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,KAAK,IAAI;AACnC,WAAO,eAAe,OAAO,OAAO,IAAI;AAAA,EAC1C,SAAS,GAAG;AACV,WAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,OAAO,OAAO,SAAU,EAAY,QAAQ,CAAC,CAAC;AAAA,EAC1F,UAAE;AACA,aAAS,OAAO,GAAG;AAAA,EACrB;AACF;AAEA,eAAsB,QAAQ,KAAa,SAAkC;AAC3E,SAAO,cAAc,QAAQ,MAAM,aAAa,KAAK,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ,CAAC;AACvF;AAGA,eAAe,aAAa,KAAa,SAAkC;AACzE,QAAM,MAAM,aAAa,GAAG;AAC5B,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACtF,MAAI,QAAQ,SAAU,QAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,SAAS,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/F,MAAI,CAAC,QAAS,QAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC;AACjD,QAAM,SAAS,SAAS,GAAG;AAE3B,QAAM,qBAAqB;AAC3B,MAAI,QAAQ,OAAO;AACjB,UAAM,QAAQ,MAAM,eAAe;AAAA,MACjC,YAAY,OAAO;AAAA,MACnB,UAAU,QAAQ,OAAO,MAAM,KAAK;AAAA,MACpC,SAAS;AAAA,IACX,CAAC;AACD,QAAI,MAAM,UAAU,YAAY;AAC9B,aAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,IACpE;AAAA,EACF;AACA,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,MAAM,MAAO,QAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC;AACxG,MAAI;AACF,WAAO,KAAK,MAAM,MAAM,UAAU,IAAI;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC;AAAA,EACnC;AACF;AAQA,eAAsB,WAAW,KAA8B;AAC7D,SAAO,cAAc,WAAW,MAAM,gBAAgB,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC;AAC3E;AAMA,SAAS,cAAc,KAAsB;AAC3C,SAAO,aAAa,KAAK,GAAG,KAAK,CAAC,uBAAuB,KAAK,GAAG;AACnE;AAMA,SAAS,mBAAmB,KAAsB;AAChD,SAAO,8CAA8C,KAAK,GAAG;AAC/D;AAGA,eAAe,gBAAgB,KAA8B;AAC3D,QAAM,MAAM,aAAa,GAAG;AAC5B,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACtF,QAAM,UAAU,MAAM,aAAa,GAAG;AACtC,MAAI,cAAc,OAAO,EAAG,QAAO;AACnC,QAAM,WAAW,MAAM,cAAc,GAAG;AACxC,MAAI,mBAAmB,QAAQ,EAAG,QAAO;AACzC,SAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,SAAS,GAAG,EAAE,MAAM,CAAC,CAAC;AACnE;AAOA,eAAsB,cAA+B;AACnD,SAAO,cAAc,YAAY,gBAAgB;AACnD;AAGA,eAAe,mBAAoC;AACjD,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAe;AACjD,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,UAAM,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,OAAO,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,EACpF;AACA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,UAAM;AAAA,MACJ,EAAE;AAAA,QACA,EAAE,wBAAwB;AAAA,UACxB,MAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,QACrE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM;AAAA,MACJ,EAAE;AAAA,QACA,EAAE,uBAAuB;AAAA,UACvB,MAAM,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI;AAAA,QACpE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC;AAC5D,MAAI,OAAO,OAAO,WAAW,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC7D,WAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAAA,EACpC;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAOA,eAAsB,aAA8B;AAClD,SAAO,cAAc,WAAW,eAAe;AACjD;AAMA,eAAe,kBAAmC;AAChD,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,eAAe;AAChD,QAAM,QAAQ;AACd,SAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;AAClC;AAYA,eAAsB,UAAU,OAAiB,CAAC,GAAoB;AACpE,SAAO,cAAc,UAAU,MAAM,eAAe,IAAI,GAAG,EAAE,KAAK,CAAC;AACrE;AAGA,eAAe,eAAe,OAAiB,CAAC,GAAoB;AAClE,QAAM,cAAc,KAAK,SAAS,YAAY;AAC9C,QAAM,YAAY,KAAK,SAAS,cAAc;AAC9C,QAAM,YAAY,cAAc,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,YAAY;AAElE,QAAM,MAAM,SAAS;AAErB,MAAI,YAAY;AAChB,MAAI;AACF,UAAM,WAAW,MAAM,eAAe;AAAA,MACpC,YAAY,IAAI;AAAA,MAChB,UAAU,QAAQ,IAAI,MAAM,KAAK;AAAA,MACjC,SAAS;AAAA,IACX,CAAC;AACD,UAAM,gBAAgB,SAAS,UAAU;AAEzC,UAAM,SAAS,MAAM,IAAI,QAA8C,CAAC,YAAY;AAClF,YAAM,OAAO,aAAa,UAAU,WAAW;AAAA,QAC7C,KAAK;AAAA,QACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,aAAa;AAAA,MACf,CAAC;AACD,UAAI,MAAM;AACV,YAAM,YAAY,CAAC,KAAa,UAAkC;AAEhE,cAAM,IAAI,gBAAgB,GAAG;AAC7B,eAAO;AACP,mBAAW,QAAQ,EAChB,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;AAC9B,yBAAe,MAAM,UAAU,KAAK;AAAA,QACtC;AAAA,MACF;AACA,WAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc,UAAU,EAAE,SAAS,GAAG,MAAM,CAAC;AACtE,WAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;AACvE,WAAK,GAAG,QAAQ,CAAC,SAAS;AACxB,YAAI,SAAS,GAAG;AACd,yBAAe,EAAE,oBAAoB,GAAG,UAAU,SAAS;AAC3D,kBAAQ,EAAE,MAAM,GAAG,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE,oBAAoB,EAAE,CAAC;AAAA,QAC7E,OAAO;AACL,kBAAQ,EAAE,MAAM,KAAK,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,QAC7E;AAAA,MACF,CAAC;AACD,WAAK,GAAG,SAAS,CAAC,MAAM;AACtB,uBAAe,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,OAAO;AAC9E,gBAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,MACxE,CAAC;AAAA,IACH,CAAC;AAID,UAAM,YAAY,gBAAgB,OAAO,GAAG;AAC5C,QAAI,OAAO,SAAS,KAAK,aAAa,CAAC,eAAe,CAAC,WAAW;AAChE,YAAM,aAAa,MAAM,eAAe;AAAA,QACtC,YAAY,IAAI;AAAA,QAChB,UAAU,QAAQ,IAAI,MAAM,KAAK;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AACD,UAAI,WAAW,UAAU,WAAW;AAClC,eAAO,OAAO;AAAA,MAChB;AACA,UAAI;AACF,uBAAe,EAAE,oBAAoB,GAAG,UAAU,MAAM;AACxD,YAAI,UAAU;AACd,cAAM,IAAI,MAAM;AAChB,eAAO,OAAO,MAAM,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAAA,MACxD,SAAS,GAAG;AACV,eAAO,OAAO,MAAM,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAU,EAAY,QAAQ,CAAC,CAAC;AAAA,MAC7F;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,KAAK,aAAa,eAAe,eAAe;AAClE,YAAM,aAAa,MAAM,eAAe,EAAE,SAAS,KAAK,CAAC;AACzD,UAAI,WAAW,UAAU,WAAW;AAClC,eAAO,OAAO,MAAM,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC;AAAA,MAClE;AAAA,IACF;AAEA,WAAO,OAAO;AAAA,EAChB,UAAE;AACA,QAAI,UAAU;AAAA,EAChB;AACF;",
6
6
  "names": []
7
7
  }
@@ -8,6 +8,9 @@ import net from "node:net";
8
8
  import type { ServiceStateEvent, ServiceStatus } from "../services.js";
9
9
  import { type DaemonMeta } from "./paths.js";
10
10
  import type { DaemonMethod, DaemonParams, DaemonResult } from "./protocol.js";
11
+ import type { ManagementEvent } from "@sfmc-bds/management";
12
+ export declare function onDaemonManagementEvent(callback: (event: ManagementEvent) => void): () => void;
13
+ export declare function disconnectDaemonClient(): void;
11
14
  /**
12
15
  * 订阅守护进程推送的服务启停事件(CLI 进程用)。
13
16
  * 使用场景:REPL 根据 running 集合刷新发送目标 / 服务窗,无需本地持有 ChildProcess。
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACb,MAAM,eAAe,CAAC;AAiBvB;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1F;AAED,4BAA4B;AAC5B,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,MAAM,UAAS;IAEf,YAAY,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAO7C;IAED,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,OAAO;IAWf,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,SAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBpG;IAED,8BAA8B;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAI/B;IAED,mBAAmB;IACnB,UAAU,IAAI,IAAI,CAQjB;CACF;AAgED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAwC9D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAGnG;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAMpE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAItE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK3D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhG"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACb,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAG9F;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAAyC;AAevF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1F;AAED,4BAA4B;AAC5B,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,MAAM,UAAS;IAEf,YAAY,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAO7C;IAED,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,OAAO;IAWf,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,SAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBpG;IAED,8BAA8B;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAI/B;IAED,mBAAmB;IACnB,UAAU,IAAI,IAAI,CAQjB;CACF;AAoED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAuC9D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAInG;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAMpE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAItE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK3D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhG"}
@@ -3,6 +3,7 @@ import { logsDir } from "@sfmc-bds/sdk/node/config";
3
3
  import { spawn } from "node:child_process";
4
4
  import { randomBytes } from "node:crypto";
5
5
  import fs from "node:fs";
6
+ import path from "node:path";
6
7
  import net from "node:net";
7
8
  import process from "node:process";
8
9
  import { EventEmitter } from "node:events";
@@ -16,6 +17,18 @@ import {
16
17
  } from "./paths.js";
17
18
  import { isLogPayload } from "./protocol.js";
18
19
  import { isDaemonServer } from "./role.js";
20
+ import { fileURLToPath } from "node:url";
21
+ import { maintenanceToken } from "@sfmc-bds/management/node";
22
+ function onDaemonManagementEvent(callback) {
23
+ remoteStateBus.on("management", callback);
24
+ return () => {
25
+ remoteStateBus.off("management", callback);
26
+ };
27
+ }
28
+ function disconnectDaemonClient() {
29
+ shared?.disconnect();
30
+ shared = null;
31
+ }
19
32
  const CALL_TIMEOUT_MS = 12e4;
20
33
  const READY_TIMEOUT_MS = 15e3;
21
34
  const READY_POLL_MS = 150;
@@ -70,6 +83,10 @@ class DaemonConnection {
70
83
  }
71
84
  }
72
85
  handleEvent(ev) {
86
+ if (ev.event === "management") {
87
+ remoteStateBus.emit("management", ev.payload);
88
+ return;
89
+ }
73
90
  if (ev.event === "log" && isLogPayload(ev.payload)) {
74
91
  ingestRemoteLog(ev.payload.text, ev.payload.source, ev.payload.level);
75
92
  return;
@@ -147,7 +164,6 @@ async function tryConnectExisting() {
147
164
  const meta = readDaemonMeta();
148
165
  if (!meta) return null;
149
166
  if (!await isProcessAlive(meta.pid)) {
150
- clearDaemonMeta();
151
167
  return null;
152
168
  }
153
169
  try {
@@ -160,11 +176,16 @@ async function tryConnectExisting() {
160
176
  }
161
177
  }
162
178
  function spawnDaemonProcess() {
163
- const entry = process.argv[1];
179
+ const lockFile = path.join(ROOT, ".sfmc", "maintenance.lock");
180
+ if (fs.existsSync(lockFile)) {
181
+ const owner = JSON.parse(fs.readFileSync(lockFile, "utf8"));
182
+ if ((maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN) !== owner.nonce) throw new Error("\u5B9E\u4F8B\u6B63\u5728\u7EF4\u62A4\uFF1B\u540E\u53F0\u5207\u6362\u5B8C\u6210\u524D\u4E0D\u4F1A\u521B\u5EFA\u53E6\u4E00\u4E2A\u5B88\u62A4\u8FDB\u7A0B");
183
+ }
184
+ const entry = process.env.SFMC_DAEMON_ENTRY ?? fileURLToPath(new URL("../main.js", import.meta.url));
164
185
  if (!entry) throw new Error("cannot resolve sfmc entry for daemon spawn");
165
186
  fs.mkdirSync(logsDir(ROOT), { recursive: true });
166
187
  const logFd = fs.openSync(daemonLogPath(), "a");
167
- const child = spawn(process.execPath, [entry, "--daemon"], {
188
+ const child = spawn(process.env.SFMC_NODE_BINARY ?? process.execPath, [entry, "--daemon"], {
168
189
  detached: true,
169
190
  windowsHide: true,
170
191
  stdio: ["ignore", logFd, logFd],
@@ -200,7 +221,6 @@ async function ensureDaemon() {
200
221
  }
201
222
  throw new Error(`daemon pid ${existing.pid} is alive but pipe is unreachable`);
202
223
  }
203
- clearDaemonMeta();
204
224
  spawnDaemonProcess();
205
225
  const deadline = Date.now() + READY_TIMEOUT_MS;
206
226
  while (Date.now() < deadline) {
@@ -216,7 +236,8 @@ async function ensureDaemon() {
216
236
  }
217
237
  async function callDaemon(method, params) {
218
238
  const conn = await ensureDaemon();
219
- return conn.call(method, params);
239
+ const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;
240
+ return conn.call(method, token ? { ...params, maintenanceToken: token } : params);
220
241
  }
221
242
  async function ensureDaemonSubscription() {
222
243
  const conn = await ensureDaemon();
@@ -228,17 +249,24 @@ async function ensureDaemonSubscription() {
228
249
  async function shutdownDaemon() {
229
250
  try {
230
251
  const conn = await ensureDaemon();
231
- await conn.call("shutdown");
252
+ const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;
253
+ await conn.call("shutdown", token ? { maintenanceToken: token } : void 0);
232
254
  conn.disconnect();
233
255
  } catch (e) {
234
- clearDaemonMeta();
235
- return e instanceof Error ? e.message : String(e);
256
+ const meta = readDaemonMeta();
257
+ if (!meta || !await isProcessAlive(meta.pid)) {
258
+ clearDaemonMeta();
259
+ return "\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62";
260
+ }
261
+ throw e;
236
262
  }
237
263
  const deadline = Date.now() + 5e3;
238
264
  while (Date.now() < deadline) {
239
265
  if (!readDaemonMeta()) break;
240
266
  await new Promise((r) => setTimeout(r, 100));
241
267
  }
268
+ const remaining = readDaemonMeta();
269
+ if (remaining && await isProcessAlive(remaining.pid)) throw new Error("\u5B88\u62A4\u8FDB\u7A0B\u5C1A\u672A\u9000\u51FA\uFF0C\u4FDD\u7559\u8FDE\u63A5\u4FE1\u606F");
242
270
  clearDaemonMeta();
243
271
  return "";
244
272
  }
@@ -261,8 +289,10 @@ async function textViaDaemon(method, params) {
261
289
  }
262
290
  export {
263
291
  callDaemon,
292
+ disconnectDaemonClient,
264
293
  ensureDaemon,
265
294
  ensureDaemonSubscription,
295
+ onDaemonManagementEvent,
266
296
  onRemoteServiceStateChange,
267
297
  queryRuntimeViaDaemon,
268
298
  shutdownDaemon,