@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.
Files changed (62) hide show
  1. package/README.md +22 -0
  2. package/dist/commands-behavior-pack.d.ts +46 -0
  3. package/dist/commands-behavior-pack.d.ts.map +1 -0
  4. package/dist/commands-behavior-pack.js +160 -0
  5. package/dist/commands-behavior-pack.js.map +1 -0
  6. package/dist/commands.d.ts +11 -0
  7. package/dist/commands.d.ts.map +1 -0
  8. package/dist/commands.js +191 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/dispatcher.d.ts +13 -0
  11. package/dist/dispatcher.d.ts.map +1 -0
  12. package/dist/dispatcher.js +23 -0
  13. package/dist/dispatcher.js.map +1 -0
  14. package/dist/index.d.ts +31 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +43 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/logs.d.ts +35 -0
  19. package/dist/logs.d.ts.map +1 -0
  20. package/dist/logs.js +202 -0
  21. package/dist/logs.js.map +1 -0
  22. package/dist/main.d.ts +3 -0
  23. package/dist/main.d.ts.map +1 -0
  24. package/dist/main.js +189 -0
  25. package/dist/main.js.map +1 -0
  26. package/dist/module-commands.d.ts +39 -0
  27. package/dist/module-commands.d.ts.map +1 -0
  28. package/dist/module-commands.js +367 -0
  29. package/dist/module-commands.js.map +1 -0
  30. package/dist/registry.d.ts +53 -0
  31. package/dist/registry.d.ts.map +1 -0
  32. package/dist/registry.js +125 -0
  33. package/dist/registry.js.map +1 -0
  34. package/dist/remote-agent.d.ts +18 -0
  35. package/dist/remote-agent.d.ts.map +1 -0
  36. package/dist/remote-agent.js +212 -0
  37. package/dist/remote-agent.js.map +1 -0
  38. package/dist/repl.d.ts +9 -0
  39. package/dist/repl.d.ts.map +1 -0
  40. package/dist/repl.js +652 -0
  41. package/dist/repl.js.map +1 -0
  42. package/dist/runtime.d.ts +28 -0
  43. package/dist/runtime.d.ts.map +1 -0
  44. package/dist/runtime.js +74 -0
  45. package/dist/runtime.js.map +1 -0
  46. package/dist/services.d.ts +61 -0
  47. package/dist/services.d.ts.map +1 -0
  48. package/dist/services.js +259 -0
  49. package/dist/services.js.map +1 -0
  50. package/dist/terminal.d.ts +3 -0
  51. package/dist/terminal.d.ts.map +1 -0
  52. package/dist/terminal.js +178 -0
  53. package/dist/terminal.js.map +1 -0
  54. package/dist/theme.d.ts +33 -0
  55. package/dist/theme.d.ts.map +1 -0
  56. package/dist/theme.js +55 -0
  57. package/dist/theme.js.map +1 -0
  58. package/dist/wizard.d.ts +2 -0
  59. package/dist/wizard.d.ts.map +1 -0
  60. package/dist/wizard.js +475 -0
  61. package/dist/wizard.js.map +1 -0
  62. package/package.json +65 -0
@@ -0,0 +1,367 @@
1
+ /**
2
+ * sfmc module-commands — runtime CLI for inspecting and managing modules
3
+ * already on disk under `modules/packages/<id>/`.
4
+ *
5
+ * Subcommands:
6
+ * list List every installed module (reads each
7
+ * modules/packages/<id>/sapi/manifest.json).
8
+ * Marks registry-known modules with `●` and
9
+ * modules from an unknown publisher with `?`.
10
+ * info <id> Show one module's manifest + on-disk fingerprint
11
+ * verify [id] Recompute the SHA-256 fingerprint of installed
12
+ * modules (id = one; no id = all)
13
+ * install <id> Wrapper around `tools/fetch-module.mjs install`.
14
+ * If `--from` is omitted, the first-party registry
15
+ * is consulted (Tanya7z/sfmc-modules).
16
+ * uninstall <id> Remove packages/<id>/ + catalog/lock via fetch-module
17
+ * enable <id> POST /api/sfmc/modules/:id/enable on db-server
18
+ * disable <id> POST /api/sfmc/modules/:id/disable on db-server
19
+ *
20
+ * The runtime SEA process never connects to the network. `install`/`uninstall`
21
+ * delegate to `tools/fetch-module.mjs` (install syncs catalog + lock).
22
+ * enable/disable go through db-server REST so module-lock.json stays consistent.
23
+ */
24
+ import fs from "node:fs/promises";
25
+ import { existsSync } from "node:fs";
26
+ import path from "node:path";
27
+ import { createHash } from "node:crypto";
28
+ import { spawn } from "node:child_process";
29
+ import { configPath, readJson } from "@sfmc-bds/sdk/node/config";
30
+ import { c } from "./theme.js";
31
+ import { ROOT } from "./runtime.js";
32
+ import { findUnknownModules } from "./registry.js";
33
+ /** Where modules live on disk. SEA reads this same path at runtime. */
34
+ function modulesDir() {
35
+ return path.join(ROOT, "modules", "packages");
36
+ }
37
+ function fmtBytes(n) {
38
+ if (n < 1024)
39
+ return `${n} B`;
40
+ if (n < 1024 * 1024)
41
+ return `${(n / 1024).toFixed(1)} KB`;
42
+ return `${(n / 1024 / 1024).toFixed(2)} MB`;
43
+ }
44
+ function shortHash(h) {
45
+ return h.slice(0, 8) + "…" + h.slice(-8);
46
+ }
47
+ /** Enumerate every installed module by scanning `modules/packages/<id>/`. */
48
+ async function scanInstalled() {
49
+ const dir = modulesDir();
50
+ if (!existsSync(dir))
51
+ return [];
52
+ const entries = await fs.readdir(dir, { withFileTypes: true });
53
+ const out = [];
54
+ for (const e of entries) {
55
+ if (!e.isDirectory())
56
+ continue;
57
+ const id = e.name;
58
+ const modPath = path.join(dir, id);
59
+ const manifestPath = path.join(modPath, "sapi", "manifest.json");
60
+ let manifest = null;
61
+ if (existsSync(manifestPath)) {
62
+ try {
63
+ manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
64
+ }
65
+ catch {
66
+ /* corrupt manifest is not fatal — just skip its fields */
67
+ }
68
+ }
69
+ const { totalBytes, fileCount } = await dirSize(modPath);
70
+ const fingerprint = await dirFingerprint(modPath);
71
+ out.push({ id, path: modPath, manifest, totalBytes, fileCount, fingerprint });
72
+ }
73
+ out.sort((a, b) => a.id.localeCompare(b.id));
74
+ return out;
75
+ }
76
+ /** Compute the canonical SHA-256 of a module directory (POSIX `find ... | sha256sum` compatible). */
77
+ async function dirFingerprint(rootDir) {
78
+ const hash = createHash("sha256");
79
+ const entries = [];
80
+ async function walk(rel) {
81
+ const full = path.join(rootDir, rel);
82
+ const items = await fs.readdir(full, { withFileTypes: true });
83
+ const sorted = items.sort((a, b) => a.name.localeCompare(b.name));
84
+ for (const it of sorted) {
85
+ const child = rel ? `${rel}/${it.name}` : it.name;
86
+ if (it.isDirectory())
87
+ await walk(child);
88
+ else if (it.isFile())
89
+ entries.push(child);
90
+ }
91
+ }
92
+ await walk("");
93
+ entries.sort();
94
+ for (const rel of entries) {
95
+ const data = await fs.readFile(path.join(rootDir, rel));
96
+ hash.update(rel.replaceAll("\\", "/"));
97
+ hash.update("\n");
98
+ hash.update(data);
99
+ hash.update("\n");
100
+ }
101
+ return hash.digest("hex");
102
+ }
103
+ async function dirSize(dir) {
104
+ let totalBytes = 0;
105
+ let fileCount = 0;
106
+ async function walk(p) {
107
+ for (const e of await fs.readdir(p, { withFileTypes: true })) {
108
+ const child = path.join(p, e.name);
109
+ if (e.isDirectory())
110
+ await walk(child);
111
+ else if (e.isFile()) {
112
+ const s = await fs.stat(child);
113
+ totalBytes += s.size;
114
+ fileCount++;
115
+ }
116
+ }
117
+ }
118
+ await walk(dir);
119
+ return { totalBytes, fileCount };
120
+ }
121
+ /* ─────────────────────────────────────────────────────────────────
122
+ * list
123
+ * ──────────────────────────────────────────────────────────────── */
124
+ export async function cmdModuleList(_args) {
125
+ const installed = await scanInstalled();
126
+ if (installed.length === 0) {
127
+ return c.dim(`\nNo modules installed. Drop a module folder under ${modulesDir()} or run \`sfmc module install <id>\`.\n`);
128
+ }
129
+ const ids = installed.map((m) => m.id);
130
+ const unknown = new Set(await findUnknownModules(ids));
131
+ const lines = [c.bold("\nInstalled modules"), c.dim(` ${modulesDir()}`)];
132
+ const header = ` ${"id".padEnd(28)}${"files".padEnd(8)}${"size".padEnd(10)}${"routes".padEnd(8)}${"fingerprint"}`;
133
+ lines.push(c.dim(header));
134
+ for (const m of installed) {
135
+ const routeCount = m.manifest?.routes?.length ?? 0;
136
+ let mark;
137
+ if (!m.manifest) {
138
+ mark = c.yellow("○");
139
+ }
140
+ else if (unknown.has(m.id)) {
141
+ mark = c.yellow("?");
142
+ }
143
+ else {
144
+ mark = c.green("●");
145
+ }
146
+ lines.push(` ${mark} ${m.id.padEnd(26)}${String(m.fileCount).padEnd(8)}${fmtBytes(m.totalBytes).padEnd(10)}${String(routeCount).padEnd(8)}${shortHash(m.fingerprint)}`);
147
+ }
148
+ return lines.join("\n") + "\n";
149
+ }
150
+ /**
151
+ * Walk `modules/packages/<id>/` and print a one-line yellow warning for each
152
+ * id that isn't in the first-party registry. Intended for the REPL startup
153
+ * hook so users immediately see modules they installed from somewhere else.
154
+ *
155
+ * Best-effort: registry unreachable → no warning (no false positives).
156
+ */
157
+ export async function scanAndWarnUnknown() {
158
+ const installed = await scanInstalled();
159
+ if (installed.length === 0)
160
+ return "";
161
+ const unknown = await findUnknownModules(installed.map((m) => m.id));
162
+ if (unknown.length === 0)
163
+ return "";
164
+ const list = unknown.map((id) => ` ${c.yellow("?")} ${id}`).join("\n");
165
+ return `${c.yellow("[sfmc] modules installed from unknown publisher — verify before use:")}\n${list}\n`;
166
+ }
167
+ /* ─────────────────────────────────────────────────────────────────
168
+ * info
169
+ * ──────────────────────────────────────────────────────────────── */
170
+ export async function cmdModuleInfo(args) {
171
+ const id = args[0];
172
+ if (!id)
173
+ return c.yellow("Usage: sfmc module info <id>");
174
+ const all = await scanInstalled();
175
+ const m = all.find((x) => x.id === id);
176
+ if (!m)
177
+ return c.red(`Module ${id} not installed at ${path.join(modulesDir(), id)}`);
178
+ const lines = [c.bold(`\n${id}`)];
179
+ lines.push(` path : ${m.path}`);
180
+ lines.push(` files : ${m.fileCount}`);
181
+ lines.push(` size : ${fmtBytes(m.totalBytes)}`);
182
+ lines.push(` fingerprint : ${m.fingerprint}`);
183
+ if (m.manifest) {
184
+ lines.push(` schemaVer : ${m.manifest.schemaVersion ?? "(none)"}`);
185
+ lines.push(` routes : ${m.manifest.routes?.length ?? 0}`);
186
+ if (m.manifest.routes?.length) {
187
+ for (const r of m.manifest.routes)
188
+ lines.push(c.dim(` ${r.method.padEnd(7)} ${r.path.padEnd(36)} ${r.handler}`));
189
+ }
190
+ lines.push(` migrations : ${m.manifest.migrations?.length ?? 0}`);
191
+ if (m.manifest.migrations?.length) {
192
+ for (const mg of m.manifest.migrations)
193
+ lines.push(c.dim(` v${mg.version} ${mg.name}`));
194
+ }
195
+ if (m.manifest.notes)
196
+ lines.push(` notes : ${c.dim(m.manifest.notes)}`);
197
+ }
198
+ else {
199
+ lines.push(c.yellow(` manifest : (missing or unreadable)`));
200
+ }
201
+ return lines.join("\n") + "\n";
202
+ }
203
+ /* ─────────────────────────────────────────────────────────────────
204
+ * verify
205
+ * ──────────────────────────────────────────────────────────────── */
206
+ export async function cmdModuleVerify(args) {
207
+ const id = args[0];
208
+ if (id) {
209
+ const all = await scanInstalled();
210
+ const m = all.find((x) => x.id === id);
211
+ if (!m)
212
+ return c.red(`Module ${id} not installed`);
213
+ return c.green(`${id} ok\n fingerprint: ${m.fingerprint}\n`);
214
+ }
215
+ const all = await scanInstalled();
216
+ const lines = [c.bold("\nVerifying installed modules")];
217
+ for (const m of all) {
218
+ lines.push(` ${m.id.padEnd(28)} ${shortHash(m.fingerprint)}`);
219
+ }
220
+ if (all.length === 0)
221
+ lines.push(c.dim(" (none)"));
222
+ return lines.join("\n") + "\n";
223
+ }
224
+ /* ─────────────────────────────────────────────────────────────────
225
+ * install — shells out to tools/fetch-module.mjs
226
+ * ──────────────────────────────────────────────────────────────── */
227
+ /* ───────────────────────────────────────────────────────────────
228
+ * enable / disable — talk to db-server over loopback HTTP
229
+ * ─────────────────────────────────────────────────────────────── */
230
+ function readDbConfig() {
231
+ return (readJson(configPath(ROOT, "db_config.json")) ?? {});
232
+ }
233
+ async function postModuleToggle(id, action) {
234
+ const cfg = readDbConfig();
235
+ const port = cfg.db_port ?? 3001;
236
+ const token = cfg.http_auth || "";
237
+ const url = `http://127.0.0.1:${port}/api/sfmc/modules/${encodeURIComponent(id)}/${action}`;
238
+ let res;
239
+ try {
240
+ res = await fetch(url, {
241
+ method: "POST",
242
+ headers: {
243
+ "Content-Type": "application/json",
244
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
245
+ },
246
+ });
247
+ }
248
+ catch (err) {
249
+ return c.red(`Cannot reach db-server at ${url}: ${err.message}. Is db-service running? (sfmc> start db)`);
250
+ }
251
+ const text = await res.text();
252
+ let body;
253
+ try {
254
+ body = JSON.parse(text);
255
+ }
256
+ catch {
257
+ body = text;
258
+ }
259
+ if (!res.ok) {
260
+ const err = body?.error ?? `HTTP ${res.status}`;
261
+ return c.red(`${action} ${id} failed: ${err}`);
262
+ }
263
+ const ok = body?.success !== false;
264
+ return ok ? c.green(`${action}d ${id}`) : c.red(`${action} ${id} returned: ${text}`);
265
+ }
266
+ export async function cmdModuleEnable(args) {
267
+ const id = args[0];
268
+ if (!id)
269
+ return c.yellow("Usage: sfmc module enable <id>");
270
+ return postModuleToggle(id, "enable");
271
+ }
272
+ export async function cmdModuleDisable(args) {
273
+ const id = args[0];
274
+ if (!id)
275
+ return c.yellow("Usage: sfmc module disable <id>");
276
+ return postModuleToggle(id, "disable");
277
+ }
278
+ /* ───────────────────────────────────────────────────────────────
279
+ * install — shells out to tools/fetch-module.mjs
280
+ * ─────────────────────────────────────────────────────────────── */
281
+ export async function cmdModuleInstall(args) {
282
+ // 支持: install <id> [id2 ...] [--from ...]
283
+ const flags = parseFlags(args);
284
+ const positional = [];
285
+ for (let i = 0; i < args.length; i++) {
286
+ if (args[i] === "--from" || args[i] === "--sha256") {
287
+ i++;
288
+ continue;
289
+ }
290
+ if (args[i]?.startsWith("--from=") || args[i]?.startsWith("--sha256="))
291
+ continue;
292
+ if (args[i]?.startsWith("--"))
293
+ continue;
294
+ positional.push(args[i]);
295
+ }
296
+ if (positional.length === 0)
297
+ return c.yellow("Usage: sfmc module install <id> [id2 ...] [--from <source>]");
298
+ const fetchScript = path.join(ROOT, "tools", "fetch-module.mjs");
299
+ if (!existsSync(fetchScript)) {
300
+ return c.red(`tools/fetch-module.mjs not found at ${fetchScript}`);
301
+ }
302
+ const sub = ["install", ...positional];
303
+ if (flags.from)
304
+ sub.push("--from", flags.from);
305
+ if (flags.sha256)
306
+ sub.push("--sha256", flags.sha256);
307
+ return new Promise((resolve) => {
308
+ const proc = spawn(process.execPath, [fetchScript, ...sub], { stdio: ["ignore", "pipe", "pipe"] });
309
+ let out = "";
310
+ proc.stdout?.on("data", (d) => {
311
+ out += d.toString();
312
+ });
313
+ proc.stderr?.on("data", (d) => {
314
+ out += d.toString();
315
+ });
316
+ proc.on("exit", (code) => {
317
+ resolve(out + (code === 0 ? "" : `\n[exit ${code}]`));
318
+ });
319
+ proc.on("error", (e) => resolve(c.red(`spawn failed: ${e.message}`)));
320
+ });
321
+ }
322
+ /* ─────────────────────────────────────────────────────────────────
323
+ * uninstall
324
+ * ──────────────────────────────────────────────────────────────── */
325
+ export async function cmdModuleUninstall(args) {
326
+ const id = args[0];
327
+ if (!id)
328
+ return c.yellow("Usage: sfmc module uninstall <id>");
329
+ const fetchScript = path.join(ROOT, "tools", "fetch-module.mjs");
330
+ if (!existsSync(fetchScript)) {
331
+ // 回退:仅删目录(旧行为)
332
+ const target = path.join(modulesDir(), id);
333
+ if (!existsSync(target))
334
+ return c.yellow(`Module ${id} not installed (no folder at ${target})`);
335
+ await fs.rm(target, { recursive: true, force: true });
336
+ return c.green(`Removed ${id} from ${target}\n`);
337
+ }
338
+ return new Promise((resolve) => {
339
+ const proc = spawn(process.execPath, [fetchScript, "uninstall", id], {
340
+ stdio: ["ignore", "pipe", "pipe"],
341
+ });
342
+ let out = "";
343
+ proc.stdout?.on("data", (d) => {
344
+ out += d.toString();
345
+ });
346
+ proc.stderr?.on("data", (d) => {
347
+ out += d.toString();
348
+ });
349
+ proc.on("exit", (code) => {
350
+ resolve(out + (code === 0 ? "" : `\n[exit ${code}]`));
351
+ });
352
+ proc.on("error", (e) => resolve(c.red(`spawn failed: ${e.message}`)));
353
+ });
354
+ }
355
+ function parseFlags(args) {
356
+ const flags = { from: null, sha256: null };
357
+ for (let i = 0; i < args.length; i++) {
358
+ if (args[i] === "--from")
359
+ flags.from = args[++i] ?? null;
360
+ else if (args[i]?.startsWith("--from="))
361
+ flags.from = args[i].slice("--from=".length);
362
+ else if (args[i] === "--sha256")
363
+ flags.sha256 = args[++i] ?? null;
364
+ }
365
+ return flags;
366
+ }
367
+ //# sourceMappingURL=module-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-commands.js","sourceRoot":"","sources":["../src/module-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * registry.ts — first-party sfmc-modules index resolution, shared between
3
+ * the module CLI and the startup unknown-source warning.
4
+ *
5
+ * Talks to https://raw.githubusercontent.com/Tanya7z/sfmc-modules/main/index.json
6
+ * (the registry lives in a separate repo to keep this one free of "what
7
+ * modules exist" governance). Caches to <sfmc/src/.sfmc-registry-cache.json>
8
+ * with a 1h TTL so a brief network blip doesn't degrade the CLI.
9
+ *
10
+ * Both helpers are best-effort: failures are surfaced as `null` and a
11
+ * console warning, never an exception, because the SEA must still boot
12
+ * when the registry is unreachable.
13
+ */
14
+ declare const DEFAULT_REGISTRY_REPO = "Tanya7z/sfmc-modules";
15
+ declare const DEFAULT_REGISTRY_TAG = "main";
16
+ export interface RegistryEntry {
17
+ repo: string;
18
+ tag: string;
19
+ }
20
+ export type RegistryIndex = Record<string, RegistryEntry>;
21
+ /**
22
+ * 解析 first-party index.json。
23
+ * 契约与 tools/lib/registry-index.mjs#parseRegistryIndex 保持一致:
24
+ * `{ modules: { <folder>: { repo, tag } } }`。忽略 `_` 前缀元数据键。
25
+ */
26
+ export declare function parseRegistryIndex(json: unknown): RegistryIndex;
27
+ export interface RegistryResult {
28
+ index: RegistryIndex;
29
+ /** True when the index came from a stale cache because the live fetch failed. */
30
+ stale: boolean;
31
+ }
32
+ /**
33
+ * Resolve the first-party index.
34
+ *
35
+ * Order:
36
+ * 1. If the cache is fresh (< TTL): return it without trying the network.
37
+ * 2. Otherwise attempt a live fetch.
38
+ * - success → write cache, return fresh.
39
+ * - failure + cache exists → return cache with `stale: true` and a warning.
40
+ * - failure + no cache → return `{ index: {}, stale: true }` and warn.
41
+ *
42
+ * Never throws: the unknown-source warning is best-effort.
43
+ */
44
+ export declare function resolveRegistryIndex(): Promise<RegistryResult>;
45
+ /**
46
+ * Compare a set of installed module ids to the registry and return the
47
+ * subset that isn't published in the first-party index. The "best-effort"
48
+ * guarantee: this returns an empty array when the registry can't be reached
49
+ * (we don't want a network outage to mark every local module as unknown).
50
+ */
51
+ export declare function findUnknownModules(installedIds: string[]): Promise<string[]>;
52
+ export { DEFAULT_REGISTRY_REPO, DEFAULT_REGISTRY_TAG };
53
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAyB1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAkB/D;AAQD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAmBpE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * registry.ts — first-party sfmc-modules index resolution, shared between
3
+ * the module CLI and the startup unknown-source warning.
4
+ *
5
+ * Talks to https://raw.githubusercontent.com/Tanya7z/sfmc-modules/main/index.json
6
+ * (the registry lives in a separate repo to keep this one free of "what
7
+ * modules exist" governance). Caches to <sfmc/src/.sfmc-registry-cache.json>
8
+ * with a 1h TTL so a brief network blip doesn't degrade the CLI.
9
+ *
10
+ * Both helpers are best-effort: failures are surfaced as `null` and a
11
+ * console warning, never an exception, because the SEA must still boot
12
+ * when the registry is unreachable.
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import path from "node:path";
16
+ import process from "node:process";
17
+ import { fileURLToPath } from "node:url";
18
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
19
+ const CACHE_PATH = path.join(__dirname, ".sfmc-registry-cache.json");
20
+ const TTL_MS = 60 * 60 * 1000;
21
+ const DEFAULT_REGISTRY_REPO = "Tanya7z/sfmc-modules";
22
+ const DEFAULT_REGISTRY_TAG = "main";
23
+ const INDEX_URL = `https://raw.githubusercontent.com/${DEFAULT_REGISTRY_REPO}/${DEFAULT_REGISTRY_TAG}/index.json`;
24
+ function readCache() {
25
+ try {
26
+ if (!existsSync(CACHE_PATH))
27
+ return null;
28
+ return JSON.parse(readFileSync(CACHE_PATH, "utf8"));
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function writeCache(cache) {
35
+ try {
36
+ mkdirSync(path.dirname(CACHE_PATH), { recursive: true });
37
+ writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2));
38
+ }
39
+ catch {
40
+ /* cache write is best-effort */
41
+ }
42
+ }
43
+ /**
44
+ * 解析 first-party index.json。
45
+ * 契约与 tools/lib/registry-index.mjs#parseRegistryIndex 保持一致:
46
+ * `{ modules: { <folder>: { repo, tag } } }`。忽略 `_` 前缀元数据键。
47
+ */
48
+ export function parseRegistryIndex(json) {
49
+ if (typeof json !== "object" || json === null || Array.isArray(json)) {
50
+ throw new Error("registry index must be a JSON object with a 'modules' field");
51
+ }
52
+ const root = json;
53
+ const modulesRaw = root.modules;
54
+ if (typeof modulesRaw !== "object" || modulesRaw === null || Array.isArray(modulesRaw)) {
55
+ throw new Error("registry index must have a 'modules' object mapping id → { repo, tag }");
56
+ }
57
+ const filtered = {};
58
+ for (const [k, v] of Object.entries(modulesRaw)) {
59
+ if (k.startsWith("_"))
60
+ continue;
61
+ if (typeof v !== "object" || v === null || Array.isArray(v))
62
+ continue;
63
+ const entry = v;
64
+ if (typeof entry.repo !== "string" || typeof entry.tag !== "string")
65
+ continue;
66
+ filtered[k] = { repo: entry.repo, tag: entry.tag };
67
+ }
68
+ return filtered;
69
+ }
70
+ async function fetchFresh() {
71
+ const res = await fetch(INDEX_URL, { headers: { "User-Agent": "sfmc-cli" } });
72
+ if (!res.ok)
73
+ throw new Error(`HTTP ${res.status} for ${INDEX_URL}`);
74
+ return parseRegistryIndex(await res.json());
75
+ }
76
+ /**
77
+ * Resolve the first-party index.
78
+ *
79
+ * Order:
80
+ * 1. If the cache is fresh (< TTL): return it without trying the network.
81
+ * 2. Otherwise attempt a live fetch.
82
+ * - success → write cache, return fresh.
83
+ * - failure + cache exists → return cache with `stale: true` and a warning.
84
+ * - failure + no cache → return `{ index: {}, stale: true }` and warn.
85
+ *
86
+ * Never throws: the unknown-source warning is best-effort.
87
+ */
88
+ export async function resolveRegistryIndex() {
89
+ const cache = readCache();
90
+ if (cache && Date.now() - cache.fetchedAt < TTL_MS) {
91
+ return { index: cache.index, stale: false };
92
+ }
93
+ try {
94
+ const fresh = await fetchFresh();
95
+ writeCache({ fetchedAt: Date.now(), index: fresh });
96
+ return { index: fresh, stale: false };
97
+ }
98
+ catch (err) {
99
+ if (cache) {
100
+ const msg = err instanceof Error ? err.message : String(err);
101
+ process.stderr.write(`[sfmc] registry offline (${msg}); using cached index from ${new Date(cache.fetchedAt).toISOString()}\n`);
102
+ return { index: cache.index, stale: true };
103
+ }
104
+ const msg = err instanceof Error ? err.message : String(err);
105
+ process.stderr.write(`[sfmc] registry unreachable and no cache: ${msg}\n`);
106
+ return { index: {}, stale: true };
107
+ }
108
+ }
109
+ /**
110
+ * Compare a set of installed module ids to the registry and return the
111
+ * subset that isn't published in the first-party index. The "best-effort"
112
+ * guarantee: this returns an empty array when the registry can't be reached
113
+ * (we don't want a network outage to mark every local module as unknown).
114
+ */
115
+ export async function findUnknownModules(installedIds) {
116
+ const { index, stale } = await resolveRegistryIndex();
117
+ if (stale && Object.keys(index).length === 0) {
118
+ /* No cache either — silently treat every module as "we couldn't tell".
119
+ * Otherwise an offline SEA would scream warnings at every boot. */
120
+ return [];
121
+ }
122
+ return installedIds.filter((id) => !index[id]);
123
+ }
124
+ export { DEFAULT_REGISTRY_REPO, DEFAULT_REGISTRY_TAG };
125
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type RemoteStatus = {
2
+ enabled?: boolean;
3
+ controller_url?: string;
4
+ agent_id?: string;
5
+ connected: boolean;
6
+ last_error?: string;
7
+ retry_in_ms?: number;
8
+ };
9
+ /** Close the active socket (if any) and stop reconnecting. Idempotent. */
10
+ export declare function stopRemoteAgent(): void;
11
+ /** Start one outbound-only remote-management connection for this supervisor process. */
12
+ export declare function startRemoteAgent(): void;
13
+ export declare function enrollRemoteAgent(controllerUrl: string, enrollmentToken: string, name: string): Promise<string>;
14
+ /** Disable the remote agent: clear enabled flag and close the connection. */
15
+ export declare function disableRemoteAgent(): void;
16
+ export declare function remoteStatus(): RemoteStatus;
17
+ export {};
18
+ //# sourceMappingURL=remote-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-agent.d.ts","sourceRoot":"","sources":["../src/remote-agent.ts"],"names":[],"mappings":"AAcA,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAwFF,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAetC;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,IAAI,IAAI,CAgEvC;AAED,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWrH;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC;AAED,wBAAgB,YAAY,IAAI,YAAY,CAW3C"}