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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/dist/argv-parse.d.ts +11 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +28 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +46 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/command-palette.d.ts +61 -0
  10. package/dist/command-palette.d.ts.map +1 -0
  11. package/dist/command-palette.js +352 -0
  12. package/dist/command-palette.js.map +7 -0
  13. package/dist/command-surface.d.ts +85 -0
  14. package/dist/command-surface.d.ts.map +1 -0
  15. package/dist/command-surface.js +292 -0
  16. package/dist/command-surface.js.map +7 -0
  17. package/dist/commands-reload.js +2 -2
  18. package/dist/commands-reload.js.map +2 -2
  19. package/dist/commands.d.ts +1 -1
  20. package/dist/commands.d.ts.map +1 -1
  21. package/dist/commands.js +196 -21
  22. package/dist/commands.js.map +2 -2
  23. package/dist/debug-command.d.ts +5 -0
  24. package/dist/debug-command.d.ts.map +1 -0
  25. package/dist/debug-command.js +118 -0
  26. package/dist/debug-command.js.map +7 -0
  27. package/dist/help-text.d.ts +3 -0
  28. package/dist/help-text.d.ts.map +1 -0
  29. package/dist/help-text.js +160 -0
  30. package/dist/help-text.js.map +7 -0
  31. package/dist/i18n/locales/en.d.ts +103 -89
  32. package/dist/i18n/locales/en.d.ts.map +1 -1
  33. package/dist/i18n/locales/en.js +105 -91
  34. package/dist/i18n/locales/en.js.map +2 -2
  35. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  36. package/dist/i18n/locales/zh-CN.js +138 -118
  37. package/dist/i18n/locales/zh-CN.js.map +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -4
  41. package/dist/index.js.map +2 -2
  42. package/dist/llbot-launch.d.ts +20 -0
  43. package/dist/llbot-launch.d.ts.map +1 -0
  44. package/dist/llbot-launch.js +40 -0
  45. package/dist/llbot-launch.js.map +7 -0
  46. package/dist/log-filter.d.ts +69 -0
  47. package/dist/log-filter.d.ts.map +1 -0
  48. package/dist/log-filter.js +150 -0
  49. package/dist/log-filter.js.map +7 -0
  50. package/dist/logs.d.ts +29 -7
  51. package/dist/logs.d.ts.map +1 -1
  52. package/dist/logs.js +164 -72
  53. package/dist/logs.js.map +3 -3
  54. package/dist/main.js +55 -46
  55. package/dist/main.js.map +2 -2
  56. package/dist/module-commands.d.ts +17 -40
  57. package/dist/module-commands.d.ts.map +1 -1
  58. package/dist/module-commands.js +129 -85
  59. package/dist/module-commands.js.map +2 -2
  60. package/dist/module-pack-build.d.ts +10 -0
  61. package/dist/module-pack-build.d.ts.map +1 -0
  62. package/dist/module-pack-build.js +434 -0
  63. package/dist/module-pack-build.js.map +7 -0
  64. package/dist/module-toggle.d.ts +33 -0
  65. package/dist/module-toggle.d.ts.map +1 -0
  66. package/dist/module-toggle.js +28 -0
  67. package/dist/module-toggle.js.map +7 -0
  68. package/dist/node-service-probe.d.ts +18 -0
  69. package/dist/node-service-probe.d.ts.map +1 -0
  70. package/dist/node-service-probe.js +97 -0
  71. package/dist/node-service-probe.js.map +7 -0
  72. package/dist/pack-lifecycle.d.ts +1 -1
  73. package/dist/pack-lifecycle.d.ts.map +1 -1
  74. package/dist/pack-lifecycle.js +14 -4
  75. package/dist/pack-lifecycle.js.map +2 -2
  76. package/dist/pack-update/index.d.ts +18 -0
  77. package/dist/pack-update/index.d.ts.map +1 -0
  78. package/dist/pack-update/index.js +113 -0
  79. package/dist/pack-update/index.js.map +7 -0
  80. package/dist/registry.d.ts +7 -4
  81. package/dist/registry.d.ts.map +1 -1
  82. package/dist/registry.js +15 -3
  83. package/dist/registry.js.map +2 -2
  84. package/dist/repl-windows/format-display.d.ts +10 -0
  85. package/dist/repl-windows/format-display.d.ts.map +1 -0
  86. package/dist/repl-windows/format-display.js +57 -0
  87. package/dist/repl-windows/format-display.js.map +7 -0
  88. package/dist/repl-windows/host.d.ts +60 -0
  89. package/dist/repl-windows/host.d.ts.map +1 -0
  90. package/dist/repl-windows/host.js +179 -0
  91. package/dist/repl-windows/host.js.map +7 -0
  92. package/dist/repl-windows/index.d.ts +9 -0
  93. package/dist/repl-windows/index.d.ts.map +1 -0
  94. package/dist/repl-windows/index.js +13 -0
  95. package/dist/repl-windows/index.js.map +7 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  97. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  98. package/dist/repl-windows/logs-filter-window.js +77 -0
  99. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  100. package/dist/repl-windows/service-window.d.ts +4 -0
  101. package/dist/repl-windows/service-window.d.ts.map +1 -0
  102. package/dist/repl-windows/service-window.js +35 -0
  103. package/dist/repl-windows/service-window.js.map +7 -0
  104. package/dist/repl-windows/types.d.ts +56 -0
  105. package/dist/repl-windows/types.d.ts.map +1 -0
  106. package/dist/repl-windows/types.js +1 -0
  107. package/dist/repl-windows/types.js.map +7 -0
  108. package/dist/repl.d.ts +6 -9
  109. package/dist/repl.d.ts.map +1 -1
  110. package/dist/repl.js +698 -427
  111. package/dist/repl.js.map +3 -3
  112. package/dist/runtime.d.ts +6 -13
  113. package/dist/runtime.d.ts.map +1 -1
  114. package/dist/runtime.js +23 -28
  115. package/dist/runtime.js.map +2 -2
  116. package/dist/send-target.d.ts +11 -0
  117. package/dist/send-target.d.ts.map +1 -0
  118. package/dist/send-target.js +42 -0
  119. package/dist/send-target.js.map +7 -0
  120. package/dist/services.d.ts +50 -4
  121. package/dist/services.d.ts.map +1 -1
  122. package/dist/services.js +244 -20
  123. package/dist/services.js.map +2 -2
  124. package/dist/theme.js +1 -1
  125. package/dist/theme.js.map +2 -2
  126. package/dist/wizard.d.ts.map +1 -1
  127. package/dist/wizard.js +76 -16
  128. package/dist/wizard.js.map +2 -2
  129. package/dist/world-packs.d.ts +15 -0
  130. package/dist/world-packs.d.ts.map +1 -1
  131. package/dist/world-packs.js +90 -87
  132. package/dist/world-packs.js.map +2 -2
  133. package/package.json +24 -21
  134. package/scripts/module-install/check-modules.mjs +204 -0
  135. package/scripts/module-install/fetch-module.mjs +1007 -0
  136. package/scripts/module-install/install-resolver.test.mjs +48 -0
  137. package/scripts/module-install/lib/catalog.mjs +96 -0
  138. package/scripts/module-install/lib/io.mjs +37 -0
  139. package/scripts/module-install/lib/link-from.mjs +80 -0
  140. package/scripts/module-install/lib/lock.mjs +78 -0
  141. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  142. package/scripts/module-install/lib/packages.mjs +142 -0
  143. package/scripts/module-install/lib/paths.mjs +48 -0
  144. package/scripts/module-install/lib/registry-index.mjs +50 -0
  145. package/scripts/module-install/link-local.test.mjs +51 -0
  146. package/scripts/module-install/local-resolver.test.mjs +51 -0
  147. package/scripts/module-install/registry-index.test.mjs +28 -0
  148. package/dist/module-wizard.d.ts +0 -14
  149. package/dist/module-wizard.d.ts.map +0 -1
  150. package/dist/module-wizard.js +0 -313
  151. package/dist/module-wizard.js.map +0 -7
  152. package/dist/pack-update/bindings.d.ts +0 -12
  153. package/dist/pack-update/bindings.d.ts.map +0 -1
  154. package/dist/pack-update/bindings.js +0 -64
  155. package/dist/pack-update/bindings.js.map +0 -7
  156. package/dist/pack-update/config.d.ts +0 -22
  157. package/dist/pack-update/config.d.ts.map +0 -1
  158. package/dist/pack-update/config.js +0 -141
  159. package/dist/pack-update/config.js.map +0 -7
  160. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  161. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  162. package/dist/pack-update/providers/curseforge.js +0 -209
  163. package/dist/pack-update/providers/curseforge.js.map +0 -7
  164. package/dist/pack-update/providers/index.d.ts +0 -16
  165. package/dist/pack-update/providers/index.d.ts.map +0 -1
  166. package/dist/pack-update/providers/index.js +0 -37
  167. package/dist/pack-update/providers/index.js.map +0 -7
  168. package/dist/pack-update/service.d.ts +0 -21
  169. package/dist/pack-update/service.d.ts.map +0 -1
  170. package/dist/pack-update/service.js +0 -567
  171. package/dist/pack-update/service.js.map +0 -7
  172. package/dist/pack-update/types.d.ts +0 -126
  173. package/dist/pack-update/types.d.ts.map +0 -1
  174. package/dist/pack-update/types.js +0 -8
  175. package/dist/pack-update/types.js.map +0 -7
  176. package/dist/pack-update/version-policy.d.ts +0 -80
  177. package/dist/pack-update/version-policy.d.ts.map +0 -1
  178. package/dist/pack-update/version-policy.js +0 -216
  179. package/dist/pack-update/version-policy.js.map +0 -7
  180. package/dist/remote-agent.d.ts +0 -18
  181. package/dist/remote-agent.d.ts.map +0 -1
  182. package/dist/remote-agent.js +0 -196
  183. package/dist/remote-agent.js.map +0 -7
package/dist/commands.js CHANGED
@@ -1,35 +1,70 @@
1
+ import { killBedrockServerByImage, probeBdsStatus, clearBdsPidFile } from "@sfmc-bds/bds-tools/process-probe";
2
+ import {
3
+ DEFAULT_QQ_CONFIG,
4
+ loadEnsuredConfig,
5
+ qqRuntimeStatusPath
6
+ } from "@sfmc-bds/sdk/node/config";
7
+ import { findNodeServicePids, killNodeServiceByScript } from "./node-service-probe.js";
1
8
  import { pushLog as pushUnifiedLog } from "./logs.js";
2
9
  import { t } from "./i18n/index.js";
3
10
  import { spawnService } from "./runtime.js";
4
- import { ROOT, SERVICE_NAMES, services } from "./services.js";
5
- import { c, DIVIDER, highlightLogLine } from "./theme.js";
11
+ import { ROOT, SERVICE_NAMES, queryServicesRuntime, services } from "./services.js";
12
+ import { c, DIVIDER, highlightLogLine, padRight } from "./theme.js";
6
13
  import { stripTaskbarOsc } from "@sfmc-bds/bds-tools/taskbar";
7
14
  import { didUpdateDeploy } from "@sfmc-bds/bds-tools/update-result";
15
+ import fs from "node:fs";
8
16
  function parseService(raw) {
9
17
  const s = raw.toLowerCase();
10
18
  if (SERVICE_NAMES.includes(s)) return s;
11
19
  return null;
12
20
  }
13
- function statusLine(name, running, pid, uptime) {
21
+ function statusLine(name, running, pid, uptime, ownership) {
14
22
  const dot = running ? c.green("\u25CF") : c.dim("\u25CB");
15
- const status = running ? c.green(t("svc.running")) : c.dim(t("svc.stopped"));
23
+ const state = running ? c.green(t("svc.state.running")) : c.dim(t("svc.state.stopped"));
24
+ let owner = c.dim(t("svc.owner.none"));
25
+ if (running && ownership === "managed") owner = c.cyan(t("svc.owner.managed"));
26
+ else if (running && ownership === "external") owner = c.yellow(t("svc.owner.external"));
16
27
  const pidStr = pid ? c.dim(String(pid)) : c.dim("\u2014");
17
28
  const upStr = uptime !== "\u2014" ? c.dim(uptime) : c.dim("\u2014");
18
- return ` ${dot} ${c.bold(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;
29
+ return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;
19
30
  }
20
- function cmdStatus() {
21
- const lines = SERVICE_NAMES.map((name) => {
22
- const s = services[name];
23
- return statusLine(s.title, s.running, s.pid, s.uptime);
24
- });
31
+ function qqBridgeStatusFooter() {
32
+ const qqCfg = loadEnsuredConfig(
33
+ ROOT,
34
+ "qq_config.json",
35
+ "qq_config",
36
+ { ...DEFAULT_QQ_CONFIG }
37
+ );
38
+ const backend = qqCfg.qq_backend === "llbot" ? "llbot" : "official";
39
+ const enabled = qqCfg.qq_enabled !== false;
40
+ if (backend === "llbot") {
41
+ const group = qqCfg.qq_group_id || "\u2014";
42
+ const pathHint = qqCfg.llbot_path ? String(qqCfg.llbot_path) : "\u2014";
43
+ return `
44
+ ${c.dim(t("svc.qq.footer.llbot", { enabled: enabled ? "on" : "off", group, path: pathHint }))}
45
+ `;
46
+ }
47
+ const appId = String(qqCfg.qq_app_id ?? "").trim();
48
+ const appIdHint = appId ? appId.length > 8 ? `${appId.slice(0, 4)}\u2026${appId.slice(-4)}` : appId : "\u2014";
49
+ const openid = String(qqCfg.qq_group_openid ?? "").trim() || "\u2014";
50
+ const sandbox = qqCfg.qq_sandbox ? "sandbox" : "prod";
51
+ const creds = appId && String(qqCfg.qq_app_secret ?? "").trim() ? "ok" : "missing";
52
+ return `
53
+ ${c.dim(t("svc.qq.footer.official", { enabled: enabled ? "on" : "off", appId: appIdHint, openid, sandbox, creds }))}
54
+ `;
55
+ }
56
+ async function cmdStatus() {
57
+ const rows = await queryServicesRuntime();
58
+ const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));
25
59
  const nameH = t("svc.col.name");
26
60
  const statusH = t("svc.col.status");
61
+ const ownerH = t("svc.col.owner");
27
62
  const pidH = t("svc.col.pid");
28
63
  const upH = t("svc.col.uptime");
64
+ const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;
29
65
  return `
30
66
  ${c.bold(t("svc.header"))}
31
- ` + c.dim(` ${nameH}${" ".repeat(Math.max(1, 11 - nameH.length))}${statusH}${" ".repeat(Math.max(1, 10 - statusH.length))}${pidH}${" ".repeat(Math.max(1, 7 - pidH.length))}${upH}
32
- `) + DIVIDER + "\n" + lines.join("\n") + "\n";
67
+ ` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n") + qqBridgeStatusFooter();
33
68
  }
34
69
  function cmdLogs(args, onFollow) {
35
70
  let n = 20;
@@ -69,15 +104,50 @@ ${c.bold(t("svc.logs.header", { title: svcObj.title, count: lines.length }))}`;
69
104
  }
70
105
  const STARTING = /* @__PURE__ */ new Set();
71
106
  const STOPPING = /* @__PURE__ */ new Set();
107
+ function isNodeSvc(name) {
108
+ return name === "db" || name === "qq";
109
+ }
110
+ function clearQqRuntimeFile() {
111
+ try {
112
+ const file = qqRuntimeStatusPath(ROOT);
113
+ if (fs.existsSync(file)) fs.unlinkSync(file);
114
+ } catch {
115
+ }
116
+ }
72
117
  async function cmdStart(raw) {
73
118
  const svc = parseService(raw);
74
119
  if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
75
120
  const svcObj = services[svc];
121
+ if (svc === "bds") {
122
+ const probe = await probeBdsStatus({ rootDir: ROOT });
123
+ if (probe.state !== "stopped") {
124
+ return c.yellow(
125
+ t("svc.bdsAlreadyRunning", {
126
+ pid: String(probe.pid),
127
+ kind: probe.state === "managed" ? t("svc.running") : t("svc.runningExternal")
128
+ })
129
+ );
130
+ }
131
+ }
132
+ if (isNodeSvc(svc)) {
133
+ const external = await findNodeServicePids(svc);
134
+ if (external.length > 0) {
135
+ return c.yellow(
136
+ t("svc.alreadyRunning", { title: svcObj.title, pid: String(external.join(",")) })
137
+ );
138
+ }
139
+ }
76
140
  if (svcObj.running) return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
77
141
  if (STARTING.has(svc)) return c.dim(t("svc.alreadyStarting", { title: svcObj.title }));
78
142
  STARTING.add(svc);
79
143
  try {
80
- await svcObj.start();
144
+ const outcome = await svcObj.start();
145
+ if (outcome.status === "skipped") {
146
+ return c.yellow(t("svc.skipped", { title: svcObj.title, reason: outcome.reason }));
147
+ }
148
+ if (outcome.status === "already") {
149
+ return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
150
+ }
81
151
  return c.green(t("svc.started", { title: svcObj.title }));
82
152
  } catch (e) {
83
153
  return c.red(t("svc.startFailed", { title: svcObj.title, message: e.message }));
@@ -89,6 +159,49 @@ async function cmdStop(raw) {
89
159
  const svc = parseService(raw);
90
160
  if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
91
161
  const svcObj = services[svc];
162
+ if (svc === "bds") {
163
+ const probe = await probeBdsStatus({
164
+ managedPid: svcObj.pid,
165
+ hasStdin: Boolean(svcObj.proc?.stdin),
166
+ rootDir: ROOT
167
+ });
168
+ if (probe.state === "external") {
169
+ if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
170
+ STOPPING.add(svc);
171
+ try {
172
+ await killBedrockServerByImage();
173
+ clearBdsPidFile(ROOT);
174
+ return c.dim(t("svc.stoppedExternal", { title: svcObj.title }));
175
+ } catch (e) {
176
+ return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
177
+ } finally {
178
+ STOPPING.delete(svc);
179
+ }
180
+ }
181
+ }
182
+ if (isNodeSvc(svc)) {
183
+ if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
184
+ STOPPING.add(svc);
185
+ try {
186
+ const managed = svcObj.running;
187
+ if (managed) {
188
+ await svcObj.stop();
189
+ }
190
+ const killed = await killNodeServiceByScript(svc);
191
+ if (svc === "qq") clearQqRuntimeFile();
192
+ if (!managed && killed.length === 0) {
193
+ return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
194
+ }
195
+ if (!managed && killed.length > 0) {
196
+ return c.dim(t("svc.stoppedExternal", { title: svcObj.title }));
197
+ }
198
+ return c.dim(t("svc.stoppedMsg", { title: svcObj.title }));
199
+ } catch (e) {
200
+ return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
201
+ } finally {
202
+ STOPPING.delete(svc);
203
+ }
204
+ }
92
205
  if (!svcObj.running) return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
93
206
  if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
94
207
  STOPPING.add(svc);
@@ -106,10 +219,21 @@ async function cmdSend(raw, message) {
106
219
  if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
107
220
  if (!message) return c.yellow(t("svc.send.usage"));
108
221
  const svcObj = services[svc];
222
+ await queryServicesRuntime();
223
+ if (svc === "bds") {
224
+ const probe = await probeBdsStatus({
225
+ managedPid: svcObj.pid,
226
+ hasStdin: Boolean(svcObj.proc?.stdin),
227
+ rootDir: ROOT
228
+ });
229
+ if (probe.state === "external") {
230
+ return c.yellow(t("svc.stdinUnavailable", { title: svcObj.title }));
231
+ }
232
+ }
109
233
  if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t("svc.notRunning", { title: svcObj.title }));
110
234
  try {
111
235
  svcObj.proc.stdin.write(message + "\n");
112
- return c.dim(t("svc.sent", { name: svc }));
236
+ return "";
113
237
  } catch {
114
238
  return c.red(t("svc.writeFailed"));
115
239
  }
@@ -117,9 +241,21 @@ async function cmdSend(raw, message) {
117
241
  async function cmdRestart(raw) {
118
242
  const svc = parseService(raw);
119
243
  if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
244
+ if (svc === "bds" || isNodeSvc(svc)) {
245
+ const stopMsg = await cmdStop(svc);
246
+ const startMsg = await cmdStart(svc);
247
+ if (/失败|failed/i.test(stopMsg) && !/已停止|stopped|already/i.test(stopMsg)) {
248
+ return stopMsg;
249
+ }
250
+ if (/失败|failed/i.test(startMsg)) return startMsg;
251
+ return c.green(t("svc.restarted", { title: services[svc].title }));
252
+ }
120
253
  const svcObj = services[svc];
121
254
  try {
122
- await svcObj.restart();
255
+ const outcome = await svcObj.restart();
256
+ if (outcome.status === "skipped") {
257
+ return c.yellow(t("svc.skipped", { title: svcObj.title, reason: outcome.reason }));
258
+ }
123
259
  return c.green(t("svc.restarted", { title: svcObj.title }));
124
260
  } catch (e) {
125
261
  return c.red(t("svc.restartFailed", { title: svcObj.title, message: e.message }));
@@ -127,8 +263,34 @@ async function cmdRestart(raw) {
127
263
  }
128
264
  async function cmdStartAll() {
129
265
  const { startAll } = await import("./services.js");
130
- await startAll();
131
- return c.green(t("svc.allStarted"));
266
+ const result = await startAll();
267
+ const parts = [];
268
+ if (result.started.length > 0) {
269
+ parts.push(c.green(t("svc.startAll.started", { list: result.started.join(", ") })));
270
+ }
271
+ if (result.skipped.length > 0) {
272
+ parts.push(
273
+ c.dim(
274
+ t("svc.startAll.skipped", {
275
+ list: result.skipped.map((s) => `${s.name}(${s.reason})`).join("; ")
276
+ })
277
+ )
278
+ );
279
+ }
280
+ if (result.failed.length > 0) {
281
+ parts.push(
282
+ c.red(
283
+ t("svc.startAll.failed", {
284
+ list: result.failed.map((s) => `${s.name}: ${s.reason}`).join("; ")
285
+ })
286
+ )
287
+ );
288
+ }
289
+ if (parts.length === 0) return c.dim(t("svc.startAll.empty"));
290
+ if (result.failed.length === 0 && result.skipped.length === 0) {
291
+ return c.green(t("svc.allStarted"));
292
+ }
293
+ return parts.join("\n");
132
294
  }
133
295
  async function cmdStopAll() {
134
296
  const { stopAll } = await import("./services.js");
@@ -140,7 +302,12 @@ async function cmdUpdate(args = []) {
140
302
  const checkOnly = args.includes("--check-only");
141
303
  const spawnArgs = userNoStart ? [...args] : [...args, "--no-start"];
142
304
  const bds = services.bds;
143
- const bdsWasRunning = bds.running;
305
+ const bdsProbe = await probeBdsStatus({
306
+ managedPid: bds.pid,
307
+ hasStdin: Boolean(bds.proc?.stdin),
308
+ rootDir: ROOT
309
+ });
310
+ const bdsWasRunning = bdsProbe.state !== "stopped";
144
311
  const result = await new Promise((resolve) => {
145
312
  const proc = spawnService("update", spawnArgs, {
146
313
  cwd: ROOT,
@@ -171,7 +338,12 @@ async function cmdUpdate(args = []) {
171
338
  });
172
339
  const didDeploy = didUpdateDeploy(result.out);
173
340
  if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {
174
- if (bds.running) {
341
+ const afterProbe = await probeBdsStatus({
342
+ managedPid: bds.pid,
343
+ hasStdin: Boolean(bds.proc?.stdin),
344
+ rootDir: ROOT
345
+ });
346
+ if (afterProbe.state !== "stopped") {
175
347
  return result.out;
176
348
  }
177
349
  try {
@@ -182,8 +354,11 @@ async function cmdUpdate(args = []) {
182
354
  return result.out + "\n" + c.red(t("svc.bdsStartFailed", { message: e.message }));
183
355
  }
184
356
  }
185
- if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning && !bds.running) {
186
- return result.out + "\n" + c.yellow(t("svc.bdsStoppedForUpdate"));
357
+ if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {
358
+ const afterProbe = await probeBdsStatus({ rootDir: ROOT });
359
+ if (afterProbe.state === "stopped") {
360
+ return result.out + "\n" + c.yellow(t("svc.bdsStoppedForUpdate"));
361
+ }
187
362
  }
188
363
  return result.out;
189
364
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands.ts"],
4
- "sourcesContent": ["import { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { t } from \"./i18n/index.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine } from \"./theme.js\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\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(name: string, running: boolean, pid: number, uptime: string): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const status = running ? c.green(t(\"svc.running\")) : c.dim(t(\"svc.stopped\"));\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(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;\n}\n\nexport function cmdStatus(): string {\n const lines = SERVICE_NAMES.map((name) => {\n const s = services[name];\n return statusLine(s.title, s.running, s.pid, s.uptime);\n });\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n return (\n `\\n${c.bold(t(\"svc.header\"))}\\n` +\n c.dim(` ${nameH}${\" \".repeat(Math.max(1, 11 - nameH.length))}${statusH}${\" \".repeat(Math.max(1, 10 - statusH.length))}${pidH}${\" \".repeat(Math.max(1, 7 - pidH.length))}${upH}\\n`) +\n DIVIDER +\n \"\\n\" +\n lines.join(\"\\n\") +\n \"\\n\"\n );\n}\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\nexport async function cmdStart(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 (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 await svcObj.start();\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\nexport async function cmdStop(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 (!svcObj.running) return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await svcObj.stop();\n return c.dim(t(\"svc.stoppedMsg\", { title: svcObj.title }));\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 const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\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 c.dim(t(\"svc.sent\", { name: svc }));\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\nexport async function cmdRestart(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 try {\n await svcObj.restart();\n return c.green(t(\"svc.restarted\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.restartFailed\", { title: svcObj.title, message: (e as Error).message }));\n }\n}\n\nexport async function cmdStartAll(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n await startAll();\n return c.green(t(\"svc.allStarted\"));\n}\n\nexport async function cmdStopAll(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * BDS \u66F4\u65B0\uFF1A\u5B50\u8FDB\u7A0B\u59CB\u7EC8 --no-start\uFF0C\u7531 sfmc \u76D1\u7763\u5668\u63A5\u7BA1\u542F\u505C\u4E0E\u65E5\u5FD7\u3002\n * \uFF08updater \u5185 detached \u81EA\u542F\u4F1A\u5BFC\u81F4 REPL \u4E22 PID / \u65E0 stdout\uFF09\n *\n * \u4E0D\u505C\u670D\u9884\u64CD\u4F5C\uFF1A\u771F\u6B63\u9700\u8981\u66F4\u65B0\u65F6\u7531 updater \u505C\u670D\uFF1B\u5DF2\u662F\u6700\u65B0\u5219\u4E0D\u5F71\u54CD\u6B63\u5728\u8DD1\u7684 BDS\u3002\n * \u66F4\u65B0\u6210\u529F\u540E\u82E5\u672A\u6307\u5B9A --no-start\uFF0C\u518D\u7531\u76D1\u7763\u5668 `start bds`\uFF08\u63A5\u7BA1 PID + \u65E5\u5FD7\u7BA1\u9053\uFF09\u3002\n */\nexport async function cmdUpdate(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 const bdsWasRunning = bds.running;\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 });\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 if (bds.running) {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\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 && !bds.running) {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n\n return result.out;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { killBedrockServerByImage, probeBdsStatus, clearBdsPidFile } from \"@sfmc-bds/bds-tools/process-probe\";\nimport {\n DEFAULT_QQ_CONFIG,\n loadEnsuredConfig,\n qqRuntimeStatusPath,\n type QQBridgeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { findNodeServicePids, killNodeServiceByScript, type NodeServiceName } from \"./node-service-probe.js\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { t } from \"./i18n/index.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { ROOT, SERVICE_NAMES, queryServicesRuntime, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\nimport fs from \"node:fs\";\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/** status \u9875\u811A\uFF1AQQ \u540E\u7AEF\u4E0E\u5173\u952E\u6458\u8981\uFF08\u5BC6\u94A5\u8131\u654F\uFF09 */\nfunction qqBridgeStatusFooter(): string {\n const qqCfg = loadEnsuredConfig(\n ROOT,\n \"qq_config.json\",\n \"qq_config\",\n { ...DEFAULT_QQ_CONFIG } as Record<string, unknown>\n ) as QQBridgeConfig;\n const backend = qqCfg.qq_backend === \"llbot\" ? \"llbot\" : \"official\";\n const enabled = qqCfg.qq_enabled !== false;\n if (backend === \"llbot\") {\n const group = qqCfg.qq_group_id || \"\u2014\";\n const pathHint = qqCfg.llbot_path ? String(qqCfg.llbot_path) : \"\u2014\";\n return (\n `\\n${c.dim(t(\"svc.qq.footer.llbot\", { enabled: enabled ? \"on\" : \"off\", group, path: pathHint }))}\\n`\n );\n }\n const appId = String(qqCfg.qq_app_id ?? \"\").trim();\n const appIdHint = appId ? (appId.length > 8 ? `${appId.slice(0, 4)}\u2026${appId.slice(-4)}` : appId) : \"\u2014\";\n const openid = String(qqCfg.qq_group_openid ?? \"\").trim() || \"\u2014\";\n const sandbox = qqCfg.qq_sandbox ? \"sandbox\" : \"prod\";\n const creds = appId && String(qqCfg.qq_app_secret ?? \"\").trim() ? \"ok\" : \"missing\";\n return (\n `\\n${c.dim(t(\"svc.qq.footer.official\", { enabled: enabled ? \"on\" : \"off\", appId: appIdHint, openid, sandbox, creds }))}\\n`\n );\n}\n\nexport async function cmdStatus(): Promise<string> {\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 =\n ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return (\n `\\n${c.bold(t(\"svc.header\"))}\\n` +\n c.dim(header) +\n \"\\n\" +\n DIVIDER +\n \"\\n\" +\n lines.join(\"\\n\") +\n qqBridgeStatusFooter()\n );\n}\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\nfunction clearQqRuntimeFile(): void {\n try {\n const file = qqRuntimeStatusPath(ROOT);\n if (fs.existsSync(file)) fs.unlinkSync(file);\n } catch {\n /* ignore */\n }\n}\n\nexport async function cmdStart(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(\n t(\"svc.alreadyRunning\", { title: svcObj.title, pid: String(external.join(\",\")) })\n );\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\nexport async function cmdStop(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({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await killBedrockServerByImage();\n clearBdsPidFile(ROOT);\n return c.dim(t(\"svc.stoppedExternal\", { title: svcObj.title }));\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 }\n\n // db / qq\uFF1A\u6258\u7BA1\u6216\u5916\u90E8\u90FD\u8981\u80FD\u505C\u5E72\u51C0\n if (isNodeSvc(svc)) {\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n const managed = svcObj.running;\n if (managed) {\n await svcObj.stop();\n }\n const killed = await killNodeServiceByScript(svc);\n if (svc === \"qq\") clearQqRuntimeFile();\n if (!managed && killed.length === 0) {\n return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n }\n if (!managed && killed.length > 0) {\n return c.dim(t(\"svc.stoppedExternal\", { title: svcObj.title }));\n }\n return c.dim(t(\"svc.stoppedMsg\", { title: svcObj.title }));\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\n if (!svcObj.running) return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await svcObj.stop();\n return c.dim(t(\"svc.stoppedMsg\", { title: svcObj.title }));\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 const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\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\nexport async function cmdRestart(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 // bds / db / qq\uFF1A\u7EDF\u4E00\u8D70 stop\u2192start\uFF0C\u786E\u4FDD\u5916\u90E8\u5B9E\u4F8B\u4E5F\u88AB\u6E05\u6389\n if (svc === \"bds\" || isNodeSvc(svc)) {\n const stopMsg = await cmdStop(svc);\n const startMsg = await cmdStart(svc);\n // \u82E5 stop \u5DF2\u62A5\u9519\u6587\u6848\u542B\u300C\u5931\u8D25\u300D\uFF0C\u539F\u6837\u5E26\u56DE\n if (/\u5931\u8D25|failed/i.test(stopMsg) && !/\u5DF2\u505C\u6B62|stopped|already/i.test(stopMsg)) {\n return stopMsg;\n }\n if (/\u5931\u8D25|failed/i.test(startMsg)) return startMsg;\n return c.green(t(\"svc.restarted\", { title: services[svc].title }));\n }\n const svcObj = services[svc];\n try {\n const outcome = await svcObj.restart();\n if (outcome.status === \"skipped\") {\n return c.yellow(t(\"svc.skipped\", { title: svcObj.title, reason: outcome.reason }));\n }\n return c.green(t(\"svc.restarted\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.restartFailed\", { title: svcObj.title, message: (e as Error).message }));\n }\n}\n\nexport async function cmdStartAll(): 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\nexport async function cmdStopAll(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * BDS \u66F4\u65B0\uFF1A\u5B50\u8FDB\u7A0B\u59CB\u7EC8 --no-start\uFF0C\u7531 sfmc \u76D1\u7763\u5668\u63A5\u7BA1\u542F\u505C\u4E0E\u65E5\u5FD7\u3002\n * \uFF08updater \u5185 detached \u81EA\u542F\u4F1A\u5BFC\u81F4 REPL \u4E22 PID / \u65E0 stdout\uFF09\n *\n * \u4E0D\u505C\u670D\u9884\u64CD\u4F5C\uFF1A\u771F\u6B63\u9700\u8981\u66F4\u65B0\u65F6\u7531 updater \u505C\u670D\uFF1B\u5DF2\u662F\u6700\u65B0\u5219\u4E0D\u5F71\u54CD\u6B63\u5728\u8DD1\u7684 BDS\u3002\n * \u66F4\u65B0\u6210\u529F\u540E\u82E5\u672A\u6307\u5B9A --no-start\uFF0C\u518D\u7531\u76D1\u7763\u5668 `start bds`\uFF08\u63A5\u7BA1 PID + \u65E5\u5FD7\u7BA1\u9053\uFF09\u3002\n */\nexport async function cmdUpdate(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 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 });\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 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}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,5 @@
1
+ /** 供单测:truthy 判定与 SDK applyDebugFromVariables 对齐。 */
2
+ export declare function isDebugTruthy(v: unknown): boolean;
3
+ /** `sfmc debug [status|enable|disable|sentry on|off]` —— BDS 调试配置入口。 */
4
+ export declare function cmdDebug(args: string[]): Promise<string>;
5
+ //# sourceMappingURL=debug-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-command.d.ts","sourceRoot":"","sources":["../src/debug-command.ts"],"names":[],"mappings":"AAsDA,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAMjD;AAqED,wEAAwE;AACxE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB9D"}
@@ -0,0 +1,118 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { resolveBdsContext } from "./pack-lifecycle.js";
5
+ import { c } from "./theme.js";
6
+ import { t } from "./i18n/index.js";
7
+ const VARIABLES_PATH = path.join("config", "default", "variables.json");
8
+ const SECRETS_PATH = path.join("config", "default", "secrets.json");
9
+ async function readJsonOrEmpty(filePath) {
10
+ try {
11
+ const text = await fs.readFile(filePath, "utf8");
12
+ return JSON.parse(text);
13
+ } catch {
14
+ return {};
15
+ }
16
+ }
17
+ async function writeJsonAtomic(filePath, value) {
18
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
19
+ const tmp = `${filePath}.${process.pid}.tmp`;
20
+ await fs.writeFile(tmp, `${JSON.stringify(value, null, 2)}
21
+ `, "utf8");
22
+ await fs.rename(tmp, filePath);
23
+ }
24
+ async function readBdsConfig() {
25
+ const { bdsRoot } = resolveBdsContext();
26
+ const variablesPath = path.join(bdsRoot, VARIABLES_PATH);
27
+ const secretsPath = path.join(bdsRoot, SECRETS_PATH);
28
+ const variables = await readJsonOrEmpty(variablesPath);
29
+ const secrets = await readJsonOrEmpty(secretsPath);
30
+ return { variables, secrets, variablesPath, secretsPath };
31
+ }
32
+ function isDebugTruthy(v) {
33
+ if (v === true || v === 1) return true;
34
+ if (typeof v === "string" && ["true", "1", "yes", "on"].includes(v.trim().toLowerCase())) {
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ function onOffLabel(on) {
40
+ return on ? c.green(t("debug.state.on")) : c.dim(t("debug.state.off"));
41
+ }
42
+ async function cmdDebugStatus() {
43
+ const { variables, secrets } = await readBdsConfig();
44
+ const lines = [c.bold(`
45
+ ${t("debug.statusTitle")}`)];
46
+ lines.push(
47
+ ` ${c.text("sfmc_debug")} : ${onOffLabel(isDebugTruthy(variables.sfmc_debug))} ${c.dim("(BDS variables.json)")}`
48
+ );
49
+ const dsn = secrets.SENTRY_DSN;
50
+ if (typeof dsn === "string" && dsn.length > 0) {
51
+ const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;
52
+ lines.push(` ${c.text("SENTRY_DSN")} : ${c.green(t("debug.state.on"))} ${c.dim(`(${masked})`)}`);
53
+ } else {
54
+ lines.push(` ${c.text("SENTRY_DSN")} : ${c.dim(t("debug.state.off"))}`);
55
+ }
56
+ lines.push(c.dim(`
57
+ ${t("debug.reloadHint")}`));
58
+ return lines.join("\n") + "\n";
59
+ }
60
+ async function cmdDebugEnable() {
61
+ const { variables, variablesPath } = await readBdsConfig();
62
+ variables.sfmc_debug = true;
63
+ await writeJsonAtomic(variablesPath, variables);
64
+ return c.green(t("debug.enabled")) + "\n" + c.dim(t("debug.reloadHint"));
65
+ }
66
+ async function cmdDebugDisable() {
67
+ const { variables, variablesPath } = await readBdsConfig();
68
+ variables.sfmc_debug = false;
69
+ await writeJsonAtomic(variablesPath, variables);
70
+ return c.yellow(t("debug.disabled")) + "\n" + c.dim(t("debug.reloadHint"));
71
+ }
72
+ async function cmdDebugSentryOn(args) {
73
+ let dsn;
74
+ for (let i = 0; i < args.length; i++) {
75
+ const a = args[i];
76
+ if (a === "--dsn") dsn = args[++i];
77
+ else if (a?.startsWith("--dsn=")) dsn = a.slice("--dsn=".length);
78
+ }
79
+ if (!dsn) {
80
+ return c.red(t("debug.sentry.dsnMissing")) + "\n" + c.dim(t("debug.sentry.usage"));
81
+ }
82
+ const { secrets, secretsPath } = await readBdsConfig();
83
+ secrets.SENTRY_DSN = dsn;
84
+ await writeJsonAtomic(secretsPath, secrets);
85
+ const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;
86
+ return c.green(t("debug.sentry.set", { dsn: masked })) + "\n" + c.dim(t("debug.reloadHint"));
87
+ }
88
+ async function cmdDebugSentryOff() {
89
+ const { secrets, secretsPath } = await readBdsConfig();
90
+ if (!("SENTRY_DSN" in secrets)) {
91
+ return c.dim(t("debug.sentry.alreadyOff"));
92
+ }
93
+ delete secrets.SENTRY_DSN;
94
+ await writeJsonAtomic(secretsPath, secrets);
95
+ return c.yellow(t("debug.sentry.removed")) + "\n" + c.dim(t("debug.reloadHint"));
96
+ }
97
+ async function cmdDebug(args) {
98
+ const sub = args[0]?.toLowerCase();
99
+ try {
100
+ if (!sub || sub === "status") return await cmdDebugStatus();
101
+ if (sub === "enable") return await cmdDebugEnable();
102
+ if (sub === "disable") return await cmdDebugDisable();
103
+ if (sub === "sentry") {
104
+ const action = args[1]?.toLowerCase();
105
+ if (action === "on") return await cmdDebugSentryOn(args.slice(2));
106
+ if (action === "off") return await cmdDebugSentryOff();
107
+ return c.red(t("debug.sentry.unknown", { action: action ?? "" })) + "\n" + c.dim(t("debug.sentry.usage"));
108
+ }
109
+ return c.red(t("debug.unknown", { sub })) + "\n" + c.dim(t("debug.usage"));
110
+ } catch (e) {
111
+ return c.red(e.message);
112
+ }
113
+ }
114
+ export {
115
+ cmdDebug,
116
+ isDebugTruthy
117
+ };
118
+ //# sourceMappingURL=debug-command.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/debug-command.ts"],
4
+ "sourcesContent": ["/**\n * debug-command.ts \u2014 sfmc debug \u9876\u5C42\u547D\u4EE4\n *\n * \u8BFB\u5199 BDS \u7AEF `config/default/variables.json` \u4E0E `config/default/secrets.json`\uFF1A\n * - `sfmc_debug` \u2014\u2014 SDK `applyDebugFromVariables()` \u5728\u542F\u52A8\u65F6\u8BFB\u53D6\n * - `SENTRY_DSN` \u2014\u2014 SDK `initSentryIfConfigured()` \u5728\u542F\u52A8\u65F6\u8BFB\u53D6\n *\n * \u672C\u6587\u4EF6\u53EA\u6539 BDS \u914D\u7F6E\uFF1B\u4E0D\u89E6\u78B0 SDK \u73B0\u6709 `applyDebugFromVariables` /\n * `initSentryIfConfigured` \u8BED\u4E49\uFF08OCP\uFF1ACLI = \u914D\u7F6E\u5165\u53E3\uFF0CSDK = \u8FD0\u884C\u65F6\u5165\u53E3\uFF09\u3002\n * \u6539\u5B8C\u540E\u9700 `sfmc mod reload` \u6216\u91CD\u542F BDS \u624D\u4F1A\u5728\u884C\u4E3A\u5305\u751F\u6548\u3002\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { resolveBdsContext } from \"./pack-lifecycle.js\";\nimport { c } from \"./theme.js\";\nimport { t } from \"./i18n/index.js\";\n\nconst VARIABLES_PATH = path.join(\"config\", \"default\", \"variables.json\");\nconst SECRETS_PATH = path.join(\"config\", \"default\", \"secrets.json\");\n\ntype VariablesDoc = Record<string, unknown>;\ntype SecretsDoc = Record<string, unknown>;\n\nasync function readJsonOrEmpty<T extends object>(filePath: string): Promise<T> {\n try {\n const text = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(text) as T;\n } catch {\n return {} as T;\n }\n}\n\nasync function writeJsonAtomic(filePath: string, value: object): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.${process.pid}.tmp`;\n await fs.writeFile(tmp, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\nasync function readBdsConfig(): Promise<{\n variables: VariablesDoc;\n secrets: SecretsDoc;\n variablesPath: string;\n secretsPath: string;\n}> {\n const { bdsRoot } = resolveBdsContext();\n const variablesPath = path.join(bdsRoot, VARIABLES_PATH);\n const secretsPath = path.join(bdsRoot, SECRETS_PATH);\n const variables = await readJsonOrEmpty<VariablesDoc>(variablesPath);\n const secrets = await readJsonOrEmpty<SecretsDoc>(secretsPath);\n return { variables, secrets, variablesPath, secretsPath };\n}\n\n/** \u4F9B\u5355\u6D4B\uFF1Atruthy \u5224\u5B9A\u4E0E SDK applyDebugFromVariables \u5BF9\u9F50\u3002 */\nexport function isDebugTruthy(v: unknown): boolean {\n if (v === true || v === 1) return true;\n if (typeof v === \"string\" && [\"true\", \"1\", \"yes\", \"on\"].includes(v.trim().toLowerCase())) {\n return true;\n }\n return false;\n}\n\nfunction onOffLabel(on: boolean): string {\n return on ? c.green(t(\"debug.state.on\")) : c.dim(t(\"debug.state.off\"));\n}\n\n/** `sfmc debug status` \u2014\u2014 \u5C55\u793A\u5F53\u524D sfmc_debug / SENTRY_DSN\u3002 */\nasync function cmdDebugStatus(): Promise<string> {\n const { variables, secrets } = await readBdsConfig();\n const lines = [c.bold(`\\n${t(\"debug.statusTitle\")}`)];\n lines.push(\n ` ${c.text(\"sfmc_debug\")} : ${onOffLabel(isDebugTruthy(variables.sfmc_debug))} ${c.dim(\"(BDS variables.json)\")}`\n );\n const dsn = secrets.SENTRY_DSN;\n if (typeof dsn === \"string\" && dsn.length > 0) {\n const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;\n lines.push(` ${c.text(\"SENTRY_DSN\")} : ${c.green(t(\"debug.state.on\"))} ${c.dim(`(${masked})`)}`);\n } else {\n lines.push(` ${c.text(\"SENTRY_DSN\")} : ${c.dim(t(\"debug.state.off\"))}`);\n }\n lines.push(c.dim(`\\n ${t(\"debug.reloadHint\")}`));\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/** `sfmc debug enable` \u2014\u2014 \u5199 sfmc_debug: true\u3002 */\nasync function cmdDebugEnable(): Promise<string> {\n const { variables, variablesPath } = await readBdsConfig();\n variables.sfmc_debug = true;\n await writeJsonAtomic(variablesPath, variables);\n return c.green(t(\"debug.enabled\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug disable` \u2014\u2014 \u5199 sfmc_debug: false\uFF1B\u4E0D\u52A8 SENTRY_DSN\u3002 */\nasync function cmdDebugDisable(): Promise<string> {\n const { variables, variablesPath } = await readBdsConfig();\n variables.sfmc_debug = false;\n await writeJsonAtomic(variablesPath, variables);\n return c.yellow(t(\"debug.disabled\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug sentry on --dsn <dsn>` \u2014\u2014 \u5199\u5165 SENTRY_DSN\u3002 */\nasync function cmdDebugSentryOn(args: string[]): Promise<string> {\n let dsn: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a === \"--dsn\") dsn = args[++i];\n else if (a?.startsWith(\"--dsn=\")) dsn = a.slice(\"--dsn=\".length);\n }\n if (!dsn) {\n return c.red(t(\"debug.sentry.dsnMissing\")) + \"\\n\" + c.dim(t(\"debug.sentry.usage\"));\n }\n const { secrets, secretsPath } = await readBdsConfig();\n secrets.SENTRY_DSN = dsn;\n await writeJsonAtomic(secretsPath, secrets);\n const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;\n return c.green(t(\"debug.sentry.set\", { dsn: masked })) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug sentry off` \u2014\u2014 \u5220\u9664 SENTRY_DSN\u3002 */\nasync function cmdDebugSentryOff(): Promise<string> {\n const { secrets, secretsPath } = await readBdsConfig();\n if (!(\"SENTRY_DSN\" in secrets)) {\n return c.dim(t(\"debug.sentry.alreadyOff\"));\n }\n delete secrets.SENTRY_DSN;\n await writeJsonAtomic(secretsPath, secrets);\n return c.yellow(t(\"debug.sentry.removed\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug [status|enable|disable|sentry on|off]` \u2014\u2014 BDS \u8C03\u8BD5\u914D\u7F6E\u5165\u53E3\u3002 */\nexport async function cmdDebug(args: string[]): Promise<string> {\n const sub = args[0]?.toLowerCase();\n try {\n if (!sub || sub === \"status\") return await cmdDebugStatus();\n if (sub === \"enable\") return await cmdDebugEnable();\n if (sub === \"disable\") return await cmdDebugDisable();\n if (sub === \"sentry\") {\n const action = args[1]?.toLowerCase();\n if (action === \"on\") return await cmdDebugSentryOn(args.slice(2));\n if (action === \"off\") return await cmdDebugSentryOff();\n return c.red(t(\"debug.sentry.unknown\", { action: action ?? \"\" })) + \"\\n\" + c.dim(t(\"debug.sentry.usage\"));\n }\n return (\n c.red(t(\"debug.unknown\", { sub })) +\n \"\\n\" +\n c.dim(t(\"debug.usage\"))\n );\n } catch (e) {\n return c.red((e as Error).message);\n }\n}"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { type CommandMode } from "./command-surface.js";
2
+ export declare function getHelp(mode?: CommandMode): string;
3
+ //# sourceMappingURL=help-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-text.d.ts","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAqDxG,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CA2I1D"}