@sfmc-bds/cli 0.2.2 → 0.2.4
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/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +11 -2
- package/dist/command-palette.js.map +2 -2
- package/dist/command-surface.d.ts +14 -2
- package/dist/command-surface.d.ts.map +1 -1
- package/dist/command-surface.js +120 -6
- package/dist/command-surface.js.map +2 -2
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +45 -38
- package/dist/commands.js.map +2 -2
- package/dist/daemon/client.d.ts +67 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +272 -0
- package/dist/daemon/client.js.map +7 -0
- package/dist/daemon/paths.d.ts +35 -0
- package/dist/daemon/paths.d.ts.map +1 -0
- package/dist/daemon/paths.js +69 -0
- package/dist/daemon/paths.js.map +7 -0
- package/dist/daemon/protocol.d.ts +66 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +16 -0
- package/dist/daemon/protocol.js.map +7 -0
- package/dist/daemon/role.d.ts +13 -0
- package/dist/daemon/role.d.ts.map +1 -0
- package/dist/daemon/role.js +12 -0
- package/dist/daemon/role.js.map +7 -0
- package/dist/daemon/server.d.ts +12 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +221 -0
- package/dist/daemon/server.js.map +7 -0
- package/dist/help-text.d.ts.map +1 -1
- package/dist/help-text.js +3 -1
- package/dist/help-text.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +25 -3
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +26 -3
- 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 +26 -3
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/logs.d.ts +11 -1
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +8 -0
- package/dist/logs.js.map +2 -2
- package/dist/main.js +27 -4
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +9 -5
- package/dist/module-commands.js.map +2 -2
- package/dist/module-fingerprint.d.ts +5 -0
- package/dist/module-fingerprint.d.ts.map +1 -1
- package/dist/module-fingerprint.js +13 -3
- package/dist/module-fingerprint.js.map +2 -2
- package/dist/module-sidecars.d.ts +16 -0
- package/dist/module-sidecars.d.ts.map +1 -0
- package/dist/module-sidecars.js +116 -0
- package/dist/module-sidecars.js.map +7 -0
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +51 -32
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +2 -2
- package/dist/services.d.ts +3 -1
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +22 -10
- package/dist/services.js.map +2 -2
- package/dist/world-packs.js.map +1 -1
- package/package.json +4 -4
package/dist/commands.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { clearBdsPidFile, killBedrockServerByImage, probeBdsStatus } from "@sfmc-bds/bds-tools/process-probe";
|
|
2
2
|
import { stripTaskbarOsc } from "@sfmc-bds/bds-tools/taskbar";
|
|
3
3
|
import { didUpdateDeploy } from "@sfmc-bds/bds-tools/update-result";
|
|
4
|
-
import {
|
|
5
|
-
DEFAULT_QQ_CONFIG,
|
|
6
|
-
loadEnsuredConfig,
|
|
7
|
-
qqRuntimeStatusPath
|
|
8
|
-
} from "@sfmc-bds/sdk/node/config";
|
|
4
|
+
import { qqRuntimeStatusPath } from "@sfmc-bds/sdk/node/config";
|
|
9
5
|
import fs from "node:fs";
|
|
6
|
+
import { isDaemonServer } from "./daemon/role.js";
|
|
10
7
|
import { t } from "./i18n/index.js";
|
|
11
8
|
import { pushLog as pushUnifiedLog } from "./logs.js";
|
|
12
9
|
import { findNodeServicePids, killNodeServiceByScript } from "./node-service-probe.js";
|
|
13
10
|
import { spawnService } from "./runtime.js";
|
|
14
11
|
import { queryServicesRuntime, ROOT, SERVICE_NAMES, services } from "./services.js";
|
|
15
12
|
import { c, DIVIDER, highlightLogLine, padRight } from "./theme.js";
|
|
13
|
+
async function viaDaemonText(method, localFn, params) {
|
|
14
|
+
if (isDaemonServer()) return localFn();
|
|
15
|
+
const { textViaDaemon, statusTextViaDaemon } = await import("./daemon/client.js");
|
|
16
|
+
if (method === "status") return statusTextViaDaemon();
|
|
17
|
+
return textViaDaemon(method, params);
|
|
18
|
+
}
|
|
16
19
|
function parseService(raw) {
|
|
17
20
|
const s = raw.toLowerCase();
|
|
18
21
|
if (SERVICE_NAMES.includes(s)) return s;
|
|
@@ -28,38 +31,20 @@ function statusLine(name, running, pid, uptime, ownership) {
|
|
|
28
31
|
const upStr = uptime !== "\u2014" ? c.dim(uptime) : c.dim("\u2014");
|
|
29
32
|
return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;
|
|
30
33
|
}
|
|
31
|
-
function qqBridgeStatusFooter() {
|
|
32
|
-
const qqCfg = loadEnsuredConfig(ROOT, "qq_config.json", "qq_config", { ...DEFAULT_QQ_CONFIG });
|
|
33
|
-
const backend = qqCfg.qq_backend === "llbot" ? "llbot" : "official";
|
|
34
|
-
const enabled = qqCfg.qq_enabled !== false;
|
|
35
|
-
if (backend === "llbot") {
|
|
36
|
-
const group = qqCfg.llbot?.group_id || "\u2014";
|
|
37
|
-
const pathHint = qqCfg.llbot?.path ? String(qqCfg.llbot.path) : "\u2014";
|
|
38
|
-
return `
|
|
39
|
-
${c.dim(t("svc.qq.footer.llbot", { enabled: enabled ? "on" : "off", group, path: pathHint }))}
|
|
40
|
-
`;
|
|
41
|
-
}
|
|
42
|
-
const appId = String(qqCfg.official?.app_id ?? "").trim();
|
|
43
|
-
const appIdHint = appId ? appId.length > 8 ? `${appId.slice(0, 4)}\u2026${appId.slice(-4)}` : appId : "\u2014";
|
|
44
|
-
const openid = String(qqCfg.official?.group_openid ?? "").trim() || "\u2014";
|
|
45
|
-
const sandbox = qqCfg.official?.sandbox ? "sandbox" : "prod";
|
|
46
|
-
const creds = appId && String(qqCfg.official?.app_secret ?? "").trim() ? "ok" : "missing";
|
|
47
|
-
return `
|
|
48
|
-
${c.dim(t("svc.qq.footer.official", { enabled: enabled ? "on" : "off", appId: appIdHint, openid, sandbox, creds }))}
|
|
49
|
-
`;
|
|
50
|
-
}
|
|
51
34
|
async function cmdStatus() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
35
|
+
return viaDaemonText("status", async () => {
|
|
36
|
+
const rows = await queryServicesRuntime();
|
|
37
|
+
const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));
|
|
38
|
+
const nameH = t("svc.col.name");
|
|
39
|
+
const statusH = t("svc.col.status");
|
|
40
|
+
const ownerH = t("svc.col.owner");
|
|
41
|
+
const pidH = t("svc.col.pid");
|
|
42
|
+
const upH = t("svc.col.uptime");
|
|
43
|
+
const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;
|
|
44
|
+
return `
|
|
61
45
|
${c.bold(t("svc.header"))}
|
|
62
|
-
` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n")
|
|
46
|
+
` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n");
|
|
47
|
+
});
|
|
63
48
|
}
|
|
64
49
|
function cmdLogs(args, onFollow) {
|
|
65
50
|
let n = 20;
|
|
@@ -110,6 +95,9 @@ function clearQqRuntimeFile() {
|
|
|
110
95
|
}
|
|
111
96
|
}
|
|
112
97
|
async function cmdStart(raw) {
|
|
98
|
+
return viaDaemonText("start", () => cmdStartLocal(raw), { name: raw });
|
|
99
|
+
}
|
|
100
|
+
async function cmdStartLocal(raw) {
|
|
113
101
|
const svc = parseService(raw);
|
|
114
102
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
115
103
|
const svcObj = services[svc];
|
|
@@ -149,6 +137,9 @@ async function cmdStart(raw) {
|
|
|
149
137
|
}
|
|
150
138
|
}
|
|
151
139
|
async function cmdStop(raw) {
|
|
140
|
+
return viaDaemonText("stop", () => cmdStopLocal(raw), { name: raw });
|
|
141
|
+
}
|
|
142
|
+
async function cmdStopLocal(raw) {
|
|
152
143
|
const svc = parseService(raw);
|
|
153
144
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
154
145
|
const svcObj = services[svc];
|
|
@@ -211,6 +202,9 @@ async function cmdStop(raw) {
|
|
|
211
202
|
}
|
|
212
203
|
}
|
|
213
204
|
async function cmdSend(raw, message) {
|
|
205
|
+
return viaDaemonText("send", () => cmdSendLocal(raw, message), { name: raw, message });
|
|
206
|
+
}
|
|
207
|
+
async function cmdSendLocal(raw, message) {
|
|
214
208
|
const svc = parseService(raw);
|
|
215
209
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
216
210
|
if (svc === "tunnel") return c.yellow(t("svc.stdinUnavailable", { title: services[svc].title }));
|
|
@@ -236,11 +230,14 @@ async function cmdSend(raw, message) {
|
|
|
236
230
|
}
|
|
237
231
|
}
|
|
238
232
|
async function cmdRestart(raw) {
|
|
233
|
+
return viaDaemonText("restart", () => cmdRestartLocal(raw), { name: raw });
|
|
234
|
+
}
|
|
235
|
+
async function cmdRestartLocal(raw) {
|
|
239
236
|
const svc = parseService(raw);
|
|
240
237
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
241
238
|
if (svc === "bds" || isNodeSvc(svc)) {
|
|
242
|
-
const stopMsg = await
|
|
243
|
-
const startMsg = await
|
|
239
|
+
const stopMsg = await cmdStopLocal(svc);
|
|
240
|
+
const startMsg = await cmdStartLocal(svc);
|
|
244
241
|
if (/失败|failed/i.test(stopMsg) && !/已停止|stopped|already/i.test(stopMsg)) {
|
|
245
242
|
return stopMsg;
|
|
246
243
|
}
|
|
@@ -259,6 +256,9 @@ async function cmdRestart(raw) {
|
|
|
259
256
|
}
|
|
260
257
|
}
|
|
261
258
|
async function cmdStartAll() {
|
|
259
|
+
return viaDaemonText("startAll", cmdStartAllLocal);
|
|
260
|
+
}
|
|
261
|
+
async function cmdStartAllLocal() {
|
|
262
262
|
const { startAll } = await import("./services.js");
|
|
263
263
|
const result = await startAll();
|
|
264
264
|
const parts = [];
|
|
@@ -290,11 +290,17 @@ async function cmdStartAll() {
|
|
|
290
290
|
return parts.join("\n");
|
|
291
291
|
}
|
|
292
292
|
async function cmdStopAll() {
|
|
293
|
+
return viaDaemonText("stopAll", cmdStopAllLocal);
|
|
294
|
+
}
|
|
295
|
+
async function cmdStopAllLocal() {
|
|
293
296
|
const { stopAll } = await import("./services.js");
|
|
294
297
|
await stopAll();
|
|
295
298
|
return c.dim(t("svc.allStopped"));
|
|
296
299
|
}
|
|
297
300
|
async function cmdUpdate(args = []) {
|
|
301
|
+
return viaDaemonText("update", () => cmdUpdateLocal(args), { args });
|
|
302
|
+
}
|
|
303
|
+
async function cmdUpdateLocal(args = []) {
|
|
298
304
|
const userNoStart = args.includes("--no-start");
|
|
299
305
|
const checkOnly = args.includes("--check-only");
|
|
300
306
|
const spawnArgs = userNoStart ? [...args] : [...args, "--no-start"];
|
|
@@ -310,7 +316,8 @@ async function cmdUpdate(args = []) {
|
|
|
310
316
|
const result = await new Promise((resolve) => {
|
|
311
317
|
const proc = spawnService("update", spawnArgs, {
|
|
312
318
|
cwd: ROOT,
|
|
313
|
-
stdio: ["ignore", "pipe", "pipe"]
|
|
319
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
320
|
+
windowsHide: true
|
|
314
321
|
});
|
|
315
322
|
let out = "";
|
|
316
323
|
const pushChunk = (raw, level) => {
|
package/dist/commands.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/commands.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * commands.ts \u2014 CLI \u6838\u5FC3\u8FD0\u7EF4\u547D\u4EE4\u5B9E\u73B0\n *\n * \u63D0\u4F9B\u547D\u4EE4\u884C\u4E0E REPL \u5171\u4EAB\u7684\u7CFB\u7EDF\u7EA7\u8FD0\u7EF4\u6307\u4EE4\uFF1A\n * - `status`\uFF1A\u67E5\u8BE2\u5168\u90E8\u670D\u52A1\uFF08BDS\u3001db-server\u3001qq-bridge\u3001LLBot\uFF09\u8FD0\u884C\u72B6\u6001\u3001PID\u3001\u8FD0\u884C\u65F6\u957F\u4E0E\u6240\u6709\u6743\n * - `start` / `stop` / `restart`\uFF1A\u6309\u4F9D\u8D56\u987A\u5E8F\u6216\u5355\u4E2A\u63A7\u5236\u670D\u52A1\u542F\u505C\n * - `startAll` / `stopAll`\uFF1A\u6279\u91CF\u7F16\u6392\u63A7\u5236\u6240\u6709\u540E\u53F0\u670D\u52A1\n * - `logs`\uFF1A\u68C0\u7D22\u5E76\u5B9E\u65F6\u8FFD\u8E2A\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u65E5\u5FD7\u6D41\n * - `update`\uFF1A\u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\n */\n\nimport { clearBdsPidFile, killBedrockServerByImage, probeBdsStatus } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\nimport {\n DEFAULT_QQ_CONFIG,\n loadEnsuredConfig,\n qqRuntimeStatusPath,\n type QQBridgeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { findNodeServicePids, killNodeServiceByScript, type NodeServiceName } from \"./node-service-probe.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { queryServicesRuntime, ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\n\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(ROOT, \"qq_config.json\", \"qq_config\", { ...DEFAULT_QQ_CONFIG } as Record<\n string,\n 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.llbot?.group_id || \"\u2014\";\n const pathHint = qqCfg.llbot?.path ? String(qqCfg.llbot.path) : \"\u2014\";\n return `\\n${c.dim(t(\"svc.qq.footer.llbot\", { enabled: enabled ? \"on\" : \"off\", group, path: pathHint }))}\\n`;\n }\n const appId = String(qqCfg.official?.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.official?.group_openid ?? \"\").trim() || \"\u2014\";\n const sandbox = qqCfg.official?.sandbox ? \"sandbox\" : \"prod\";\n const creds = appId && String(qqCfg.official?.app_secret ?? \"\").trim() ? \"ok\" : \"missing\";\n return `\\n${c.dim(t(\"svc.qq.footer.official\", { enabled: enabled ? \"on\" : \"off\", appId: appIdHint, openid, sandbox, creds }))}\\n`;\n}\n\n/**\n * \u67E5\u8BE2\u5E76\u683C\u5F0F\u5316\u5C55\u793A\u6240\u6709\u540E\u53F0\u670D\u52A1\u7684\u5F53\u524D\u8FD0\u884C\u72B6\u6001\u77E9\u9635\u3002\n *\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u72B6\u6001\u6458\u8981\u6587\u672C\u8868\u683C\u3002\n */\nexport async function cmdStatus(): Promise<string> {\n const rows = await queryServicesRuntime();\n const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const ownerH = t(\"svc.col.owner\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return (\n `\\n${c.bold(t(\"svc.header\"))}\\n` + c.dim(header) + \"\\n\" + DIVIDER + \"\\n\" + lines.join(\"\\n\") + qqBridgeStatusFooter()\n );\n}\n\n/**\n * \u68C0\u7D22\u5E76\u683C\u5F0F\u5316\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u5386\u53F2\u65E5\u5FD7\u884C\uFF08\u652F\u6301 `-n <\u884C\u6570>` \u53CA `-f` \u5B9E\u65F6\u8FFD\u8E2A\uFF09\u3002\n *\n * @param args \u53C2\u6570\u5217\u8868\u3002\n * @param onFollow \u53EF\u9009\u7684\u8DDF\u968F\u6A21\u5F0F\u56DE\u8C03\u3002\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u65E5\u5FD7\u8F93\u51FA\u6587\u672C\u3002\n */\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nfunction isNodeSvc(name: ServiceName): name is NodeServiceName {\n return name === \"db\" || name === \"qq\";\n}\n\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\n/**\n * \u542F\u52A8\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08bds / db / qq / llbot\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u542F\u52A8\u7ED3\u679C\u63CF\u8FF0\u6587\u672C\u3002\n */\nexport async function cmdStart(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({ rootDir: ROOT });\n if (probe.state !== \"stopped\") {\n return c.yellow(\n t(\"svc.bdsAlreadyRunning\", {\n pid: String(probe.pid),\n kind: probe.state === \"managed\" ? t(\"svc.running\") : t(\"svc.runningExternal\"),\n })\n );\n }\n }\n // \u5916\u90E8\u5DF2\u5728\u8DD1\uFF1A\u7981\u6B62\u518D spawn\uFF08\u907F\u514D\u53CC db / \u53CC qq\uFF09\n if (isNodeSvc(svc)) {\n const external = await findNodeServicePids(svc);\n if (external.length > 0) {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: String(external.join(\",\")) }));\n }\n }\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n const outcome = await svcObj.start();\n if (outcome.status === \"skipped\") {\n return c.yellow(t(\"svc.skipped\", { title: svcObj.title, reason: outcome.reason }));\n }\n if (outcome.status === \"already\") {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n }\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\n/**\n * \u505C\u6B62\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u652F\u6301\u5BF9\u5916\u90E8\u975E\u6258\u7BA1\u5B9E\u4F8B\u6267\u884C\u7CBE\u51C6\u6E05\u7406\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u505C\u6B62\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdStop(raw: string): Promise<string> {\n 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) {\n if (svc === \"tunnel\") await svcObj.stop(); // \u53D6\u6D88\u7B49\u5F85\u4E2D\u7684\u65AD\u7EBF\u91CD\u8BD5\n return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n }\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 (svc === \"tunnel\") return c.yellow(t(\"svc.stdinUnavailable\", { title: services[svc].title }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n /* \u5148\u7EDF\u4E00\u63A2\u6D4B\uFF0C\u907F\u514D\u5185\u5B58 running \u4E0E\u771F\u5B9E\u8FDB\u7A0B\u8131\u8282 */\n await queryServicesRuntime();\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n return c.yellow(t(\"svc.stdinUnavailable\", { title: svcObj.title }));\n }\n }\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return \"\";\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\n/**\n * \u91CD\u542F\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u9075\u5FAA stop \u2192 start \u4E25\u8C28\u65F6\u5E8F\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u91CD\u542F\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdRestart(raw: string): Promise<string> {\n 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\n/**\n * \u6309\u670D\u52A1\u62D3\u6251\u4F9D\u8D56\u6B21\u5E8F\u6279\u91CF\u542F\u52A8\u6240\u6709\u5DF2\u542F\u7528\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u542F\u52A8\u7ED3\u679C\u7EDF\u8BA1\u62A5\u544A\u6587\u672C\u3002\n */\nexport async function cmdStartAll(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n const result = await startAll();\n const parts: string[] = [];\n if (result.started.length > 0) {\n parts.push(c.green(t(\"svc.startAll.started\", { list: result.started.join(\", \") })));\n }\n if (result.skipped.length > 0) {\n parts.push(\n c.dim(\n t(\"svc.startAll.skipped\", {\n list: result.skipped.map((s) => `${s.name}(${s.reason})`).join(\"; \"),\n })\n )\n );\n }\n if (result.failed.length > 0) {\n parts.push(\n c.red(\n t(\"svc.startAll.failed\", {\n list: result.failed.map((s) => `${s.name}: ${s.reason}`).join(\"; \"),\n })\n )\n );\n }\n if (parts.length === 0) return c.dim(t(\"svc.startAll.empty\"));\n if (result.failed.length === 0 && result.skipped.length === 0) {\n return c.green(t(\"svc.allStarted\"));\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * \u6279\u91CF\u505C\u6B62\u6240\u6709\u5F53\u524D\u5904\u4E8E\u8FD0\u884C\u6001\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u505C\u6B62\u786E\u8BA4\u6587\u672C\u3002\n */\nexport async function cmdStopAll(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * \u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\u6D41\u7A0B\u3002\n *\n * \u8FDB\u7A0B\u7BA1\u7406\u4E0E\u7F16\u6392\u7EA6\u675F\uFF1A\n * - updater \u5B50\u8FDB\u7A0B\u59CB\u7EC8\u9644\u52A0 `--no-start` \u53C2\u6570\uFF0C\u907F\u514D\u7531\u4E8E\u8FDB\u7A0B\u8131\u79BB\u5BFC\u81F4 REPL \u4E22\u5931 PID \u8DDF\u8E2A\u53CA\u6807\u51C6\u8F93\u51FA\n * - \u82E5\u66F4\u65B0\u524D BDS \u5904\u4E8E\u8FD0\u884C\u72B6\u6001\uFF0C\u4E14\u672A\u663E\u5F0F\u6307\u5B9A `--no-start`\uFF0C\u5728\u66F4\u65B0\u843D\u76D8\u90E8\u7F72\u5B8C\u6210\u540E\u7531\u76D1\u7763\u5668\u91CD\u65B0\u5524\u8D77 BDS\n *\n * @param args \u4F20\u9012\u7ED9\u66F4\u65B0\u5668\u7684\u547D\u4EE4\u884C\u53C2\u6570\u3002\n * @returns \u66F4\u65B0\u6267\u884C\u7ED3\u679C\u6458\u8981\u6587\u672C\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n // \u66F4\u65B0\u5668\u548C CLI \u5206\u5C5E\u4E0D\u540C\u8FDB\u7A0B\uFF1B\u5148\u6682\u505C CLI \u7684\u5D29\u6E83\u81EA\u542F\uFF0C\u518D\u4EA4\u7ED9\u66F4\u65B0\u5668\u505C\u670D\u3002\n bds.beginUpdate();\n try {\n const bdsProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n const bdsWasRunning = bdsProbe.state !== \"stopped\";\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n const afterProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n if (afterProbe.state !== \"stopped\") {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n bds.endUpdate();\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {\n const afterProbe = await probeBdsStatus({ rootDir: ROOT });\n if (afterProbe.state === \"stopped\") {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n }\n\n return result.out;\n } finally {\n bds.endUpdate();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * commands.ts \u2014 CLI \u6838\u5FC3\u8FD0\u7EF4\u547D\u4EE4\u5B9E\u73B0\n *\n * \u63D0\u4F9B\u547D\u4EE4\u884C\u4E0E REPL \u5171\u4EAB\u7684\u7CFB\u7EDF\u7EA7\u8FD0\u7EF4\u6307\u4EE4\uFF1A\n * - `status`\uFF1A\u67E5\u8BE2\u5168\u90E8\u670D\u52A1\uFF08BDS\u3001db-server\u3001qq-bridge\u3001LLBot\uFF09\u8FD0\u884C\u72B6\u6001\u3001PID\u3001\u8FD0\u884C\u65F6\u957F\u4E0E\u6240\u6709\u6743\n * - `start` / `stop` / `restart`\uFF1A\u6309\u4F9D\u8D56\u987A\u5E8F\u6216\u5355\u4E2A\u63A7\u5236\u670D\u52A1\u542F\u505C\n * - `startAll` / `stopAll`\uFF1A\u6279\u91CF\u7F16\u6392\u63A7\u5236\u6240\u6709\u540E\u53F0\u670D\u52A1\n * - `logs`\uFF1A\u68C0\u7D22\u5E76\u5B9E\u65F6\u8FFD\u8E2A\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u65E5\u5FD7\u6D41\n * - `update`\uFF1A\u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\n */\n\nimport { clearBdsPidFile, killBedrockServerByImage, probeBdsStatus } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\nimport { qqRuntimeStatusPath } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { isDaemonServer } from \"./daemon/role.js\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { findNodeServicePids, killNodeServiceByScript, type NodeServiceName } from \"./node-service-probe.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { queryServicesRuntime, ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\n\n/**\n * CLI \u4FA7\u7ECF\u5B88\u62A4\u8FDB\u7A0B\u6267\u884C\u5E76\u53D6\u56DE text\uFF1B\u5B88\u62A4\u8FDB\u7A0B\u5185\u76F4\u63A5\u8DD1 localFn\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Astatus/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u5206\u6D41\uFF0C\u907F\u514D CLI \u8FDB\u7A0B\u6301\u6709\u5B50\u8FDB\u7A0B\u3002\n */\nasync function viaDaemonText(\n method: \"status\" | \"start\" | \"stop\" | \"restart\" | \"startAll\" | \"stopAll\" | \"send\" | \"update\",\n localFn: () => Promise<string>,\n params?: { name?: string; message?: string; args?: string[] }\n): Promise<string> {\n if (isDaemonServer()) return localFn();\n const { textViaDaemon, statusTextViaDaemon } = await import(\"./daemon/client.js\");\n if (method === \"status\") return statusTextViaDaemon();\n return textViaDaemon(method, params);\n}\n\nfunction parseService(raw: string): ServiceName | null {\n const s = raw.toLowerCase() as ServiceName;\n if (SERVICE_NAMES.includes(s)) return s;\n return null;\n}\n\nfunction statusLine(\n name: string,\n running: boolean,\n pid: number,\n uptime: string,\n ownership?: \"managed\" | \"external\"\n): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const state = running ? c.green(t(\"svc.state.running\")) : c.dim(t(\"svc.state.stopped\"));\n let owner = c.dim(t(\"svc.owner.none\"));\n if (running && ownership === \"managed\") owner = c.cyan(t(\"svc.owner.managed\"));\n else if (running && ownership === \"external\") owner = c.yellow(t(\"svc.owner.external\"));\n const pidStr = pid ? c.dim(String(pid)) : c.dim(\"\u2014\");\n const upStr = uptime !== \"\u2014\" ? c.dim(uptime) : c.dim(\"\u2014\");\n return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;\n}\n\n/**\n * \u67E5\u8BE2\u5E76\u683C\u5F0F\u5316\u5C55\u793A\u6240\u6709\u540E\u53F0\u670D\u52A1\u7684\u5F53\u524D\u8FD0\u884C\u72B6\u6001\u77E9\u9635\u3002\n *\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u72B6\u6001\u6458\u8981\u6587\u672C\u8868\u683C\u3002\n */\nexport async function cmdStatus(): Promise<string> {\n return viaDaemonText(\"status\", async () => {\n const rows = await queryServicesRuntime();\n const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const ownerH = t(\"svc.col.owner\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return `\\n${c.bold(t(\"svc.header\"))}\\n` + c.dim(header) + \"\\n\" + DIVIDER + \"\\n\" + lines.join(\"\\n\");\n });\n}\n\n/**\n * \u68C0\u7D22\u5E76\u683C\u5F0F\u5316\u6307\u5B9A\u670D\u52A1\u7684\u6700\u8FD1\u5386\u53F2\u65E5\u5FD7\u884C\uFF08\u652F\u6301 `-n <\u884C\u6570>` \u53CA `-f` \u5B9E\u65F6\u8FFD\u8E2A\uFF09\u3002\n *\n * @param args \u53C2\u6570\u5217\u8868\u3002\n * @param onFollow \u53EF\u9009\u7684\u8DDF\u968F\u6A21\u5F0F\u56DE\u8C03\u3002\n * @returns \u683C\u5F0F\u5316\u540E\u7684\u65E5\u5FD7\u8F93\u51FA\u6587\u672C\u3002\n */\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nfunction isNodeSvc(name: ServiceName): name is NodeServiceName {\n return name === \"db\" || name === \"qq\";\n}\n\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\n/**\n * \u542F\u52A8\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08bds / db / qq / llbot\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u542F\u52A8\u7ED3\u679C\u63CF\u8FF0\u6587\u672C\u3002\n */\nexport async function cmdStart(raw: string): Promise<string> {\n return viaDaemonText(\"start\", () => cmdStartLocal(raw), { name: raw });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u542F\u52A8\u5355\u670D\u52A1\uFF08\u542B\u5916\u90E8\u63A2\u6D3B\u9632\u53CC\u5F00\uFF09 */\nasync function cmdStartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({ rootDir: ROOT });\n if (probe.state !== \"stopped\") {\n return c.yellow(\n t(\"svc.bdsAlreadyRunning\", {\n pid: String(probe.pid),\n kind: probe.state === \"managed\" ? t(\"svc.running\") : t(\"svc.runningExternal\"),\n })\n );\n }\n }\n // \u5916\u90E8\u5DF2\u5728\u8DD1\uFF1A\u7981\u6B62\u518D spawn\uFF08\u907F\u514D\u53CC db / \u53CC qq\uFF09\n if (isNodeSvc(svc)) {\n const external = await findNodeServicePids(svc);\n if (external.length > 0) {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: String(external.join(\",\")) }));\n }\n }\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n const outcome = await svcObj.start();\n if (outcome.status === \"skipped\") {\n return c.yellow(t(\"svc.skipped\", { title: svcObj.title, reason: outcome.reason }));\n }\n if (outcome.status === \"already\") {\n return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n }\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\n/**\n * \u505C\u6B62\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u652F\u6301\u5BF9\u5916\u90E8\u975E\u6258\u7BA1\u5B9E\u4F8B\u6267\u884C\u7CBE\u51C6\u6E05\u7406\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u505C\u6B62\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdStop(raw: string): Promise<string> {\n return viaDaemonText(\"stop\", () => cmdStopLocal(raw), { name: raw });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u505C\u6B62\u5355\u670D\u52A1\uFF08\u542B\u5916\u90E8\u5B9E\u4F8B\u6E05\u7406\uFF09 */\nasync function cmdStopLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (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) {\n if (svc === \"tunnel\") await svcObj.stop(); // \u53D6\u6D88\u7B49\u5F85\u4E2D\u7684\u65AD\u7EBF\u91CD\u8BD5\n return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n }\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 return viaDaemonText(\"send\", () => cmdSendLocal(raw, message), { name: raw, message });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u5411\u670D\u52A1 stdin \u5199\u5165\u4E00\u884C */\nasync function cmdSendLocal(raw: string, message: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (svc === \"tunnel\") return c.yellow(t(\"svc.stdinUnavailable\", { title: services[svc].title }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n /* \u5148\u7EDF\u4E00\u63A2\u6D4B\uFF0C\u907F\u514D\u5185\u5B58 running \u4E0E\u771F\u5B9E\u8FDB\u7A0B\u8131\u8282 */\n await queryServicesRuntime();\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n return c.yellow(t(\"svc.stdinUnavailable\", { title: svcObj.title }));\n }\n }\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return \"\";\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\n/**\n * \u91CD\u542F\u6307\u5B9A\u7684\u5355\u9879\u540E\u53F0\u670D\u52A1\uFF08\u9075\u5FAA stop \u2192 start \u4E25\u8C28\u65F6\u5E8F\uFF09\u3002\n *\n * @param raw \u76EE\u6807\u670D\u52A1\u540D\u79F0\u5B57\u7B26\u4E32\u3002\n * @returns \u91CD\u542F\u64CD\u4F5C\u7ED3\u679C\u6587\u672C\u3002\n */\nexport async function cmdRestart(raw: string): Promise<string> {\n return viaDaemonText(\"restart\", () => cmdRestartLocal(raw), { name: raw });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u91CD\u542F\u5355\u670D\u52A1 */\nasync function cmdRestartLocal(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n // 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 cmdStopLocal(svc);\n const startMsg = await cmdStartLocal(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\n/**\n * \u6309\u670D\u52A1\u62D3\u6251\u4F9D\u8D56\u6B21\u5E8F\u6279\u91CF\u542F\u52A8\u6240\u6709\u5DF2\u542F\u7528\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u542F\u52A8\u7ED3\u679C\u7EDF\u8BA1\u62A5\u544A\u6587\u672C\u3002\n */\nexport async function cmdStartAll(): Promise<string> {\n return viaDaemonText(\"startAll\", cmdStartAllLocal);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u542F\u52A8 */\nasync function cmdStartAllLocal(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n const result = await startAll();\n const parts: string[] = [];\n if (result.started.length > 0) {\n parts.push(c.green(t(\"svc.startAll.started\", { list: result.started.join(\", \") })));\n }\n if (result.skipped.length > 0) {\n parts.push(\n c.dim(\n t(\"svc.startAll.skipped\", {\n list: result.skipped.map((s) => `${s.name}(${s.reason})`).join(\"; \"),\n })\n )\n );\n }\n if (result.failed.length > 0) {\n parts.push(\n c.red(\n t(\"svc.startAll.failed\", {\n list: result.failed.map((s) => `${s.name}: ${s.reason}`).join(\"; \"),\n })\n )\n );\n }\n if (parts.length === 0) return c.dim(t(\"svc.startAll.empty\"));\n if (result.failed.length === 0 && result.skipped.length === 0) {\n return c.green(t(\"svc.allStarted\"));\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * \u6279\u91CF\u505C\u6B62\u6240\u6709\u5F53\u524D\u5904\u4E8E\u8FD0\u884C\u6001\u7684\u540E\u53F0\u670D\u52A1\u3002\n *\n * @returns \u6279\u91CF\u505C\u6B62\u786E\u8BA4\u6587\u672C\u3002\n */\nexport async function cmdStopAll(): Promise<string> {\n return viaDaemonText(\"stopAll\", cmdStopAllLocal);\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6279\u91CF\u505C\u6B62 */\nasync function cmdStopAllLocal(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * \u89E6\u53D1 BDS \u6838\u5FC3\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u4E0E\u70ED\u5347\u7EA7\u6D41\u7A0B\u3002\n *\n * \u8FDB\u7A0B\u7BA1\u7406\u4E0E\u7F16\u6392\u7EA6\u675F\uFF1A\n * - updater \u5B50\u8FDB\u7A0B\u59CB\u7EC8\u9644\u52A0 `--no-start` \u53C2\u6570\uFF0C\u907F\u514D\u7531\u4E8E\u8FDB\u7A0B\u8131\u79BB\u5BFC\u81F4 REPL \u4E22\u5931 PID \u8DDF\u8E2A\u53CA\u6807\u51C6\u8F93\u51FA\n * - \u82E5\u66F4\u65B0\u524D BDS \u5904\u4E8E\u8FD0\u884C\u72B6\u6001\uFF0C\u4E14\u672A\u663E\u5F0F\u6307\u5B9A `--no-start`\uFF0C\u5728\u66F4\u65B0\u843D\u76D8\u90E8\u7F72\u5B8C\u6210\u540E\u7531\u76D1\u7763\u5668\u91CD\u65B0\u5524\u8D77 BDS\n *\n * @param args \u4F20\u9012\u7ED9\u66F4\u65B0\u5668\u7684\u547D\u4EE4\u884C\u53C2\u6570\u3002\n * @returns \u66F4\u65B0\u6267\u884C\u7ED3\u679C\u6458\u8981\u6587\u672C\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n return viaDaemonText(\"update\", () => cmdUpdateLocal(args), { args });\n}\n\n/** \u5B88\u62A4\u8FDB\u7A0B\u5185\u6267\u884C BDS \u66F4\u65B0\uFF08\u9700\u6301\u6709 bds Service \u53E5\u67C4\u4EE5 beginUpdate/endUpdate\uFF09 */\nasync function cmdUpdateLocal(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n // \u66F4\u65B0\u5668\u548C CLI \u5206\u5C5E\u4E0D\u540C\u8FDB\u7A0B\uFF1B\u5148\u6682\u505C CLI \u7684\u5D29\u6E83\u81EA\u542F\uFF0C\u518D\u4EA4\u7ED9\u66F4\u65B0\u5668\u505C\u670D\u3002\n bds.beginUpdate();\n try {\n const bdsProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n const bdsWasRunning = bdsProbe.state !== \"stopped\";\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n const afterProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n if (afterProbe.state !== \"stopped\") {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n bds.endUpdate();\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {\n const afterProbe = await probeBdsStatus({ rootDir: ROOT });\n if (afterProbe.state === \"stopped\") {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n }\n\n return result.out;\n } finally {\n bds.endUpdate();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* client.ts — CLI 侧守护进程客户端:ensureDaemon + RPC + 日志订阅
|
|
3
|
+
*
|
|
4
|
+
* 若 `.sfmc/daemon.json` 对应进程不在或管道不可连,则 spawn `sfmc --daemon`
|
|
5
|
+
*(detached + windowsHide),再轮询直到 ping 成功。
|
|
6
|
+
*/
|
|
7
|
+
import net from "node:net";
|
|
8
|
+
import type { ServiceStateEvent, ServiceStatus } from "../services.js";
|
|
9
|
+
import { type DaemonMeta } from "./paths.js";
|
|
10
|
+
import type { DaemonMethod, DaemonParams, DaemonResult } from "./protocol.js";
|
|
11
|
+
/**
|
|
12
|
+
* 订阅守护进程推送的服务启停事件(CLI 进程用)。
|
|
13
|
+
* 使用场景:REPL 根据 running 集合刷新发送目标 / 服务窗,无需本地持有 ChildProcess。
|
|
14
|
+
*/
|
|
15
|
+
export declare function onRemoteServiceStateChange(fn: (ev: ServiceStateEvent) => void): () => void;
|
|
16
|
+
/** 单条连接:请求/响应匹配 + 可选事件订阅 */
|
|
17
|
+
declare class DaemonConnection {
|
|
18
|
+
private sock;
|
|
19
|
+
private meta;
|
|
20
|
+
private buf;
|
|
21
|
+
private pending;
|
|
22
|
+
private subscribed;
|
|
23
|
+
closed: boolean;
|
|
24
|
+
constructor(sock: net.Socket, meta: DaemonMeta);
|
|
25
|
+
private onData;
|
|
26
|
+
private handleEvent;
|
|
27
|
+
private onClose;
|
|
28
|
+
/** 发送 RPC 并等待匹配 id 的响应 */
|
|
29
|
+
call(method: DaemonMethod, params?: DaemonParams, timeoutMs?: number): Promise<DaemonResult>;
|
|
30
|
+
/** 订阅日志与状态事件(同一连接上继续发 RPC) */
|
|
31
|
+
subscribe(): Promise<void>;
|
|
32
|
+
/** 断开连接(不停守护进程) */
|
|
33
|
+
disconnect(): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 确保守护进程可用并返回共享连接。
|
|
37
|
+
* 守护进程进程内调用会抛错(应直接走本地 cmd*)。
|
|
38
|
+
*/
|
|
39
|
+
export declare function ensureDaemon(): Promise<DaemonConnection>;
|
|
40
|
+
/**
|
|
41
|
+
* 调用守护进程方法;自动 ensureDaemon。
|
|
42
|
+
* 使用场景:CLI 侧 status/start/stop/send/update 等运维命令的统一出口。
|
|
43
|
+
*/
|
|
44
|
+
export declare function callDaemon(method: DaemonMethod, params?: DaemonParams): Promise<DaemonResult>;
|
|
45
|
+
/**
|
|
46
|
+
* 确保已连接并订阅远程日志/状态;返回断开函数(不停守护进程)。
|
|
47
|
+
* 使用场景:REPL 启动时挂上实时日志流,退出时只 disconnect。
|
|
48
|
+
*/
|
|
49
|
+
export declare function ensureDaemonSubscription(): Promise<() => void>;
|
|
50
|
+
/**
|
|
51
|
+
* 请求守护进程 stopAll 后退出(`sfmc daemon stop`)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function shutdownDaemon(): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* 从守护进程拉取运行态行;失败时返回空数组由调用方降级。
|
|
56
|
+
*/
|
|
57
|
+
export declare function queryRuntimeViaDaemon(): Promise<ServiceStatus[]>;
|
|
58
|
+
/**
|
|
59
|
+
* 从守护进程拉取格式化 status 文本。
|
|
60
|
+
*/
|
|
61
|
+
export declare function statusTextViaDaemon(): Promise<string>;
|
|
62
|
+
/**
|
|
63
|
+
* 通用「返回 text」类 RPC 辅助。
|
|
64
|
+
*/
|
|
65
|
+
export declare function textViaDaemon(method: DaemonMethod, params?: DaemonParams): Promise<string>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACb,MAAM,eAAe,CAAC;AAiBvB;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1F;AAED,4BAA4B;AAC5B,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,MAAM,UAAS;IAEf,YAAY,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAO7C;IAED,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,OAAO;IAWf,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,SAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBpG;IAED,8BAA8B;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAI/B;IAED,mBAAmB;IACnB,UAAU,IAAI,IAAI,CAQjB;CACF;AAgED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAwC9D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAGnG;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAMpE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAItE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK3D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhG"}
|