@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.
- package/dist/argv-parse.d.ts +11 -0
- package/dist/argv-parse.d.ts.map +1 -0
- package/dist/argv-parse.js +28 -0
- package/dist/argv-parse.js.map +7 -0
- package/dist/cli-gate.d.ts +11 -0
- package/dist/cli-gate.d.ts.map +1 -0
- package/dist/cli-gate.js +46 -0
- package/dist/cli-gate.js.map +7 -0
- package/dist/command-palette.d.ts +61 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +352 -0
- package/dist/command-palette.js.map +7 -0
- package/dist/command-surface.d.ts +85 -0
- package/dist/command-surface.d.ts.map +1 -0
- package/dist/command-surface.js +292 -0
- package/dist/command-surface.js.map +7 -0
- package/dist/commands-reload.js +2 -2
- package/dist/commands-reload.js.map +2 -2
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +196 -21
- package/dist/commands.js.map +2 -2
- package/dist/debug-command.d.ts +5 -0
- package/dist/debug-command.d.ts.map +1 -0
- package/dist/debug-command.js +118 -0
- package/dist/debug-command.js.map +7 -0
- package/dist/help-text.d.ts +3 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +160 -0
- package/dist/help-text.js.map +7 -0
- package/dist/i18n/locales/en.d.ts +103 -89
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +105 -91
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +138 -118
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +2 -2
- package/dist/llbot-launch.d.ts +20 -0
- package/dist/llbot-launch.d.ts.map +1 -0
- package/dist/llbot-launch.js +40 -0
- package/dist/llbot-launch.js.map +7 -0
- package/dist/log-filter.d.ts +69 -0
- package/dist/log-filter.d.ts.map +1 -0
- package/dist/log-filter.js +150 -0
- package/dist/log-filter.js.map +7 -0
- package/dist/logs.d.ts +29 -7
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +164 -72
- package/dist/logs.js.map +3 -3
- package/dist/main.js +55 -46
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +17 -40
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +129 -85
- package/dist/module-commands.js.map +2 -2
- package/dist/module-pack-build.d.ts +10 -0
- package/dist/module-pack-build.d.ts.map +1 -0
- package/dist/module-pack-build.js +434 -0
- package/dist/module-pack-build.js.map +7 -0
- package/dist/module-toggle.d.ts +33 -0
- package/dist/module-toggle.d.ts.map +1 -0
- package/dist/module-toggle.js +28 -0
- package/dist/module-toggle.js.map +7 -0
- package/dist/node-service-probe.d.ts +18 -0
- package/dist/node-service-probe.d.ts.map +1 -0
- package/dist/node-service-probe.js +97 -0
- package/dist/node-service-probe.js.map +7 -0
- package/dist/pack-lifecycle.d.ts +1 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +14 -4
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/pack-update/index.d.ts +18 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +113 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/registry.d.ts +7 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -3
- package/dist/registry.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts +10 -0
- package/dist/repl-windows/format-display.d.ts.map +1 -0
- package/dist/repl-windows/format-display.js +57 -0
- package/dist/repl-windows/format-display.js.map +7 -0
- package/dist/repl-windows/host.d.ts +60 -0
- package/dist/repl-windows/host.d.ts.map +1 -0
- package/dist/repl-windows/host.js +179 -0
- package/dist/repl-windows/host.js.map +7 -0
- package/dist/repl-windows/index.d.ts +9 -0
- package/dist/repl-windows/index.d.ts.map +1 -0
- package/dist/repl-windows/index.js +13 -0
- package/dist/repl-windows/index.js.map +7 -0
- package/dist/repl-windows/logs-filter-window.d.ts +15 -0
- package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
- package/dist/repl-windows/logs-filter-window.js +77 -0
- package/dist/repl-windows/logs-filter-window.js.map +7 -0
- package/dist/repl-windows/service-window.d.ts +4 -0
- package/dist/repl-windows/service-window.d.ts.map +1 -0
- package/dist/repl-windows/service-window.js +35 -0
- package/dist/repl-windows/service-window.js.map +7 -0
- package/dist/repl-windows/types.d.ts +56 -0
- package/dist/repl-windows/types.d.ts.map +1 -0
- package/dist/repl-windows/types.js +1 -0
- package/dist/repl-windows/types.js.map +7 -0
- package/dist/repl.d.ts +6 -9
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +698 -427
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +6 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +23 -28
- package/dist/runtime.js.map +2 -2
- package/dist/send-target.d.ts +11 -0
- package/dist/send-target.d.ts.map +1 -0
- package/dist/send-target.js +42 -0
- package/dist/send-target.js.map +7 -0
- package/dist/services.d.ts +50 -4
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +244 -20
- package/dist/services.js.map +2 -2
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +2 -2
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +76 -16
- package/dist/wizard.js.map +2 -2
- package/dist/world-packs.d.ts +15 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +90 -87
- package/dist/world-packs.js.map +2 -2
- package/package.json +24 -21
- package/scripts/module-install/check-modules.mjs +204 -0
- package/scripts/module-install/fetch-module.mjs +1007 -0
- package/scripts/module-install/install-resolver.test.mjs +48 -0
- package/scripts/module-install/lib/catalog.mjs +96 -0
- package/scripts/module-install/lib/io.mjs +37 -0
- package/scripts/module-install/lib/link-from.mjs +80 -0
- package/scripts/module-install/lib/lock.mjs +78 -0
- package/scripts/module-install/lib/npm-resolver.mjs +55 -0
- package/scripts/module-install/lib/packages.mjs +142 -0
- package/scripts/module-install/lib/paths.mjs +48 -0
- package/scripts/module-install/lib/registry-index.mjs +50 -0
- package/scripts/module-install/link-local.test.mjs +51 -0
- package/scripts/module-install/local-resolver.test.mjs +51 -0
- package/scripts/module-install/registry-index.test.mjs +28 -0
- package/dist/module-wizard.d.ts +0 -14
- package/dist/module-wizard.d.ts.map +0 -1
- package/dist/module-wizard.js +0 -313
- package/dist/module-wizard.js.map +0 -7
- package/dist/pack-update/bindings.d.ts +0 -12
- package/dist/pack-update/bindings.d.ts.map +0 -1
- package/dist/pack-update/bindings.js +0 -64
- package/dist/pack-update/bindings.js.map +0 -7
- package/dist/pack-update/config.d.ts +0 -22
- package/dist/pack-update/config.d.ts.map +0 -1
- package/dist/pack-update/config.js +0 -141
- package/dist/pack-update/config.js.map +0 -7
- package/dist/pack-update/providers/curseforge.d.ts +0 -23
- package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
- package/dist/pack-update/providers/curseforge.js +0 -209
- package/dist/pack-update/providers/curseforge.js.map +0 -7
- package/dist/pack-update/providers/index.d.ts +0 -16
- package/dist/pack-update/providers/index.d.ts.map +0 -1
- package/dist/pack-update/providers/index.js +0 -37
- package/dist/pack-update/providers/index.js.map +0 -7
- package/dist/pack-update/service.d.ts +0 -21
- package/dist/pack-update/service.d.ts.map +0 -1
- package/dist/pack-update/service.js +0 -567
- package/dist/pack-update/service.js.map +0 -7
- package/dist/pack-update/types.d.ts +0 -126
- package/dist/pack-update/types.d.ts.map +0 -1
- package/dist/pack-update/types.js +0 -8
- package/dist/pack-update/types.js.map +0 -7
- package/dist/pack-update/version-policy.d.ts +0 -80
- package/dist/pack-update/version-policy.d.ts.map +0 -1
- package/dist/pack-update/version-policy.js +0 -216
- package/dist/pack-update/version-policy.js.map +0 -7
- package/dist/remote-agent.d.ts +0 -18
- package/dist/remote-agent.d.ts.map +0 -1
- package/dist/remote-agent.js +0 -196
- 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
|
|
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
|
|
29
|
+
return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;
|
|
19
30
|
}
|
|
20
|
-
function
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
186
|
-
|
|
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
|
}
|
package/dist/commands.js.map
CHANGED
|
@@ -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 @@
|
|
|
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"}
|