@sfmc-bds/cli 0.3.1 → 0.4.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 (106) hide show
  1. package/dist/command-surface.d.ts.map +1 -1
  2. package/dist/command-surface.js +5 -6
  3. package/dist/command-surface.js.map +2 -2
  4. package/dist/commands.d.ts.map +1 -1
  5. package/dist/commands.js +1 -1
  6. package/dist/commands.js.map +2 -2
  7. package/dist/daemon/client.d.ts +3 -0
  8. package/dist/daemon/client.d.ts.map +1 -1
  9. package/dist/daemon/client.js +38 -8
  10. package/dist/daemon/client.js.map +2 -2
  11. package/dist/daemon/protocol.d.ts +9 -3
  12. package/dist/daemon/protocol.d.ts.map +1 -1
  13. package/dist/daemon/protocol.js.map +2 -2
  14. package/dist/daemon/server.d.ts.map +1 -1
  15. package/dist/daemon/server.js +82 -2
  16. package/dist/daemon/server.js.map +2 -2
  17. package/dist/i18n/locales/en.d.ts +12 -5
  18. package/dist/i18n/locales/en.d.ts.map +1 -1
  19. package/dist/i18n/locales/en.js +12 -5
  20. package/dist/i18n/locales/en.js.map +2 -2
  21. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  22. package/dist/i18n/locales/zh-CN.js +12 -5
  23. package/dist/i18n/locales/zh-CN.js.map +2 -2
  24. package/dist/interactive-prompts.d.ts +1 -1
  25. package/dist/interactive-prompts.d.ts.map +1 -1
  26. package/dist/interactive-prompts.js +4 -2
  27. package/dist/interactive-prompts.js.map +2 -2
  28. package/dist/logs.d.ts.map +1 -1
  29. package/dist/logs.js +13 -1
  30. package/dist/logs.js.map +2 -2
  31. package/dist/main.js +14 -184
  32. package/dist/main.js.map +2 -2
  33. package/dist/management/config.d.ts +8 -0
  34. package/dist/management/config.d.ts.map +1 -0
  35. package/dist/management/config.js +107 -0
  36. package/dist/management/config.js.map +7 -0
  37. package/dist/management/deployment.d.ts +7 -0
  38. package/dist/management/deployment.d.ts.map +1 -0
  39. package/dist/management/deployment.js +36 -0
  40. package/dist/management/deployment.js.map +7 -0
  41. package/dist/management/domain.d.ts +65 -0
  42. package/dist/management/domain.d.ts.map +1 -0
  43. package/dist/management/domain.js +137 -0
  44. package/dist/management/domain.js.map +7 -0
  45. package/dist/management/maintenance.d.ts +18 -0
  46. package/dist/management/maintenance.d.ts.map +1 -0
  47. package/dist/management/maintenance.js +214 -0
  48. package/dist/management/maintenance.js.map +7 -0
  49. package/dist/management/platform-worker.d.ts +2 -0
  50. package/dist/management/platform-worker.d.ts.map +1 -0
  51. package/dist/management/platform-worker.js +155 -0
  52. package/dist/management/platform-worker.js.map +7 -0
  53. package/dist/management/server.d.ts +7 -0
  54. package/dist/management/server.d.ts.map +1 -0
  55. package/dist/management/server.js +291 -0
  56. package/dist/management/server.js.map +7 -0
  57. package/dist/management/startup.d.ts +6 -0
  58. package/dist/management/startup.d.ts.map +1 -0
  59. package/dist/management/startup.js +67 -0
  60. package/dist/management/startup.js.map +7 -0
  61. package/dist/management/stdio.d.ts +3 -0
  62. package/dist/management/stdio.d.ts.map +1 -0
  63. package/dist/management/stdio.js +93 -0
  64. package/dist/management/stdio.js.map +7 -0
  65. package/dist/management/tasks.d.ts +21 -0
  66. package/dist/management/tasks.d.ts.map +1 -0
  67. package/dist/management/tasks.js +103 -0
  68. package/dist/management/tasks.js.map +7 -0
  69. package/dist/module-commands.d.ts +2 -2
  70. package/dist/module-commands.d.ts.map +1 -1
  71. package/dist/module-commands.js +28 -24
  72. package/dist/module-commands.js.map +2 -2
  73. package/dist/module-update/index.d.ts +2 -5
  74. package/dist/module-update/index.d.ts.map +1 -1
  75. package/dist/module-update/index.js +5 -29
  76. package/dist/module-update/index.js.map +2 -2
  77. package/dist/pack-lifecycle.d.ts.map +1 -1
  78. package/dist/pack-lifecycle.js +2 -0
  79. package/dist/pack-lifecycle.js.map +2 -2
  80. package/dist/runtime-main.d.ts +3 -0
  81. package/dist/runtime-main.d.ts.map +1 -0
  82. package/dist/runtime-main.js +188 -0
  83. package/dist/runtime-main.js.map +7 -0
  84. package/dist/runtime.d.ts +6 -0
  85. package/dist/runtime.d.ts.map +1 -1
  86. package/dist/runtime.js +6 -1
  87. package/dist/runtime.js.map +2 -2
  88. package/dist/services.d.ts +19 -10
  89. package/dist/services.d.ts.map +1 -1
  90. package/dist/services.js +24 -13
  91. package/dist/services.js.map +2 -2
  92. package/dist/wizard.d.ts.map +1 -1
  93. package/dist/wizard.js +213 -142
  94. package/dist/wizard.js.map +3 -3
  95. package/dist/world-packs.d.ts.map +1 -1
  96. package/dist/world-packs.js +7 -0
  97. package/dist/world-packs.js.map +2 -2
  98. package/package.json +8 -4
  99. package/scripts/module-install/.sfmc-registry-cache.json +95 -0
  100. package/scripts/module-install/fetch-module.mjs +9 -3
  101. package/scripts/module-install/lib/module-update-config.mjs +2 -2
  102. package/scripts/module-install/lib/module-update.mjs +94 -6
  103. package/scripts/module-install/lib/packages.mjs +3 -6
  104. package/scripts/module-install/lib/pins.mjs +15 -4
  105. package/scripts/module-install/lib/registry-cache.mjs +5 -1
  106. package/scripts/module-install/test/module-update.test.mjs +349 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/daemon/client.ts"],
4
- "sourcesContent": ["/**\n * client.ts \u2014 CLI \u4FA7\u5B88\u62A4\u8FDB\u7A0B\u5BA2\u6237\u7AEF\uFF1AensureDaemon + RPC + \u65E5\u5FD7\u8BA2\u9605\n *\n * \u82E5 `.sfmc/daemon.json` \u5BF9\u5E94\u8FDB\u7A0B\u4E0D\u5728\u6216\u7BA1\u9053\u4E0D\u53EF\u8FDE\uFF0C\u5219 spawn `sfmc --daemon`\n *\uFF08detached + windowsHide\uFF09\uFF0C\u518D\u8F6E\u8BE2\u76F4\u5230 ping \u6210\u529F\u3002\n */\n\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport { EventEmitter } from \"node:events\";\nimport { ingestRemoteLog } from \"../logs.js\";\nimport { ROOT } from \"../runtime.js\";\nimport type { ServiceStateEvent, ServiceStatus } from \"../services.js\";\nimport {\n clearDaemonMeta,\n daemonLogPath,\n daemonMetaPath,\n readDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type {\n DaemonEvent,\n DaemonFrame,\n DaemonMethod,\n DaemonParams,\n DaemonRequest,\n DaemonResult,\n} from \"./protocol.js\";\nimport { isLogPayload } from \"./protocol.js\";\nimport { isDaemonServer } from \"./role.js\";\n\n/** \u5355\u6B21 RPC \u9ED8\u8BA4\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09 */\nconst CALL_TIMEOUT_MS = 120_000;\n/** ensureDaemon \u7B49\u5F85\u5B88\u62A4\u8FDB\u7A0B\u5C31\u7EEA\u7684\u603B\u65F6\u957F */\nconst READY_TIMEOUT_MS = 15_000;\n/** \u8F6E\u8BE2\u95F4\u9694 */\nconst READY_POLL_MS = 150;\n\n/** \u5171\u4EAB\u8FDE\u63A5\uFF08\u540C\u4E00 CLI \u8FDB\u7A0B\u590D\u7528\uFF09 */\nlet shared: DaemonConnection | null = null;\n\n/** \u672C\u5730\u72B6\u6001\u4E8B\u4EF6\u603B\u7EBF\uFF1A\u628A daemon \u63A8\u9001\u7684 state \u8F6C\u7ED9 CLI \u4FA7 onServiceStateChange \u8BA2\u9605\u8005 */\nconst remoteStateBus = new EventEmitter();\n\n/**\n * \u8BA2\u9605\u5B88\u62A4\u8FDB\u7A0B\u63A8\u9001\u7684\u670D\u52A1\u542F\u505C\u4E8B\u4EF6\uFF08CLI \u8FDB\u7A0B\u7528\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u6839\u636E running \u96C6\u5408\u5237\u65B0\u53D1\u9001\u76EE\u6807 / \u670D\u52A1\u7A97\uFF0C\u65E0\u9700\u672C\u5730\u6301\u6709 ChildProcess\u3002\n */\nexport function onRemoteServiceStateChange(fn: (ev: ServiceStateEvent) => void): () => void {\n remoteStateBus.on(\"state\", fn);\n return () => {\n remoteStateBus.off(\"state\", fn);\n };\n}\n\n/** \u5355\u6761\u8FDE\u63A5\uFF1A\u8BF7\u6C42/\u54CD\u5E94\u5339\u914D + \u53EF\u9009\u4E8B\u4EF6\u8BA2\u9605 */\nclass DaemonConnection {\n private sock: net.Socket;\n private meta: DaemonMeta;\n private buf = \"\";\n private pending = new Map<\n string,\n { resolve: (r: DaemonResult) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private subscribed = false;\n closed = false;\n\n constructor(sock: net.Socket, meta: DaemonMeta) {\n this.sock = sock;\n this.meta = meta;\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => this.onData(chunk));\n sock.on(\"close\", () => this.onClose(new Error(\"daemon connection closed\")));\n sock.on(\"error\", (e) => this.onClose(e instanceof Error ? e : new Error(String(e))));\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let idx: number;\n while ((idx = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, idx).trim();\n this.buf = this.buf.slice(idx + 1);\n if (!line) continue;\n let frame: DaemonFrame;\n try {\n frame = JSON.parse(line) as DaemonFrame;\n } catch {\n continue;\n }\n if (frame.type === \"event\") {\n this.handleEvent(frame);\n continue;\n }\n if (frame.type === \"res\") {\n const wait = this.pending.get(frame.id);\n if (!wait) continue;\n this.pending.delete(frame.id);\n clearTimeout(wait.timer);\n if (frame.ok && frame.result) wait.resolve(frame.result);\n else wait.reject(new Error(frame.error ?? \"daemon error\"));\n }\n }\n }\n\n private handleEvent(ev: DaemonEvent): void {\n if (ev.event === \"log\" && isLogPayload(ev.payload)) {\n ingestRemoteLog(ev.payload.text, ev.payload.source, ev.payload.level);\n return;\n }\n if (ev.event === \"state\") {\n remoteStateBus.emit(\"state\", ev.payload as ServiceStateEvent);\n }\n }\n\n private onClose(err: Error): void {\n if (this.closed) return;\n this.closed = true;\n for (const [, wait] of this.pending) {\n clearTimeout(wait.timer);\n wait.reject(err);\n }\n this.pending.clear();\n if (shared === this) shared = null;\n }\n\n /** \u53D1\u9001 RPC \u5E76\u7B49\u5F85\u5339\u914D id \u7684\u54CD\u5E94 */\n call(method: DaemonMethod, params?: DaemonParams, timeoutMs = CALL_TIMEOUT_MS): Promise<DaemonResult> {\n if (this.closed || this.sock.destroyed) {\n return Promise.reject(new Error(\"daemon not connected\"));\n }\n const id = randomBytes(8).toString(\"hex\");\n const req: DaemonRequest = params\n ? { id, token: this.meta.token, method, params }\n : { id, token: this.meta.token, method };\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`daemon call timeout: ${method}`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n try {\n this.sock.write(JSON.stringify(req) + \"\\n\");\n } catch (e) {\n this.pending.delete(id);\n clearTimeout(timer);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** \u8BA2\u9605\u65E5\u5FD7\u4E0E\u72B6\u6001\u4E8B\u4EF6\uFF08\u540C\u4E00\u8FDE\u63A5\u4E0A\u7EE7\u7EED\u53D1 RPC\uFF09 */\n async subscribe(): Promise<void> {\n if (this.subscribed) return;\n await this.call(\"subscribe\");\n this.subscribed = true;\n }\n\n /** \u65AD\u5F00\u8FDE\u63A5\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09 */\n disconnect(): void {\n this.closed = true;\n try {\n this.sock.end();\n } catch {\n /* ignore */\n }\n if (shared === this) shared = null;\n }\n}\n\nfunction connectSocket(pipe: string, timeoutMs = 3000): Promise<net.Socket> {\n return new Promise((resolve, reject) => {\n const sock = net.createConnection(pipe);\n const timer = setTimeout(() => {\n sock.destroy();\n reject(new Error(\"connect timeout\"));\n }, timeoutMs);\n sock.once(\"connect\", () => {\n clearTimeout(timer);\n resolve(sock);\n });\n sock.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\n/**\n * \u5C1D\u8BD5\u8FDE\u63A5\u5DF2\u6709 daemon\uFF1B\u6210\u529F\u5219\u8FD4\u56DE\u8FDE\u63A5\uFF0C\u5931\u8D25\u8FD4\u56DE null\u3002\n */\nasync function tryConnectExisting(): Promise<DaemonConnection | null> {\n const meta = readDaemonMeta();\n if (!meta) return null;\n if (!(await isProcessAlive(meta.pid))) {\n clearDaemonMeta();\n return null;\n }\n try {\n const sock = await connectSocket(meta.pipe);\n const conn = new DaemonConnection(sock, meta);\n await conn.call(\"ping\", undefined, 3000);\n return conn;\n } catch {\n return null;\n }\n}\n\n/**\n * \u62C9\u8D77\u5B88\u62A4\u8FDB\u7A0B\u5B50\u8FDB\u7A0B\uFF08detached\uFF0C\u65E5\u5FD7\u5199\u5165 daemon.log\uFF09\u3002\n * \u5165\u53E3\u811A\u672C\u590D\u7528\u5F53\u524D CLI \u7684 argv[1]\uFF08\u5373 sfmc \u4E3B\u5165\u53E3\uFF09\u3002\n */\nfunction spawnDaemonProcess(): void {\n const entry = process.argv[1];\n if (!entry) throw new Error(\"cannot resolve sfmc entry for daemon spawn\");\n fs.mkdirSync(logsDir(ROOT), { recursive: true });\n const logFd = fs.openSync(daemonLogPath(), \"a\");\n const child = spawn(process.execPath, [entry, \"--daemon\"], {\n detached: true,\n windowsHide: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, SFMC_ROOT: ROOT },\n cwd: ROOT,\n });\n child.unref();\n try {\n fs.closeSync(logFd);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u786E\u4FDD\u5B88\u62A4\u8FDB\u7A0B\u53EF\u7528\u5E76\u8FD4\u56DE\u5171\u4EAB\u8FDE\u63A5\u3002\n * \u5B88\u62A4\u8FDB\u7A0B\u8FDB\u7A0B\u5185\u8C03\u7528\u4F1A\u629B\u9519\uFF08\u5E94\u76F4\u63A5\u8D70\u672C\u5730 cmd*\uFF09\u3002\n */\nexport async function ensureDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) {\n throw new Error(\"ensureDaemon must not run inside daemon server\");\n }\n if (shared && !shared.closed) return shared;\n\n let conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n\n const existing = readDaemonMeta();\n if (existing && (await isProcessAlive(existing.pid))) {\n /* PID \u4ECD\u5728\u4F46\u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1A\u77ED\u6682\u91CD\u8BD5\uFF0C\u7981\u6B62\u518D spawn \u7B2C\u4E8C\u5957\u5B88\u62A4\u8FDB\u7A0B */\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(`daemon pid ${existing.pid} is alive but pipe is unreachable`);\n }\n\n clearDaemonMeta();\n spawnDaemonProcess();\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n if (!fs.existsSync(daemonMetaPath())) continue;\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(\"failed to start or connect sfmc daemon\");\n}\n\n/**\n * \u8C03\u7528\u5B88\u62A4\u8FDB\u7A0B\u65B9\u6CD5\uFF1B\u81EA\u52A8 ensureDaemon\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ACLI \u4FA7 status/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u51FA\u53E3\u3002\n */\nexport async function callDaemon(method: DaemonMethod, params?: DaemonParams): Promise<DaemonResult> {\n const conn = await ensureDaemon();\n return conn.call(method, params);\n}\n\n/**\n * \u786E\u4FDD\u5DF2\u8FDE\u63A5\u5E76\u8BA2\u9605\u8FDC\u7A0B\u65E5\u5FD7/\u72B6\u6001\uFF1B\u8FD4\u56DE\u65AD\u5F00\u51FD\u6570\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u542F\u52A8\u65F6\u6302\u4E0A\u5B9E\u65F6\u65E5\u5FD7\u6D41\uFF0C\u9000\u51FA\u65F6\u53EA disconnect\u3002\n */\nexport async function ensureDaemonSubscription(): Promise<() => void> {\n const conn = await ensureDaemon();\n await conn.subscribe();\n return () => {\n conn.disconnect();\n };\n}\n\n/**\n * \u8BF7\u6C42\u5B88\u62A4\u8FDB\u7A0B stopAll \u540E\u9000\u51FA\uFF08`sfmc daemon stop`\uFF09\u3002\n */\nexport async function shutdownDaemon(): Promise<string> {\n try {\n const conn = await ensureDaemon();\n await conn.call(\"shutdown\");\n conn.disconnect();\n } catch (e) {\n /* \u5B88\u62A4\u8FDB\u7A0B\u53EF\u80FD\u5DF2\u4E0D\u5728 */\n clearDaemonMeta();\n return e instanceof Error ? e.message : String(e);\n }\n /* \u77ED\u6682\u7B49\u5F85 meta \u6E05\u7406 */\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!readDaemonMeta()) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n clearDaemonMeta();\n return \"\";\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u8FD0\u884C\u6001\u884C\uFF1B\u5931\u8D25\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u7531\u8C03\u7528\u65B9\u964D\u7EA7\u3002\n */\nexport async function queryRuntimeViaDaemon(): Promise<ServiceStatus[]> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.rows;\n return [];\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u683C\u5F0F\u5316 status \u6587\u672C\u3002\n */\nexport async function statusTextViaDaemon(): Promise<string> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.text;\n if (result.kind === \"text\") return result.text;\n return \"\";\n}\n\n/**\n * \u901A\u7528\u300C\u8FD4\u56DE text\u300D\u7C7B RPC \u8F85\u52A9\u3002\n */\nexport async function textViaDaemon(method: DaemonMethod, params?: DaemonParams): Promise<string> {\n const result = await callDaemon(method, params);\n if (result.kind === \"text\") return result.text;\n if (result.kind === \"status\") return result.text;\n return \"\";\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * client.ts \u2014 CLI \u4FA7\u5B88\u62A4\u8FDB\u7A0B\u5BA2\u6237\u7AEF\uFF1AensureDaemon + RPC + \u65E5\u5FD7\u8BA2\u9605\n *\n * \u82E5 `.sfmc/daemon.json` \u5BF9\u5E94\u8FDB\u7A0B\u4E0D\u5728\u6216\u7BA1\u9053\u4E0D\u53EF\u8FDE\uFF0C\u5219 spawn `sfmc --daemon`\n *\uFF08detached + windowsHide\uFF09\uFF0C\u518D\u8F6E\u8BE2\u76F4\u5230 ping \u6210\u529F\u3002\n */\n\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport { EventEmitter } from \"node:events\";\nimport { ingestRemoteLog } from \"../logs.js\";\nimport { ROOT } from \"../runtime.js\";\nimport type { ServiceStateEvent, ServiceStatus } from \"../services.js\";\nimport {\n clearDaemonMeta,\n daemonLogPath,\n daemonMetaPath,\n readDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type {\n DaemonEvent,\n DaemonFrame,\n DaemonMethod,\n DaemonParams,\n DaemonRequest,\n DaemonResult,\n} from \"./protocol.js\";\nimport { isLogPayload } from \"./protocol.js\";\nimport { isDaemonServer } from \"./role.js\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ManagementEvent } from \"@sfmc-bds/management\";\nimport { maintenanceToken } from \"@sfmc-bds/management/node\";\n\nexport function onDaemonManagementEvent(callback: (event: ManagementEvent) => void): () => void {\n remoteStateBus.on(\"management\", callback);\n return () => { remoteStateBus.off(\"management\", callback); };\n}\nexport function disconnectDaemonClient(): void { shared?.disconnect(); shared = null; }\n\n/** \u5355\u6B21 RPC \u9ED8\u8BA4\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09 */\nconst CALL_TIMEOUT_MS = 120_000;\n/** ensureDaemon \u7B49\u5F85\u5B88\u62A4\u8FDB\u7A0B\u5C31\u7EEA\u7684\u603B\u65F6\u957F */\nconst READY_TIMEOUT_MS = 15_000;\n/** \u8F6E\u8BE2\u95F4\u9694 */\nconst READY_POLL_MS = 150;\n\n/** \u5171\u4EAB\u8FDE\u63A5\uFF08\u540C\u4E00 CLI \u8FDB\u7A0B\u590D\u7528\uFF09 */\nlet shared: DaemonConnection | null = null;\n\n/** \u672C\u5730\u72B6\u6001\u4E8B\u4EF6\u603B\u7EBF\uFF1A\u628A daemon \u63A8\u9001\u7684 state \u8F6C\u7ED9 CLI \u4FA7 onServiceStateChange \u8BA2\u9605\u8005 */\nconst remoteStateBus = new EventEmitter();\n\n/**\n * \u8BA2\u9605\u5B88\u62A4\u8FDB\u7A0B\u63A8\u9001\u7684\u670D\u52A1\u542F\u505C\u4E8B\u4EF6\uFF08CLI \u8FDB\u7A0B\u7528\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u6839\u636E running \u96C6\u5408\u5237\u65B0\u53D1\u9001\u76EE\u6807 / \u670D\u52A1\u7A97\uFF0C\u65E0\u9700\u672C\u5730\u6301\u6709 ChildProcess\u3002\n */\nexport function onRemoteServiceStateChange(fn: (ev: ServiceStateEvent) => void): () => void {\n remoteStateBus.on(\"state\", fn);\n return () => {\n remoteStateBus.off(\"state\", fn);\n };\n}\n\n/** \u5355\u6761\u8FDE\u63A5\uFF1A\u8BF7\u6C42/\u54CD\u5E94\u5339\u914D + \u53EF\u9009\u4E8B\u4EF6\u8BA2\u9605 */\nclass DaemonConnection {\n private sock: net.Socket;\n private meta: DaemonMeta;\n private buf = \"\";\n private pending = new Map<\n string,\n { resolve: (r: DaemonResult) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private subscribed = false;\n closed = false;\n\n constructor(sock: net.Socket, meta: DaemonMeta) {\n this.sock = sock;\n this.meta = meta;\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => this.onData(chunk));\n sock.on(\"close\", () => this.onClose(new Error(\"daemon connection closed\")));\n sock.on(\"error\", (e) => this.onClose(e instanceof Error ? e : new Error(String(e))));\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let idx: number;\n while ((idx = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, idx).trim();\n this.buf = this.buf.slice(idx + 1);\n if (!line) continue;\n let frame: DaemonFrame;\n try {\n frame = JSON.parse(line) as DaemonFrame;\n } catch {\n continue;\n }\n if (frame.type === \"event\") {\n this.handleEvent(frame);\n continue;\n }\n if (frame.type === \"res\") {\n const wait = this.pending.get(frame.id);\n if (!wait) continue;\n this.pending.delete(frame.id);\n clearTimeout(wait.timer);\n if (frame.ok && frame.result) wait.resolve(frame.result);\n else wait.reject(new Error(frame.error ?? \"daemon error\"));\n }\n }\n }\n\n private handleEvent(ev: DaemonEvent): void {\n if (ev.event === \"management\") { remoteStateBus.emit(\"management\", ev.payload); return; }\n if (ev.event === \"log\" && isLogPayload(ev.payload)) {\n ingestRemoteLog(ev.payload.text, ev.payload.source, ev.payload.level);\n return;\n }\n if (ev.event === \"state\") {\n remoteStateBus.emit(\"state\", ev.payload as ServiceStateEvent);\n }\n }\n\n private onClose(err: Error): void {\n if (this.closed) return;\n this.closed = true;\n for (const [, wait] of this.pending) {\n clearTimeout(wait.timer);\n wait.reject(err);\n }\n this.pending.clear();\n if (shared === this) shared = null;\n }\n\n /** \u53D1\u9001 RPC \u5E76\u7B49\u5F85\u5339\u914D id \u7684\u54CD\u5E94 */\n call(method: DaemonMethod, params?: DaemonParams, timeoutMs = CALL_TIMEOUT_MS): Promise<DaemonResult> {\n if (this.closed || this.sock.destroyed) {\n return Promise.reject(new Error(\"daemon not connected\"));\n }\n const id = randomBytes(8).toString(\"hex\");\n const req: DaemonRequest = params\n ? { id, token: this.meta.token, method, params }\n : { id, token: this.meta.token, method };\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`daemon call timeout: ${method}`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n try {\n this.sock.write(JSON.stringify(req) + \"\\n\");\n } catch (e) {\n this.pending.delete(id);\n clearTimeout(timer);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** \u8BA2\u9605\u65E5\u5FD7\u4E0E\u72B6\u6001\u4E8B\u4EF6\uFF08\u540C\u4E00\u8FDE\u63A5\u4E0A\u7EE7\u7EED\u53D1 RPC\uFF09 */\n async subscribe(): Promise<void> {\n if (this.subscribed) return;\n await this.call(\"subscribe\");\n this.subscribed = true;\n }\n\n /** \u65AD\u5F00\u8FDE\u63A5\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09 */\n disconnect(): void {\n this.closed = true;\n try {\n this.sock.end();\n } catch {\n /* ignore */\n }\n if (shared === this) shared = null;\n }\n}\n\nfunction connectSocket(pipe: string, timeoutMs = 3000): Promise<net.Socket> {\n return new Promise((resolve, reject) => {\n const sock = net.createConnection(pipe);\n const timer = setTimeout(() => {\n sock.destroy();\n reject(new Error(\"connect timeout\"));\n }, timeoutMs);\n sock.once(\"connect\", () => {\n clearTimeout(timer);\n resolve(sock);\n });\n sock.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\n/**\n * \u5C1D\u8BD5\u8FDE\u63A5\u5DF2\u6709 daemon\uFF1B\u6210\u529F\u5219\u8FD4\u56DE\u8FDE\u63A5\uFF0C\u5931\u8D25\u8FD4\u56DE null\u3002\n */\nasync function tryConnectExisting(): Promise<DaemonConnection | null> {\n const meta = readDaemonMeta();\n if (!meta) return null;\n if (!(await isProcessAlive(meta.pid))) {\n return null;\n }\n try {\n const sock = await connectSocket(meta.pipe);\n const conn = new DaemonConnection(sock, meta);\n await conn.call(\"ping\", undefined, 3000);\n return conn;\n } catch {\n return null;\n }\n}\n\n/**\n * \u62C9\u8D77\u5B88\u62A4\u8FDB\u7A0B\u5B50\u8FDB\u7A0B\uFF08detached\uFF0C\u65E5\u5FD7\u5199\u5165 daemon.log\uFF09\u3002\n * \u5165\u53E3\u811A\u672C\u590D\u7528\u5F53\u524D CLI \u7684 argv[1]\uFF08\u5373 sfmc \u4E3B\u5165\u53E3\uFF09\u3002\n */\nfunction spawnDaemonProcess(): void {\n const lockFile = path.join(ROOT, \".sfmc\", \"maintenance.lock\");\n if (fs.existsSync(lockFile)) {\n const owner = JSON.parse(fs.readFileSync(lockFile, \"utf8\")) as { nonce: string };\n if ((maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN) !== owner.nonce) throw new Error(\"\u5B9E\u4F8B\u6B63\u5728\u7EF4\u62A4\uFF1B\u540E\u53F0\u5207\u6362\u5B8C\u6210\u524D\u4E0D\u4F1A\u521B\u5EFA\u53E6\u4E00\u4E2A\u5B88\u62A4\u8FDB\u7A0B\");\n }\n const entry = process.env.SFMC_DAEMON_ENTRY ?? fileURLToPath(new URL(\"../main.js\", import.meta.url));\n if (!entry) throw new Error(\"cannot resolve sfmc entry for daemon spawn\");\n fs.mkdirSync(logsDir(ROOT), { recursive: true });\n const logFd = fs.openSync(daemonLogPath(), \"a\");\n const child = spawn(process.env.SFMC_NODE_BINARY ?? process.execPath, [entry, \"--daemon\"], {\n detached: true,\n windowsHide: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, SFMC_ROOT: ROOT },\n cwd: ROOT,\n });\n child.unref();\n try {\n fs.closeSync(logFd);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u786E\u4FDD\u5B88\u62A4\u8FDB\u7A0B\u53EF\u7528\u5E76\u8FD4\u56DE\u5171\u4EAB\u8FDE\u63A5\u3002\n * \u5B88\u62A4\u8FDB\u7A0B\u8FDB\u7A0B\u5185\u8C03\u7528\u4F1A\u629B\u9519\uFF08\u5E94\u76F4\u63A5\u8D70\u672C\u5730 cmd*\uFF09\u3002\n */\nexport async function ensureDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) {\n throw new Error(\"ensureDaemon must not run inside daemon server\");\n }\n if (shared && !shared.closed) return shared;\n\n let conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n\n const existing = readDaemonMeta();\n if (existing && (await isProcessAlive(existing.pid))) {\n /* PID \u4ECD\u5728\u4F46\u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1A\u77ED\u6682\u91CD\u8BD5\uFF0C\u7981\u6B62\u518D spawn \u7B2C\u4E8C\u5957\u5B88\u62A4\u8FDB\u7A0B */\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(`daemon pid ${existing.pid} is alive but pipe is unreachable`);\n }\n\n spawnDaemonProcess();\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n if (!fs.existsSync(daemonMetaPath())) continue;\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(\"failed to start or connect sfmc daemon\");\n}\n\n/**\n * \u8C03\u7528\u5B88\u62A4\u8FDB\u7A0B\u65B9\u6CD5\uFF1B\u81EA\u52A8 ensureDaemon\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ACLI \u4FA7 status/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u51FA\u53E3\u3002\n */\nexport async function callDaemon(method: DaemonMethod, params?: DaemonParams): Promise<DaemonResult> {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n return conn.call(method, token ? { ...params, maintenanceToken: token } : params);\n}\n\n/**\n * \u786E\u4FDD\u5DF2\u8FDE\u63A5\u5E76\u8BA2\u9605\u8FDC\u7A0B\u65E5\u5FD7/\u72B6\u6001\uFF1B\u8FD4\u56DE\u65AD\u5F00\u51FD\u6570\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u542F\u52A8\u65F6\u6302\u4E0A\u5B9E\u65F6\u65E5\u5FD7\u6D41\uFF0C\u9000\u51FA\u65F6\u53EA disconnect\u3002\n */\nexport async function ensureDaemonSubscription(): Promise<() => void> {\n const conn = await ensureDaemon();\n await conn.subscribe();\n return () => {\n conn.disconnect();\n };\n}\n\n/**\n * \u8BF7\u6C42\u5B88\u62A4\u8FDB\u7A0B stopAll \u540E\u9000\u51FA\uFF08`sfmc daemon stop`\uFF09\u3002\n */\nexport async function shutdownDaemon(): Promise<string> {\n try {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n await conn.call(\"shutdown\", token ? { maintenanceToken: token } : undefined);\n conn.disconnect();\n } catch (e) {\n const meta = readDaemonMeta();\n if (!meta || !await isProcessAlive(meta.pid)) { clearDaemonMeta(); return \"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\"; }\n throw e;\n }\n /* \u77ED\u6682\u7B49\u5F85 meta \u6E05\u7406 */\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!readDaemonMeta()) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n const remaining = readDaemonMeta();\n if (remaining && await isProcessAlive(remaining.pid)) throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u5C1A\u672A\u9000\u51FA\uFF0C\u4FDD\u7559\u8FDE\u63A5\u4FE1\u606F\");\n clearDaemonMeta();\n return \"\";\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u8FD0\u884C\u6001\u884C\uFF1B\u5931\u8D25\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u7531\u8C03\u7528\u65B9\u964D\u7EA7\u3002\n */\nexport async function queryRuntimeViaDaemon(): Promise<ServiceStatus[]> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.rows;\n return [];\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u683C\u5F0F\u5316 status \u6587\u672C\u3002\n */\nexport async function statusTextViaDaemon(): Promise<string> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.text;\n if (result.kind === \"text\") return result.text;\n return \"\";\n}\n\n/**\n * \u901A\u7528\u300C\u8FD4\u56DE text\u300D\u7C7B RPC \u8F85\u52A9\u3002\n */\nexport async function textViaDaemon(method: DaemonMethod, params?: DaemonParams): Promise<string> {\n const result = await callDaemon(method, params);\n if (result.kind === \"text\") return result.text;\n if (result.kind === \"status\") return result.text;\n return \"\";\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["deadline"]
7
7
  }
@@ -6,8 +6,9 @@
6
6
  */
7
7
  import type { UnifiedLog, LogLevel, LogSource } from "../logs.js";
8
8
  import type { ServiceName, ServiceStateEvent, ServiceStatus } from "../services.js";
9
+ import type { ManagementRequest, ManagementResponse, ManagementEvent } from "@sfmc-bds/management";
9
10
  /** 协议方法名(固定集合,OCP:新增能力加此处与 server 分发) */
10
- export type DaemonMethod = "ping" | "status" | "start" | "stop" | "restart" | "startAll" | "stopAll" | "send" | "update" | "subscribe" | "shutdown";
11
+ export type DaemonMethod = "management" | "maintenanceStop" | "ping" | "status" | "start" | "stop" | "restart" | "startAll" | "stopAll" | "send" | "update" | "subscribe" | "shutdown";
11
12
  /** 客户端 → 服务端请求帧 */
12
13
  export interface DaemonRequest {
13
14
  id: string;
@@ -17,6 +18,8 @@ export interface DaemonRequest {
17
18
  }
18
19
  /** 各方法参数(按 method 选用) */
19
20
  export type DaemonParams = {
21
+ request?: ManagementRequest;
22
+ maintenanceToken?: string;
20
23
  name?: string;
21
24
  message?: string;
22
25
  args?: string[];
@@ -32,8 +35,8 @@ export interface DaemonResponse {
32
35
  /** 服务端推送事件(subscribe 之后) */
33
36
  export interface DaemonEvent {
34
37
  type: "event";
35
- event: "log" | "state";
36
- payload: DaemonLogPayload | ServiceStateEvent;
38
+ event: "log" | "state" | "management";
39
+ payload: DaemonLogPayload | ServiceStateEvent | ManagementEvent;
37
40
  }
38
41
  /** 日志事件载荷(与 UnifiedLog 对齐,便于 CLI 侧 pushLog) */
39
42
  export interface DaemonLogPayload {
@@ -44,6 +47,9 @@ export interface DaemonLogPayload {
44
47
  }
45
48
  /** status 等方法的结构化结果 */
46
49
  export type DaemonResult = {
50
+ kind: "management";
51
+ response: ManagementResponse;
52
+ } | {
47
53
  kind: "pong";
48
54
  } | {
49
55
  kind: "text";
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpF,yCAAyC;AACzC,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,UAAU,GACV,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,GACX,UAAU,CAAC;AAEf,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,mBAAmB;AACnB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;CAC/C;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;AAEvD,kBAAkB;AAClB,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAE7E;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAO9D;AAED,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEnG,yCAAyC;AACzC,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,iBAAiB,GACjB,MAAM,GACN,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,UAAU,GACV,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,GACX,UAAU,CAAC;AAEf,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,mBAAmB;AACnB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,YAAY,CAAC;IACtC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAC;CACjE;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;AAEvD,kBAAkB;AAClB,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAE7E;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAO9D;AAED,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/daemon/protocol.ts"],
4
- "sourcesContent": ["/**\n * protocol.ts \u2014 CLI \u2194 \u5B88\u62A4\u8FDB\u7A0B \u6362\u884C\u5206\u9694 JSON \u534F\u8BAE\u7C7B\u578B\n *\n * \u8BF7\u6C42/\u54CD\u5E94\u6210\u5BF9\u5339\u914D id\uFF1Bsubscribe \u540E\u670D\u52A1\u7AEF\u53EF\u63A8\u9001 event \u5E27\u3002\n * \u6240\u6709\u8BF7\u6C42\u987B\u643A\u5E26\u4E0E daemon.json \u4E00\u81F4\u7684 token\u3002\n */\n\nimport type { UnifiedLog, LogLevel, LogSource } from \"../logs.js\";\nimport type { ServiceName, ServiceStateEvent, ServiceStatus } from \"../services.js\";\n\n/** \u534F\u8BAE\u65B9\u6CD5\u540D\uFF08\u56FA\u5B9A\u96C6\u5408\uFF0COCP\uFF1A\u65B0\u589E\u80FD\u529B\u52A0\u6B64\u5904\u4E0E server \u5206\u53D1\uFF09 */\nexport type DaemonMethod =\n | \"ping\"\n | \"status\"\n | \"start\"\n | \"stop\"\n | \"restart\"\n | \"startAll\"\n | \"stopAll\"\n | \"send\"\n | \"update\"\n | \"subscribe\"\n | \"shutdown\";\n\n/** \u5BA2\u6237\u7AEF \u2192 \u670D\u52A1\u7AEF\u8BF7\u6C42\u5E27 */\nexport interface DaemonRequest {\n id: string;\n token: string;\n method: DaemonMethod;\n params?: DaemonParams;\n}\n\n/** \u5404\u65B9\u6CD5\u53C2\u6570\uFF08\u6309 method \u9009\u7528\uFF09 */\nexport type DaemonParams = {\n name?: string;\n message?: string;\n args?: string[];\n};\n\n/** \u670D\u52A1\u7AEF \u2192 \u5BA2\u6237\u7AEF\u54CD\u5E94\u5E27 */\nexport interface DaemonResponse {\n type: \"res\";\n id: string;\n ok: boolean;\n result?: DaemonResult;\n error?: string;\n}\n\n/** \u670D\u52A1\u7AEF\u63A8\u9001\u4E8B\u4EF6\uFF08subscribe \u4E4B\u540E\uFF09 */\nexport interface DaemonEvent {\n type: \"event\";\n event: \"log\" | \"state\";\n payload: DaemonLogPayload | ServiceStateEvent;\n}\n\n/** \u65E5\u5FD7\u4E8B\u4EF6\u8F7D\u8377\uFF08\u4E0E UnifiedLog \u5BF9\u9F50\uFF0C\u4FBF\u4E8E CLI \u4FA7 pushLog\uFF09 */\nexport interface DaemonLogPayload {\n text: string;\n source: LogSource;\n level: LogLevel;\n time?: string;\n}\n\n/** status \u7B49\u65B9\u6CD5\u7684\u7ED3\u6784\u5316\u7ED3\u679C */\nexport type DaemonResult =\n | { kind: \"pong\" }\n | { kind: \"text\"; text: string }\n | { kind: \"status\"; text: string; rows: ServiceStatus[] }\n | { kind: \"subscribed\" }\n | { kind: \"shutdown\" };\n\nexport type DaemonFrame = DaemonResponse | DaemonEvent;\n\n/** \u7C7B\u578B\u5B88\u536B\uFF1A\u65E5\u5FD7\u4E8B\u4EF6\u8F7D\u8377 */\nexport function isLogPayload(p: DaemonEvent[\"payload\"]): p is DaemonLogPayload {\n return typeof (p as DaemonLogPayload).text === \"string\" && typeof (p as DaemonLogPayload).source === \"string\";\n}\n\n/** \u4ECE UnifiedLog \u6784\u9020\u53EF\u5E8F\u5217\u5316\u65E5\u5FD7\u8F7D\u8377 */\nexport function toLogPayload(log: UnifiedLog): DaemonLogPayload {\n return {\n text: log.text,\n source: log.source,\n level: log.level,\n time: log.time instanceof Date ? log.time.toISOString() : String(log.time ?? \"\"),\n };\n}\n\nexport type { ServiceName, ServiceStateEvent, ServiceStatus };\n"],
5
- "mappings": "AA0EO,SAAS,aAAa,GAAkD;AAC7E,SAAO,OAAQ,EAAuB,SAAS,YAAY,OAAQ,EAAuB,WAAW;AACvG;AAGO,SAAS,aAAa,KAAmC;AAC9D,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,MAAM,IAAI,gBAAgB,OAAO,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,QAAQ,EAAE;AAAA,EACjF;AACF;",
4
+ "sourcesContent": ["/**\n * protocol.ts \u2014 CLI \u2194 \u5B88\u62A4\u8FDB\u7A0B \u6362\u884C\u5206\u9694 JSON \u534F\u8BAE\u7C7B\u578B\n *\n * \u8BF7\u6C42/\u54CD\u5E94\u6210\u5BF9\u5339\u914D id\uFF1Bsubscribe \u540E\u670D\u52A1\u7AEF\u53EF\u63A8\u9001 event \u5E27\u3002\n * \u6240\u6709\u8BF7\u6C42\u987B\u643A\u5E26\u4E0E daemon.json \u4E00\u81F4\u7684 token\u3002\n */\n\nimport type { UnifiedLog, LogLevel, LogSource } from \"../logs.js\";\nimport type { ServiceName, ServiceStateEvent, ServiceStatus } from \"../services.js\";\nimport type { ManagementRequest, ManagementResponse, ManagementEvent } from \"@sfmc-bds/management\";\n\n/** \u534F\u8BAE\u65B9\u6CD5\u540D\uFF08\u56FA\u5B9A\u96C6\u5408\uFF0COCP\uFF1A\u65B0\u589E\u80FD\u529B\u52A0\u6B64\u5904\u4E0E server \u5206\u53D1\uFF09 */\nexport type DaemonMethod =\n | \"management\"\n | \"maintenanceStop\"\n | \"ping\"\n | \"status\"\n | \"start\"\n | \"stop\"\n | \"restart\"\n | \"startAll\"\n | \"stopAll\"\n | \"send\"\n | \"update\"\n | \"subscribe\"\n | \"shutdown\";\n\n/** \u5BA2\u6237\u7AEF \u2192 \u670D\u52A1\u7AEF\u8BF7\u6C42\u5E27 */\nexport interface DaemonRequest {\n id: string;\n token: string;\n method: DaemonMethod;\n params?: DaemonParams;\n}\n\n/** \u5404\u65B9\u6CD5\u53C2\u6570\uFF08\u6309 method \u9009\u7528\uFF09 */\nexport type DaemonParams = {\n request?: ManagementRequest;\n maintenanceToken?: string;\n name?: string;\n message?: string;\n args?: string[];\n};\n\n/** \u670D\u52A1\u7AEF \u2192 \u5BA2\u6237\u7AEF\u54CD\u5E94\u5E27 */\nexport interface DaemonResponse {\n type: \"res\";\n id: string;\n ok: boolean;\n result?: DaemonResult;\n error?: string;\n}\n\n/** \u670D\u52A1\u7AEF\u63A8\u9001\u4E8B\u4EF6\uFF08subscribe \u4E4B\u540E\uFF09 */\nexport interface DaemonEvent {\n type: \"event\";\n event: \"log\" | \"state\" | \"management\";\n payload: DaemonLogPayload | ServiceStateEvent | ManagementEvent;\n}\n\n/** \u65E5\u5FD7\u4E8B\u4EF6\u8F7D\u8377\uFF08\u4E0E UnifiedLog \u5BF9\u9F50\uFF0C\u4FBF\u4E8E CLI \u4FA7 pushLog\uFF09 */\nexport interface DaemonLogPayload {\n text: string;\n source: LogSource;\n level: LogLevel;\n time?: string;\n}\n\n/** status \u7B49\u65B9\u6CD5\u7684\u7ED3\u6784\u5316\u7ED3\u679C */\nexport type DaemonResult =\n | { kind: \"management\"; response: ManagementResponse }\n | { kind: \"pong\" }\n | { kind: \"text\"; text: string }\n | { kind: \"status\"; text: string; rows: ServiceStatus[] }\n | { kind: \"subscribed\" }\n | { kind: \"shutdown\" };\n\nexport type DaemonFrame = DaemonResponse | DaemonEvent;\n\n/** \u7C7B\u578B\u5B88\u536B\uFF1A\u65E5\u5FD7\u4E8B\u4EF6\u8F7D\u8377 */\nexport function isLogPayload(p: DaemonEvent[\"payload\"]): p is DaemonLogPayload {\n return typeof (p as DaemonLogPayload).text === \"string\" && typeof (p as DaemonLogPayload).source === \"string\";\n}\n\n/** \u4ECE UnifiedLog \u6784\u9020\u53EF\u5E8F\u5217\u5316\u65E5\u5FD7\u8F7D\u8377 */\nexport function toLogPayload(log: UnifiedLog): DaemonLogPayload {\n return {\n text: log.text,\n source: log.source,\n level: log.level,\n time: log.time instanceof Date ? log.time.toISOString() : String(log.time ?? \"\"),\n };\n}\n\nexport type { ServiceName, ServiceStateEvent, ServiceStatus };\n"],
5
+ "mappings": "AAgFO,SAAS,aAAa,GAAkD;AAC7E,SAAO,OAAQ,EAAuB,SAAS,YAAY,OAAQ,EAAuB,WAAW;AACvG;AAGO,SAAS,aAAa,KAAmC;AAC9D,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,MAAM,IAAI,gBAAgB,OAAO,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,QAAQ,EAAE;AAAA,EACjF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyKH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsFrD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2MH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsGrD"}
@@ -12,6 +12,7 @@ import {
12
12
  } from "../commands.js";
13
13
  import { onLog } from "../logs.js";
14
14
  import { onServiceStateChange, queryServicesRuntimeLocal, stopAll } from "../services.js";
15
+ import { startAll } from "../services.js";
15
16
  import {
16
17
  clearDaemonMeta,
17
18
  createDaemonToken,
@@ -20,6 +21,17 @@ import {
20
21
  } from "./paths.js";
21
22
  import { toLogPayload } from "./protocol.js";
22
23
  import { markDaemonServer } from "./role.js";
24
+ import { dispatchManagement, onManagementEvent } from "../management/server.js";
25
+ import { toManagementError } from "@sfmc-bds/management";
26
+ import { withMaintenanceLock } from "@sfmc-bds/management/node";
27
+ import { ROOT } from "../runtime.js";
28
+ import fs from "node:fs";
29
+ import path from "node:path";
30
+ import { stopForMaintenance } from "../management/maintenance.js";
31
+ import { START_ORDER } from "../services.js";
32
+ import { readDaemonMeta } from "./paths.js";
33
+ import { isProcessAlive } from "@sfmc-bds/bds-tools/process-probe";
34
+ import { randomUUID } from "node:crypto";
23
35
  const subscribers = /* @__PURE__ */ new Set();
24
36
  let shuttingDown = false;
25
37
  function broadcast(event) {
@@ -29,6 +41,11 @@ function broadcast(event) {
29
41
  subscribers.delete(sock);
30
42
  continue;
31
43
  }
44
+ if (sock.writableLength > 4 * 1024 * 1024) {
45
+ sock.destroy();
46
+ subscribers.delete(sock);
47
+ continue;
48
+ }
32
49
  try {
33
50
  sock.write(line);
34
51
  } catch {
@@ -44,7 +61,31 @@ function writeRes(sock, res) {
44
61
  }
45
62
  }
46
63
  async function dispatch(req) {
64
+ const mutable = ["start", "stop", "restart", "startAll", "stopAll", "send", "update", "shutdown", "maintenanceStop"].includes(req.method);
65
+ if (mutable) {
66
+ const owner = fs.existsSync(path.join(ROOT, ".sfmc", "maintenance.lock")) ? JSON.parse(fs.readFileSync(path.join(ROOT, ".sfmc", "maintenance.lock"), "utf8")) : null;
67
+ if (!req.params?.maintenanceToken || req.params.maintenanceToken !== owner?.nonce) {
68
+ return withMaintenanceLock(ROOT, () => dispatchUnlocked(req));
69
+ }
70
+ }
71
+ return dispatchUnlocked(req);
72
+ }
73
+ async function dispatchUnlocked(req) {
47
74
  switch (req.method) {
75
+ case "maintenanceStop": {
76
+ await stopForMaintenance([...START_ORDER], () => {
77
+ });
78
+ return { kind: "status", text: "", rows: await queryServicesRuntimeLocal() };
79
+ }
80
+ case "management": {
81
+ const request = req.params?.request;
82
+ if (!request || typeof request.id !== "string" || typeof request.method !== "string") throw new Error("invalid management request");
83
+ try {
84
+ return { kind: "management", response: { type: "res", id: request.id, ok: true, result: await dispatchManagement(request) } };
85
+ } catch (error) {
86
+ return { kind: "management", response: { type: "res", id: request.id, ok: false, error: toManagementError(error) } };
87
+ }
88
+ }
48
89
  case "ping":
49
90
  return { kind: "pong" };
50
91
  case "status": {
@@ -94,7 +135,13 @@ async function dispatch(req) {
94
135
  case "shutdown": {
95
136
  if (!shuttingDown) {
96
137
  shuttingDown = true;
97
- await stopAll();
138
+ try {
139
+ await stopForMaintenance([...START_ORDER], () => {
140
+ });
141
+ } catch (error) {
142
+ shuttingDown = false;
143
+ throw error;
144
+ }
98
145
  setTimeout(() => {
99
146
  clearDaemonMeta();
100
147
  process.exit(0);
@@ -142,8 +189,34 @@ async function handleLine(sock, line, expectedToken) {
142
189
  }
143
190
  }
144
191
  async function runDaemonServer() {
192
+ const startLock = path.join(ROOT, ".sfmc", "daemon-start.lock");
193
+ fs.mkdirSync(path.dirname(startLock), { recursive: true });
194
+ const nonce = randomUUID();
195
+ let handle;
196
+ try {
197
+ handle = fs.openSync(startLock, "wx", 384);
198
+ } catch (error) {
199
+ if (error.code === "EEXIST") throw new Error("\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5728\u542F\u52A8\u6216\u542F\u52A8\u9501\u9057\u7559\uFF1B\u4E0D\u4F1A\u521B\u5EFA\u7B2C\u4E8C\u5957\u540E\u53F0\uFF0C\u8BF7\u68C0\u67E5 daemon-start.lock");
200
+ throw error;
201
+ }
202
+ fs.writeFileSync(handle, JSON.stringify({ pid: process.pid, nonce }));
203
+ fs.closeSync(handle);
204
+ const releaseStartup = () => {
205
+ try {
206
+ const owner = JSON.parse(fs.readFileSync(startLock, "utf8"));
207
+ if (owner.nonce === nonce) fs.unlinkSync(startLock);
208
+ } catch {
209
+ }
210
+ };
211
+ process.once("exit", releaseStartup);
212
+ const previous = readDaemonMeta();
213
+ if (previous && await isProcessAlive(previous.pid)) {
214
+ releaseStartup();
215
+ process.exit(0);
216
+ }
217
+ if (previous) clearDaemonMeta();
145
218
  markDaemonServer();
146
- clearDaemonMeta();
219
+ const unsubManagement = onManagementEvent((event) => broadcast({ type: "event", event: "management", payload: event }));
147
220
  const token = createDaemonToken();
148
221
  const pipe = daemonPipePath();
149
222
  const meta = {
@@ -163,6 +236,10 @@ async function runDaemonServer() {
163
236
  sock.setEncoding("utf8");
164
237
  sock.on("data", (chunk) => {
165
238
  buf += chunk;
239
+ if (Buffer.byteLength(buf) > 8 * 1024 * 1024) {
240
+ sock.destroy();
241
+ return;
242
+ }
166
243
  let idx;
167
244
  while ((idx = buf.indexOf("\n")) >= 0) {
168
245
  const line = buf.slice(0, idx).trim();
@@ -192,7 +269,10 @@ async function runDaemonServer() {
192
269
  });
193
270
  });
194
271
  writeDaemonMeta(meta);
272
+ releaseStartup();
273
+ if (process.argv.includes("--autostart") && !fs.existsSync(path.join(ROOT, ".sfmc", "maintenance.lock"))) await startAll();
195
274
  const cleanup = () => {
275
+ unsubManagement();
196
276
  unsubLog();
197
277
  unsubState();
198
278
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/daemon/server.ts"],
4
- "sourcesContent": ["/**\n * server.ts \u2014 \u5B88\u62A4\u8FDB\u7A0B\u670D\u52A1\u7AEF\uFF1A\u672C\u673A\u7BA1\u9053 listen + \u5C06 RPC \u5206\u53D1\u7ED9\u73B0\u6709\u76D1\u7BA1\u903B\u8F91\n *\n * \u4EC5\u5728 `sfmc --daemon` \u8FDB\u7A0B\u5185\u8FD0\u884C\uFF1B\u6301\u6709 Service \u5B50\u8FDB\u7A0B\u3001\u81EA\u52A8\u91CD\u542F\u4E0E BDS stdin\u3002\n * CLI \u9000\u51FA\u4E0D\u65AD\u5F00\u672C\u8FDB\u7A0B\uFF1B`shutdown` \u65B9\u6CD5\u4F1A\u5148 stopAll \u518D\u9000\u51FA\u3002\n */\n\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport {\n cmdRestart,\n cmdSend,\n cmdStart,\n cmdStartAll,\n cmdStatus,\n cmdStop,\n cmdStopAll,\n cmdUpdate,\n} from \"../commands.js\";\nimport { onLog } from \"../logs.js\";\nimport { onServiceStateChange, queryServicesRuntimeLocal, stopAll } from \"../services.js\";\nimport {\n clearDaemonMeta,\n createDaemonToken,\n daemonPipePath,\n writeDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type { DaemonEvent, DaemonRequest, DaemonResponse, DaemonResult } from \"./protocol.js\";\nimport { toLogPayload } from \"./protocol.js\";\nimport { markDaemonServer } from \"./role.js\";\n\n/** \u5F53\u524D\u5DF2\u8BA2\u9605\u4E8B\u4EF6\u63A8\u9001\u7684 socket \u96C6\u5408 */\nconst subscribers = new Set<net.Socket>();\n\n/** \u662F\u5426\u5DF2\u5F00\u59CB\u4F18\u96C5\u9000\u51FA\uFF08\u907F\u514D\u91CD\u590D shutdown\uFF09 */\nlet shuttingDown = false;\n\n/**\n * \u5411\u6240\u6709\u8BA2\u9605\u8005\u5E7F\u64AD\u4E8B\u4EF6\u5E27\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u670D\u52A1\u65E5\u5FD7\u4E0E\u542F\u505C\u72B6\u6001\u9700\u5B9E\u65F6\u51FA\u73B0\u5728\u5DF2\u8FDE\u63A5\u7684 REPL\u3002\n */\nfunction broadcast(event: DaemonEvent): void {\n const line = JSON.stringify(event) + \"\\n\";\n for (const sock of subscribers) {\n if (sock.destroyed) {\n subscribers.delete(sock);\n continue;\n }\n try {\n sock.write(line);\n } catch {\n subscribers.delete(sock);\n }\n }\n}\n\nfunction writeRes(sock: net.Socket, res: DaemonResponse): void {\n if (sock.destroyed) return;\n try {\n sock.write(JSON.stringify(res) + \"\\n\");\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u5206\u53D1\u5355\u6761 RPC \u5230\u73B0\u6709 cmd* / services API\uFF08\u672C\u8FDB\u7A0B\u5DF2\u662F daemon\uFF0Ccmd* \u8D70\u672C\u5730\u5B9E\u73B0\uFF09\u3002\n */\nasync function dispatch(req: DaemonRequest): Promise<DaemonResult> {\n switch (req.method) {\n case \"ping\":\n return { kind: \"pong\" };\n case \"status\": {\n const text = await cmdStatus();\n const rows = await queryServicesRuntimeLocal();\n return { kind: \"status\", text, rows };\n }\n case \"start\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdStart(name) };\n }\n case \"stop\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStopAll() };\n }\n return { kind: \"text\", text: await cmdStop(name) };\n }\n case \"restart\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n await cmdStopAll();\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdRestart(name) };\n }\n case \"startAll\":\n return { kind: \"text\", text: await cmdStartAll() };\n case \"stopAll\":\n return { kind: \"text\", text: await cmdStopAll() };\n case \"send\": {\n const name = req.params?.name;\n const message = req.params?.message;\n if (!name || message === undefined) throw new Error(\"missing params.name/message\");\n return { kind: \"text\", text: await cmdSend(name, message) };\n }\n case \"update\":\n return { kind: \"text\", text: await cmdUpdate(req.params?.args ?? []) };\n case \"subscribe\":\n return { kind: \"subscribed\" };\n case \"shutdown\": {\n if (!shuttingDown) {\n shuttingDown = true;\n await stopAll();\n setTimeout(() => {\n clearDaemonMeta();\n process.exit(0);\n }, 50).unref();\n }\n return { kind: \"shutdown\" };\n }\n default:\n throw new Error(`unknown method: ${(req as DaemonRequest).method}`);\n }\n}\n\n/**\n * \u5904\u7406\u5355\u6761\u8FDE\u63A5\u4E0A\u7684\u8BF7\u6C42\u884C\uFF1B\u9274\u6743\u5931\u8D25\u5219\u5173\u95ED\u3002\n */\nasync function handleLine(sock: net.Socket, line: string, expectedToken: string): Promise<void> {\n let req: DaemonRequest;\n try {\n req = JSON.parse(line) as DaemonRequest;\n } catch {\n writeRes(sock, { type: \"res\", id: \"?\", ok: false, error: \"invalid json\" });\n return;\n }\n if (!req?.id || !req.method) {\n writeRes(sock, { type: \"res\", id: req?.id ?? \"?\", ok: false, error: \"invalid request\" });\n return;\n }\n if (req.token !== expectedToken) {\n writeRes(sock, { type: \"res\", id: req.id, ok: false, error: \"unauthorized\" });\n sock.end();\n return;\n }\n\n if (req.method === \"subscribe\") {\n subscribers.add(sock);\n sock.once(\"close\", () => subscribers.delete(sock));\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result: { kind: \"subscribed\" } });\n return;\n }\n\n try {\n const result = await dispatch(req);\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result });\n } catch (e) {\n writeRes(sock, {\n type: \"res\",\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/**\n * \u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u6807\u8BB0\u89D2\u8272\u3001listen \u7BA1\u9053\u3001\u843D\u76D8 daemon.json\uFF0C\u5E76\u8F6C\u53D1\u65E5\u5FD7/\u72B6\u6001\u4E8B\u4EF6\u3002\n * \u672C\u51FD\u6570\u5728\u6210\u529F listen \u540E\u6C38\u4E0D\u8FD4\u56DE\uFF08\u8FDB\u7A0B\u5E38\u9A7B\uFF09\u3002\n */\nexport async function runDaemonServer(): Promise<void> {\n markDaemonServer();\n clearDaemonMeta();\n\n const token = createDaemonToken();\n const pipe = daemonPipePath();\n const meta: DaemonMeta = {\n pid: process.pid,\n pipe,\n token,\n startedAt: new Date().toISOString(),\n };\n\n const unsubLog = onLog((log) => {\n broadcast({ type: \"event\", event: \"log\", payload: toLogPayload(log) });\n });\n const unsubState = onServiceStateChange((ev) => {\n broadcast({ type: \"event\", event: \"state\", payload: ev });\n });\n\n const server = net.createServer((sock) => {\n let buf = \"\";\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => {\n buf += chunk;\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (!line) continue;\n void handleLine(sock, line, token);\n }\n });\n sock.on(\"error\", () => {\n subscribers.delete(sock);\n });\n sock.on(\"close\", () => {\n subscribers.delete(sock);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onErr = (err: NodeJS.ErrnoException): void => {\n /* \u53E6\u4E00\u5B9E\u4F8B\u5DF2\u5360\u7528\u7BA1\u9053\uFF1A\u5B89\u9759\u9000\u51FA\uFF0C\u907F\u514D\u53CC\u5B88\u62A4\u8FDB\u7A0B */\n if (err.code === \"EADDRINUSE\") {\n process.exit(0);\n }\n reject(err);\n };\n server.once(\"error\", onErr);\n server.listen(pipe, () => {\n server.off(\"error\", onErr);\n resolve();\n });\n });\n\n writeDaemonMeta(meta);\n\n const cleanup = (): void => {\n unsubLog();\n unsubState();\n try {\n server.close();\n } catch {\n /* ignore */\n }\n clearDaemonMeta();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGTERM\", () => {\n if (shuttingDown) return;\n shuttingDown = true;\n void stopAll().finally(() => {\n cleanup();\n process.exit(0);\n });\n });\n /* \u5B88\u62A4\u8FDB\u7A0B\u5FFD\u7565 SIGINT\uFF1A\u8131\u79BB\u7EC8\u7AEF\u540E\u4E0D\u5E94\u56E0\u4FE1\u53F7\u505C\u670D\uFF1B\u663E\u5F0F shutdown \u9000\u51FA */\n process.on(\"SIGINT\", () => {\n /* no-op */\n });\n\n await new Promise<never>(() => {\n /* park forever */\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * server.ts \u2014 \u5B88\u62A4\u8FDB\u7A0B\u670D\u52A1\u7AEF\uFF1A\u672C\u673A\u7BA1\u9053 listen + \u5C06 RPC \u5206\u53D1\u7ED9\u73B0\u6709\u76D1\u7BA1\u903B\u8F91\n *\n * \u4EC5\u5728 `sfmc --daemon` \u8FDB\u7A0B\u5185\u8FD0\u884C\uFF1B\u6301\u6709 Service \u5B50\u8FDB\u7A0B\u3001\u81EA\u52A8\u91CD\u542F\u4E0E BDS stdin\u3002\n * CLI \u9000\u51FA\u4E0D\u65AD\u5F00\u672C\u8FDB\u7A0B\uFF1B`shutdown` \u65B9\u6CD5\u4F1A\u5148 stopAll \u518D\u9000\u51FA\u3002\n */\n\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport {\n cmdRestart,\n cmdSend,\n cmdStart,\n cmdStartAll,\n cmdStatus,\n cmdStop,\n cmdStopAll,\n cmdUpdate,\n} from \"../commands.js\";\nimport { onLog } from \"../logs.js\";\nimport { onServiceStateChange, queryServicesRuntimeLocal, stopAll } from \"../services.js\";\nimport { startAll } from \"../services.js\";\nimport {\n clearDaemonMeta,\n createDaemonToken,\n daemonPipePath,\n writeDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type { DaemonEvent, DaemonRequest, DaemonResponse, DaemonResult } from \"./protocol.js\";\nimport { toLogPayload } from \"./protocol.js\";\nimport { markDaemonServer } from \"./role.js\";\nimport { dispatchManagement, onManagementEvent } from \"../management/server.js\";\nimport { toManagementError } from \"@sfmc-bds/management\";\nimport { withMaintenanceLock } from \"@sfmc-bds/management/node\";\nimport { ROOT } from \"../runtime.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stopForMaintenance } from \"../management/maintenance.js\";\nimport { START_ORDER } from \"../services.js\";\nimport { readDaemonMeta } from \"./paths.js\";\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { randomUUID } from \"node:crypto\";\n\n/** \u5F53\u524D\u5DF2\u8BA2\u9605\u4E8B\u4EF6\u63A8\u9001\u7684 socket \u96C6\u5408 */\nconst subscribers = new Set<net.Socket>();\n\n/** \u662F\u5426\u5DF2\u5F00\u59CB\u4F18\u96C5\u9000\u51FA\uFF08\u907F\u514D\u91CD\u590D shutdown\uFF09 */\nlet shuttingDown = false;\n\n/**\n * \u5411\u6240\u6709\u8BA2\u9605\u8005\u5E7F\u64AD\u4E8B\u4EF6\u5E27\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u670D\u52A1\u65E5\u5FD7\u4E0E\u542F\u505C\u72B6\u6001\u9700\u5B9E\u65F6\u51FA\u73B0\u5728\u5DF2\u8FDE\u63A5\u7684 REPL\u3002\n */\nfunction broadcast(event: DaemonEvent): void {\n const line = JSON.stringify(event) + \"\\n\";\n for (const sock of subscribers) {\n if (sock.destroyed) {\n subscribers.delete(sock);\n continue;\n }\n if (sock.writableLength > 4 * 1024 * 1024) { sock.destroy(); subscribers.delete(sock); continue; }\n try {\n sock.write(line);\n } catch {\n subscribers.delete(sock);\n }\n }\n}\n\nfunction writeRes(sock: net.Socket, res: DaemonResponse): void {\n if (sock.destroyed) return;\n try {\n sock.write(JSON.stringify(res) + \"\\n\");\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u5206\u53D1\u5355\u6761 RPC \u5230\u73B0\u6709 cmd* / services API\uFF08\u672C\u8FDB\u7A0B\u5DF2\u662F daemon\uFF0Ccmd* \u8D70\u672C\u5730\u5B9E\u73B0\uFF09\u3002\n */\nasync function dispatch(req: DaemonRequest): Promise<DaemonResult> {\n const mutable = [\"start\", \"stop\", \"restart\", \"startAll\", \"stopAll\", \"send\", \"update\", \"shutdown\", \"maintenanceStop\"].includes(req.method);\n if (mutable) {\n const owner = fs.existsSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\")) ? JSON.parse(fs.readFileSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\"), \"utf8\")) as { nonce?: string } : null;\n if (!req.params?.maintenanceToken || req.params.maintenanceToken !== owner?.nonce) {\n return withMaintenanceLock(ROOT, () => dispatchUnlocked(req));\n }\n }\n return dispatchUnlocked(req);\n}\nasync function dispatchUnlocked(req: DaemonRequest): Promise<DaemonResult> {\n switch (req.method) {\n case \"maintenanceStop\": {\n await stopForMaintenance([...START_ORDER], () => {});\n return { kind: \"status\", text: \"\", rows: await queryServicesRuntimeLocal() };\n }\n case \"management\": {\n const request = req.params?.request;\n if (!request || typeof request.id !== \"string\" || typeof request.method !== \"string\") throw new Error(\"invalid management request\");\n try { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: true, result: await dispatchManagement(request) } }; }\n catch (error) { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: false, error: toManagementError(error) } }; }\n }\n case \"ping\":\n return { kind: \"pong\" };\n case \"status\": {\n const text = await cmdStatus();\n const rows = await queryServicesRuntimeLocal();\n return { kind: \"status\", text, rows };\n }\n case \"start\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdStart(name) };\n }\n case \"stop\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStopAll() };\n }\n return { kind: \"text\", text: await cmdStop(name) };\n }\n case \"restart\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n await cmdStopAll();\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdRestart(name) };\n }\n case \"startAll\":\n return { kind: \"text\", text: await cmdStartAll() };\n case \"stopAll\":\n return { kind: \"text\", text: await cmdStopAll() };\n case \"send\": {\n const name = req.params?.name;\n const message = req.params?.message;\n if (!name || message === undefined) throw new Error(\"missing params.name/message\");\n return { kind: \"text\", text: await cmdSend(name, message) };\n }\n case \"update\":\n return { kind: \"text\", text: await cmdUpdate(req.params?.args ?? []) };\n case \"subscribe\":\n return { kind: \"subscribed\" };\n case \"shutdown\": {\n if (!shuttingDown) {\n shuttingDown = true;\n try { await stopForMaintenance([...START_ORDER], () => {}); }\n catch (error) { shuttingDown = false; throw error; }\n setTimeout(() => {\n clearDaemonMeta();\n process.exit(0);\n }, 50).unref();\n }\n return { kind: \"shutdown\" };\n }\n default:\n throw new Error(`unknown method: ${(req as DaemonRequest).method}`);\n }\n}\n\n/**\n * \u5904\u7406\u5355\u6761\u8FDE\u63A5\u4E0A\u7684\u8BF7\u6C42\u884C\uFF1B\u9274\u6743\u5931\u8D25\u5219\u5173\u95ED\u3002\n */\nasync function handleLine(sock: net.Socket, line: string, expectedToken: string): Promise<void> {\n let req: DaemonRequest;\n try {\n req = JSON.parse(line) as DaemonRequest;\n } catch {\n writeRes(sock, { type: \"res\", id: \"?\", ok: false, error: \"invalid json\" });\n return;\n }\n if (!req?.id || !req.method) {\n writeRes(sock, { type: \"res\", id: req?.id ?? \"?\", ok: false, error: \"invalid request\" });\n return;\n }\n if (req.token !== expectedToken) {\n writeRes(sock, { type: \"res\", id: req.id, ok: false, error: \"unauthorized\" });\n sock.end();\n return;\n }\n\n if (req.method === \"subscribe\") {\n subscribers.add(sock);\n sock.once(\"close\", () => subscribers.delete(sock));\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result: { kind: \"subscribed\" } });\n return;\n }\n\n try {\n const result = await dispatch(req);\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result });\n } catch (e) {\n writeRes(sock, {\n type: \"res\",\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/**\n * \u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u6807\u8BB0\u89D2\u8272\u3001listen \u7BA1\u9053\u3001\u843D\u76D8 daemon.json\uFF0C\u5E76\u8F6C\u53D1\u65E5\u5FD7/\u72B6\u6001\u4E8B\u4EF6\u3002\n * \u672C\u51FD\u6570\u5728\u6210\u529F listen \u540E\u6C38\u4E0D\u8FD4\u56DE\uFF08\u8FDB\u7A0B\u5E38\u9A7B\uFF09\u3002\n */\nexport async function runDaemonServer(): Promise<void> {\n const startLock = path.join(ROOT, \".sfmc\", \"daemon-start.lock\");\n fs.mkdirSync(path.dirname(startLock), { recursive: true });\n const nonce = randomUUID();\n let handle: number;\n try { handle = fs.openSync(startLock, \"wx\", 0o600); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === \"EEXIST\") throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5728\u542F\u52A8\u6216\u542F\u52A8\u9501\u9057\u7559\uFF1B\u4E0D\u4F1A\u521B\u5EFA\u7B2C\u4E8C\u5957\u540E\u53F0\uFF0C\u8BF7\u68C0\u67E5 daemon-start.lock\"); throw error; }\n fs.writeFileSync(handle, JSON.stringify({ pid: process.pid, nonce })); fs.closeSync(handle);\n const releaseStartup = () => { try { const owner = JSON.parse(fs.readFileSync(startLock, \"utf8\")) as { nonce: string }; if (owner.nonce === nonce) fs.unlinkSync(startLock); } catch { /* \u5DF2\u91CA\u653E */ } };\n process.once(\"exit\", releaseStartup);\n const previous = readDaemonMeta();\n if (previous && await isProcessAlive(previous.pid)) { releaseStartup(); process.exit(0); }\n if (previous) clearDaemonMeta();\n markDaemonServer();\n const unsubManagement = onManagementEvent(event => broadcast({ type: \"event\", event: \"management\", payload: event }));\n\n const token = createDaemonToken();\n const pipe = daemonPipePath();\n const meta: DaemonMeta = {\n pid: process.pid,\n pipe,\n token,\n startedAt: new Date().toISOString(),\n };\n\n const unsubLog = onLog((log) => {\n broadcast({ type: \"event\", event: \"log\", payload: toLogPayload(log) });\n });\n const unsubState = onServiceStateChange((ev) => {\n broadcast({ type: \"event\", event: \"state\", payload: ev });\n });\n\n const server = net.createServer((sock) => {\n let buf = \"\";\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => {\n buf += chunk;\n if (Buffer.byteLength(buf) > 8 * 1024 * 1024) { sock.destroy(); return; }\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (!line) continue;\n void handleLine(sock, line, token);\n }\n });\n sock.on(\"error\", () => {\n subscribers.delete(sock);\n });\n sock.on(\"close\", () => {\n subscribers.delete(sock);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onErr = (err: NodeJS.ErrnoException): void => {\n /* \u53E6\u4E00\u5B9E\u4F8B\u5DF2\u5360\u7528\u7BA1\u9053\uFF1A\u5B89\u9759\u9000\u51FA\uFF0C\u907F\u514D\u53CC\u5B88\u62A4\u8FDB\u7A0B */\n if (err.code === \"EADDRINUSE\") {\n process.exit(0);\n }\n reject(err);\n };\n server.once(\"error\", onErr);\n server.listen(pipe, () => {\n server.off(\"error\", onErr);\n resolve();\n });\n });\n\n writeDaemonMeta(meta);\n releaseStartup();\n if (process.argv.includes(\"--autostart\") && !fs.existsSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\"))) await startAll();\n\n const cleanup = (): void => {\n unsubManagement();\n unsubLog();\n unsubState();\n try {\n server.close();\n } catch {\n /* ignore */\n }\n clearDaemonMeta();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGTERM\", () => {\n if (shuttingDown) return;\n shuttingDown = true;\n void stopAll().finally(() => {\n cleanup();\n process.exit(0);\n });\n });\n /* \u5B88\u62A4\u8FDB\u7A0B\u5FFD\u7565 SIGINT\uFF1A\u8131\u79BB\u7EC8\u7AEF\u540E\u4E0D\u5E94\u56E0\u4FE1\u53F7\u505C\u670D\uFF1B\u663E\u5F0F shutdown \u9000\u51FA */\n process.on(\"SIGINT\", () => {\n /* no-op */\n });\n\n await new Promise<never>(() => {\n /* park forever */\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -85,6 +85,7 @@ export declare const en: {
85
85
  readonly "help.section.module": "─── Module Management ───";
86
86
  readonly "help.module.list": "List installed modules";
87
87
  readonly "help.module.search": "Search registry / show module info";
88
+ readonly "help.module.submit": "Preview or submit a module registry PR";
88
89
  readonly "help.module.install": "Install a module";
89
90
  readonly "help.module.uninstall": "Remove installed module";
90
91
  readonly "help.module.verify": "Verify SHA-256 integrity";
@@ -209,12 +210,12 @@ export declare const en: {
209
210
  readonly "wizard.runtimeMissingAssets": "Runtime is missing required directories: {list}";
210
211
  readonly "wizard.prepFailed": "Runtime preparation failed: {message}";
211
212
  readonly "wizard.step2": "Step 2 - External Runtimes";
212
- readonly "wizard.step2Note": "Select paths for BDS, Database, and QQ bridge backend";
213
+ readonly "wizard.step2Note": "Confirm the BDS directory first. Database, backups, and QQ can stay on defaults.";
213
214
  readonly "wizard.bdsDir": "BDS installation directory";
214
215
  readonly "wizard.cannotCreateBds": "Cannot create BDS installation directory: {dir}";
215
216
  readonly "wizard.qqBackend": "QQ bridge backend:";
216
217
  readonly "wizard.qqBackend.official": "QQ Open Platform (official Bot)";
217
- readonly "wizard.qqBackend.officialHint": "Recommended; needs AppID / AppSecret";
218
+ readonly "wizard.qqBackend.officialHint": "Needs AppID / AppSecret; can be set later";
218
219
  readonly "wizard.qqBackend.llbot": "LLBot (OneBot 11)";
219
220
  readonly "wizard.qqBackend.llbotHint": "Requires local LLBot process";
220
221
  readonly "wizard.qqBackend.disabled": "Disable QQ bridge for now";
@@ -251,7 +252,12 @@ export declare const en: {
251
252
  readonly "wizard.updaterTip": "If could not find BDS runtime, updater will be started later.\n You can configure updater later in configs/bds_updater.json";
252
253
  readonly "wizard.step4": "Step 4 - Modules";
253
254
  readonly "wizard.modulesFound": "Found {count} optional modules";
254
- readonly "wizard.modulesNone": "No modules catalog found";
255
+ readonly "wizard.modulesNone": "No modules installed yet.";
256
+ readonly "wizard.useDefaults": "Use the default database, backup directory, and update preserve list?";
257
+ readonly "wizard.defaultsApplied": "Database {db} (port {port}), backup {backup}.";
258
+ readonly "wizard.installFromRegistry": "Install from the official index (optional):";
259
+ readonly "wizard.registryLoading": "Reading the official module index";
260
+ readonly "wizard.registryOffline": "Official index is unavailable. Install later with `mod install <id>`.";
255
261
  readonly "wizard.enableModules": "Enable modules:";
256
262
  readonly "wizard.emptyHint": "(empty)";
257
263
  readonly "wizard.updatingConfigs": "Updating configs";
@@ -275,6 +281,7 @@ export declare const en: {
275
281
  readonly "wizard.deploying": "Deploying to {path}";
276
282
  readonly "wizard.restartBds": "Restart BDS to load the new behavior pack.";
277
283
  readonly "wizard.deployFailed": "deploy failed: {message}\nRun `sfmc mod reload` after fixing bds_path in configs/.";
284
+ readonly "prompt.useDefault": "Use this path";
278
285
  readonly "prompt.enterPath": "Enter path";
279
286
  readonly "prompt.browse": "Browse…";
280
287
  readonly "prompt.browseHint": "Open system folder picker";
@@ -310,7 +317,7 @@ export declare const en: {
310
317
  readonly "mod.removed": "Removed {id} from {path}\n";
311
318
  readonly "mod.update.usage": "Usage: mod update [id...] [--check] [--yes] [--allow-major]";
312
319
  readonly "mod.update.disabled": "Module auto-update is disabled (configs/module-update.json).";
313
- readonly "mod.update.checkOff": "Module update check is off for this server start.";
320
+ readonly "mod.update.checkOff": "Module updates only happen when the update command is executed.";
314
321
  readonly "mod.update.none": "No module updates.";
315
322
  readonly "mod.update.upgrade": "{id} {from} -> {to}";
316
323
  readonly "mod.update.confirm": "Update {count} module(s)?";
@@ -337,7 +344,7 @@ export declare const en: {
337
344
  readonly "mod.pin.ok": "{id} auto-update {state}";
338
345
  readonly "mod.pin.on": "on";
339
346
  readonly "mod.pin.off": "off";
340
- readonly "mod.pin.locked": "{id} is a local link or directory and cannot auto-update.";
347
+ readonly "mod.pin.locked": "{id} is a local link, directory, or GitHub source and cannot auto-update.";
341
348
  readonly "mod.pin.missing": "Module {id} is not installed.";
342
349
  readonly "pack.built": "built packs at {path}";
343
350
  readonly "pack.buildFailed": "pack build failed: {message}";
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"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"}
@@ -86,6 +86,7 @@ const en = {
86
86
  "help.section.module": "\u2500\u2500\u2500 Module Management \u2500\u2500\u2500",
87
87
  "help.module.list": "List installed modules",
88
88
  "help.module.search": "Search registry / show module info",
89
+ "help.module.submit": "Preview or submit a module registry PR",
89
90
  "help.module.install": "Install a module",
90
91
  "help.module.uninstall": "Remove installed module",
91
92
  "help.module.verify": "Verify SHA-256 integrity",
@@ -214,12 +215,12 @@ const en = {
214
215
  "wizard.runtimeMissingAssets": "Runtime is missing required directories: {list}",
215
216
  "wizard.prepFailed": "Runtime preparation failed: {message}",
216
217
  "wizard.step2": "Step 2 - External Runtimes",
217
- "wizard.step2Note": "Select paths for BDS, Database, and QQ bridge backend",
218
+ "wizard.step2Note": "Confirm the BDS directory first. Database, backups, and QQ can stay on defaults.",
218
219
  "wizard.bdsDir": "BDS installation directory",
219
220
  "wizard.cannotCreateBds": "Cannot create BDS installation directory: {dir}",
220
221
  "wizard.qqBackend": "QQ bridge backend:",
221
222
  "wizard.qqBackend.official": "QQ Open Platform (official Bot)",
222
- "wizard.qqBackend.officialHint": "Recommended; needs AppID / AppSecret",
223
+ "wizard.qqBackend.officialHint": "Needs AppID / AppSecret; can be set later",
223
224
  "wizard.qqBackend.llbot": "LLBot (OneBot 11)",
224
225
  "wizard.qqBackend.llbotHint": "Requires local LLBot process",
225
226
  "wizard.qqBackend.disabled": "Disable QQ bridge for now",
@@ -256,7 +257,12 @@ const en = {
256
257
  "wizard.updaterTip": "If could not find BDS runtime, updater will be started later.\n You can configure updater later in configs/bds_updater.json",
257
258
  "wizard.step4": "Step 4 - Modules",
258
259
  "wizard.modulesFound": "Found {count} optional modules",
259
- "wizard.modulesNone": "No modules catalog found",
260
+ "wizard.modulesNone": "No modules installed yet.",
261
+ "wizard.useDefaults": "Use the default database, backup directory, and update preserve list?",
262
+ "wizard.defaultsApplied": "Database {db} (port {port}), backup {backup}.",
263
+ "wizard.installFromRegistry": "Install from the official index (optional):",
264
+ "wizard.registryLoading": "Reading the official module index",
265
+ "wizard.registryOffline": "Official index is unavailable. Install later with `mod install <id>`.",
260
266
  "wizard.enableModules": "Enable modules:",
261
267
  "wizard.emptyHint": "(empty)",
262
268
  "wizard.updatingConfigs": "Updating configs",
@@ -281,6 +287,7 @@ const en = {
281
287
  "wizard.restartBds": "Restart BDS to load the new behavior pack.",
282
288
  "wizard.deployFailed": "deploy failed: {message}\nRun `sfmc mod reload` after fixing bds_path in configs/.",
283
289
  /* ─── prompts ─── */
290
+ "prompt.useDefault": "Use this path",
284
291
  "prompt.enterPath": "Enter path",
285
292
  "prompt.browse": "Browse\u2026",
286
293
  "prompt.browseHint": "Open system folder picker",
@@ -319,7 +326,7 @@ const en = {
319
326
  "mod.removed": "Removed {id} from {path}\n",
320
327
  "mod.update.usage": "Usage: mod update [id...] [--check] [--yes] [--allow-major]",
321
328
  "mod.update.disabled": "Module auto-update is disabled (configs/module-update.json).",
322
- "mod.update.checkOff": "Module update check is off for this server start.",
329
+ "mod.update.checkOff": "Module updates only happen when the update command is executed.",
323
330
  "mod.update.none": "No module updates.",
324
331
  "mod.update.upgrade": "{id} {from} -> {to}",
325
332
  "mod.update.confirm": "Update {count} module(s)?",
@@ -346,7 +353,7 @@ const en = {
346
353
  "mod.pin.ok": "{id} auto-update {state}",
347
354
  "mod.pin.on": "on",
348
355
  "mod.pin.off": "off",
349
- "mod.pin.locked": "{id} is a local link or directory and cannot auto-update.",
356
+ "mod.pin.locked": "{id} is a local link, directory, or GitHub source and cannot auto-update.",
350
357
  "mod.pin.missing": "Module {id} is not installed.",
351
358
  /* ─── pack lifecycle ─── */
352
359
  "pack.built": "built packs at {path}",