@sfmc-bds/cli 0.2.0-beta.6 → 0.2.0-beta.8

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 (68) hide show
  1. package/dist/argv-parse.d.ts +0 -2
  2. package/dist/argv-parse.d.ts.map +1 -1
  3. package/dist/argv-parse.js +1 -5
  4. package/dist/argv-parse.js.map +2 -2
  5. package/dist/cli-gate.d.ts.map +1 -1
  6. package/dist/cli-gate.js +0 -2
  7. package/dist/cli-gate.js.map +2 -2
  8. package/dist/command-surface.d.ts +5 -12
  9. package/dist/command-surface.d.ts.map +1 -1
  10. package/dist/command-surface.js +6 -62
  11. package/dist/command-surface.js.map +2 -2
  12. package/dist/help-text.d.ts.map +1 -1
  13. package/dist/help-text.js +6 -10
  14. package/dist/help-text.js.map +2 -2
  15. package/dist/i18n/locales/en.d.ts +9 -87
  16. package/dist/i18n/locales/en.d.ts.map +1 -1
  17. package/dist/i18n/locales/en.js +9 -90
  18. package/dist/i18n/locales/en.js.map +2 -2
  19. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  20. package/dist/i18n/locales/zh-CN.js +9 -90
  21. package/dist/i18n/locales/zh-CN.js.map +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -4
  25. package/dist/index.js.map +2 -2
  26. package/dist/main.js +3 -6
  27. package/dist/main.js.map +2 -2
  28. package/dist/module-commands.d.ts +6 -25
  29. package/dist/module-commands.d.ts.map +1 -1
  30. package/dist/module-commands.js +107 -127
  31. package/dist/module-commands.js.map +2 -2
  32. package/dist/module-pack-build.d.ts.map +1 -1
  33. package/dist/module-pack-build.js +4 -0
  34. package/dist/module-pack-build.js.map +2 -2
  35. package/dist/module-toggle.d.ts +33 -0
  36. package/dist/module-toggle.d.ts.map +1 -0
  37. package/dist/module-toggle.js +28 -0
  38. package/dist/module-toggle.js.map +7 -0
  39. package/dist/pack-lifecycle.d.ts.map +1 -1
  40. package/dist/pack-lifecycle.js +4 -0
  41. package/dist/pack-lifecycle.js.map +2 -2
  42. package/dist/remote-agent.js +5 -5
  43. package/dist/remote-agent.js.map +2 -2
  44. package/dist/repl.d.ts +0 -2
  45. package/dist/repl.d.ts.map +1 -1
  46. package/dist/repl.js +2 -31
  47. package/dist/repl.js.map +2 -2
  48. package/dist/runtime.d.ts +4 -13
  49. package/dist/runtime.d.ts.map +1 -1
  50. package/dist/runtime.js +15 -27
  51. package/dist/runtime.js.map +2 -2
  52. package/dist/services.d.ts +0 -2
  53. package/dist/services.d.ts.map +1 -1
  54. package/dist/services.js +0 -4
  55. package/dist/services.js.map +2 -2
  56. package/package.json +6 -6
  57. package/dist/module-publish.d.ts +0 -69
  58. package/dist/module-publish.d.ts.map +0 -1
  59. package/dist/module-publish.js +0 -478
  60. package/dist/module-publish.js.map +0 -7
  61. package/dist/module-watch.d.ts +0 -32
  62. package/dist/module-watch.d.ts.map +0 -1
  63. package/dist/module-watch.js +0 -171
  64. package/dist/module-watch.js.map +0 -7
  65. package/dist/module-wizard.d.ts +0 -12
  66. package/dist/module-wizard.d.ts.map +0 -1
  67. package/dist/module-wizard.js +0 -297
  68. package/dist/module-wizard.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/remote-agent.ts"],
4
- "sourcesContent": ["import { WebSocket } from \"ws\";\nimport {\n configPath,\n DEFAULT_REMOTE_CONFIG,\n loadEnsuredConfig,\n writeJson,\n withConfigSchema,\n type RemoteConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStop } from \"./commands.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { SERVICE_NAMES, serviceStatus, type ServiceName } from \"./services.js\";\n\ntype Task = {\n type: \"task\";\n taskId: string;\n action: \"status\" | \"start\" | \"stop\" | \"restart\" | \"send\";\n service?: string;\n message?: string;\n};\n\ntype RemoteStatus = {\n enabled?: boolean;\n controller_url?: string;\n agent_id?: string;\n connected: boolean;\n last_error?: string;\n retry_in_ms?: number;\n};\n\nlet socket: WebSocket | null = null;\nlet retryTimer: NodeJS.Timeout | null = null;\nlet retryDelay = 1000;\nlet heartbeatTimer: NodeJS.Timeout | null = null;\nlet lastError = \"\";\nlet warnedMissingConfig = false;\nlet stopping = false;\n\nconst HEARTBEAT_INTERVAL_MS = 20_000;\n\n/** \u542F\u52A8\u65F6\u786E\u4FDD remote.json \u5B58\u5728,\u8FD4\u56DE\u73B0\u6709\u6216\u7A7A\u914D\u7F6E\uFF08\u5DF2\u5265\u79BB $schema\uFF09\u3002 */\nfunction loadConfig(): RemoteConfig {\n return loadEnsuredConfig(\n ROOT,\n \"remote.json\",\n \"remote\",\n { ...DEFAULT_REMOTE_CONFIG } as Record<string, unknown>\n ) as RemoteConfig;\n}\n\nfunction writeConfig(config: RemoteConfig): void {\n writeJson(configPath(ROOT, \"remote.json\"), withConfigSchema({ ...config } as Record<string, unknown>, \"remote\"));\n}\n\nfunction isService(value: string | undefined): value is ServiceName {\n return !!value && SERVICE_NAMES.includes(value as ServiceName);\n}\n\nfunction isAction(value: unknown): value is Task[\"action\"] {\n return value === \"status\" || value === \"start\" || value === \"stop\" || value === \"restart\" || value === \"send\";\n}\n\nfunction websocketUrl(controllerUrl: string, agentId: string): string {\n const url = new URL(controllerUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/v1/agent\";\n url.search = new URLSearchParams({ id: agentId }).toString();\n return url.toString();\n}\n\nfunction send(payload: unknown): void {\n if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(payload));\n}\n\nfunction startHeartbeat(): void {\n stopHeartbeat();\n heartbeatTimer = setInterval(() => send({ type: \"ping\" }), HEARTBEAT_INTERVAL_MS);\n}\n\nfunction stopHeartbeat(): void {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n}\n\nasync function execute(task: Task): Promise<unknown> {\n if (!isAction(task.action)) throw new Error(\"invalid task action\");\n if (task.action === \"status\") return { services: await serviceStatus() };\n if (!isService(task.service)) throw new Error(\"service is required and must be one of: \" + SERVICE_NAMES.join(\", \"));\n if (task.action === \"send\") {\n if (!task.message) throw new Error(\"message is required for send action\");\n return { output: await cmdSend(task.service, task.message), services: await serviceStatus() };\n }\n\n const output =\n task.action === \"start\"\n ? await cmdStart(task.service)\n : task.action === \"stop\"\n ? await cmdStop(task.service)\n : await cmdRestart(task.service);\n return { output, services: await serviceStatus() };\n}\n\nfunction scheduleReconnect(): void {\n if (retryTimer || stopping) return;\n const delay = retryDelay;\n retryTimer = setTimeout(() => {\n retryTimer = null;\n startRemoteAgent();\n }, delay);\n}\n\nfunction resetReconnect(reason?: string): void {\n retryDelay = 1000;\n if (reason) {\n lastError = reason;\n console.warn(`[remote-agent] ${reason} \u2014 will retry in ${retryDelay}ms`);\n }\n}\n\n/** Close the active socket (if any) and stop reconnecting. Idempotent. */\nexport function stopRemoteAgent(): void {\n stopping = true;\n stopHeartbeat();\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n if (socket) {\n try {\n socket.close(1000, \"client_shutdown\");\n } catch {\n /* ignore */\n }\n socket = null;\n }\n}\n\n/** Start one outbound-only remote-management connection for this supervisor process. */\nexport function startRemoteAgent(): void {\n if (stopping) return;\n if (socket || retryTimer) return;\n const config = loadConfig();\n if (!config.enabled || !config.controller_url || !config.agent_id || !config.agent_secret) {\n if (!warnedMissingConfig) {\n const missing: string[] = [];\n if (!config.enabled) missing.push(\"enabled\");\n if (!config.controller_url) missing.push(\"controller_url\");\n if (!config.agent_id) missing.push(\"agent_id\");\n if (!config.agent_secret) missing.push(\"agent_secret\");\n if (missing.length) {\n console.warn(`[remote-agent] disabled \u2014 missing remote.json fields: ${missing.join(\", \")} (run \\`sfmc remote enroll\\`)`);\n }\n warnedMissingConfig = true;\n }\n return;\n }\n warnedMissingConfig = true;\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(websocketUrl(config.controller_url, config.agent_id));\n } catch (e) {\n resetReconnect(`failed to construct websocket: ${(e as Error).message}`);\n scheduleReconnect();\n return;\n }\n socket = ws;\n\n ws.on(\"open\", () => {\n retryDelay = 1000;\n lastError = \"\";\n void serviceStatus().then((status) => {\n send({ type: \"hello\", agentId: config.agent_id, secret: config.agent_secret, status });\n startHeartbeat();\n });\n });\n ws.on(\"message\", (raw) => {\n let msg: { type?: string };\n try {\n msg = JSON.parse(raw.toString()) as { type?: string };\n } catch {\n return;\n }\n if (msg.type === \"ping\") {\n send({ type: \"pong\" });\n return;\n }\n if (msg.type !== \"task\") return;\n const task = msg as Task;\n void execute(task)\n .then((result) => send({ type: \"task_result\", taskId: task.taskId, ok: true, result }))\n .catch((error: Error) => send({ type: \"task_result\", taskId: task.taskId, ok: false, error: error.message }));\n });\n ws.on(\"close\", (code, reason) => {\n if (socket === ws) socket = null;\n stopHeartbeat();\n if (stopping) return;\n resetReconnect(`disconnected (code=${code} ${reason.toString() || \"no_reason\"})`);\n scheduleReconnect();\n });\n ws.on(\"error\", (e) => {\n resetReconnect(`socket error: ${e.message}`);\n /* close event will follow and trigger reconnect */\n });\n}\n\nexport async function enrollRemoteAgent(controllerUrl: string, enrollmentToken: string, name: string): Promise<string> {\n const response = await fetch(new URL(\"/v1/enroll\", controllerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", authorization: `Bearer ${enrollmentToken}` },\n body: JSON.stringify({ name }),\n });\n const result = (await response.json()) as { agentId?: string; agentSecret?: string; error?: string };\n if (!response.ok || !result.agentId || !result.agentSecret) throw new Error(result.error ?? \"enrollment failed\");\n\n writeConfig({ enabled: true, controller_url: controllerUrl, agent_id: result.agentId, agent_secret: result.agentSecret });\n return result.agentId;\n}\n\n/** Disable the remote agent: clear enabled flag and close the connection. */\nexport function disableRemoteAgent(): void {\n const config = loadConfig();\n if (config.agent_id || config.agent_secret) {\n writeConfig({ ...config, enabled: false });\n }\n stopRemoteAgent();\n stopping = false;\n}\n\nexport function remoteStatus(): RemoteStatus {\n const config = loadConfig();\n const result: RemoteStatus = { connected: socket?.readyState === WebSocket.OPEN };\n if (config.enabled !== undefined) result.enabled = config.enabled;\n if (config.controller_url) result.controller_url = config.controller_url;\n if (config.agent_id) result.agent_id = config.agent_id;\n if (lastError) {\n result.last_error = lastError;\n result.retry_in_ms = retryDelay;\n }\n return result;\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { WebSocket } from \"ws\";\nimport {\n configPath,\n DEFAULT_REMOTE_CONFIG,\n loadEnsuredConfig,\n writeJson,\n withConfigSchema,\n type RemoteConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStop } from \"./commands.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { SERVICE_NAMES, queryServicesRuntime, type ServiceName } from \"./services.js\";\n\ntype Task = {\n type: \"task\";\n taskId: string;\n action: \"status\" | \"start\" | \"stop\" | \"restart\" | \"send\";\n service?: string;\n message?: string;\n};\n\ntype RemoteStatus = {\n enabled?: boolean;\n controller_url?: string;\n agent_id?: string;\n connected: boolean;\n last_error?: string;\n retry_in_ms?: number;\n};\n\nlet socket: WebSocket | null = null;\nlet retryTimer: NodeJS.Timeout | null = null;\nlet retryDelay = 1000;\nlet heartbeatTimer: NodeJS.Timeout | null = null;\nlet lastError = \"\";\nlet warnedMissingConfig = false;\nlet stopping = false;\n\nconst HEARTBEAT_INTERVAL_MS = 20_000;\n\n/** \u542F\u52A8\u65F6\u786E\u4FDD remote.json \u5B58\u5728,\u8FD4\u56DE\u73B0\u6709\u6216\u7A7A\u914D\u7F6E\uFF08\u5DF2\u5265\u79BB $schema\uFF09\u3002 */\nfunction loadConfig(): RemoteConfig {\n return loadEnsuredConfig(\n ROOT,\n \"remote.json\",\n \"remote\",\n { ...DEFAULT_REMOTE_CONFIG } as Record<string, unknown>\n ) as RemoteConfig;\n}\n\nfunction writeConfig(config: RemoteConfig): void {\n writeJson(configPath(ROOT, \"remote.json\"), withConfigSchema({ ...config } as Record<string, unknown>, \"remote\"));\n}\n\nfunction isService(value: string | undefined): value is ServiceName {\n return !!value && SERVICE_NAMES.includes(value as ServiceName);\n}\n\nfunction isAction(value: unknown): value is Task[\"action\"] {\n return value === \"status\" || value === \"start\" || value === \"stop\" || value === \"restart\" || value === \"send\";\n}\n\nfunction websocketUrl(controllerUrl: string, agentId: string): string {\n const url = new URL(controllerUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/v1/agent\";\n url.search = new URLSearchParams({ id: agentId }).toString();\n return url.toString();\n}\n\nfunction send(payload: unknown): void {\n if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(payload));\n}\n\nfunction startHeartbeat(): void {\n stopHeartbeat();\n heartbeatTimer = setInterval(() => send({ type: \"ping\" }), HEARTBEAT_INTERVAL_MS);\n}\n\nfunction stopHeartbeat(): void {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n}\n\nasync function execute(task: Task): Promise<unknown> {\n if (!isAction(task.action)) throw new Error(\"invalid task action\");\n if (task.action === \"status\") return { services: await queryServicesRuntime() };\n if (!isService(task.service)) throw new Error(\"service is required and must be one of: \" + SERVICE_NAMES.join(\", \"));\n if (task.action === \"send\") {\n if (!task.message) throw new Error(\"message is required for send action\");\n return { output: await cmdSend(task.service, task.message), services: await queryServicesRuntime() };\n }\n\n const output =\n task.action === \"start\"\n ? await cmdStart(task.service)\n : task.action === \"stop\"\n ? await cmdStop(task.service)\n : await cmdRestart(task.service);\n return { output, services: await queryServicesRuntime() };\n}\n\nfunction scheduleReconnect(): void {\n if (retryTimer || stopping) return;\n const delay = retryDelay;\n retryTimer = setTimeout(() => {\n retryTimer = null;\n startRemoteAgent();\n }, delay);\n}\n\nfunction resetReconnect(reason?: string): void {\n retryDelay = 1000;\n if (reason) {\n lastError = reason;\n console.warn(`[remote-agent] ${reason} \u2014 will retry in ${retryDelay}ms`);\n }\n}\n\n/** Close the active socket (if any) and stop reconnecting. Idempotent. */\nexport function stopRemoteAgent(): void {\n stopping = true;\n stopHeartbeat();\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n if (socket) {\n try {\n socket.close(1000, \"client_shutdown\");\n } catch {\n /* ignore */\n }\n socket = null;\n }\n}\n\n/** Start one outbound-only remote-management connection for this supervisor process. */\nexport function startRemoteAgent(): void {\n if (stopping) return;\n if (socket || retryTimer) return;\n const config = loadConfig();\n if (!config.enabled || !config.controller_url || !config.agent_id || !config.agent_secret) {\n if (!warnedMissingConfig) {\n const missing: string[] = [];\n if (!config.enabled) missing.push(\"enabled\");\n if (!config.controller_url) missing.push(\"controller_url\");\n if (!config.agent_id) missing.push(\"agent_id\");\n if (!config.agent_secret) missing.push(\"agent_secret\");\n if (missing.length) {\n console.warn(`[remote-agent] disabled \u2014 missing remote.json fields: ${missing.join(\", \")} (run \\`sfmc remote enroll\\`)`);\n }\n warnedMissingConfig = true;\n }\n return;\n }\n warnedMissingConfig = true;\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(websocketUrl(config.controller_url, config.agent_id));\n } catch (e) {\n resetReconnect(`failed to construct websocket: ${(e as Error).message}`);\n scheduleReconnect();\n return;\n }\n socket = ws;\n\n ws.on(\"open\", () => {\n retryDelay = 1000;\n lastError = \"\";\n void queryServicesRuntime().then((status) => {\n send({ type: \"hello\", agentId: config.agent_id, secret: config.agent_secret, status });\n startHeartbeat();\n });\n });\n ws.on(\"message\", (raw) => {\n let msg: { type?: string };\n try {\n msg = JSON.parse(raw.toString()) as { type?: string };\n } catch {\n return;\n }\n if (msg.type === \"ping\") {\n send({ type: \"pong\" });\n return;\n }\n if (msg.type !== \"task\") return;\n const task = msg as Task;\n void execute(task)\n .then((result) => send({ type: \"task_result\", taskId: task.taskId, ok: true, result }))\n .catch((error: Error) => send({ type: \"task_result\", taskId: task.taskId, ok: false, error: error.message }));\n });\n ws.on(\"close\", (code, reason) => {\n if (socket === ws) socket = null;\n stopHeartbeat();\n if (stopping) return;\n resetReconnect(`disconnected (code=${code} ${reason.toString() || \"no_reason\"})`);\n scheduleReconnect();\n });\n ws.on(\"error\", (e) => {\n resetReconnect(`socket error: ${e.message}`);\n /* close event will follow and trigger reconnect */\n });\n}\n\nexport async function enrollRemoteAgent(controllerUrl: string, enrollmentToken: string, name: string): Promise<string> {\n const response = await fetch(new URL(\"/v1/enroll\", controllerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", authorization: `Bearer ${enrollmentToken}` },\n body: JSON.stringify({ name }),\n });\n const result = (await response.json()) as { agentId?: string; agentSecret?: string; error?: string };\n if (!response.ok || !result.agentId || !result.agentSecret) throw new Error(result.error ?? \"enrollment failed\");\n\n writeConfig({ enabled: true, controller_url: controllerUrl, agent_id: result.agentId, agent_secret: result.agentSecret });\n return result.agentId;\n}\n\n/** Disable the remote agent: clear enabled flag and close the connection. */\nexport function disableRemoteAgent(): void {\n const config = loadConfig();\n if (config.agent_id || config.agent_secret) {\n writeConfig({ ...config, enabled: false });\n }\n stopRemoteAgent();\n stopping = false;\n}\n\nexport function remoteStatus(): RemoteStatus {\n const config = loadConfig();\n const result: RemoteStatus = { connected: socket?.readyState === WebSocket.OPEN };\n if (config.enabled !== undefined) result.enabled = config.enabled;\n if (config.controller_url) result.controller_url = config.controller_url;\n if (config.agent_id) result.agent_id = config.agent_id;\n if (lastError) {\n result.last_error = lastError;\n result.retry_in_ms = retryDelay;\n }\n return result;\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/repl.d.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  import { type CommandMode } from "./command-surface.js";
2
2
  export declare function playWelcomeAnimation(): Promise<void>;
3
3
  export declare function getHelp(mode?: CommandMode): string;
4
- /** @deprecated 请用 getHelp(mode);保留别名以兼容旧导入。 */
5
- export declare const HELP: string;
6
4
  /** 来源选择项:方括号 3 字符标签染色(供外部/测试复用) */
7
5
  export declare const SOURCE_ITEMS: Array<{
8
6
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAcA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgN9B,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D;AAcD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAE1D;AAED,+CAA+C;AAC/C,eAAO,MAAM,IAAI,EAOD,MAAM,CAAC;AA0fvB,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG9D,CAAC;AAmBJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkR/C"}
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAcA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgN9B,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D;AAcD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAE1D;AAofD,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG9D,CAAC;AAmBJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkR/C"}
package/dist/repl.js CHANGED
@@ -232,14 +232,6 @@ ${lines.join("\n")}
232
232
  function getHelp(mode = "argv") {
233
233
  return buildHelp(mode);
234
234
  }
235
- const HELP = {
236
- toString() {
237
- return getHelp("argv");
238
- },
239
- valueOf() {
240
- return getHelp("argv");
241
- }
242
- };
243
235
  function getCommands() {
244
236
  return listVisibleTopLevelNames(REPL_MODE);
245
237
  }
@@ -309,15 +301,9 @@ function getCompletions(parsed) {
309
301
  if (argIndex === 1 && verb === "reload") {
310
302
  return ["--build-only"].filter(sw);
311
303
  }
312
- if (argIndex === 1 && verb === "link") {
313
- return ["--from"].filter(sw);
314
- }
315
304
  if (argIndex >= 1 && verb === "install") {
316
305
  return ["--from", "--sha256", "--link"].filter(sw);
317
306
  }
318
- if (argIndex >= 2 && verb === "link") {
319
- return ["--from"].filter(sw);
320
- }
321
307
  if (argIndex >= 1 && verb === "list") {
322
308
  return ["--from", "--sha256"].filter(sw);
323
309
  }
@@ -989,14 +975,7 @@ async function execCmd(parts) {
989
975
  stdout.write(g + "\n");
990
976
  break;
991
977
  }
992
- const needsCooked = modShort === "create" || modShort === "dev";
993
- const wasRaw = stdin.isRaw ?? false;
994
- if (needsCooked) setRaw(false);
995
- try {
996
- stdout.write(await dispatchModuleCommand(modShort, args) + "\n");
997
- } finally {
998
- if (needsCooked) setRaw(wasRaw);
999
- }
978
+ stdout.write(await dispatchModuleCommand(modShort, args) + "\n");
1000
979
  break;
1001
980
  }
1002
981
  if (isModuleCommand(cmd)) {
@@ -1006,14 +985,7 @@ async function execCmd(parts) {
1006
985
  stdout.write(g + "\n");
1007
986
  break;
1008
987
  }
1009
- const needsCooked = sub === "create" || sub === "dev";
1010
- const wasRaw = stdin.isRaw ?? false;
1011
- if (needsCooked) setRaw(false);
1012
- try {
1013
- stdout.write(await dispatchModuleCommand(sub, subRest) + "\n");
1014
- } finally {
1015
- if (needsCooked) setRaw(wasRaw);
1016
- }
988
+ stdout.write(await dispatchModuleCommand(sub, subRest) + "\n");
1017
989
  break;
1018
990
  }
1019
991
  if (isPacksCommand(cmd)) {
@@ -1031,7 +1003,6 @@ async function execCmd(parts) {
1031
1003
  }
1032
1004
  }
1033
1005
  export {
1034
- HELP,
1035
1006
  SOURCE_ITEMS,
1036
1007
  getHelp,
1037
1008
  playWelcomeAnimation,
package/dist/repl.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/repl.ts"],
4
- "sourcesContent": ["import { pauseAllProgress, resumeAllProgress } from \"@sfmc-bds/sdk/logs\";\nimport chalk from \"chalk\";\nimport process, { stdin, stdout } from \"node:process\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport {\n activeNode,\n clampPaletteSelection,\n commitSelection,\n formatPaletteCascadeLines,\n paletteGhost,\n promptSlashColumn,\n resolvePaletteView,\n} from \"./command-palette.js\";\nimport {\n listVisiblePacksSubs,\n listVisibleTopLevelNames,\n resolveModuleTopShorthand,\n type CommandMode,\n} from \"./command-surface.js\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { cmdRemote } from \"./cmd-remote.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { getHelp as buildHelp } from \"./help-text.js\";\nimport { t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport {\n formatLog,\n getAllLogs,\n logPrefixWidth,\n onLog,\n readDiskLogs,\n SOURCE_META,\n wrapLogLine,\n type LogLevel,\n type UnifiedLog,\n} from \"./logs.js\";\nimport {\n dispatchModuleCommand,\n getVisibleModuleSubcommands,\n isModuleCommand,\n listInstalledModuleIdsSync,\n} from \"./module-commands.js\";\nimport { listRegistryModuleIdsSync } from \"./registry.js\";\nimport { stopRemoteAgent } from \"./remote-agent.js\";\nimport {\n createLogsFilterWindow,\n createServiceWindow,\n serviceWindowId,\n WindowHost,\n type LogsFilterState,\n type WindowChrome,\n type WindowKeyEvent,\n type WindowKeyResult,\n} from \"./repl-windows/index.js\";\nimport { listActiveSendTargets, paintSendPrompt, plainPrompt } from \"./send-target.js\";\nimport { forceStopAll, onServiceStateChange, SERVICE_NAMES, stopAll, type ServiceName } from \"./services.js\";\nimport { c, T } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst REPL_MODE: CommandMode = \"repl\";\n\nfunction getDisplayWidth(str: string) {\n // \u5148\u53BB\u9664 ANSI \u7801\n const plain = str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let width = 0;\n for (const ch of plain) {\n // \u7C97\u7565\u5224\u65AD\uFF1A\u975E ASCII \u5B57\u7B26\uFF08\u5982\u4E2D\u6587\uFF09\u89C6\u4E3A\u5360 2 \u5217\n if (ch.codePointAt(0)! > 127) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction charDisplayWidth(ch: string): number {\n return ch.codePointAt(0)! > 127 ? 2 : 1;\n}\n\nfunction setRaw(v: boolean): void {\n try {\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") stdin.setRawMode(v);\n } catch {}\n}\n\n/** \u5DE6\u4FA7 SFMC logo \u4E09\u884C\uFF08\u5E95\u884C\u542B\u63A5\u6A2A\u7EBF\u7684 \u2570\u2500\u2500\u2500\uFF0C\u4E0E\u6700\u7EC8\u5E03\u5C40\u4E00\u81F4\uFF09 */\nconst LOGO_ROWS = [\"\u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574\", \"\u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 \", \"\u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500\"] as const;\nconst LOGO_PAD = \" \";\nconst LOGO_TOP_GAP = \" \";\nconst LOGO_MID_GAP = \" \";\nconst SHORTCUT_HINT = ` / \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`;\n/** S\u2192F\u2192M\u2192C \u624B\u5199\u7B14\u987A\uFF08row, col\uFF09\uFF1B\u7A7A\u683C\u683C\u5728\u6784\u5EFA\u65F6\u8FC7\u6EE4 */\nconst LOGO_STROKE_RAW: ReadonlyArray<readonly [number, number]> = [\n // S\n [0, 1],\n [0, 2],\n [0, 0],\n [1, 0],\n [1, 1],\n [1, 2],\n [2, 2],\n [2, 1],\n [2, 0],\n // F\n [0, 3],\n [1, 3],\n [2, 3],\n [0, 4],\n [0, 5],\n [1, 4],\n // M\n [0, 6],\n [1, 6],\n [2, 6],\n [0, 7],\n [1, 7],\n [0, 8],\n [1, 8],\n [2, 8],\n // C\uFF08\u672B\u7B14\u843D\u5230 \u2570\u2500\u2500\u2500\uFF0C\u968F\u540E\u65E0\u7F1D\u63A5\u6A2A\u7EBF\u5EF6\u957F\uFF09\n [0, 10],\n [0, 11],\n [0, 9],\n [1, 9],\n [2, 9],\n [2, 10],\n [2, 11],\n [2, 12],\n];\nconst LOGO_STROKES = LOGO_STROKE_RAW.filter(([r, col]) => {\n const ch = LOGO_ROWS[r]?.[col];\n return ch !== undefined && ch !== \" \";\n});\n\n/** \u6B22\u8FCE\u6761\u7EAF\u6587\u672C\uFF08\u4E0E\u4E0B\u65B9\u6837\u5F0F\u5316 meta \u5185\u5BB9\u4E00\u81F4\uFF09 */\nconst metaPlain = `Scripts For Minecraft Server v${pkg.version}`;\n/** \u5F3A\u8C03\u9996\u5B57\u6BCD\u4E0B\u6807\uFF1AS / F / M / c */\nconst META_ACCENT_INDEX = new Set([0, 8, 12, 16]);\nconst metaUnlit = chalk.hex(T.subtle);\nconst meta = `${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}`;\nconst metaWidth = getDisplayWidth(metaPlain);\nconst lineLength = metaWidth + 5;\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE\u7EAF\u6587\u672C\uFF1BpaintLit \u51B3\u5B9A\u5DF2\u4EAE\u5B57\u7B26\u6837\u5F0F */\nfunction buildTextAtProgress(\n plain: string,\n litColumns: number,\n paintLit: (ch: string, index: number) => string\n): string {\n let cols = 0;\n let out = \"\";\n for (let i = 0; i < plain.length; i++) {\n const ch = plain[i]!;\n const w = charDisplayWidth(ch);\n if (cols + w <= litColumns) {\n out += paintLit(ch, i);\n } else {\n out += metaUnlit(ch);\n }\n cols += w;\n }\n return out;\n}\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE meta\uFF1A\u5DF2\u4EAE\u4FDD\u7559\u6700\u7EC8\u6837\u5F0F\uFF0C\u672A\u4EAE\u7528 subtle */\nfunction buildMetaAtProgress(litColumns: number): string {\n return buildTextAtProgress(metaPlain, litColumns, (ch, i) => (META_ACCENT_INDEX.has(i) ? c.text(ch) : c.dim(ch)));\n}\n\n/** \u5FEB\u6377\u952E\u63D0\u793A\u4E0E\u6A2A\u7EBF/meta \u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6 */\nfunction buildShortcutsAtProgress(litColumns: number): string {\n return buildTextAtProgress(SHORTCUT_HINT, litColumns, (ch) => c.dim(ch));\n}\n\n/** \u6309\u7B14\u987A\u8FDB\u5EA6\u6E32\u67D3 logo\uFF1B\u672A\u5199\u51FA\u7684\u58A8\u8FF9\u7528\u7A7A\u683C\u5360\u4F4D\uFF0C\u4FDD\u6301\u5E03\u5C40\u7A33\u5B9A */\nfunction buildLogoRows(strokeCount: number): [string, string, string] {\n const lit = new Set<string>();\n const n = Math.min(Math.max(0, strokeCount), LOGO_STROKES.length);\n for (let i = 0; i < n; i++) {\n const [r, col] = LOGO_STROKES[i]!;\n lit.add(`${r},${col}`);\n }\n return LOGO_ROWS.map((row, r) => {\n let out = \"\";\n for (let col = 0; col < row.length; col++) {\n const ch = row[col]!;\n if (ch === \" \") {\n out += \" \";\n } else if (lit.has(`${r},${col}`)) {\n out += c.text(ch);\n } else {\n out += \" \";\n }\n }\n return out;\n }) as [string, string, string];\n}\n\nfunction buildWelcomeLines(\n strokeCount: number,\n lineProgress: number,\n metaContent: string,\n shortcutContent: string\n): string[] {\n const [topLogo, midLogo, botLogo] = buildLogoRows(strokeCount);\n const line = \"\u2500\".repeat(Math.max(0, lineProgress));\n return [\n `\\n`,\n `${LOGO_PAD}${topLogo}${LOGO_TOP_GAP}${shortcutContent}`,\n `${LOGO_PAD}${midLogo}${LOGO_MID_GAP}${metaContent}`,\n `${LOGO_PAD}${botLogo}${line}`,\n ];\n}\n\n/** \u56DE\u5377\u91CD\u7ED8\uFF1A\u9996\u5E27\u76F4\u63A5\u5199\uFF0C\u4E4B\u540E\u5149\u6807\u4E0A\u79FB\u5E76\u9010\u884C ESC[2K \u6E05\u884C\u91CD\u5199 */\nfunction paintWelcomeLines(lines: string[], firstFrame: boolean): void {\n if (!firstFrame) {\n process.stdout.write(`\\x1b[${lines.length}A`);\n }\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\x1b[2K\\r${lines[i]}`);\n if (i < lines.length - 1) process.stdout.write(\"\\n\");\n }\n}\n\nexport async function playWelcomeAnimation(): Promise<void> {\n const strokeTotal = LOGO_STROKES.length;\n const totalSteps = strokeTotal + lineLength;\n const finalShortcuts = c.dim(SHORTCUT_HINT);\n\n // \u975E TTY\uFF1A\u76F4\u63A5\u8F93\u51FA\u6700\u7EC8\u5E27\uFF0C\u907F\u514D\u63A7\u5236\u5E8F\u5217\u6C61\u67D3\u7BA1\u9053\u8F93\u51FA\n if (!process.stdout.isTTY) {\n const lines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n process.stdout.write(`\\n${lines.join(\"\\n\")}\\n\\n`);\n return;\n }\n\n let step = 0;\n let firstFrame = true;\n\n process.stdout.write(\"\\x1b[?25l\");\n // \u5148\u7A7A\u4E00\u884C\uFF0C\u628A\u6B22\u8FCE\u5757\u4E0E\u4E0A\u65B9\u8F93\u51FA\u9694\u5F00\n process.stdout.write(\"\\n\");\n\n return new Promise((resolve) => {\n const done = (): void => {\n const finalLines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n paintWelcomeLines(finalLines, firstFrame);\n process.stdout.write(\"\\x1b[?25h\\n\\n\");\n resolve();\n };\n\n const tick = (): void => {\n const inLogo = step < strokeTotal;\n const strokeCount = Math.min(step + 1, strokeTotal);\n // \u53F3\u4FA7\u4E09\u884C\uFF08shortcut / meta / \u6A2A\u7EBF\uFF09\u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6\n const lineProgress = inLogo ? 0 : Math.min(step - strokeTotal + 1, lineLength);\n const metaContent = buildMetaAtProgress(Math.min(lineProgress, metaWidth));\n const shortcutContent = buildShortcutsAtProgress(lineProgress);\n const lines = buildWelcomeLines(strokeCount, lineProgress, metaContent, shortcutContent);\n paintWelcomeLines(lines, firstFrame);\n firstFrame = false;\n\n if (step >= totalSteps - 1) {\n done();\n return;\n }\n step += 1;\n // logo \u7B14\u987A\u7A0D\u6162\uFF1B\u63A5\u4E0A\u6A2A\u7EBF\u540E\u6062\u590D\u8F83\u5FEB\u8282\u594F\n setTimeout(tick, step < strokeTotal ? 22 : 5);\n };\n\n setTimeout(tick, 22);\n });\n}\n\n/* let welcome = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${meta}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\\n\n`; */\n\n/* welcome = `\\n\n \u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574 ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\n \u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 ${meta}\n \u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500${\"\u2500\".repeat(getDisplayWidth(meta) + 3)}\\n`; */\n\nexport function getHelp(mode: CommandMode = \"argv\"): string {\n return buildHelp(mode);\n}\n\n/** @deprecated \u8BF7\u7528 getHelp(mode)\uFF1B\u4FDD\u7559\u522B\u540D\u4EE5\u517C\u5BB9\u65E7\u5BFC\u5165\u3002 */\nexport const HELP = {\n toString() {\n return getHelp(\"argv\");\n },\n valueOf() {\n return getHelp(\"argv\");\n },\n} as unknown as string;\n\nfunction getCommands(): string[] {\n return listVisibleTopLevelNames(REPL_MODE);\n}\n\n/* ==================================================================\n * Context-aware completion\n * ================================================================== */\ninterface ParsedLine {\n cmd: string;\n /** cmd \u4E4B\u540E\u7684\u5168\u90E8 token(\u4E0D\u542B\u6B63\u5728\u8F93\u5165\u7684 current,\u82E5\u672B\u5C3E\u65E0\u7A7A\u683C\u5219\u4E0D\u542B\u6700\u540E\u4E00\u4E2A\u534A\u8BCD) */\n words: string[];\n argIndex: number;\n current: string;\n}\n\n/**\n * \u89E3\u6790\u5F53\u524D\u8F93\u5165\u884C,\u63D0\u53D6\u547D\u4EE4\u540D\u3001\u53C2\u6570\u4F4D\u7F6E\u3001\u6B63\u5728\u8F93\u5165\u7684 word\u3002\n * \u672B\u5C3E\u7A7A\u683C\u89C6\u4E3A\"\u521A\u7ED3\u675F\u4E00\u4E2A word,\u51C6\u5907\u8F93\u5165\u4E0B\u4E00\u4E2A\"\u3002\n */\nfunction parseLine(line: string): ParsedLine {\n const endsWithSpace = line.length > 0 && /\\s$/.test(line);\n const trimmed = line.trim();\n if (!trimmed) return { cmd: \"\", words: [], argIndex: 0, current: \"\" };\n const tokens = trimmed.split(/\\s+/);\n if (endsWithSpace) {\n return {\n cmd: tokens[0] ?? \"\",\n words: tokens.slice(1),\n argIndex: tokens.length - 1,\n current: \"\",\n };\n }\n if (tokens.length === 1) return { cmd: \"\", words: [], argIndex: 0, current: tokens[0]! };\n return {\n cmd: tokens[0]!,\n words: tokens.slice(1, -1),\n argIndex: tokens.length - 2,\n current: tokens[tokens.length - 1]!,\n };\n}\n\n/**\n * \u6839\u636E\u547D\u4EE4 + \u53C2\u6570\u4F4D\u7F6E\u8FD4\u56DE\u8865\u5168\u5019\u9009 (\u533A\u5206\u547D\u4EE4,\u4E0D\u518D\u628A\u670D\u52A1\u540D\u5F53\u6210\u6240\u6709\u6307\u4EE4\u7684\u4E8C\u7EA7\u53C2\u6570)\u3002\n */\nfunction getCompletions(parsed: ParsedLine): string[] {\n const { words, argIndex, current } = parsed;\n const cmd = parsed.cmd.startsWith(\"/\") ? parsed.cmd.slice(1) : parsed.cmd;\n const sw = (s: string): boolean => s.startsWith(current);\n if (!cmd) {\n const cmds = getCommands().map((n) => (n.startsWith(\"/\") ? n : n));\n return [\"/\", ...cmds].filter(sw);\n }\n switch (cmd) {\n case \"logs\":\n case \"log\":\n return [];\n case \"start\":\n case \"stop\":\n case \"restart\":\n if (argIndex === 0) return [\"-all\", ...SERVICE_NAMES].filter(sw);\n return [];\n case \"send\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n return [];\n case \"update\":\n return [\"--check-only\", \"--force\", \"--channel=release\", \"--channel=preview\"].filter(sw);\n case \"remote\":\n if (argIndex === 0) return [\"status\", \"enroll\", \"disable\"].filter(sw);\n return [];\n case \"packs\":\n case \"addon\":\n if (argIndex === 0) return [...listVisiblePacksSubs(REPL_MODE)].filter(sw);\n if (argIndex === 1 && [\"list\"].includes(words[0] ?? \"\")) {\n return [\"--kind\", \"--search\"].filter(sw);\n }\n return [];\n default: {\n if (!isModuleCommand(cmd)) return [];\n if (argIndex === 0) return [...getVisibleModuleSubcommands(REPL_MODE)].filter(sw);\n const verb = words[0] ?? \"\";\n if (argIndex === 1 && verb === \"search\") {\n return listRegistryModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && [\"info\", \"uninstall\", \"remove\", \"verify\", \"enable\", \"disable\"].includes(verb)) {\n return listInstalledModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && verb === \"reload\") {\n return [\"--build-only\"].filter(sw);\n }\n if (argIndex === 1 && verb === \"link\") {\n return [\"--from\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"install\") {\n return [\"--from\", \"--sha256\", \"--link\"].filter(sw);\n }\n if (argIndex >= 2 && verb === \"link\") {\n return [\"--from\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"list\") {\n return [\"--from\", \"--sha256\"].filter(sw);\n }\n return [];\n }\n }\n}\n\n/* ==================================================================\n * Escape sequence consumer\n * ================================================================== */\nfunction consumeEscapeSeq(chunk: Buffer, i: number): number | null {\n if (chunk[i] !== 0x1b) return null;\n const rem = chunk.length - i - 1;\n if (rem >= 2 && chunk[i + 1] === 0x5b) {\n let j = i + 2;\n while (j < chunk.length && chunk[j]! >= 0x30 && chunk[j]! <= 0x3f) j++;\n while (j < chunk.length && chunk[j]! >= 0x20 && chunk[j]! <= 0x2f) j++;\n if (j < chunk.length && chunk[j]! >= 0x40 && chunk[j]! <= 0x7e) j++;\n return j;\n }\n if (rem >= 2 && chunk[i + 1] === 0x4f) return i + 3;\n if (rem >= 1) return i + 2;\n return i + 1;\n}\n\n/* ==================================================================\n * Line reader\n * ================================================================== */\nconst history: string[] = [];\nlet historyIdx = -1;\n\n/** \u5F53\u524D readLine \u7684\u91CD\u7ED8\u51FD\u6570 (\u7A97\u53E3 resize / \u65E5\u5FD7\u63A8\u9001\u65F6\u8C03\u7528) */\nlet currentRedraw: (() => void) | null = null;\n\ntype ReadLineOpts = {\n getPrompt: () => string;\n /** \u65E0\u6D3B\u8DC3\u670D\u52A1\u65F6\uFF0C\u666E\u901A\u5B57\u7B26\u81EA\u52A8\u524D\u7F6E /\uFF1B\u53EF\u4E3A getter \u4EE5\u4FBF\u670D\u52A1\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: boolean | (() => boolean);\n /** Tab\uFF1A\u5728\u975E / \u884C\u4E0A\u5207\u6362\u53D1\u9001\u76EE\u6807\uFF1B\u8FD4\u56DE true \u8868\u793A\u5DF2\u5904\u7406 */\n cycleSendTarget: () => boolean;\n /** \u5F53\u524D\u7A97\u53E3 chrome\uFF08\u65E0\u8F93\u5165\u7A97\u753B shortcut \u6761\uFF09 */\n getChrome?: () => WindowChrome;\n /** \u4EA4\u7ED9\u6D3B\u52A8\u7A97\u7684\u6309\u952E\uFF08Esc / L / S \u7B49\uFF09 */\n onWindowKey?: (ev: WindowKeyEvent) => WindowKeyResult;\n initial?: string;\n};\n\ntype ReadLineResult =\n | { kind: \"line\"; value: string }\n | { kind: \"cancel\" }\n | { kind: \"open-logs\"; pending: string }\n | { kind: \"run\"; parts: string[] };\n\nasync function readLine(opts: ReadLineOpts): Promise<ReadLineResult> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n\n let line = opts.initial ?? \"\";\n let cursor = line.length;\n let suggestion = \"\";\n /** \u5404\u7EA7\u5217\u9009\u4E2D / \u6EDA\u52A8\uFF08\u4EC5\u6700\u53F3\u5217\u53EF\u5BFC\u822A\uFF09 */\n let palSels: number[] = [0];\n let palScrolls: number[] = [0];\n let overlayRows = 0;\n\n function prompt(): string {\n return opts.getPrompt();\n }\n\n function showsInput(): boolean {\n return opts.getChrome?.().showsInput !== false;\n }\n\n function slashMode(): boolean {\n return showsInput() && line.startsWith(\"/\");\n }\n\n function paletteView() {\n return resolvePaletteView(line, palSels, palScrolls);\n }\n\n function syncPaletteState(view: ReturnType<typeof resolvePaletteView>): void {\n for (let i = 0; i < view.columns.length; i++) {\n palSels[i] = view.columns[i]!.selected;\n palScrolls[i] = view.columns[i]!.scroll;\n }\n }\n\n function resetPalette(): void {\n palSels = [0];\n palScrolls = [0];\n }\n\n function clearOverlay(): void {\n stdout.write(\"\\r\\x1B[J\");\n overlayRows = 0;\n }\n\n function applyWindowKey(ev: WindowKeyEvent): boolean {\n if (!opts.onWindowKey) return false;\n const r = opts.onWindowKey(ev);\n if (r.action === \"none\") return false;\n if (r.action === \"redraw\") redraw();\n return true;\n }\n\n function redraw(): void {\n const chrome = opts.getChrome?.();\n if (chrome && !chrome.showsInput) {\n clearOverlay();\n const foot = chrome.footerShortcuts || \"\";\n stdout.write(foot);\n stdout.write(\"\\r\");\n return;\n }\n\n const p = prompt();\n suggestion = \"\";\n\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (cursor === line.length) {\n suggestion = paletteGhost(view);\n }\n } else {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n const first = candidates[0];\n if (\n cursor === line.length &&\n parsed.current &&\n first &&\n first !== parsed.current &&\n first.startsWith(parsed.current)\n ) {\n suggestion = first.slice(parsed.current.length);\n }\n }\n\n clearOverlay();\n stdout.write(p + line);\n if (suggestion) stdout.write(c.dim(suggestion));\n\n if (slashMode()) {\n const view = paletteView();\n const indent = promptSlashColumn(p);\n const list = formatPaletteCascadeLines(view, indent);\n if (list.length > 0) {\n stdout.write(\"\\n\" + list.join(\"\\n\"));\n overlayRows = list.length;\n stdout.write(`\\x1B[${overlayRows}A`);\n }\n }\n\n const col = promptSlashColumn(p) + cursor + 1;\n stdout.write(`\\r\\x1B[${col}G`);\n }\n\n redraw();\n currentRedraw = redraw;\n\n return new Promise<ReadLineResult>((resolve) => {\n const done = (value: ReadLineResult): void => {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n currentRedraw = null;\n resolve(value);\n };\n\n const finishLine = (value: string): void => {\n clearOverlay();\n stdout.write(prompt() + value + \"\\r\\n\");\n if (value.length > 0) {\n history.push(value);\n if (history.length > 100) history.shift();\n }\n historyIdx = history.length;\n done({ kind: \"line\", value });\n };\n\n /** \u2191\u2193/Tab\uFF1A\u4EC5\u5728\u6700\u53F3\u5217\u8F6E\u6362\u9009\u4E2D\uFF0C\u5199\u5165\u7070\u5B57\uFF0C\u4E0D\u6539\u8F93\u5165\u6846 */\n const movePalSel = (delta: number): boolean => {\n const view = paletteView();\n if (view.hidden) return false;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return false;\n const len = col.items.length;\n const cur = clampPaletteSelection(col.selected, len);\n const next = (((cur + delta) % len) + len) % len;\n palSels[view.active] = next;\n redraw();\n return true;\n };\n\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const len = next - i;\n /* \u5355\u72EC Esc \u2192 \u4EA4\u7ED9\u7A97\u53E3\uFF08/logs \u8FD4\u56DE\uFF09 */\n if (len === 1) {\n if (applyWindowKey({ type: \"escape\" })) {\n i = next;\n continue;\n }\n i = next;\n continue;\n }\n if (!showsInput()) {\n i = next;\n continue;\n }\n if (len === 3 && chunk[i + 1] === 0x5b) {\n const fin = chunk[i + 2];\n if (fin === 0x41) {\n /* \u2191 */\n if (slashMode() && movePalSel(-1)) {\n i = next;\n continue;\n }\n if (historyIdx > 0) {\n historyIdx--;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x42) {\n /* \u2193 */\n if (slashMode() && movePalSel(1)) {\n i = next;\n continue;\n }\n if (historyIdx < history.length - 1) {\n historyIdx++;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n } else if (historyIdx === history.length - 1) {\n historyIdx = history.length;\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x43) {\n /* \u2192\uFF1A\u63A5\u53D7\u7070\u5B57\u6216\u79FB\u5149\u6807\uFF08\u4E0D\u5207\u6362\u9762\u677F\u7126\u70B9\uFF09 */\n if (cursor < line.length) {\n cursor++;\n redraw();\n } else if (suggestion) {\n line += suggestion;\n cursor = line.length;\n redraw();\n }\n } else if (fin === 0x44) {\n if (cursor > 0) {\n cursor--;\n redraw();\n }\n } else if (fin === 0x48) {\n cursor = 0;\n redraw();\n } else if (fin === 0x46) {\n cursor = line.length;\n redraw();\n }\n }\n i = next;\n } else i++;\n continue;\n }\n\n const byte = chunk[i]!;\n i++;\n\n if (byte === 0x0d || byte === 0x0a) {\n if (!showsInput()) continue;\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (!view.hidden && view.columns.some((col) => col.items.length > 0) && activeNode(view)) {\n const acc = commitSelection(line, view);\n if (acc.submit) {\n finishLine(acc.line);\n return;\n }\n line = acc.line;\n cursor = line.length;\n /* \u65B0\u5C42\u9009\u4E2D\u5F52\u96F6 */\n const depth = Math.max(0, acc.line.trimEnd().split(/\\s+/).length - 1);\n while (palSels.length <= depth + 1) palSels.push(0);\n while (palScrolls.length <= depth + 1) palScrolls.push(0);\n palSels[depth + 1] = 0;\n palScrolls[depth + 1] = 0;\n redraw();\n continue;\n }\n }\n finishLine(line);\n return;\n }\n\n if (byte === 0x03) {\n if (!showsInput()) {\n /* \u65E0\u8F93\u5165\u7A97\uFF1ACtrl+C \u8FD4\u56DE\u4E0A\u4E00\u7A97\uFF0C\u518D\u6309\u624D\u9000\u51FA */\n if (applyWindowKey({ type: \"escape\" })) continue;\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n if (line.length > 0) {\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n continue;\n }\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n\n /* Ctrl+P \u2014 \u786E\u4FDD\u4EE5 / \u5F00\u5934 */\n if (byte === 0x10) {\n if (!showsInput()) continue;\n if (!line.startsWith(\"/\")) {\n line = \"/\" + line;\n cursor = Math.min(cursor + 1, line.length);\n }\n resetPalette();\n redraw();\n continue;\n }\n\n if (byte === 0x09) {\n /* Tab\uFF1A/ \u6A21\u5F0F = \u5217\u8868\u8F6E\u6362\uFF1B\u5426\u5219\u5207\u6362\u670D\u52A1\u7A97 */\n if (slashMode()) {\n movePalSel(1);\n continue;\n }\n if (opts.cycleSendTarget()) {\n redraw();\n continue;\n }\n continue;\n }\n\n if (byte === 0x0c) {\n /* Ctrl+L \u2192 \u6253\u5F00 /logs \u7B5B\u9009\u7A97 */\n clearOverlay();\n done({ kind: \"open-logs\", pending: showsInput() ? line : \"\" });\n return;\n }\n\n if (byte === 0x7f || byte === 0x08) {\n if (!showsInput()) continue;\n if (cursor > 0) {\n line = line.slice(0, cursor - 1) + line.slice(cursor);\n cursor--;\n }\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n\n if (byte >= 0x20 && byte <= 0x7e) {\n const ch = String.fromCharCode(byte);\n if (!showsInput()) {\n applyWindowKey({ type: \"char\", ch });\n continue;\n }\n let insert = ch;\n const autoSlash =\n typeof opts.autoSlash === \"function\" ? opts.autoSlash() : opts.autoSlash;\n if (autoSlash && line.length === 0 && insert !== \"/\") {\n insert = \"/\" + insert;\n }\n line = line.slice(0, cursor) + insert + line.slice(cursor);\n cursor += insert.length;\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n }\n };\n stdin.on(\"data\", handler);\n });\n}\n\n/** \u6765\u6E90\u9009\u62E9\u9879:\u65B9\u62EC\u53F7 3 \u5B57\u7B26\u6807\u7B7E\u67D3\u8272\uFF08\u4F9B\u5916\u90E8/\u6D4B\u8BD5\u590D\u7528\uFF09 */\nexport const SOURCE_ITEMS: Array<{ label: string; value: string }> = SOURCE_META.map((m) => ({\n label: m.paint(`[${m.name}]`),\n value: m.value,\n}));\n\n/** REPL \u4EA4\u4E92\u6001\uFF1A\u65E0\u53C2 /logs \u6253\u5F00\u7B5B\u9009\u7A97\uFF08\u7531 startRepl \u6CE8\u5165\uFF09 */\nlet openLogsWindowHook: (() => void) | null = null;\n\nfunction writeLogLineToTty(wrapped: string): void {\n pauseAllProgress();\n try {\n stdout.write(`\\r\\x1B[K${wrapped}\\n`);\n } finally {\n resumeAllProgress();\n }\n currentRedraw?.();\n}\n\n/* ==================================================================\n * START REPL\n * ================================================================== */\n\nexport async function startRepl(): Promise<void> {\n let stopping = false;\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.forceStop\") + \"\\n\"));\n forceStopAll();\n stopRemoteAgent();\n process.exit(130);\n };\n const shutdown = async (): Promise<void> => {\n if (stopping) return;\n stopping = true;\n process.off(\"SIGINT\", onSigint);\n openLogsWindowHook = null;\n stdout.write(c.dim(t(\"repl.stopping\") + \"\\n\"));\n await stopAll();\n stopRemoteAgent();\n try {\n setRaw(false);\n stdin.pause();\n } catch {\n /* ignore */\n }\n stdout.write(c.dim(t(\"repl.bye\") + \"\\n\"));\n process.exit(0);\n };\n process.on(\"SIGINT\", onSigint);\n\n if (!stdin.isTTY) {\n console.log(c.dim(t(\"repl.nonInteractive\")));\n for await (const line of (await import(\"node:readline/promises\")).createInterface({\n input: stdin,\n output: stdout,\n terminal: false,\n })) {\n const t = line.trim();\n if (!t) continue;\n const p = t.split(/\\s+/);\n if ([\"quit\", \"exit\", \"q\"].includes(p[0]!)) break;\n if (p[0] === \"init\") {\n (await import(\"./wizard.js\")).runWizard();\n continue;\n }\n await execCmd(p);\n }\n await shutdown();\n return;\n }\n console.clear();\n await playWelcomeAnimation();\n\n let logsFilterState: LogsFilterState = { levels: [], sources: [] };\n let preferredTarget: ServiceName | null = null;\n let activeTargets: ServiceName[] = [];\n let pendingInput = \"\";\n\n const host = new WindowHost({\n writeLog: writeLogLineToTty,\n onChromeChange: () => currentRedraw?.(),\n });\n\n function clearTerminal(): void {\n /* \u6E05\u89C6\u53E3\uFF1B\u518D\u6E05 scrollback\uFF0C\u907F\u514D\u5F80\u4E0A\u6ED1\u4ECD\u770B\u5230\u4E0A\u4E00\u7A97\u5185\u5BB9 */\n console.clear();\n stdout.write(\"\\x1B[3J\");\n }\n\n /** \u9996\u6B21\u8FDB\u5165\u7A97\u53E3\uFF1A\u4ECE\u5185\u5B58/\u843D\u76D8\u62C9\u4E00\u6B21\u4F5C\u4E3A\u79CD\u5B50\u7F13\u5B58 */\n function seedWindowBuffer(w: {\n id: string;\n acceptLog: (l: UnifiedLog) => boolean;\n formatLogLine: (l: UnifiedLog) => { text: string; indent: number };\n getReplayFilter?: () => { levels: string[]; sources: string[] };\n }): string[] {\n const lines: string[] = [];\n if (w.id === \"logs\") {\n const f = w.getReplayFilter?.() ?? { levels: [], sources: [] };\n const disk = readDiskLogs({\n levels: f.levels as LogLevel[],\n sources: f.sources,\n });\n for (const log of disk) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n } else {\n for (const log of getAllLogs()) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n }\n host.setBuffer(w.id, lines);\n return lines;\n }\n\n /**\n * \u5C55\u793A\u6D3B\u52A8\u7A97\uFF1A\u5148\u6E05\u5C4F\uFF0C\u518D\u6062\u590D/seed\u3002\n * - /logs\uFF1A\u7528\u843D\u76D8\u79CD\u5B50\u7F13\u5B58\uFF08\u6539\u7B5B\u9009\u624D reseed\uFF09\uFF0C\u907F\u514D\u91CD\u590D\u8BFB\u6587\u4EF6\n * - \u670D\u52A1\u4E3B\u9762\u677F\uFF1A\u6BCF\u6B21\u4ECE\u5185\u5B58\u91CD seed\uFF0C\u4FDD\u8BC1\u79BB\u5F00 /logs \u6216 Tab \u56DE\u6765\u65F6\u5185\u5BB9\u5B9E\u65F6\n */\n function showActiveWindow(opts?: { reseed?: boolean }): void {\n clearTerminal();\n const w = host.getActive();\n if (!w) {\n currentRedraw?.();\n return;\n }\n let lines: readonly string[];\n if (w.id === \"logs\") {\n if (opts?.reseed) host.invalidateBuffer(w.id);\n lines = host.hasBuffer(w.id) ? host.getBuffer(w.id) : seedWindowBuffer(w);\n } else {\n /* \u4E3B\u9762\u677F\u5B9E\u65F6\uFF1A\u4E0D\u4F5C\u5E9F\u4E5F\u65E0\u59A8\uFF0C\u76F4\u63A5\u91CD\u62C9\u5185\u5B58\u7F13\u51B2 */\n host.invalidateBuffer(w.id);\n lines = seedWindowBuffer(w);\n }\n for (const l of lines) stdout.write(l + \"\\n\");\n currentRedraw?.();\n }\n\n host.register(\n createLogsFilterWindow({\n getState: () => logsFilterState,\n setState: (next) => {\n logsFilterState = next;\n },\n /* \u7B5B\u9009\u53D8\u66F4\uFF1A\u4F5C\u5E9F /logs \u7F13\u5B58\u5E76\u91CD\u65B0\u8BFB\u76D8\u4E00\u6B21 */\n onFilterChanged: () => showActiveWindow({ reseed: true }),\n })\n );\n\n function syncServiceWindows(targets: ServiceName[]): void {\n for (const name of targets) {\n const id = serviceWindowId(name);\n if (!host.has(id)) host.register(createServiceWindow(name));\n }\n host.setServiceOrder(targets.map(serviceWindowId));\n const svc = host.getActive()?.serviceName;\n if (svc) preferredTarget = svc;\n }\n\n function openLogsWindow(): void {\n /* \u79BB\u5F00\u4E3B\u9762\u677F\uFF1A\u5176\u7F13\u5B58\u53EF\u7559\u7740\uFF0C\u4F46\u5C55\u793A\u4E0A\u5148\u6E05\u5C4F\u518D\u8FDB /logs\uFF1BEsc \u56DE\u6765\u4F1A\u6309\u5B9E\u65F6\u91CD seed \u4E3B\u9762\u677F */\n host.open(\"logs\");\n showActiveWindow();\n }\n\n openLogsWindowHook = openLogsWindow;\n\n const unsub = onLog((log) => {\n if (host.getActive()) {\n host.routeLog(log);\n return;\n }\n /* \u65E0\u6D3B\u52A8\u7A97\uFF1A\u5168\u91CF\u5C55\u793A\uFF08\u5E26\u6E90\u6807\u7B7E\uFF09\uFF0C\u4E0E\u65E7\u7A7A\u95F2\u884C\u4E3A\u4E00\u81F4 */\n writeLogLineToTty(wrapLogLine(formatLog(log), logPrefixWidth(log)));\n });\n\n async function refreshTargetsFromRuntime(): Promise<void> {\n const prevId = host.getActiveId();\n activeTargets = await listActiveSendTargets();\n syncServiceWindows(activeTargets);\n if (preferredTarget && !activeTargets.includes(preferredTarget)) {\n preferredTarget = activeTargets[0] ?? null;\n }\n const nextId = host.getActiveId();\n /* \u65B0\u6FC0\u6D3B\u7A97\u6216\u9996\u6B21\u5C1A\u65E0\u7F13\u5B58\uFF1A\u6E05\u5C4F\u5E76 seed/\u6062\u590D */\n if (nextId && (nextId !== prevId || !host.hasBuffer(nextId))) {\n showActiveWindow();\n } else if (!nextId && prevId) {\n clearTerminal();\n currentRedraw?.();\n } else {\n currentRedraw?.();\n }\n }\n\n const unsubState = onServiceStateChange(() => {\n void refreshTargetsFromRuntime();\n });\n\n function onResize(): void {\n if (!currentRedraw) return;\n const id = host.getActiveId();\n if (id) host.invalidateBuffer(id);\n showActiveWindow();\n }\n\n process.stdout.on(\"resize\", onResize);\n\n function currentTarget(): ServiceName | null {\n if (activeTargets.length === 0) return null;\n const fromWin = host.getActive()?.serviceName;\n if (fromWin && activeTargets.includes(fromWin)) {\n preferredTarget = fromWin;\n return fromWin;\n }\n if (preferredTarget && activeTargets.includes(preferredTarget)) return preferredTarget;\n preferredTarget = activeTargets[0]!;\n return preferredTarget;\n }\n\n function buildPrompt(): string {\n const tgt = currentTarget();\n return tgt ? paintSendPrompt(tgt) : plainPrompt();\n }\n\n while (true) {\n await refreshTargetsFromRuntime();\n const result = await readLine({\n getPrompt: buildPrompt,\n /* \u65E0\u670D\u52A1\u65F6\u9ED8\u8BA4\u52A0 /\uFF08\u4E0E\u7A97\u53E3\u7CFB\u7EDF\u524D\u884C\u4E3A\u4E00\u81F4\uFF09\uFF1B\u7528 getter \u4EE5\u4FBF\u8FDB\u7A0B\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: () => activeTargets.length === 0,\n getChrome: () => host.getChrome(),\n onWindowKey: (ev) => {\n const r = host.onKey(ev);\n if (r.action === \"redraw\") showActiveWindow();\n return r;\n },\n cycleSendTarget: () => {\n const name = host.cycleServiceWindows();\n if (!name) return false;\n preferredTarget = name;\n showActiveWindow();\n return true;\n },\n initial: pendingInput,\n });\n pendingInput = \"\";\n\n if (result.kind === \"cancel\") break;\n\n if (result.kind === \"open-logs\") {\n pendingInput = result.pending;\n openLogsWindow();\n continue;\n }\n\n if (result.kind === \"run\") {\n try {\n await execCmd(result.parts);\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n continue;\n }\n\n const trimmed = result.value.trim();\n if (!trimmed) continue;\n\n try {\n if (trimmed.startsWith(\"/\")) {\n await execCmd(trimmed.split(/\\s+/));\n } else {\n const tgt = currentTarget();\n if (!tgt) {\n await execCmd((\"/\" + trimmed).split(/\\s+/));\n } else {\n const sent = await cmdSend(tgt, trimmed);\n if (sent) stdout.write(sent + \"\\n\");\n }\n }\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n }\n\n process.stdout.off(\"resize\", onResize);\n unsubState();\n unsub();\n await shutdown();\n}\n\nasync function execCmd(parts: string[]): Promise<void> {\n const normalized = parts.map((p, i) => (i === 0 && p.startsWith(\"/\") ? p.slice(1) : p));\n const [cmd, ...args] = normalized;\n\n if (cmd && ![\"help\", \"h\", \"?\", \"version\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, REPL_MODE);\n if (topGate) {\n stdout.write(topGate + \"\\n\");\n return;\n }\n }\n\n switch (cmd) {\n case \"help\":\n case \"h\":\n case \"?\":\n stdout.write(getHelp(REPL_MODE));\n break;\n case \"version\":\n await playWelcomeAnimation();\n break;\n case \"status\":\n stdout.write((await cmdStatus()) + \"\\n\");\n break;\n case \"logs\":\n case \"log\": {\n /* \u65E0\u53C2\u53F6\u547D\u4EE4\uFF1A\u6253\u5F00\u7B5B\u9009\u7A97 */\n if (openLogsWindowHook) {\n openLogsWindowHook();\n break;\n }\n stdout.write(c.yellow(t(\"repl.logsReplOnly\") + \"\\n\"));\n break;\n }\n case \"start\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStartAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.start.usageShort\") + \"\\n\"));\n break;\n case \"stop\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStopAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStop(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.stop.usageShort\") + \"\\n\"));\n break;\n case \"restart\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") {\n await cmdStopAll();\n stdout.write((await cmdStartAll()) + \"\\n\");\n } else if (args[0]) stdout.write((await cmdRestart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.restart.usageShort\") + \"\\n\"));\n break;\n case \"send\": {\n const svc = args[0] ?? \"\";\n const msg = args.slice(1).join(\" \");\n {\n const sent = await cmdSend(svc, msg);\n if (sent) stdout.write(sent + \"\\n\");\n }\n break;\n }\n case \"update\":\n stdout.write((await cmdUpdate(args)) + \"\\n\");\n break;\n case \"locale\":\n case \"lang\":\n stdout.write(cmdLocale(args) + \"\\n\");\n break;\n case \"debug\":\n stdout.write((await cmdDebug(args)) + \"\\n\");\n break;\n case \"remote\":\n stdout.write((await cmdRemote(args, { daemonAfterEnroll: false })) + \"\\n\");\n break;\n case \"init\": {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(false);\n try {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n } finally {\n setRaw(wasRaw);\n }\n break;\n }\n case \"quit\":\n case \"exit\":\n case \"q\":\n throw \"QUIT\";\n default: {\n const modShort = resolveModuleTopShorthand(cmd);\n if (modShort) {\n const g = gateModuleSub(modShort, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n /* create/dev \u7B49\u4EA4\u4E92\u5411\u5BFC\u9700\u6682\u65F6\u9000\u51FA raw */\n const needsCooked = modShort === \"create\" || modShort === \"dev\";\n const wasRaw = stdin.isRaw ?? false;\n if (needsCooked) setRaw(false);\n try {\n stdout.write((await dispatchModuleCommand(modShort, args)) + \"\\n\");\n } finally {\n if (needsCooked) setRaw(wasRaw);\n }\n break;\n }\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gateModuleSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n const needsCooked = sub === \"create\" || sub === \"dev\";\n const wasRaw = stdin.isRaw ?? false;\n if (needsCooked) setRaw(false);\n try {\n stdout.write((await dispatchModuleCommand(sub, subRest)) + \"\\n\");\n } finally {\n if (needsCooked) setRaw(wasRaw);\n }\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gatePacksSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchPacksCommand(sub, subRest)) + \"\\n\");\n break;\n }\n stdout.write(c.yellow(t(\"common.unknownShort\", { cmd: cmd ?? \"\" }) + \"\\n\"));\n }\n }\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { pauseAllProgress, resumeAllProgress } from \"@sfmc-bds/sdk/logs\";\nimport chalk from \"chalk\";\nimport process, { stdin, stdout } from \"node:process\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport {\n activeNode,\n clampPaletteSelection,\n commitSelection,\n formatPaletteCascadeLines,\n paletteGhost,\n promptSlashColumn,\n resolvePaletteView,\n} from \"./command-palette.js\";\nimport {\n listVisiblePacksSubs,\n listVisibleTopLevelNames,\n resolveModuleTopShorthand,\n type CommandMode,\n} from \"./command-surface.js\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { cmdRemote } from \"./cmd-remote.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { getHelp as buildHelp } from \"./help-text.js\";\nimport { t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport {\n formatLog,\n getAllLogs,\n logPrefixWidth,\n onLog,\n readDiskLogs,\n SOURCE_META,\n wrapLogLine,\n type LogLevel,\n type UnifiedLog,\n} from \"./logs.js\";\nimport {\n dispatchModuleCommand,\n getVisibleModuleSubcommands,\n isModuleCommand,\n listInstalledModuleIdsSync,\n} from \"./module-commands.js\";\nimport { listRegistryModuleIdsSync } from \"./registry.js\";\nimport { stopRemoteAgent } from \"./remote-agent.js\";\nimport {\n createLogsFilterWindow,\n createServiceWindow,\n serviceWindowId,\n WindowHost,\n type LogsFilterState,\n type WindowChrome,\n type WindowKeyEvent,\n type WindowKeyResult,\n} from \"./repl-windows/index.js\";\nimport { listActiveSendTargets, paintSendPrompt, plainPrompt } from \"./send-target.js\";\nimport { forceStopAll, onServiceStateChange, SERVICE_NAMES, stopAll, type ServiceName } from \"./services.js\";\nimport { c, T } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst REPL_MODE: CommandMode = \"repl\";\n\nfunction getDisplayWidth(str: string) {\n // \u5148\u53BB\u9664 ANSI \u7801\n const plain = str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let width = 0;\n for (const ch of plain) {\n // \u7C97\u7565\u5224\u65AD\uFF1A\u975E ASCII \u5B57\u7B26\uFF08\u5982\u4E2D\u6587\uFF09\u89C6\u4E3A\u5360 2 \u5217\n if (ch.codePointAt(0)! > 127) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction charDisplayWidth(ch: string): number {\n return ch.codePointAt(0)! > 127 ? 2 : 1;\n}\n\nfunction setRaw(v: boolean): void {\n try {\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") stdin.setRawMode(v);\n } catch {}\n}\n\n/** \u5DE6\u4FA7 SFMC logo \u4E09\u884C\uFF08\u5E95\u884C\u542B\u63A5\u6A2A\u7EBF\u7684 \u2570\u2500\u2500\u2500\uFF0C\u4E0E\u6700\u7EC8\u5E03\u5C40\u4E00\u81F4\uFF09 */\nconst LOGO_ROWS = [\"\u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574\", \"\u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 \", \"\u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500\"] as const;\nconst LOGO_PAD = \" \";\nconst LOGO_TOP_GAP = \" \";\nconst LOGO_MID_GAP = \" \";\nconst SHORTCUT_HINT = ` / \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`;\n/** S\u2192F\u2192M\u2192C \u624B\u5199\u7B14\u987A\uFF08row, col\uFF09\uFF1B\u7A7A\u683C\u683C\u5728\u6784\u5EFA\u65F6\u8FC7\u6EE4 */\nconst LOGO_STROKE_RAW: ReadonlyArray<readonly [number, number]> = [\n // S\n [0, 1],\n [0, 2],\n [0, 0],\n [1, 0],\n [1, 1],\n [1, 2],\n [2, 2],\n [2, 1],\n [2, 0],\n // F\n [0, 3],\n [1, 3],\n [2, 3],\n [0, 4],\n [0, 5],\n [1, 4],\n // M\n [0, 6],\n [1, 6],\n [2, 6],\n [0, 7],\n [1, 7],\n [0, 8],\n [1, 8],\n [2, 8],\n // C\uFF08\u672B\u7B14\u843D\u5230 \u2570\u2500\u2500\u2500\uFF0C\u968F\u540E\u65E0\u7F1D\u63A5\u6A2A\u7EBF\u5EF6\u957F\uFF09\n [0, 10],\n [0, 11],\n [0, 9],\n [1, 9],\n [2, 9],\n [2, 10],\n [2, 11],\n [2, 12],\n];\nconst LOGO_STROKES = LOGO_STROKE_RAW.filter(([r, col]) => {\n const ch = LOGO_ROWS[r]?.[col];\n return ch !== undefined && ch !== \" \";\n});\n\n/** \u6B22\u8FCE\u6761\u7EAF\u6587\u672C\uFF08\u4E0E\u4E0B\u65B9\u6837\u5F0F\u5316 meta \u5185\u5BB9\u4E00\u81F4\uFF09 */\nconst metaPlain = `Scripts For Minecraft Server v${pkg.version}`;\n/** \u5F3A\u8C03\u9996\u5B57\u6BCD\u4E0B\u6807\uFF1AS / F / M / c */\nconst META_ACCENT_INDEX = new Set([0, 8, 12, 16]);\nconst metaUnlit = chalk.hex(T.subtle);\nconst meta = `${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}`;\nconst metaWidth = getDisplayWidth(metaPlain);\nconst lineLength = metaWidth + 5;\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE\u7EAF\u6587\u672C\uFF1BpaintLit \u51B3\u5B9A\u5DF2\u4EAE\u5B57\u7B26\u6837\u5F0F */\nfunction buildTextAtProgress(\n plain: string,\n litColumns: number,\n paintLit: (ch: string, index: number) => string\n): string {\n let cols = 0;\n let out = \"\";\n for (let i = 0; i < plain.length; i++) {\n const ch = plain[i]!;\n const w = charDisplayWidth(ch);\n if (cols + w <= litColumns) {\n out += paintLit(ch, i);\n } else {\n out += metaUnlit(ch);\n }\n cols += w;\n }\n return out;\n}\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE meta\uFF1A\u5DF2\u4EAE\u4FDD\u7559\u6700\u7EC8\u6837\u5F0F\uFF0C\u672A\u4EAE\u7528 subtle */\nfunction buildMetaAtProgress(litColumns: number): string {\n return buildTextAtProgress(metaPlain, litColumns, (ch, i) => (META_ACCENT_INDEX.has(i) ? c.text(ch) : c.dim(ch)));\n}\n\n/** \u5FEB\u6377\u952E\u63D0\u793A\u4E0E\u6A2A\u7EBF/meta \u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6 */\nfunction buildShortcutsAtProgress(litColumns: number): string {\n return buildTextAtProgress(SHORTCUT_HINT, litColumns, (ch) => c.dim(ch));\n}\n\n/** \u6309\u7B14\u987A\u8FDB\u5EA6\u6E32\u67D3 logo\uFF1B\u672A\u5199\u51FA\u7684\u58A8\u8FF9\u7528\u7A7A\u683C\u5360\u4F4D\uFF0C\u4FDD\u6301\u5E03\u5C40\u7A33\u5B9A */\nfunction buildLogoRows(strokeCount: number): [string, string, string] {\n const lit = new Set<string>();\n const n = Math.min(Math.max(0, strokeCount), LOGO_STROKES.length);\n for (let i = 0; i < n; i++) {\n const [r, col] = LOGO_STROKES[i]!;\n lit.add(`${r},${col}`);\n }\n return LOGO_ROWS.map((row, r) => {\n let out = \"\";\n for (let col = 0; col < row.length; col++) {\n const ch = row[col]!;\n if (ch === \" \") {\n out += \" \";\n } else if (lit.has(`${r},${col}`)) {\n out += c.text(ch);\n } else {\n out += \" \";\n }\n }\n return out;\n }) as [string, string, string];\n}\n\nfunction buildWelcomeLines(\n strokeCount: number,\n lineProgress: number,\n metaContent: string,\n shortcutContent: string\n): string[] {\n const [topLogo, midLogo, botLogo] = buildLogoRows(strokeCount);\n const line = \"\u2500\".repeat(Math.max(0, lineProgress));\n return [\n `\\n`,\n `${LOGO_PAD}${topLogo}${LOGO_TOP_GAP}${shortcutContent}`,\n `${LOGO_PAD}${midLogo}${LOGO_MID_GAP}${metaContent}`,\n `${LOGO_PAD}${botLogo}${line}`,\n ];\n}\n\n/** \u56DE\u5377\u91CD\u7ED8\uFF1A\u9996\u5E27\u76F4\u63A5\u5199\uFF0C\u4E4B\u540E\u5149\u6807\u4E0A\u79FB\u5E76\u9010\u884C ESC[2K \u6E05\u884C\u91CD\u5199 */\nfunction paintWelcomeLines(lines: string[], firstFrame: boolean): void {\n if (!firstFrame) {\n process.stdout.write(`\\x1b[${lines.length}A`);\n }\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\x1b[2K\\r${lines[i]}`);\n if (i < lines.length - 1) process.stdout.write(\"\\n\");\n }\n}\n\nexport async function playWelcomeAnimation(): Promise<void> {\n const strokeTotal = LOGO_STROKES.length;\n const totalSteps = strokeTotal + lineLength;\n const finalShortcuts = c.dim(SHORTCUT_HINT);\n\n // \u975E TTY\uFF1A\u76F4\u63A5\u8F93\u51FA\u6700\u7EC8\u5E27\uFF0C\u907F\u514D\u63A7\u5236\u5E8F\u5217\u6C61\u67D3\u7BA1\u9053\u8F93\u51FA\n if (!process.stdout.isTTY) {\n const lines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n process.stdout.write(`\\n${lines.join(\"\\n\")}\\n\\n`);\n return;\n }\n\n let step = 0;\n let firstFrame = true;\n\n process.stdout.write(\"\\x1b[?25l\");\n // \u5148\u7A7A\u4E00\u884C\uFF0C\u628A\u6B22\u8FCE\u5757\u4E0E\u4E0A\u65B9\u8F93\u51FA\u9694\u5F00\n process.stdout.write(\"\\n\");\n\n return new Promise((resolve) => {\n const done = (): void => {\n const finalLines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n paintWelcomeLines(finalLines, firstFrame);\n process.stdout.write(\"\\x1b[?25h\\n\\n\");\n resolve();\n };\n\n const tick = (): void => {\n const inLogo = step < strokeTotal;\n const strokeCount = Math.min(step + 1, strokeTotal);\n // \u53F3\u4FA7\u4E09\u884C\uFF08shortcut / meta / \u6A2A\u7EBF\uFF09\u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6\n const lineProgress = inLogo ? 0 : Math.min(step - strokeTotal + 1, lineLength);\n const metaContent = buildMetaAtProgress(Math.min(lineProgress, metaWidth));\n const shortcutContent = buildShortcutsAtProgress(lineProgress);\n const lines = buildWelcomeLines(strokeCount, lineProgress, metaContent, shortcutContent);\n paintWelcomeLines(lines, firstFrame);\n firstFrame = false;\n\n if (step >= totalSteps - 1) {\n done();\n return;\n }\n step += 1;\n // logo \u7B14\u987A\u7A0D\u6162\uFF1B\u63A5\u4E0A\u6A2A\u7EBF\u540E\u6062\u590D\u8F83\u5FEB\u8282\u594F\n setTimeout(tick, step < strokeTotal ? 22 : 5);\n };\n\n setTimeout(tick, 22);\n });\n}\n\n/* let welcome = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${meta}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\\n\n`; */\n\n/* welcome = `\\n\n \u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574 ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\n \u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 ${meta}\n \u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500${\"\u2500\".repeat(getDisplayWidth(meta) + 3)}\\n`; */\n\nexport function getHelp(mode: CommandMode = \"argv\"): string {\n return buildHelp(mode);\n}\n\nfunction getCommands(): string[] {\n return listVisibleTopLevelNames(REPL_MODE);\n}\n\n/* ==================================================================\n * Context-aware completion\n * ================================================================== */\ninterface ParsedLine {\n cmd: string;\n /** cmd \u4E4B\u540E\u7684\u5168\u90E8 token(\u4E0D\u542B\u6B63\u5728\u8F93\u5165\u7684 current,\u82E5\u672B\u5C3E\u65E0\u7A7A\u683C\u5219\u4E0D\u542B\u6700\u540E\u4E00\u4E2A\u534A\u8BCD) */\n words: string[];\n argIndex: number;\n current: string;\n}\n\n/**\n * \u89E3\u6790\u5F53\u524D\u8F93\u5165\u884C,\u63D0\u53D6\u547D\u4EE4\u540D\u3001\u53C2\u6570\u4F4D\u7F6E\u3001\u6B63\u5728\u8F93\u5165\u7684 word\u3002\n * \u672B\u5C3E\u7A7A\u683C\u89C6\u4E3A\"\u521A\u7ED3\u675F\u4E00\u4E2A word,\u51C6\u5907\u8F93\u5165\u4E0B\u4E00\u4E2A\"\u3002\n */\nfunction parseLine(line: string): ParsedLine {\n const endsWithSpace = line.length > 0 && /\\s$/.test(line);\n const trimmed = line.trim();\n if (!trimmed) return { cmd: \"\", words: [], argIndex: 0, current: \"\" };\n const tokens = trimmed.split(/\\s+/);\n if (endsWithSpace) {\n return {\n cmd: tokens[0] ?? \"\",\n words: tokens.slice(1),\n argIndex: tokens.length - 1,\n current: \"\",\n };\n }\n if (tokens.length === 1) return { cmd: \"\", words: [], argIndex: 0, current: tokens[0]! };\n return {\n cmd: tokens[0]!,\n words: tokens.slice(1, -1),\n argIndex: tokens.length - 2,\n current: tokens[tokens.length - 1]!,\n };\n}\n\n/**\n * \u6839\u636E\u547D\u4EE4 + \u53C2\u6570\u4F4D\u7F6E\u8FD4\u56DE\u8865\u5168\u5019\u9009 (\u533A\u5206\u547D\u4EE4,\u4E0D\u518D\u628A\u670D\u52A1\u540D\u5F53\u6210\u6240\u6709\u6307\u4EE4\u7684\u4E8C\u7EA7\u53C2\u6570)\u3002\n */\nfunction getCompletions(parsed: ParsedLine): string[] {\n const { words, argIndex, current } = parsed;\n const cmd = parsed.cmd.startsWith(\"/\") ? parsed.cmd.slice(1) : parsed.cmd;\n const sw = (s: string): boolean => s.startsWith(current);\n if (!cmd) {\n const cmds = getCommands().map((n) => (n.startsWith(\"/\") ? n : n));\n return [\"/\", ...cmds].filter(sw);\n }\n switch (cmd) {\n case \"logs\":\n case \"log\":\n return [];\n case \"start\":\n case \"stop\":\n case \"restart\":\n if (argIndex === 0) return [\"-all\", ...SERVICE_NAMES].filter(sw);\n return [];\n case \"send\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n return [];\n case \"update\":\n return [\"--check-only\", \"--force\", \"--channel=release\", \"--channel=preview\"].filter(sw);\n case \"remote\":\n if (argIndex === 0) return [\"status\", \"enroll\", \"disable\"].filter(sw);\n return [];\n case \"packs\":\n case \"addon\":\n if (argIndex === 0) return [...listVisiblePacksSubs(REPL_MODE)].filter(sw);\n if (argIndex === 1 && [\"list\"].includes(words[0] ?? \"\")) {\n return [\"--kind\", \"--search\"].filter(sw);\n }\n return [];\n default: {\n if (!isModuleCommand(cmd)) return [];\n if (argIndex === 0) return [...getVisibleModuleSubcommands(REPL_MODE)].filter(sw);\n const verb = words[0] ?? \"\";\n if (argIndex === 1 && verb === \"search\") {\n return listRegistryModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && [\"info\", \"uninstall\", \"remove\", \"verify\", \"enable\", \"disable\"].includes(verb)) {\n return listInstalledModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && verb === \"reload\") {\n return [\"--build-only\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"install\") {\n return [\"--from\", \"--sha256\", \"--link\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"list\") {\n return [\"--from\", \"--sha256\"].filter(sw);\n }\n return [];\n }\n }\n}\n\n/* ==================================================================\n * Escape sequence consumer\n * ================================================================== */\nfunction consumeEscapeSeq(chunk: Buffer, i: number): number | null {\n if (chunk[i] !== 0x1b) return null;\n const rem = chunk.length - i - 1;\n if (rem >= 2 && chunk[i + 1] === 0x5b) {\n let j = i + 2;\n while (j < chunk.length && chunk[j]! >= 0x30 && chunk[j]! <= 0x3f) j++;\n while (j < chunk.length && chunk[j]! >= 0x20 && chunk[j]! <= 0x2f) j++;\n if (j < chunk.length && chunk[j]! >= 0x40 && chunk[j]! <= 0x7e) j++;\n return j;\n }\n if (rem >= 2 && chunk[i + 1] === 0x4f) return i + 3;\n if (rem >= 1) return i + 2;\n return i + 1;\n}\n\n/* ==================================================================\n * Line reader\n * ================================================================== */\nconst history: string[] = [];\nlet historyIdx = -1;\n\n/** \u5F53\u524D readLine \u7684\u91CD\u7ED8\u51FD\u6570 (\u7A97\u53E3 resize / \u65E5\u5FD7\u63A8\u9001\u65F6\u8C03\u7528) */\nlet currentRedraw: (() => void) | null = null;\n\ntype ReadLineOpts = {\n getPrompt: () => string;\n /** \u65E0\u6D3B\u8DC3\u670D\u52A1\u65F6\uFF0C\u666E\u901A\u5B57\u7B26\u81EA\u52A8\u524D\u7F6E /\uFF1B\u53EF\u4E3A getter \u4EE5\u4FBF\u670D\u52A1\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: boolean | (() => boolean);\n /** Tab\uFF1A\u5728\u975E / \u884C\u4E0A\u5207\u6362\u53D1\u9001\u76EE\u6807\uFF1B\u8FD4\u56DE true \u8868\u793A\u5DF2\u5904\u7406 */\n cycleSendTarget: () => boolean;\n /** \u5F53\u524D\u7A97\u53E3 chrome\uFF08\u65E0\u8F93\u5165\u7A97\u753B shortcut \u6761\uFF09 */\n getChrome?: () => WindowChrome;\n /** \u4EA4\u7ED9\u6D3B\u52A8\u7A97\u7684\u6309\u952E\uFF08Esc / L / S \u7B49\uFF09 */\n onWindowKey?: (ev: WindowKeyEvent) => WindowKeyResult;\n initial?: string;\n};\n\ntype ReadLineResult =\n | { kind: \"line\"; value: string }\n | { kind: \"cancel\" }\n | { kind: \"open-logs\"; pending: string }\n | { kind: \"run\"; parts: string[] };\n\nasync function readLine(opts: ReadLineOpts): Promise<ReadLineResult> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n\n let line = opts.initial ?? \"\";\n let cursor = line.length;\n let suggestion = \"\";\n /** \u5404\u7EA7\u5217\u9009\u4E2D / \u6EDA\u52A8\uFF08\u4EC5\u6700\u53F3\u5217\u53EF\u5BFC\u822A\uFF09 */\n let palSels: number[] = [0];\n let palScrolls: number[] = [0];\n let overlayRows = 0;\n\n function prompt(): string {\n return opts.getPrompt();\n }\n\n function showsInput(): boolean {\n return opts.getChrome?.().showsInput !== false;\n }\n\n function slashMode(): boolean {\n return showsInput() && line.startsWith(\"/\");\n }\n\n function paletteView() {\n return resolvePaletteView(line, palSels, palScrolls);\n }\n\n function syncPaletteState(view: ReturnType<typeof resolvePaletteView>): void {\n for (let i = 0; i < view.columns.length; i++) {\n palSels[i] = view.columns[i]!.selected;\n palScrolls[i] = view.columns[i]!.scroll;\n }\n }\n\n function resetPalette(): void {\n palSels = [0];\n palScrolls = [0];\n }\n\n function clearOverlay(): void {\n stdout.write(\"\\r\\x1B[J\");\n overlayRows = 0;\n }\n\n function applyWindowKey(ev: WindowKeyEvent): boolean {\n if (!opts.onWindowKey) return false;\n const r = opts.onWindowKey(ev);\n if (r.action === \"none\") return false;\n if (r.action === \"redraw\") redraw();\n return true;\n }\n\n function redraw(): void {\n const chrome = opts.getChrome?.();\n if (chrome && !chrome.showsInput) {\n clearOverlay();\n const foot = chrome.footerShortcuts || \"\";\n stdout.write(foot);\n stdout.write(\"\\r\");\n return;\n }\n\n const p = prompt();\n suggestion = \"\";\n\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (cursor === line.length) {\n suggestion = paletteGhost(view);\n }\n } else {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n const first = candidates[0];\n if (\n cursor === line.length &&\n parsed.current &&\n first &&\n first !== parsed.current &&\n first.startsWith(parsed.current)\n ) {\n suggestion = first.slice(parsed.current.length);\n }\n }\n\n clearOverlay();\n stdout.write(p + line);\n if (suggestion) stdout.write(c.dim(suggestion));\n\n if (slashMode()) {\n const view = paletteView();\n const indent = promptSlashColumn(p);\n const list = formatPaletteCascadeLines(view, indent);\n if (list.length > 0) {\n stdout.write(\"\\n\" + list.join(\"\\n\"));\n overlayRows = list.length;\n stdout.write(`\\x1B[${overlayRows}A`);\n }\n }\n\n const col = promptSlashColumn(p) + cursor + 1;\n stdout.write(`\\r\\x1B[${col}G`);\n }\n\n redraw();\n currentRedraw = redraw;\n\n return new Promise<ReadLineResult>((resolve) => {\n const done = (value: ReadLineResult): void => {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n currentRedraw = null;\n resolve(value);\n };\n\n const finishLine = (value: string): void => {\n clearOverlay();\n stdout.write(prompt() + value + \"\\r\\n\");\n if (value.length > 0) {\n history.push(value);\n if (history.length > 100) history.shift();\n }\n historyIdx = history.length;\n done({ kind: \"line\", value });\n };\n\n /** \u2191\u2193/Tab\uFF1A\u4EC5\u5728\u6700\u53F3\u5217\u8F6E\u6362\u9009\u4E2D\uFF0C\u5199\u5165\u7070\u5B57\uFF0C\u4E0D\u6539\u8F93\u5165\u6846 */\n const movePalSel = (delta: number): boolean => {\n const view = paletteView();\n if (view.hidden) return false;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return false;\n const len = col.items.length;\n const cur = clampPaletteSelection(col.selected, len);\n const next = (((cur + delta) % len) + len) % len;\n palSels[view.active] = next;\n redraw();\n return true;\n };\n\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const len = next - i;\n /* \u5355\u72EC Esc \u2192 \u4EA4\u7ED9\u7A97\u53E3\uFF08/logs \u8FD4\u56DE\uFF09 */\n if (len === 1) {\n if (applyWindowKey({ type: \"escape\" })) {\n i = next;\n continue;\n }\n i = next;\n continue;\n }\n if (!showsInput()) {\n i = next;\n continue;\n }\n if (len === 3 && chunk[i + 1] === 0x5b) {\n const fin = chunk[i + 2];\n if (fin === 0x41) {\n /* \u2191 */\n if (slashMode() && movePalSel(-1)) {\n i = next;\n continue;\n }\n if (historyIdx > 0) {\n historyIdx--;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x42) {\n /* \u2193 */\n if (slashMode() && movePalSel(1)) {\n i = next;\n continue;\n }\n if (historyIdx < history.length - 1) {\n historyIdx++;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n } else if (historyIdx === history.length - 1) {\n historyIdx = history.length;\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x43) {\n /* \u2192\uFF1A\u63A5\u53D7\u7070\u5B57\u6216\u79FB\u5149\u6807\uFF08\u4E0D\u5207\u6362\u9762\u677F\u7126\u70B9\uFF09 */\n if (cursor < line.length) {\n cursor++;\n redraw();\n } else if (suggestion) {\n line += suggestion;\n cursor = line.length;\n redraw();\n }\n } else if (fin === 0x44) {\n if (cursor > 0) {\n cursor--;\n redraw();\n }\n } else if (fin === 0x48) {\n cursor = 0;\n redraw();\n } else if (fin === 0x46) {\n cursor = line.length;\n redraw();\n }\n }\n i = next;\n } else i++;\n continue;\n }\n\n const byte = chunk[i]!;\n i++;\n\n if (byte === 0x0d || byte === 0x0a) {\n if (!showsInput()) continue;\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (!view.hidden && view.columns.some((col) => col.items.length > 0) && activeNode(view)) {\n const acc = commitSelection(line, view);\n if (acc.submit) {\n finishLine(acc.line);\n return;\n }\n line = acc.line;\n cursor = line.length;\n /* \u65B0\u5C42\u9009\u4E2D\u5F52\u96F6 */\n const depth = Math.max(0, acc.line.trimEnd().split(/\\s+/).length - 1);\n while (palSels.length <= depth + 1) palSels.push(0);\n while (palScrolls.length <= depth + 1) palScrolls.push(0);\n palSels[depth + 1] = 0;\n palScrolls[depth + 1] = 0;\n redraw();\n continue;\n }\n }\n finishLine(line);\n return;\n }\n\n if (byte === 0x03) {\n if (!showsInput()) {\n /* \u65E0\u8F93\u5165\u7A97\uFF1ACtrl+C \u8FD4\u56DE\u4E0A\u4E00\u7A97\uFF0C\u518D\u6309\u624D\u9000\u51FA */\n if (applyWindowKey({ type: \"escape\" })) continue;\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n if (line.length > 0) {\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n continue;\n }\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n\n /* Ctrl+P \u2014 \u786E\u4FDD\u4EE5 / \u5F00\u5934 */\n if (byte === 0x10) {\n if (!showsInput()) continue;\n if (!line.startsWith(\"/\")) {\n line = \"/\" + line;\n cursor = Math.min(cursor + 1, line.length);\n }\n resetPalette();\n redraw();\n continue;\n }\n\n if (byte === 0x09) {\n /* Tab\uFF1A/ \u6A21\u5F0F = \u5217\u8868\u8F6E\u6362\uFF1B\u5426\u5219\u5207\u6362\u670D\u52A1\u7A97 */\n if (slashMode()) {\n movePalSel(1);\n continue;\n }\n if (opts.cycleSendTarget()) {\n redraw();\n continue;\n }\n continue;\n }\n\n if (byte === 0x0c) {\n /* Ctrl+L \u2192 \u6253\u5F00 /logs \u7B5B\u9009\u7A97 */\n clearOverlay();\n done({ kind: \"open-logs\", pending: showsInput() ? line : \"\" });\n return;\n }\n\n if (byte === 0x7f || byte === 0x08) {\n if (!showsInput()) continue;\n if (cursor > 0) {\n line = line.slice(0, cursor - 1) + line.slice(cursor);\n cursor--;\n }\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n\n if (byte >= 0x20 && byte <= 0x7e) {\n const ch = String.fromCharCode(byte);\n if (!showsInput()) {\n applyWindowKey({ type: \"char\", ch });\n continue;\n }\n let insert = ch;\n const autoSlash =\n typeof opts.autoSlash === \"function\" ? opts.autoSlash() : opts.autoSlash;\n if (autoSlash && line.length === 0 && insert !== \"/\") {\n insert = \"/\" + insert;\n }\n line = line.slice(0, cursor) + insert + line.slice(cursor);\n cursor += insert.length;\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n }\n };\n stdin.on(\"data\", handler);\n });\n}\n\n/** \u6765\u6E90\u9009\u62E9\u9879:\u65B9\u62EC\u53F7 3 \u5B57\u7B26\u6807\u7B7E\u67D3\u8272\uFF08\u4F9B\u5916\u90E8/\u6D4B\u8BD5\u590D\u7528\uFF09 */\nexport const SOURCE_ITEMS: Array<{ label: string; value: string }> = SOURCE_META.map((m) => ({\n label: m.paint(`[${m.name}]`),\n value: m.value,\n}));\n\n/** REPL \u4EA4\u4E92\u6001\uFF1A\u65E0\u53C2 /logs \u6253\u5F00\u7B5B\u9009\u7A97\uFF08\u7531 startRepl \u6CE8\u5165\uFF09 */\nlet openLogsWindowHook: (() => void) | null = null;\n\nfunction writeLogLineToTty(wrapped: string): void {\n pauseAllProgress();\n try {\n stdout.write(`\\r\\x1B[K${wrapped}\\n`);\n } finally {\n resumeAllProgress();\n }\n currentRedraw?.();\n}\n\n/* ==================================================================\n * START REPL\n * ================================================================== */\n\nexport async function startRepl(): Promise<void> {\n let stopping = false;\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.forceStop\") + \"\\n\"));\n forceStopAll();\n stopRemoteAgent();\n process.exit(130);\n };\n const shutdown = async (): Promise<void> => {\n if (stopping) return;\n stopping = true;\n process.off(\"SIGINT\", onSigint);\n openLogsWindowHook = null;\n stdout.write(c.dim(t(\"repl.stopping\") + \"\\n\"));\n await stopAll();\n stopRemoteAgent();\n try {\n setRaw(false);\n stdin.pause();\n } catch {\n /* ignore */\n }\n stdout.write(c.dim(t(\"repl.bye\") + \"\\n\"));\n process.exit(0);\n };\n process.on(\"SIGINT\", onSigint);\n\n if (!stdin.isTTY) {\n console.log(c.dim(t(\"repl.nonInteractive\")));\n for await (const line of (await import(\"node:readline/promises\")).createInterface({\n input: stdin,\n output: stdout,\n terminal: false,\n })) {\n const t = line.trim();\n if (!t) continue;\n const p = t.split(/\\s+/);\n if ([\"quit\", \"exit\", \"q\"].includes(p[0]!)) break;\n if (p[0] === \"init\") {\n (await import(\"./wizard.js\")).runWizard();\n continue;\n }\n await execCmd(p);\n }\n await shutdown();\n return;\n }\n console.clear();\n await playWelcomeAnimation();\n\n let logsFilterState: LogsFilterState = { levels: [], sources: [] };\n let preferredTarget: ServiceName | null = null;\n let activeTargets: ServiceName[] = [];\n let pendingInput = \"\";\n\n const host = new WindowHost({\n writeLog: writeLogLineToTty,\n onChromeChange: () => currentRedraw?.(),\n });\n\n function clearTerminal(): void {\n /* \u6E05\u89C6\u53E3\uFF1B\u518D\u6E05 scrollback\uFF0C\u907F\u514D\u5F80\u4E0A\u6ED1\u4ECD\u770B\u5230\u4E0A\u4E00\u7A97\u5185\u5BB9 */\n console.clear();\n stdout.write(\"\\x1B[3J\");\n }\n\n /** \u9996\u6B21\u8FDB\u5165\u7A97\u53E3\uFF1A\u4ECE\u5185\u5B58/\u843D\u76D8\u62C9\u4E00\u6B21\u4F5C\u4E3A\u79CD\u5B50\u7F13\u5B58 */\n function seedWindowBuffer(w: {\n id: string;\n acceptLog: (l: UnifiedLog) => boolean;\n formatLogLine: (l: UnifiedLog) => { text: string; indent: number };\n getReplayFilter?: () => { levels: string[]; sources: string[] };\n }): string[] {\n const lines: string[] = [];\n if (w.id === \"logs\") {\n const f = w.getReplayFilter?.() ?? { levels: [], sources: [] };\n const disk = readDiskLogs({\n levels: f.levels as LogLevel[],\n sources: f.sources,\n });\n for (const log of disk) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n } else {\n for (const log of getAllLogs()) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n }\n host.setBuffer(w.id, lines);\n return lines;\n }\n\n /**\n * \u5C55\u793A\u6D3B\u52A8\u7A97\uFF1A\u5148\u6E05\u5C4F\uFF0C\u518D\u6062\u590D/seed\u3002\n * - /logs\uFF1A\u7528\u843D\u76D8\u79CD\u5B50\u7F13\u5B58\uFF08\u6539\u7B5B\u9009\u624D reseed\uFF09\uFF0C\u907F\u514D\u91CD\u590D\u8BFB\u6587\u4EF6\n * - \u670D\u52A1\u4E3B\u9762\u677F\uFF1A\u6BCF\u6B21\u4ECE\u5185\u5B58\u91CD seed\uFF0C\u4FDD\u8BC1\u79BB\u5F00 /logs \u6216 Tab \u56DE\u6765\u65F6\u5185\u5BB9\u5B9E\u65F6\n */\n function showActiveWindow(opts?: { reseed?: boolean }): void {\n clearTerminal();\n const w = host.getActive();\n if (!w) {\n currentRedraw?.();\n return;\n }\n let lines: readonly string[];\n if (w.id === \"logs\") {\n if (opts?.reseed) host.invalidateBuffer(w.id);\n lines = host.hasBuffer(w.id) ? host.getBuffer(w.id) : seedWindowBuffer(w);\n } else {\n /* \u4E3B\u9762\u677F\u5B9E\u65F6\uFF1A\u4E0D\u4F5C\u5E9F\u4E5F\u65E0\u59A8\uFF0C\u76F4\u63A5\u91CD\u62C9\u5185\u5B58\u7F13\u51B2 */\n host.invalidateBuffer(w.id);\n lines = seedWindowBuffer(w);\n }\n for (const l of lines) stdout.write(l + \"\\n\");\n currentRedraw?.();\n }\n\n host.register(\n createLogsFilterWindow({\n getState: () => logsFilterState,\n setState: (next) => {\n logsFilterState = next;\n },\n /* \u7B5B\u9009\u53D8\u66F4\uFF1A\u4F5C\u5E9F /logs \u7F13\u5B58\u5E76\u91CD\u65B0\u8BFB\u76D8\u4E00\u6B21 */\n onFilterChanged: () => showActiveWindow({ reseed: true }),\n })\n );\n\n function syncServiceWindows(targets: ServiceName[]): void {\n for (const name of targets) {\n const id = serviceWindowId(name);\n if (!host.has(id)) host.register(createServiceWindow(name));\n }\n host.setServiceOrder(targets.map(serviceWindowId));\n const svc = host.getActive()?.serviceName;\n if (svc) preferredTarget = svc;\n }\n\n function openLogsWindow(): void {\n /* \u79BB\u5F00\u4E3B\u9762\u677F\uFF1A\u5176\u7F13\u5B58\u53EF\u7559\u7740\uFF0C\u4F46\u5C55\u793A\u4E0A\u5148\u6E05\u5C4F\u518D\u8FDB /logs\uFF1BEsc \u56DE\u6765\u4F1A\u6309\u5B9E\u65F6\u91CD seed \u4E3B\u9762\u677F */\n host.open(\"logs\");\n showActiveWindow();\n }\n\n openLogsWindowHook = openLogsWindow;\n\n const unsub = onLog((log) => {\n if (host.getActive()) {\n host.routeLog(log);\n return;\n }\n /* \u65E0\u6D3B\u52A8\u7A97\uFF1A\u5168\u91CF\u5C55\u793A\uFF08\u5E26\u6E90\u6807\u7B7E\uFF09\uFF0C\u4E0E\u65E7\u7A7A\u95F2\u884C\u4E3A\u4E00\u81F4 */\n writeLogLineToTty(wrapLogLine(formatLog(log), logPrefixWidth(log)));\n });\n\n async function refreshTargetsFromRuntime(): Promise<void> {\n const prevId = host.getActiveId();\n activeTargets = await listActiveSendTargets();\n syncServiceWindows(activeTargets);\n if (preferredTarget && !activeTargets.includes(preferredTarget)) {\n preferredTarget = activeTargets[0] ?? null;\n }\n const nextId = host.getActiveId();\n /* \u65B0\u6FC0\u6D3B\u7A97\u6216\u9996\u6B21\u5C1A\u65E0\u7F13\u5B58\uFF1A\u6E05\u5C4F\u5E76 seed/\u6062\u590D */\n if (nextId && (nextId !== prevId || !host.hasBuffer(nextId))) {\n showActiveWindow();\n } else if (!nextId && prevId) {\n clearTerminal();\n currentRedraw?.();\n } else {\n currentRedraw?.();\n }\n }\n\n const unsubState = onServiceStateChange(() => {\n void refreshTargetsFromRuntime();\n });\n\n function onResize(): void {\n if (!currentRedraw) return;\n const id = host.getActiveId();\n if (id) host.invalidateBuffer(id);\n showActiveWindow();\n }\n\n process.stdout.on(\"resize\", onResize);\n\n function currentTarget(): ServiceName | null {\n if (activeTargets.length === 0) return null;\n const fromWin = host.getActive()?.serviceName;\n if (fromWin && activeTargets.includes(fromWin)) {\n preferredTarget = fromWin;\n return fromWin;\n }\n if (preferredTarget && activeTargets.includes(preferredTarget)) return preferredTarget;\n preferredTarget = activeTargets[0]!;\n return preferredTarget;\n }\n\n function buildPrompt(): string {\n const tgt = currentTarget();\n return tgt ? paintSendPrompt(tgt) : plainPrompt();\n }\n\n while (true) {\n await refreshTargetsFromRuntime();\n const result = await readLine({\n getPrompt: buildPrompt,\n /* \u65E0\u670D\u52A1\u65F6\u9ED8\u8BA4\u52A0 /\uFF08\u4E0E\u7A97\u53E3\u7CFB\u7EDF\u524D\u884C\u4E3A\u4E00\u81F4\uFF09\uFF1B\u7528 getter \u4EE5\u4FBF\u8FDB\u7A0B\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: () => activeTargets.length === 0,\n getChrome: () => host.getChrome(),\n onWindowKey: (ev) => {\n const r = host.onKey(ev);\n if (r.action === \"redraw\") showActiveWindow();\n return r;\n },\n cycleSendTarget: () => {\n const name = host.cycleServiceWindows();\n if (!name) return false;\n preferredTarget = name;\n showActiveWindow();\n return true;\n },\n initial: pendingInput,\n });\n pendingInput = \"\";\n\n if (result.kind === \"cancel\") break;\n\n if (result.kind === \"open-logs\") {\n pendingInput = result.pending;\n openLogsWindow();\n continue;\n }\n\n if (result.kind === \"run\") {\n try {\n await execCmd(result.parts);\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n continue;\n }\n\n const trimmed = result.value.trim();\n if (!trimmed) continue;\n\n try {\n if (trimmed.startsWith(\"/\")) {\n await execCmd(trimmed.split(/\\s+/));\n } else {\n const tgt = currentTarget();\n if (!tgt) {\n await execCmd((\"/\" + trimmed).split(/\\s+/));\n } else {\n const sent = await cmdSend(tgt, trimmed);\n if (sent) stdout.write(sent + \"\\n\");\n }\n }\n } catch (e) {\n if (e === \"QUIT\") break;\n console.log(c.red(t(\"common.error\", { message: (e as Error).message })));\n }\n }\n\n process.stdout.off(\"resize\", onResize);\n unsubState();\n unsub();\n await shutdown();\n}\n\nasync function execCmd(parts: string[]): Promise<void> {\n const normalized = parts.map((p, i) => (i === 0 && p.startsWith(\"/\") ? p.slice(1) : p));\n const [cmd, ...args] = normalized;\n\n if (cmd && ![\"help\", \"h\", \"?\", \"version\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, REPL_MODE);\n if (topGate) {\n stdout.write(topGate + \"\\n\");\n return;\n }\n }\n\n switch (cmd) {\n case \"help\":\n case \"h\":\n case \"?\":\n stdout.write(getHelp(REPL_MODE));\n break;\n case \"version\":\n await playWelcomeAnimation();\n break;\n case \"status\":\n stdout.write((await cmdStatus()) + \"\\n\");\n break;\n case \"logs\":\n case \"log\": {\n /* \u65E0\u53C2\u53F6\u547D\u4EE4\uFF1A\u6253\u5F00\u7B5B\u9009\u7A97 */\n if (openLogsWindowHook) {\n openLogsWindowHook();\n break;\n }\n stdout.write(c.yellow(t(\"repl.logsReplOnly\") + \"\\n\"));\n break;\n }\n case \"start\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStartAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.start.usageShort\") + \"\\n\"));\n break;\n case \"stop\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") stdout.write((await cmdStopAll()) + \"\\n\");\n else if (args[0]) stdout.write((await cmdStop(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.stop.usageShort\") + \"\\n\"));\n break;\n case \"restart\":\n if (args[0] === \"-all\" || args[0] === \"all\" || args[0] === \"--all\") {\n await cmdStopAll();\n stdout.write((await cmdStartAll()) + \"\\n\");\n } else if (args[0]) stdout.write((await cmdRestart(args[0])) + \"\\n\");\n else stdout.write(c.yellow(t(\"svc.restart.usageShort\") + \"\\n\"));\n break;\n case \"send\": {\n const svc = args[0] ?? \"\";\n const msg = args.slice(1).join(\" \");\n {\n const sent = await cmdSend(svc, msg);\n if (sent) stdout.write(sent + \"\\n\");\n }\n break;\n }\n case \"update\":\n stdout.write((await cmdUpdate(args)) + \"\\n\");\n break;\n case \"locale\":\n case \"lang\":\n stdout.write(cmdLocale(args) + \"\\n\");\n break;\n case \"debug\":\n stdout.write((await cmdDebug(args)) + \"\\n\");\n break;\n case \"remote\":\n stdout.write((await cmdRemote(args, { daemonAfterEnroll: false })) + \"\\n\");\n break;\n case \"init\": {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(false);\n try {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n } finally {\n setRaw(wasRaw);\n }\n break;\n }\n case \"quit\":\n case \"exit\":\n case \"q\":\n throw \"QUIT\";\n default: {\n const modShort = resolveModuleTopShorthand(cmd);\n if (modShort) {\n const g = gateModuleSub(modShort, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchModuleCommand(modShort, args)) + \"\\n\");\n break;\n }\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gateModuleSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchModuleCommand(sub, subRest)) + \"\\n\");\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = args;\n const g = gatePacksSub(sub, REPL_MODE);\n if (g) {\n stdout.write(g + \"\\n\");\n break;\n }\n stdout.write((await dispatchPacksCommand(sub, subRest)) + \"\\n\");\n break;\n }\n stdout.write(c.yellow(t(\"common.unknownShort\", { cmd: cmd ?? \"\" }) + \"\\n\"));\n }\n }\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": ["t"]
7
7
  }
package/dist/runtime.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { type SpawnOptions, type SpawnSyncOptions } from "node:child_process";
2
2
  /**
3
- * 是否为 monorepo 布局(仓根同时有 db-server/sfmc/)。
3
+ * 是否为 monorepo 布局(仓根同时有 packages/db-server 与 packages/cli)。
4
4
  * npm 全局/本地安装时 ROOT 通常是 cwd,不满足此条件。
5
5
  */
6
6
  export declare function isMonorepoLayout(root: string): boolean;
7
7
  /**
8
8
  * 项目根目录。优先级:`process.env.SFMC_ROOT` > fallback。
9
- * - monorepo:`sfmc/` 上一级
9
+ * - monorepo: walk-up 到 sfmc-monorepo
10
10
  * - npm 聚合包 / 全局安装:cwd(配置与数据落在当前目录)
11
11
  */
12
12
  export declare const ROOT: string;
@@ -26,24 +26,15 @@ export type ServiceId = "db" | "qq" | "update" | "manager" | "pack-manager";
26
26
  */
27
27
  export declare function resolveServiceScript(service: ServiceId): string;
28
28
  /**
29
- * 解析 tools/fetch-module.mjs。
30
- * 优先级: SFMC_FETCH_MODULE > ROOT/tools/ > @sfmc-bds/tools。
29
+ * 解析 packages/tools/fetch-module.mjs。
30
+ * 优先级: SFMC_FETCH_MODULE > ROOT/packages/tools/ > @sfmc-bds/tools。
31
31
  */
32
32
  export declare function resolveFetchModule(): string | null;
33
- /**
34
- * 解析 tools/new-module.mjs。
35
- * 优先级: SFMC_NEW_MODULE > ROOT/tools/ > @sfmc-bds/tools。
36
- */
37
- export declare function resolveNewModule(): string | null;
38
33
  /**
39
34
  * 解析 `@sfmc-bds/sdk` 包根目录(含 package.json)。
40
35
  * 优先级: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > 公开 export 向上找 > monorepo。
41
36
  */
42
37
  export declare function resolveSdkPackageRoot(): string;
43
- /** @deprecated 已移除 configs-default 播种;保留空实现以免外部旧调用炸掉 */
44
- export declare function resolveDefaultsDir(): string | null;
45
- /** @deprecated 配置改由各服务 ensure + SDK DEFAULT 生成 */
46
- export declare function seedMissingConfigsFromDefaults(_rootDir?: string): string[];
47
38
  /**
48
39
  * 启动一个子服务。
49
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAQlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAQhD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAgE9C;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED,kDAAkD;AAClD,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,MAAa,GAAG,MAAM,EAAE,CAEhF;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,YAAiB,6CAI5F;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,gBAAqB,2EAIpG"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAQlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,YAAiB,6CAI5F;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,gBAAqB,2EAIpG"}