@sfmc-bds/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/commands-behavior-pack.d.ts +46 -0
- package/dist/commands-behavior-pack.d.ts.map +1 -0
- package/dist/commands-behavior-pack.js +160 -0
- package/dist/commands-behavior-pack.js.map +1 -0
- package/dist/commands.d.ts +11 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +191 -0
- package/dist/commands.js.map +1 -0
- package/dist/dispatcher.d.ts +13 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +23 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/logs.d.ts +35 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +202 -0
- package/dist/logs.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +189 -0
- package/dist/main.js.map +1 -0
- package/dist/module-commands.d.ts +39 -0
- package/dist/module-commands.d.ts.map +1 -0
- package/dist/module-commands.js +367 -0
- package/dist/module-commands.js.map +1 -0
- package/dist/registry.d.ts +53 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +125 -0
- package/dist/registry.js.map +1 -0
- package/dist/remote-agent.d.ts +18 -0
- package/dist/remote-agent.d.ts.map +1 -0
- package/dist/remote-agent.js +212 -0
- package/dist/remote-agent.js.map +1 -0
- package/dist/repl.d.ts +9 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +652 -0
- package/dist/repl.js.map +1 -0
- package/dist/runtime.d.ts +28 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +74 -0
- package/dist/runtime.js.map +1 -0
- package/dist/services.d.ts +61 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +259 -0
- package/dist/services.js.map +1 -0
- package/dist/terminal.d.ts +3 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +178 -0
- package/dist/terminal.js.map +1 -0
- package/dist/theme.d.ts +33 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +55 -0
- package/dist/theme.js.map +1 -0
- package/dist/wizard.d.ts +2 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +475 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @sfmc-bds/cli
|
|
2
|
+
|
|
3
|
+
SFMC 管理 CLI:REPL、服务启停、模块安装、行为包 build/deploy。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @sfmc-bds/cli
|
|
9
|
+
# 或
|
|
10
|
+
npx @sfmc-bds/cli status
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
服主推荐仍使用 [GitHub Releases SEA 单文件](https://github.com/DogeLakeDev/ScriptsForMinecraftServer/releases)。
|
|
14
|
+
|
|
15
|
+
## 依赖
|
|
16
|
+
|
|
17
|
+
- `@sfmc-bds/sdk` ^0.1.0
|
|
18
|
+
- Node.js >= 22.13
|
|
19
|
+
|
|
20
|
+
## 仓库
|
|
21
|
+
|
|
22
|
+
<https://github.com/DogeLakeDev/ScriptsForMinecraftServer/tree/main/sfmc>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands-behavior-pack.ts — sfmc CLI commands `behavior-pack build` / `deploy`
|
|
3
|
+
*
|
|
4
|
+
* 设计:
|
|
5
|
+
* 1. `build` = esbuild 聚合 modules/packages/<id>/sapi/src/index.ts → <ROOT>/build/sfmc-modules-bp/scripts/main.js
|
|
6
|
+
* 然后 spawnService pack-manager assemble-bp 把那个目录装成完整 BP:
|
|
7
|
+
* - 拷 scripts/** 到 outDir/scripts/
|
|
8
|
+
* - 写一份 manifest.json (uuid 由 pack-manager 随机生成)
|
|
9
|
+
* - 写 permissions.json (7 项 @minecraft/*)
|
|
10
|
+
* - 拷 pack_icon.png (如提供)
|
|
11
|
+
* 2. `deploy` = spawnService pack-manager deploy 拷到 worlds/<level>/behavior_packs/<bpName>/
|
|
12
|
+
* 并写 permissions.json。enable/disable packs in world (写 world_behavior_packs.json)
|
|
13
|
+
* 是单独命令 `behavior-pack enable-pack` / `disable-pack` — 因为 BDS 重启后
|
|
14
|
+
* 才会读那个 JSON,与 build/deploy 顺序解耦。
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
export declare const BP_NAME = "sfmc-modules";
|
|
18
|
+
export declare const RP_NAME = "sfmc-modules-rp";
|
|
19
|
+
/** Build 输出根: <ROOT>/build/ */
|
|
20
|
+
export declare function buildRoot(): string;
|
|
21
|
+
/** Build 中间产物的 BP 源目录(已经被 esbuild 写过 scripts/main.js):<ROOT>/build/sfmc-modules-bp/ */
|
|
22
|
+
export declare function bpSrc(): string;
|
|
23
|
+
/** 最终装配好的 BP 目录(assemble-bp 后写到此处,deploy 从这里拷到 BDS):<ROOT>/build/sfmc-modules/ */
|
|
24
|
+
export declare function bpOut(): string;
|
|
25
|
+
/** RP 装配结果:<ROOT>/build/sfmc-modules-rp/ */
|
|
26
|
+
export declare function rpOut(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Walk modules/packages/<id>/sapi/src/index.ts and produce a list of entry
|
|
29
|
+
* paths. Modules without sapi/ are skipped silently.
|
|
30
|
+
*/
|
|
31
|
+
export declare function listEnabledEntries(): Promise<string[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Run esbuild to bundle every enabled module entry into a single script.
|
|
34
|
+
* This function returns the output path. On failure it throws — the CLI
|
|
35
|
+
* surfaces the error message back to the user.
|
|
36
|
+
*
|
|
37
|
+
* NOTE: Commits 4 doesn't pull in esbuild as a runtime dep. This function
|
|
38
|
+
* is therefore only usable from the npm path; the SEA path needs the
|
|
39
|
+
* platform binary embed (Stage K follow-up).
|
|
40
|
+
*/
|
|
41
|
+
export declare function bundleScripts(): Promise<string>;
|
|
42
|
+
/** Build the BP from already-bundled scripts + assemble via pack-manager. */
|
|
43
|
+
export declare function cmdBehaviorPackBuild(_args: string[]): Promise<string>;
|
|
44
|
+
/** Deploy the assembled BP + RP into the BDS world's behavior_packs folder. */
|
|
45
|
+
export declare function cmdBehaviorPackDeploy(_args: string[]): Promise<string>;
|
|
46
|
+
//# sourceMappingURL=commands-behavior-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-behavior-pack.d.ts","sourceRoot":"","sources":["../src/commands-behavior-pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,OAAO,oBAAoB,CAAC;AAEzC,+BAA+B;AAC/B,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,uFAAuF;AACvF,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,kFAAkF;AAClF,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAKD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAc5D;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAuBrD;AAED,6EAA6E;AAC7E,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B3E;AAQD,+EAA+E;AAC/E,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B5E"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands-behavior-pack.ts — sfmc CLI commands `behavior-pack build` / `deploy`
|
|
3
|
+
*
|
|
4
|
+
* 设计:
|
|
5
|
+
* 1. `build` = esbuild 聚合 modules/packages/<id>/sapi/src/index.ts → <ROOT>/build/sfmc-modules-bp/scripts/main.js
|
|
6
|
+
* 然后 spawnService pack-manager assemble-bp 把那个目录装成完整 BP:
|
|
7
|
+
* - 拷 scripts/** 到 outDir/scripts/
|
|
8
|
+
* - 写一份 manifest.json (uuid 由 pack-manager 随机生成)
|
|
9
|
+
* - 写 permissions.json (7 项 @minecraft/*)
|
|
10
|
+
* - 拷 pack_icon.png (如提供)
|
|
11
|
+
* 2. `deploy` = spawnService pack-manager deploy 拷到 worlds/<level>/behavior_packs/<bpName>/
|
|
12
|
+
* 并写 permissions.json。enable/disable packs in world (写 world_behavior_packs.json)
|
|
13
|
+
* 是单独命令 `behavior-pack enable-pack` / `disable-pack` — 因为 BDS 重启后
|
|
14
|
+
* 才会读那个 JSON,与 build/deploy 顺序解耦。
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
import { configPath, readJson } from "@sfmc-bds/sdk/node/config";
|
|
18
|
+
import { existsSync } from "node:fs";
|
|
19
|
+
import fs from "node:fs/promises";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
import process from "node:process";
|
|
22
|
+
import PropertiesReader from "properties-reader";
|
|
23
|
+
import { ROOT, spawnServiceSync } from "./runtime.js";
|
|
24
|
+
import { c } from "./theme.js";
|
|
25
|
+
export const BP_NAME = "sfmc-modules";
|
|
26
|
+
export const RP_NAME = "sfmc-modules-rp";
|
|
27
|
+
/** Build 输出根: <ROOT>/build/ */
|
|
28
|
+
export function buildRoot() {
|
|
29
|
+
return path.join(ROOT, "build");
|
|
30
|
+
}
|
|
31
|
+
/** Build 中间产物的 BP 源目录(已经被 esbuild 写过 scripts/main.js):<ROOT>/build/sfmc-modules-bp/ */
|
|
32
|
+
export function bpSrc() {
|
|
33
|
+
return path.join(buildRoot(), `${BP_NAME}-bp`);
|
|
34
|
+
}
|
|
35
|
+
/** 最终装配好的 BP 目录(assemble-bp 后写到此处,deploy 从这里拷到 BDS):<ROOT>/build/sfmc-modules/ */
|
|
36
|
+
export function bpOut() {
|
|
37
|
+
return path.join(buildRoot(), BP_NAME);
|
|
38
|
+
}
|
|
39
|
+
/** RP 装配结果:<ROOT>/build/sfmc-modules-rp/ */
|
|
40
|
+
export function rpOut() {
|
|
41
|
+
return path.join(buildRoot(), RP_NAME);
|
|
42
|
+
}
|
|
43
|
+
/** Esbuild bundle 入口到输出路径表 */
|
|
44
|
+
const ENTRY_FILES = ["sapi", "src", "index.ts"];
|
|
45
|
+
/**
|
|
46
|
+
* Walk modules/packages/<id>/sapi/src/index.ts and produce a list of entry
|
|
47
|
+
* paths. Modules without sapi/ are skipped silently.
|
|
48
|
+
*/
|
|
49
|
+
export async function listEnabledEntries() {
|
|
50
|
+
const pkgDir = path.join(ROOT, "modules", "packages");
|
|
51
|
+
try {
|
|
52
|
+
const entries = await fs.readdir(pkgDir, { withFileTypes: true });
|
|
53
|
+
const out = [];
|
|
54
|
+
for (const e of entries) {
|
|
55
|
+
if (!e.isDirectory())
|
|
56
|
+
continue;
|
|
57
|
+
const entry = path.join(pkgDir, e.name, ...ENTRY_FILES);
|
|
58
|
+
if (existsSync(entry))
|
|
59
|
+
out.push(entry);
|
|
60
|
+
}
|
|
61
|
+
return out.sort();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Run esbuild to bundle every enabled module entry into a single script.
|
|
69
|
+
* This function returns the output path. On failure it throws — the CLI
|
|
70
|
+
* surfaces the error message back to the user.
|
|
71
|
+
*
|
|
72
|
+
* NOTE: Commits 4 doesn't pull in esbuild as a runtime dep. This function
|
|
73
|
+
* is therefore only usable from the npm path; the SEA path needs the
|
|
74
|
+
* platform binary embed (Stage K follow-up).
|
|
75
|
+
*/
|
|
76
|
+
export async function bundleScripts() {
|
|
77
|
+
const { build } = await import("esbuild");
|
|
78
|
+
const entries = await listEnabledEntries();
|
|
79
|
+
const outFile = path.join(bpSrc(), "scripts", "main.js");
|
|
80
|
+
await fs.mkdir(path.dirname(outFile), { recursive: true });
|
|
81
|
+
if (entries.length === 0) {
|
|
82
|
+
/* Empty bundle is legal: BDS still loads an empty main.js and the BP is
|
|
83
|
+
* valid. The user just won't see anything until they install a module. */
|
|
84
|
+
await fs.writeFile(outFile, "/* no modules enabled */\n", "utf8");
|
|
85
|
+
return outFile;
|
|
86
|
+
}
|
|
87
|
+
await build({
|
|
88
|
+
entryPoints: entries,
|
|
89
|
+
outfile: outFile,
|
|
90
|
+
bundle: true,
|
|
91
|
+
platform: "neutral",
|
|
92
|
+
format: "esm",
|
|
93
|
+
target: "es2022",
|
|
94
|
+
logLevel: "warning",
|
|
95
|
+
sourcemap: false,
|
|
96
|
+
external: ["@minecraft/*"],
|
|
97
|
+
});
|
|
98
|
+
return outFile;
|
|
99
|
+
}
|
|
100
|
+
/** Build the BP from already-bundled scripts + assemble via pack-manager. */
|
|
101
|
+
export async function cmdBehaviorPackBuild(_args) {
|
|
102
|
+
const scriptFile = await bundleScripts();
|
|
103
|
+
if (!existsSync(scriptFile)) {
|
|
104
|
+
return c.red(`bundle failed: ${scriptFile} missing`);
|
|
105
|
+
}
|
|
106
|
+
const proc = spawnServiceSync("pack-manager", [
|
|
107
|
+
"assemble-bp",
|
|
108
|
+
"--src",
|
|
109
|
+
bpSrc(),
|
|
110
|
+
"--out",
|
|
111
|
+
bpOut(),
|
|
112
|
+
"--name",
|
|
113
|
+
BP_NAME,
|
|
114
|
+
"--version",
|
|
115
|
+
"1,0,0",
|
|
116
|
+
"--description",
|
|
117
|
+
"ScriptsForMinecraftServer aggregated behavior pack",
|
|
118
|
+
], { encoding: "utf8" });
|
|
119
|
+
if (proc.status !== 0) {
|
|
120
|
+
const stderr = (proc.stderr ?? "").toString();
|
|
121
|
+
return c.red(`pack-manager assemble-bp failed: ${stderr}`);
|
|
122
|
+
}
|
|
123
|
+
return `${c.green(`built behavior pack at ${bpOut()}`)}\n${(proc.stdout ?? "").toString().trim()}\n`;
|
|
124
|
+
}
|
|
125
|
+
async function getServerProperties(bdsPath) {
|
|
126
|
+
const properties = PropertiesReader({ sourceFile: path.join(bdsPath, "server.properties") });
|
|
127
|
+
const levelName = properties.get("level-name");
|
|
128
|
+
return { levelName };
|
|
129
|
+
}
|
|
130
|
+
/** Deploy the assembled BP + RP into the BDS world's behavior_packs folder. */
|
|
131
|
+
export async function cmdBehaviorPackDeploy(_args) {
|
|
132
|
+
const cfg = readJson(configPath(ROOT, "bds_updater.json"));
|
|
133
|
+
const bdsPath = cfg.bds_path;
|
|
134
|
+
if (!bdsPath) {
|
|
135
|
+
return c.red("deploy: bds_path not configured. Run `sfmc init` first.");
|
|
136
|
+
}
|
|
137
|
+
const p = await getServerProperties(bdsPath);
|
|
138
|
+
const args = [
|
|
139
|
+
"deploy",
|
|
140
|
+
"--bds-root",
|
|
141
|
+
bdsPath,
|
|
142
|
+
"--level",
|
|
143
|
+
p.levelName,
|
|
144
|
+
"--bp-src",
|
|
145
|
+
bpOut(),
|
|
146
|
+
"--bp-name",
|
|
147
|
+
BP_NAME,
|
|
148
|
+
];
|
|
149
|
+
if (existsSync(rpOut())) {
|
|
150
|
+
args.push("--rp-src", rpOut(), "--rp-name", RP_NAME);
|
|
151
|
+
}
|
|
152
|
+
const proc = spawnServiceSync("pack-manager", args, { encoding: "utf8" });
|
|
153
|
+
if (proc.status !== 0) {
|
|
154
|
+
const stderr = (proc.stderr ?? "").toString();
|
|
155
|
+
return c.red(`pack-manager deploy failed: ${stderr}`);
|
|
156
|
+
}
|
|
157
|
+
return `${c.green(`deployed to ${path.join(bdsPath, "worlds", p.levelName)}`)}\n${(proc.stdout ?? "").toString().trim()}\n`;
|
|
158
|
+
}
|
|
159
|
+
void process;
|
|
160
|
+
//# sourceMappingURL=commands-behavior-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-behavior-pack.js","sourceRoot":"","sources":["../src/commands-behavior-pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ServiceName } from "./services.js";
|
|
2
|
+
export declare function cmdStatus(): string;
|
|
3
|
+
export declare function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string;
|
|
4
|
+
export declare function cmdStart(raw: string): Promise<string>;
|
|
5
|
+
export declare function cmdStop(raw: string): Promise<string>;
|
|
6
|
+
export declare function cmdSend(raw: string, message: string): Promise<string>;
|
|
7
|
+
export declare function cmdRestart(raw: string): Promise<string>;
|
|
8
|
+
export declare function cmdStartAll(): Promise<string>;
|
|
9
|
+
export declare function cmdStopAll(): Promise<string>;
|
|
10
|
+
export declare function cmdUpdate(args?: string[]): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAiBhF,wBAAgB,SAAS,IAAI,MAAM,CAalC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CA+C7F;AAKD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe3D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAIlD;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BpE"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { pushLog as pushUnifiedLog } from "./logs.js";
|
|
2
|
+
import { spawnService } from "./runtime.js";
|
|
3
|
+
import { ROOT, SERVICE_NAMES, services } from "./services.js";
|
|
4
|
+
import { c, DIVIDER, highlightLogLine } from "./theme.js";
|
|
5
|
+
function parseService(raw) {
|
|
6
|
+
const s = raw.toLowerCase();
|
|
7
|
+
if (SERVICE_NAMES.includes(s))
|
|
8
|
+
return s;
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
function statusLine(name, running, pid, uptime) {
|
|
12
|
+
const dot = running ? c.green("●") : c.dim("○");
|
|
13
|
+
const status = running ? c.green("Running") : c.dim("Stopped");
|
|
14
|
+
const pidStr = pid ? c.dim(String(pid)) : c.dim("—");
|
|
15
|
+
const upStr = uptime !== "—" ? c.dim(uptime) : c.dim("—");
|
|
16
|
+
return ` ${dot} ${c.bold(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;
|
|
17
|
+
}
|
|
18
|
+
export function cmdStatus() {
|
|
19
|
+
const lines = SERVICE_NAMES.map((name) => {
|
|
20
|
+
const s = services[name];
|
|
21
|
+
return statusLine(s.title, s.running, s.pid, s.uptime);
|
|
22
|
+
});
|
|
23
|
+
return (`\n${c.bold("Services")}\n` +
|
|
24
|
+
c.dim(` Name${" ".repeat(7)}Status${" ".repeat(4)}PID${" ".repeat(4)}Uptime\n`) +
|
|
25
|
+
DIVIDER +
|
|
26
|
+
"\n" +
|
|
27
|
+
lines.join("\n") +
|
|
28
|
+
"\n");
|
|
29
|
+
}
|
|
30
|
+
export function cmdLogs(args, onFollow) {
|
|
31
|
+
let n = 20;
|
|
32
|
+
let follow = false;
|
|
33
|
+
const positional = [];
|
|
34
|
+
for (const a of args) {
|
|
35
|
+
if (a === "-n")
|
|
36
|
+
continue; /* handled below */
|
|
37
|
+
if (a === "-f") {
|
|
38
|
+
follow = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
positional.push(a);
|
|
42
|
+
}
|
|
43
|
+
/* -n takes the next argument as value */
|
|
44
|
+
const nIdx = args.indexOf("-n");
|
|
45
|
+
if (nIdx >= 0 && nIdx + 1 < args.length)
|
|
46
|
+
n = parseInt(args[nIdx + 1] ?? "0", 10);
|
|
47
|
+
const svcRaw = positional[0];
|
|
48
|
+
if (!svcRaw)
|
|
49
|
+
return c.yellow("Usage: logs <service> [-n N] [-f]");
|
|
50
|
+
const svc = parseService(svcRaw);
|
|
51
|
+
if (!svc)
|
|
52
|
+
return c.red(`Unknown service: ${svcRaw} (try: ${SERVICE_NAMES.join(", ")})`);
|
|
53
|
+
const svcObj = services[svc];
|
|
54
|
+
const lines = svcObj.getRecentLogs(n);
|
|
55
|
+
if (lines.length === 0)
|
|
56
|
+
return c.dim("(no logs yet)");
|
|
57
|
+
const header = `\n${c.bold(svcObj.title)} logs (last ${lines.length}):`;
|
|
58
|
+
const body = lines
|
|
59
|
+
.map((l) => {
|
|
60
|
+
const ts = c.dim(l.time.toLocaleTimeString());
|
|
61
|
+
const text = highlightLogLine(l.text);
|
|
62
|
+
const prefix = l.stream === "stderr" ? c.red("!") : c.dim(" ");
|
|
63
|
+
return `${ts} ${prefix} ${text}`;
|
|
64
|
+
})
|
|
65
|
+
.join("\n");
|
|
66
|
+
const result = header + "\n" + DIVIDER + "\n" + body + "\n";
|
|
67
|
+
if (follow && onFollow) {
|
|
68
|
+
onFollow(svc);
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
const STARTING = new Set();
|
|
74
|
+
const STOPPING = new Set();
|
|
75
|
+
export async function cmdStart(raw) {
|
|
76
|
+
const svc = parseService(raw);
|
|
77
|
+
if (!svc)
|
|
78
|
+
return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
|
|
79
|
+
const svcObj = services[svc];
|
|
80
|
+
if (svcObj.running)
|
|
81
|
+
return c.yellow(`${svcObj.title} already running (PID ${svcObj.pid})`);
|
|
82
|
+
if (STARTING.has(svc))
|
|
83
|
+
return c.dim(`${svcObj.title} already starting...`);
|
|
84
|
+
STARTING.add(svc);
|
|
85
|
+
try {
|
|
86
|
+
await svcObj.start();
|
|
87
|
+
return c.green(`${svcObj.title} started`);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
return c.red(`${svcObj.title} failed: ${e.message}`);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
STARTING.delete(svc);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function cmdStop(raw) {
|
|
97
|
+
const svc = parseService(raw);
|
|
98
|
+
if (!svc)
|
|
99
|
+
return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
|
|
100
|
+
const svcObj = services[svc];
|
|
101
|
+
if (!svcObj.running)
|
|
102
|
+
return c.yellow(`${svcObj.title} already stopped`);
|
|
103
|
+
if (STOPPING.has(svc))
|
|
104
|
+
return c.dim(`${svcObj.title} already stopping...`);
|
|
105
|
+
STOPPING.add(svc);
|
|
106
|
+
try {
|
|
107
|
+
await svcObj.stop();
|
|
108
|
+
return c.dim(`${svcObj.title} stopped`);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return c.red(`${svcObj.title} stop failed: ${e.message}`);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
STOPPING.delete(svc);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export async function cmdSend(raw, message) {
|
|
118
|
+
const svc = parseService(raw);
|
|
119
|
+
if (!svc)
|
|
120
|
+
return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
|
|
121
|
+
if (!message)
|
|
122
|
+
return c.yellow("Usage: send <service> <message>");
|
|
123
|
+
const svcObj = services[svc];
|
|
124
|
+
if (!svcObj.running || !svcObj.proc?.stdin)
|
|
125
|
+
return c.yellow(`${svcObj.title} not running`);
|
|
126
|
+
try {
|
|
127
|
+
svcObj.proc.stdin.write(message + "\n");
|
|
128
|
+
return c.dim(`sent to ${svc}`);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return c.red("write failed");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export async function cmdRestart(raw) {
|
|
135
|
+
const svc = parseService(raw);
|
|
136
|
+
if (!svc)
|
|
137
|
+
return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
|
|
138
|
+
const svcObj = services[svc];
|
|
139
|
+
try {
|
|
140
|
+
await svcObj.restart();
|
|
141
|
+
return c.green(`${svcObj.title} restarted`);
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
return c.red(`${svcObj.title} restart failed: ${e.message}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export async function cmdStartAll() {
|
|
148
|
+
const { startAll } = await import("./services.js");
|
|
149
|
+
await startAll();
|
|
150
|
+
return c.green("All services started");
|
|
151
|
+
}
|
|
152
|
+
export async function cmdStopAll() {
|
|
153
|
+
const { stopAll } = await import("./services.js");
|
|
154
|
+
await stopAll();
|
|
155
|
+
return c.dim("All services stopped");
|
|
156
|
+
}
|
|
157
|
+
export async function cmdUpdate(args = []) {
|
|
158
|
+
return new Promise((resolve) => {
|
|
159
|
+
const proc = spawnService("update", args, {
|
|
160
|
+
cwd: ROOT,
|
|
161
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
162
|
+
});
|
|
163
|
+
let out = "";
|
|
164
|
+
proc.stdout?.on("data", (d) => {
|
|
165
|
+
const s = d.toString();
|
|
166
|
+
out += s;
|
|
167
|
+
for (const line of s.split("\n").filter(Boolean))
|
|
168
|
+
pushUnifiedLog(line, "update", "info");
|
|
169
|
+
});
|
|
170
|
+
proc.stderr?.on("data", (d) => {
|
|
171
|
+
const s = d.toString();
|
|
172
|
+
out += s;
|
|
173
|
+
for (const line of s.split("\n").filter(Boolean))
|
|
174
|
+
pushUnifiedLog(line, "update", "error");
|
|
175
|
+
});
|
|
176
|
+
proc.on("exit", (code) => {
|
|
177
|
+
if (code === 0) {
|
|
178
|
+
pushUnifiedLog("update complete", "system", "success");
|
|
179
|
+
resolve((out ? out + "\n" : "") + "update complete");
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
resolve(out || `update exited with code ${code}`);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
proc.on("error", (e) => {
|
|
186
|
+
pushUnifiedLog(`update error: ${e.message}`, "system", "error");
|
|
187
|
+
resolve(`update error: ${e.message}`);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEA dispatcher —— 单 exe 多路分发入口。
|
|
3
|
+
*
|
|
4
|
+
* 子服务(db/qq/update/manager/pack-manager)**不打包进 SEA**:
|
|
5
|
+
* SEA exe 只能跑 ESM bundle 内的代码,不能直接 require 外部 .js 文件。
|
|
6
|
+
* 所以 SEA supervisor 通过 `runtime.ts#spawnService` 用**系统 node**
|
|
7
|
+
* spawn 根目录下的子服务入口脚本,SEA bundle 只包含 supervisor 自己。
|
|
8
|
+
*
|
|
9
|
+
* 同一个 sfmc.exe 默认跑 supervisor (main.ts);子服务走外部 node 进程
|
|
10
|
+
* —— SEA exe 在这里不重入,避免 SEA 重复 inline 子服务代码。
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEA dispatcher —— 单 exe 多路分发入口。
|
|
3
|
+
*
|
|
4
|
+
* 子服务(db/qq/update/manager/pack-manager)**不打包进 SEA**:
|
|
5
|
+
* SEA exe 只能跑 ESM bundle 内的代码,不能直接 require 外部 .js 文件。
|
|
6
|
+
* 所以 SEA supervisor 通过 `runtime.ts#spawnService` 用**系统 node**
|
|
7
|
+
* spawn 根目录下的子服务入口脚本,SEA bundle 只包含 supervisor 自己。
|
|
8
|
+
*
|
|
9
|
+
* 同一个 sfmc.exe 默认跑 supervisor (main.ts);子服务走外部 node 进程
|
|
10
|
+
* —— SEA exe 在这里不重入,避免 SEA 重复 inline 子服务代码。
|
|
11
|
+
*/
|
|
12
|
+
import { ensureSeaTerminalProfile } from "./terminal.js";
|
|
13
|
+
ensureSeaTerminalProfile();
|
|
14
|
+
if (process.env.SFMC_SERVICE) {
|
|
15
|
+
/* 子服务不在 SEA 内运行;supervisor 用系统 node spawn 它们。
|
|
16
|
+
* 这里只是兜底:如果有人误把 SFMC_SERVICE 设上后直接跑 sfmc.exe,
|
|
17
|
+
* 提示并退出,而不是错误地执行 main。 */
|
|
18
|
+
console.error(`[sfmc] service "${process.env.SFMC_SERVICE}" must be launched by the supervisor, not directly.`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
/* 未设 SFMC_SERVICE 时,落到 ./main.js 末尾的 main() 自执行。 */
|
|
22
|
+
await import("./main.js");
|
|
23
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,wBAAwB,EAAE,CAAC;AAE3B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC7B;;8BAE0B;IAC1B,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,GAAG,CAAC,YAAY,qDAAqD,CAAC,CAAC;IAChH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,oDAAoD;AACpD,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sfmc/ public runtime surface (Stage J — minimum entry design)
|
|
3
|
+
*
|
|
4
|
+
* This is the clean API that downstream callers (future sfmc-cil commands,
|
|
5
|
+
* external scripts, CI tooling) consume to manage the runtime stack
|
|
6
|
+
* without re-implementing process lifecycle logic.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Single process tree. sfmc/ does not spawn itself recursively — it spawns
|
|
10
|
+
* the actual services (db-server, qq-bridge, bds-tools, BDS).
|
|
11
|
+
* - `IS_SEA` / `ROOT` from runtime.ts describe the deployment shape so callers
|
|
12
|
+
* can adapt (path lookup, config dir).
|
|
13
|
+
* - Service lifecycle goes through ServiceRegistry (start/stop/restart/status).
|
|
14
|
+
* - Module manifest from db-server is exposed via `readModuleManifest()` so
|
|
15
|
+
* callers can show enabled modules + per-module state.
|
|
16
|
+
*
|
|
17
|
+
* Re-exports are deliberately thin: each item is a stable contract. Internal
|
|
18
|
+
* helpers (LogLine buffers, child-process piping) are NOT re-exported.
|
|
19
|
+
*/
|
|
20
|
+
export { ROOT, IS_SEA, spawnService, spawnServiceSync, type ServiceId } from "./runtime.js";
|
|
21
|
+
export { SERVICE_NAMES, type ServiceName, type ServiceStatus, refreshServices, startAll, stopAll, forceStopAll, serviceStatus, services, START_ORDER, } from "./services.js";
|
|
22
|
+
export { pushLog, onLog, getAllLogs, getRecentLogs, type UnifiedLog, type LogLevel, type LogSource } from "./logs.js";
|
|
23
|
+
/**
|
|
24
|
+
* Reads the manifest emitted by the behavior pack build, if present.
|
|
25
|
+
* Returns null when no manifest exists (e.g. behavior pack hasn't been built).
|
|
26
|
+
*/
|
|
27
|
+
export declare function readModuleManifest(): Promise<unknown>;
|
|
28
|
+
export { startRepl, HELP } from "./repl.js";
|
|
29
|
+
export { runWizard } from "./wizard.js";
|
|
30
|
+
export { cmdModuleList, cmdModuleInstall, cmdModuleUninstall, cmdModuleVerify, cmdModuleInfo } from "./module-commands.js";
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtH;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW3D;AAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sfmc/ public runtime surface (Stage J — minimum entry design)
|
|
3
|
+
*
|
|
4
|
+
* This is the clean API that downstream callers (future sfmc-cil commands,
|
|
5
|
+
* external scripts, CI tooling) consume to manage the runtime stack
|
|
6
|
+
* without re-implementing process lifecycle logic.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Single process tree. sfmc/ does not spawn itself recursively — it spawns
|
|
10
|
+
* the actual services (db-server, qq-bridge, bds-tools, BDS).
|
|
11
|
+
* - `IS_SEA` / `ROOT` from runtime.ts describe the deployment shape so callers
|
|
12
|
+
* can adapt (path lookup, config dir).
|
|
13
|
+
* - Service lifecycle goes through ServiceRegistry (start/stop/restart/status).
|
|
14
|
+
* - Module manifest from db-server is exposed via `readModuleManifest()` so
|
|
15
|
+
* callers can show enabled modules + per-module state.
|
|
16
|
+
*
|
|
17
|
+
* Re-exports are deliberately thin: each item is a stable contract. Internal
|
|
18
|
+
* helpers (LogLine buffers, child-process piping) are NOT re-exported.
|
|
19
|
+
*/
|
|
20
|
+
export { ROOT, IS_SEA, spawnService, spawnServiceSync } from "./runtime.js";
|
|
21
|
+
export { SERVICE_NAMES, refreshServices, startAll, stopAll, forceStopAll, serviceStatus, services, START_ORDER, } from "./services.js";
|
|
22
|
+
export { pushLog, onLog, getAllLogs, getRecentLogs } from "./logs.js";
|
|
23
|
+
/**
|
|
24
|
+
* Reads the manifest emitted by the behavior pack build, if present.
|
|
25
|
+
* Returns null when no manifest exists (e.g. behavior pack hasn't been built).
|
|
26
|
+
*/
|
|
27
|
+
export async function readModuleManifest() {
|
|
28
|
+
const fs = await import("node:fs/promises");
|
|
29
|
+
const path = await import("node:path");
|
|
30
|
+
const { ROOT } = await import("./runtime.js");
|
|
31
|
+
const manifestPath = path.join(ROOT, "modules", "_manifests", "module-manifests.json");
|
|
32
|
+
try {
|
|
33
|
+
const text = await fs.readFile(manifestPath, "utf8");
|
|
34
|
+
return JSON.parse(text);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export { startRepl, HELP } from "./repl.js";
|
|
41
|
+
export { runWizard } from "./wizard.js";
|
|
42
|
+
export { cmdModuleList, cmdModuleInstall, cmdModuleUninstall, cmdModuleVerify, cmdModuleInfo } from "./module-commands.js";
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAE5F,OAAO,EACL,aAAa,EAGb,eAAe,EACf,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAkD,MAAM,WAAW,CAAC;AAEtH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC;IACvF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/logs.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* logs.ts — sfmc 主进程统一日志聚合层
|
|
3
|
+
*
|
|
4
|
+
* 内部委托 @sfmc-bds/logs 共享包的 createMemoryBuffer + inferLevel,
|
|
5
|
+
* 保持向后兼容的 pushLog / onLog / getAllLogs / getRecentLogs API
|
|
6
|
+
* (services.ts 捕获子进程 stdout 后调用 pushLog 汇聚到此)。
|
|
7
|
+
*
|
|
8
|
+
* formatLog 保留 theme.ts (chalk) 配色,比共享包的纯 ANSI 版本视觉更丰富。
|
|
9
|
+
*/
|
|
10
|
+
import { type LogEntry, type LogLevel as SharedLogLevel } from "@sfmc-bds/sdk/logs";
|
|
11
|
+
export type LogLevel = SharedLogLevel;
|
|
12
|
+
export type LogSource = string;
|
|
13
|
+
export interface UnifiedLog extends LogEntry {
|
|
14
|
+
}
|
|
15
|
+
/** 推送一条日志到内存缓冲 (services.ts 捕获子进程 stdout 后调用) */
|
|
16
|
+
export declare function pushLog(text: string, source: LogSource, level: LogLevel): void;
|
|
17
|
+
/** 订阅新日志事件,返回取消订阅函数 */
|
|
18
|
+
export declare function onLog(fn: (log: UnifiedLog) => void): () => void;
|
|
19
|
+
/** 获取全部日志 (按时间顺序) */
|
|
20
|
+
export declare function getAllLogs(): UnifiedLog[];
|
|
21
|
+
/** 获取最近 n 条,可按 level / source 过滤 */
|
|
22
|
+
export declare function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[];
|
|
23
|
+
/** 从原始文本推断日志级别 (委托共享包) */
|
|
24
|
+
export declare function inferLevel(text: string): LogLevel;
|
|
25
|
+
/** 格式化日志用于 REPL 展示 (用 theme.ts chalk 配色) */
|
|
26
|
+
export declare function formatLog(l: UnifiedLog): string;
|
|
27
|
+
/** 字符串在终端的可见宽度 (strip ANSI 后按 CJK 宽度累加) */
|
|
28
|
+
export declare function visibleWidth(s: string): number;
|
|
29
|
+
/**
|
|
30
|
+
* 按终端可见宽度换行,后续行左侧缩进 indent 个空格。
|
|
31
|
+
* 保留 ANSI 颜色码:换行时先 reset 避免缩进空格带色,新行恢复颜色状态。
|
|
32
|
+
* 宽字符(CJK)按 2 列计算,避免中文行换行位置偏后。
|
|
33
|
+
*/
|
|
34
|
+
export declare function wrapLogLine(s: string, indent: number): string;
|
|
35
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAI/C,iDAAiD;AACjD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAE9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,qBAAqB;AACrB,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAEzC;AAED,oCAAoC;AACpC,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAE/F;AAED,0BAA0B;AAC1B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AAuCD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAgC/C;AAmDD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAoC7D"}
|