@sfmc-bds/cli 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +11 -2
- package/dist/command-palette.js.map +2 -2
- package/dist/command-surface.d.ts +14 -2
- package/dist/command-surface.d.ts.map +1 -1
- package/dist/command-surface.js +120 -6
- package/dist/command-surface.js.map +2 -2
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +45 -38
- package/dist/commands.js.map +2 -2
- package/dist/daemon/client.d.ts +67 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +272 -0
- package/dist/daemon/client.js.map +7 -0
- package/dist/daemon/paths.d.ts +35 -0
- package/dist/daemon/paths.d.ts.map +1 -0
- package/dist/daemon/paths.js +69 -0
- package/dist/daemon/paths.js.map +7 -0
- package/dist/daemon/protocol.d.ts +66 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +16 -0
- package/dist/daemon/protocol.js.map +7 -0
- package/dist/daemon/role.d.ts +13 -0
- package/dist/daemon/role.d.ts.map +1 -0
- package/dist/daemon/role.js +12 -0
- package/dist/daemon/role.js.map +7 -0
- package/dist/daemon/server.d.ts +12 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +221 -0
- package/dist/daemon/server.js.map +7 -0
- package/dist/help-text.d.ts.map +1 -1
- package/dist/help-text.js +3 -1
- package/dist/help-text.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +25 -3
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +26 -3
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +26 -3
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/logs.d.ts +11 -1
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +8 -0
- package/dist/logs.js.map +2 -2
- package/dist/main.js +27 -4
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +9 -5
- package/dist/module-commands.js.map +2 -2
- package/dist/module-fingerprint.d.ts +5 -0
- package/dist/module-fingerprint.d.ts.map +1 -1
- package/dist/module-fingerprint.js +13 -3
- package/dist/module-fingerprint.js.map +2 -2
- package/dist/module-sidecars.d.ts +16 -0
- package/dist/module-sidecars.d.ts.map +1 -0
- package/dist/module-sidecars.js +116 -0
- package/dist/module-sidecars.js.map +7 -0
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +51 -32
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +2 -2
- package/dist/services.d.ts +3 -1
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +22 -10
- package/dist/services.js.map +2 -2
- package/dist/world-packs.js.map +1 -1
- package/package.json +4 -4
package/dist/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 { 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 {\n createLogsFilterWindow,\n createServiceWindow,\n createSfmcWindow,\n serviceWindowId,\n SFMC_WINDOW_ID,\n WindowHost,\n type LogsFilterState,\n type WindowChrome,\n type WindowKeyEvent,\n type WindowKeyResult,\n} from \"./repl-windows/index.js\";\nimport { SEND_TARGET_ORDER, paintSendPrompt, paintSfmcPrompt, plainPrompt } from \"./send-target.js\";\nimport { forceStopAll, onServiceStateChange, queryServicesRuntime, 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 \"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 /** \u670D\u52A1\u542F\u52A8\u540E\uFF0C\u7A7A\u8F93\u5165\u6846\u5185\u663E\u793A\u7684\u64CD\u4F5C\u63D0\u793A */\n getEmptyHint?: () => 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 else if (!line) stdout.write(c.dim(opts.getEmptyHint?.() ?? \"\"));\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 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 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 activeServiceWindows: 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(windows: ServiceName[]): void {\n if (windows.length === 0) {\n host.setServiceOrder([]);\n preferredTarget = null;\n return;\n }\n for (const name of windows) {\n const id = serviceWindowId(name);\n if (!host.has(id)) host.register(createServiceWindow(name));\n }\n if (!host.has(SFMC_WINDOW_ID)) {\n host.register(createSfmcWindow({ getActiveTargets: () => activeServiceWindows }));\n }\n host.setServiceOrder([...windows.map(serviceWindowId), SFMC_WINDOW_ID]);\n const svc = host.getActive()?.serviceName;\n if (svc && activeTargets.includes(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 const running = new Set((await queryServicesRuntime()).filter((row) => row.running).map((row) => row.name));\n activeTargets = SEND_TARGET_ORDER.filter((name) => running.has(name));\n activeServiceWindows = SERVICE_NAMES.filter((name) => running.has(name));\n syncServiceWindows(activeServiceWindows);\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 if (host.getActive()?.id === SFMC_WINDOW_ID) return null;\n if (host.getActive()?.showsInput === false || host.getActive()?.serviceName === \"tunnel\") 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 if (host.getActive()?.id === SFMC_WINDOW_ID) {\n return paintSfmcPrompt();\n }\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 getEmptyHint: () => (activeServiceWindows.length > 0 ? \"\u6309\u4E0B TAB \u5207\u6362\u7A97\u53E3\" : \"\"),\n /* \u65E0\u670D\u52A1\u6216\u5728 SFMC \u5E73\u53F0\u7A97\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 || host.getActive()?.id === SFMC_WINDOW_ID || host.getActive()?.showsInput === false || host.getActive()?.serviceName === \"tunnel\",\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 res = host.cycleServiceWindows();\n if (!res.switched) return false;\n if (res.serviceName && activeTargets.includes(res.serviceName)) preferredTarget = res.serviceName;\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 \"ui\": {\n const { cmdUi } = await import(\"./ui-command.js\");\n stdout.write((await cmdUi(args, { block: false })) + \"\\n\");\n break;\n }\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
|
-
"names": ["t"]
|
|
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 listNextPaletteTokens,\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 { 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 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 {\n createLogsFilterWindow,\n createServiceWindow,\n createSfmcWindow,\n serviceWindowId,\n SFMC_WINDOW_ID,\n WindowHost,\n type LogsFilterState,\n type WindowChrome,\n type WindowKeyEvent,\n type WindowKeyResult,\n} from \"./repl-windows/index.js\";\nimport { SEND_TARGET_ORDER, paintSendPrompt, paintSfmcPrompt, plainPrompt } from \"./send-target.js\";\nimport { onServiceStateChange, queryServicesRuntime, SERVICE_NAMES, 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 /* \u9762\u677F\u6811\u91CC\u5DF2\u7ECF\u6709\u56FA\u5B9A\u4E0B\u4E00\u53C2\u65F6\uFF0C\u7070\u5B57\u4E0E\u9762\u677F\u5171\u7528\u540C\u4E00\u4EFD\u9009\u9879 */\n const paletteNext = listNextPaletteTokens([cmd, ...words.slice(0, argIndex)], REPL_MODE);\n if (paletteNext && paletteNext.length > 0) return paletteNext.filter(sw);\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\", \"--no-start\", \"--channel=release\", \"--channel=preview\"].filter(sw);\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 /** \u670D\u52A1\u542F\u52A8\u540E\uFF0C\u7A7A\u8F93\u5165\u6846\u5185\u663E\u793A\u7684\u64CD\u4F5C\u63D0\u793A */\n getEmptyHint?: () => 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 else if (!line) stdout.write(c.dim(opts.getEmptyHint?.() ?? \"\"));\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 /** \u65AD\u5F00\u4E0E\u5B88\u62A4\u8FDB\u7A0B\u7684\u8BA2\u9605\uFF08\u4E0D\u505C\u670D\uFF09 */\n let disconnectDaemon: (() => void) | null = null;\n\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.detach\") + \"\\n\"));\n disconnectDaemon?.();\n disconnectDaemon = null;\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.detach\") + \"\\n\"));\n disconnectDaemon?.();\n disconnectDaemon = null;\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 /* \u8FDE\u63A5\uFF08\u6216\u62C9\u8D77\uFF09\u5B88\u62A4\u8FDB\u7A0B\u5E76\u8BA2\u9605\u8FDC\u7A0B\u65E5\u5FD7/\u72B6\u6001 */\n try {\n const { ensureDaemonSubscription } = await import(\"./daemon/client.js\");\n disconnectDaemon = await ensureDaemonSubscription();\n } catch (e) {\n stdout.write(c.red(t(\"daemon.connectFailed\", { message: (e as Error).message })) + \"\\n\");\n process.exit(1);\n }\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 activeServiceWindows: 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\u843D\u76D8\u62C9\u5386\u53F2\u4F5C\u4E3A\u79CD\u5B50\uFF08CLI \u91CD\u8FDE\u540E\u5185\u5B58\u4E3A\u7A7A\uFF0C\u6743\u5A01\u5728 `.sfmc/logs/*.log`\uFF09 */\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 f = w.getReplayFilter?.() ?? { levels: [], sources: [] };\n /* \u4E0E\u65E7\u5185\u5B58\u73AF\u5927\u5C0F\u5BF9\u9F50\uFF0C\u907F\u514D\u8D85\u5927 log \u6587\u4EF6\u62D6\u57AE\u6E05\u5C4F\u56DE\u653E */\n const disk = readDiskLogs({\n levels: f.levels as LogLevel[],\n sources: f.sources,\n limit: 5000,\n });\n const lines: string[] = [];\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 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 * \u5386\u53F2\u4E00\u5F8B\u843D\u76D8 seed\uFF1B\u5B9E\u65F6\u884C\u7531 onLog \u2192 routeLog \u8FFD\u52A0\u8FDB\u5404\u7A97\u7F13\u5B58\u3002\n * \u6539\u7B5B\u9009\u65F6\u4F20 reseed \u5F3A\u5236\u91CD\u8BFB\u76D8\u3002\n */\n function showActiveWindow(opts?: { reseed?: boolean }): void {\n clearTerminal();\n const w = host.getActive();\n if (!w) {\n currentRedraw?.();\n return;\n }\n if (opts?.reseed) host.invalidateBuffer(w.id);\n const lines = host.hasBuffer(w.id) ? host.getBuffer(w.id) : seedWindowBuffer(w);\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(windows: ServiceName[]): void {\n if (windows.length === 0) {\n host.setServiceOrder([]);\n preferredTarget = null;\n return;\n }\n for (const name of windows) {\n const id = serviceWindowId(name);\n if (!host.has(id)) host.register(createServiceWindow(name));\n }\n if (!host.has(SFMC_WINDOW_ID)) {\n host.register(createSfmcWindow({ getActiveTargets: () => activeServiceWindows }));\n }\n host.setServiceOrder([...windows.map(serviceWindowId), SFMC_WINDOW_ID]);\n const svc = host.getActive()?.serviceName;\n if (svc && activeTargets.includes(svc)) preferredTarget = svc;\n }\n\n function openLogsWindow(): void {\n /* \u79BB\u5F00\u4E3B\u9762\u677F\uFF1A\u7F13\u5B58\u4FDD\u7559\uFF1BEsc \u56DE\u6765\u82E5\u4E3B\u9762\u677F\u5DF2\u6709\u7F13\u5B58\u5219\u76F4\u63A5\u6062\u590D\uFF08\u542B\u671F\u95F4 routeLog \u8FFD\u52A0\uFF09 */\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 const running = new Set((await queryServicesRuntime()).filter((row) => row.running).map((row) => row.name));\n activeTargets = SEND_TARGET_ORDER.filter((name) => running.has(name));\n activeServiceWindows = SERVICE_NAMES.filter((name) => running.has(name));\n syncServiceWindows(activeServiceWindows);\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 if (host.getActive()?.id === SFMC_WINDOW_ID) return null;\n if (host.getActive()?.showsInput === false || host.getActive()?.serviceName === \"tunnel\") 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 if (host.getActive()?.id === SFMC_WINDOW_ID) {\n return paintSfmcPrompt();\n }\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 getEmptyHint: () => (activeServiceWindows.length > 0 ? \"\u6309\u4E0B TAB \u5207\u6362\u7A97\u53E3\" : \"\"),\n /* \u65E0\u670D\u52A1\u6216\u5728 SFMC \u5E73\u53F0\u7A97\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 || host.getActive()?.id === SFMC_WINDOW_ID || host.getActive()?.showsInput === false || host.getActive()?.serviceName === \"tunnel\",\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 res = host.cycleServiceWindows();\n if (!res.switched) return false;\n if (res.serviceName && activeTargets.includes(res.serviceName)) preferredTarget = res.serviceName;\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 \"ui\": {\n const { cmdUi } = await import(\"./ui-command.js\");\n stdout.write((await cmdUi(args, { block: false })) + \"\\n\");\n break;\n }\n case \"daemon\": {\n const sub = args[0];\n if (sub === \"stop\") {\n const { shutdownDaemon } = await import(\"./daemon/client.js\");\n const err = await shutdownDaemon();\n stdout.write((err ? c.red(err) : c.dim(t(\"daemon.stopped\"))) + \"\\n\");\n } else if (sub === \"status\" || !sub) {\n const { readDaemonMeta } = await import(\"./daemon/paths.js\");\n const { isProcessAlive } = await import(\"@sfmc-bds/bds-tools/process-probe\");\n const meta = readDaemonMeta();\n if (!meta || !(await isProcessAlive(meta.pid))) {\n stdout.write(c.dim(t(\"daemon.notRunning\")) + \"\\n\");\n } else {\n stdout.write(c.green(t(\"daemon.running\", { pid: String(meta.pid) })) + \"\\n\");\n }\n } else {\n stdout.write(c.yellow(t(\"daemon.usage\") + \"\\n\"));\n }\n break;\n }\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
|
+
"names": ["t", "meta"]
|
|
7
7
|
}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export declare function resolveSdkPackageRoot(): string;
|
|
|
40
40
|
*
|
|
41
41
|
* 透传给子进程的 env:
|
|
42
42
|
* - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR
|
|
43
|
+
* 默认 windowsHide:Windows 上隐藏子进程控制台,避免守护进程拉起 db/qq/bds 时弹出空白窗口。
|
|
43
44
|
*/
|
|
44
45
|
export declare function spawnService(service: ServiceId, args?: string[], opts?: SpawnOptions): import("node:child_process").ChildProcess;
|
|
45
46
|
/** spawnService 的同步版本 */
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,CAyB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAiBlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C;AAgBD
|
|
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,CAyB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAiBlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C;AAgBD;;;;;;GAMG;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"}
|
package/dist/runtime.js
CHANGED
|
@@ -180,12 +180,12 @@ function serviceChildEnv(service, optsEnv) {
|
|
|
180
180
|
function spawnService(service, args = [], opts = {}) {
|
|
181
181
|
const env = serviceChildEnv(service, opts.env);
|
|
182
182
|
const script = resolveServiceScript(service);
|
|
183
|
-
return spawn(nodeBinary(), [script, ...args], { ...opts, env });
|
|
183
|
+
return spawn(nodeBinary(), [script, ...args], { windowsHide: true, ...opts, env });
|
|
184
184
|
}
|
|
185
185
|
function spawnServiceSync(service, args = [], opts = {}) {
|
|
186
186
|
const env = serviceChildEnv(service, opts.env);
|
|
187
187
|
const script = resolveServiceScript(service);
|
|
188
|
-
return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });
|
|
188
|
+
return spawnSync(nodeBinary(), [script, ...args], { windowsHide: true, ...opts, env });
|
|
189
189
|
}
|
|
190
190
|
export {
|
|
191
191
|
PACKAGES_DIR,
|
package/dist/runtime.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/runtime.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n configPath,\n findMonorepoRoot,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40\uFF08\u4ED3\u6839\u540C\u65F6\u6709 packages/db-server \u4E0E packages/cli\uFF09\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"packages\", \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"packages\", \"cli\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const found = findMonorepoRoot(__dirname);\n if (found && isMonorepoLayout(found)) return found;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo: walk-up \u5230 sfmc-monorepo\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/** \u6BCF\u6B21\u8C03\u7528\u91CD\u65B0\u89E3\u6790\uFF08\u5C0A\u91CD\u8FD0\u884C\u4E2D\u53D8\u66F4\u7684 `SFMC_ROOT`\uFF1B\u5355\u6D4B/\u5B50\u8FDB\u7A0B\u53CB\u597D\uFF09\u3002 */\nexport function getRoot(): string {\n return resolveRuntimeRoot(detectFallbackRoot());\n}\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"packages/db-server/dist/index.js\",\n qq: \"packages/qq-bridge/dist/index.js\",\n update: \"packages/bds-tools/dist/check-update.js\",\n manager: \"packages/bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"packages/bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u5916\u90E8\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, SERVICE_SCRIPT[service]);\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 fetch-module\uFF08@sfmc-bds/cli/scripts/module-install\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n return tryResolveNpm(\"@sfmc-bds/cli\", {\n rel: \"scripts/module-install/fetch-module.mjs\",\n exportPath: \"@sfmc-bds/cli/fetch-module.mjs\",\n });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const fromCli = path.join(monoFromCli, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n }\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import {\n configPath,\n findMonorepoRoot,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40\uFF08\u4ED3\u6839\u540C\u65F6\u6709 packages/db-server \u4E0E packages/cli\uFF09\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"packages\", \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"packages\", \"cli\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const found = findMonorepoRoot(__dirname);\n if (found && isMonorepoLayout(found)) return found;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo: walk-up \u5230 sfmc-monorepo\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/** \u6BCF\u6B21\u8C03\u7528\u91CD\u65B0\u89E3\u6790\uFF08\u5C0A\u91CD\u8FD0\u884C\u4E2D\u53D8\u66F4\u7684 `SFMC_ROOT`\uFF1B\u5355\u6D4B/\u5B50\u8FDB\u7A0B\u53CB\u597D\uFF09\u3002 */\nexport function getRoot(): string {\n return resolveRuntimeRoot(detectFallbackRoot());\n}\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"packages/db-server/dist/index.js\",\n qq: \"packages/qq-bridge/dist/index.js\",\n update: \"packages/bds-tools/dist/check-update.js\",\n manager: \"packages/bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"packages/bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u5916\u90E8\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, SERVICE_SCRIPT[service]);\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 fetch-module\uFF08@sfmc-bds/cli/scripts/module-install\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n return tryResolveNpm(\"@sfmc-bds/cli\", {\n rel: \"scripts/module-install/fetch-module.mjs\",\n exportPath: \"@sfmc-bds/cli/fetch-module.mjs\",\n });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const fromCli = path.join(monoFromCli, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n }\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n * \u9ED8\u8BA4 windowsHide\uFF1AWindows \u4E0A\u9690\u85CF\u5B50\u8FDB\u7A0B\u63A7\u5236\u53F0\uFF0C\u907F\u514D\u5B88\u62A4\u8FDB\u7A0B\u62C9\u8D77 db/qq/bds \u65F6\u5F39\u51FA\u7A7A\u767D\u7A97\u53E3\u3002\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { windowsHide: true, ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { windowsHide: true, ...opts, env });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/services.d.ts
CHANGED
|
@@ -27,7 +27,6 @@ export interface LogLine {
|
|
|
27
27
|
export declare function nonBlankOutputLines(text: string): string[];
|
|
28
28
|
export type ServiceName = "bds" | "db" | "tunnel" | "qq" | "llbot";
|
|
29
29
|
export declare const SERVICE_NAMES: ServiceName[];
|
|
30
|
-
export declare function setArgvDaemonize(on: boolean): void;
|
|
31
30
|
/** 单服务 start 结果:optional 服务 validate 失败记为 skipped,不抛错 */
|
|
32
31
|
export type StartOutcome = {
|
|
33
32
|
status: "started";
|
|
@@ -127,8 +126,11 @@ export declare function onServiceStateChange(fn: (ev: ServiceStateEvent) => void
|
|
|
127
126
|
/**
|
|
128
127
|
* 统一运行态查询(权威入口):OS/健康探测 + 回写 Service 内存标志。
|
|
129
128
|
* status / Tab 发送目标 / reload 等均应走此接口,勿直接读 `service.running`。
|
|
129
|
+
* CLI 进程经守护进程 RPC 获取;守护进程内走本地探活。
|
|
130
130
|
*/
|
|
131
131
|
export declare function queryServicesRuntime(): Promise<ServiceStatus[]>;
|
|
132
|
+
/** 守护进程内本地探活实现(亦供 server status 组装 rows) */
|
|
133
|
+
export declare function queryServicesRuntimeLocal(): Promise<ServiceStatus[]>;
|
|
132
134
|
/** 单服务是否在跑(含外部实例) */
|
|
133
135
|
export declare function isServiceRunning(name: ServiceName): Promise<boolean>;
|
|
134
136
|
//# sourceMappingURL=services.d.ts.map
|
package/dist/services.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA8B,SAAS,EAAkB,MAAM,2BAA2B,CAAC;AAqBvG,OAAO,EAAS,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA8B,SAAS,EAAkB,MAAM,2BAA2B,CAAC;AAqBvG,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAa3C,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC;AACnE,eAAO,MAAM,aAAa,EAAE,WAAW,EAA2C,CAAC;AAEnF,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACpC;AAOD,wBAAgB,gBAAgB,IAAI,SAAS,CAE5C;AAwCD,UAAU,UAAU;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,0BAA0B;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,cAAM,OAAO;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,GAAG,IAAI,CAAQ;IACjC,OAAO,UAAS;IAChB,GAAG,SAAK;IACR,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC9B,IAAI,EAAE,OAAO,EAAE,CAAM;IACrB,MAAM,oBAAsB;IAE5B,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAA8C;IAElE,YAAY,GAAG,EAAE,UAAU,EAS1B;IAED,IAAI,MAAM,IAAI,MAAM,CAQnB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAUvD;IAEK,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CA6GnC;IAED,OAAO,CAAC,eAAe;IAYvB,oCAAoC;IACpC,WAAW,IAAI,IAAI,CAQlB;IAED,SAAS,IAAI,IAAI,CAEhB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC1B;IAED,SAAS,IAAI,IAAI,CAchB;IAEK,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAGrC;IAED,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAElC;IAED;;OAEG;IACH,oBAAoB,IAAI,IAAI,CAG3B;IAED,OAAO,CAAC,OAAO;CAmBhB;AAuJD,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAoB,CAAC;AAErE,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,eAAO,MAAM,WAAW,EAAE,WAAW,EAA2C,CAAC;AAEjF,wBAAsB,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAoBxD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAO7C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,6BAA6B;AAC7B,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAgBpF;AAYD;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAMrE;AAED,4CAA4C;AAC5C,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAwG1E;AAED,qBAAqB;AACrB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAG1E"}
|
package/dist/services.js
CHANGED
|
@@ -20,6 +20,8 @@ import { spawn } from "node:child_process";
|
|
|
20
20
|
import { EventEmitter } from "node:events";
|
|
21
21
|
import fs from "node:fs";
|
|
22
22
|
import path from "node:path";
|
|
23
|
+
import { isDaemonServer } from "./daemon/role.js";
|
|
24
|
+
import { onRemoteServiceStateChange } from "./daemon/client.js";
|
|
23
25
|
import { t } from "./i18n/index.js";
|
|
24
26
|
import { resolveLlbotLaunch } from "./llbot-launch.js";
|
|
25
27
|
import { inferLevel, pushLog as pushUnifiedLog } from "./logs.js";
|
|
@@ -27,16 +29,13 @@ import { findNodeServicePids } from "./node-service-probe.js";
|
|
|
27
29
|
import { ensurePackUpdateConfigFile } from "./pack-update/index.js";
|
|
28
30
|
import { recordBdsVersion } from "./bds-runtime-version.js";
|
|
29
31
|
import { reportBdsPlayerSession } from "./player-session.js";
|
|
32
|
+
import { startModuleSidecars, stopModuleSidecars } from "./module-sidecars.js";
|
|
30
33
|
import { ROOT, spawnService } from "./runtime.js";
|
|
31
34
|
import { ROOT as ROOT2 } from "./runtime.js";
|
|
32
35
|
function nonBlankOutputLines(text) {
|
|
33
36
|
return text.split(/\r?\n/).filter((line) => line.trim().length > 0);
|
|
34
37
|
}
|
|
35
38
|
const SERVICE_NAMES = ["bds", "db", "tunnel", "qq", "llbot"];
|
|
36
|
-
let argvDaemonize = false;
|
|
37
|
-
function setArgvDaemonize(on) {
|
|
38
|
-
argvDaemonize = on;
|
|
39
|
-
}
|
|
40
39
|
let dbHealthPort = 3001;
|
|
41
40
|
let qqBackendMode = "official";
|
|
42
41
|
function getQqBackendMode() {
|
|
@@ -144,17 +143,18 @@ class Service {
|
|
|
144
143
|
if (this.def.beforeStart) {
|
|
145
144
|
await this.def.beforeStart();
|
|
146
145
|
}
|
|
146
|
+
if (this.name === "bds") {
|
|
147
|
+
await startModuleSidecars(ROOT, (line, stream) => this.pushLog(line, stream));
|
|
148
|
+
}
|
|
147
149
|
if (this.updateInProgress) throw new Error("BDS \u6B63\u5728\u66F4\u65B0\uFF0C\u6682\u4E0D\u53EF\u542F\u52A8");
|
|
148
150
|
this.manualStop = false;
|
|
149
|
-
const daemonize = argvDaemonize && process.platform !== "win32";
|
|
150
151
|
const spawnOpts = {
|
|
151
152
|
cwd: this.def.cwd,
|
|
152
|
-
stdio:
|
|
153
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
153
154
|
env: this.def.env ? { ...process.env, ...this.def.env } : process.env,
|
|
154
|
-
|
|
155
|
+
windowsHide: true
|
|
155
156
|
};
|
|
156
157
|
const child = this.def.service ? spawnService(this.def.service, this.def.args ?? [], spawnOpts) : spawn(this.def.cmd, this.def.args ?? [], spawnOpts);
|
|
157
|
-
if (daemonize) child.unref();
|
|
158
158
|
this.proc = child;
|
|
159
159
|
this.pid = child.pid ?? 0;
|
|
160
160
|
this.running = true;
|
|
@@ -305,6 +305,7 @@ class Service {
|
|
|
305
305
|
if (filePid === exitingPid) {
|
|
306
306
|
clearBdsPidFile(ROOT);
|
|
307
307
|
}
|
|
308
|
+
stopModuleSidecars();
|
|
308
309
|
}
|
|
309
310
|
if (this.name === "tunnel" && exitingPid > 0) clearTunnelRuntime(exitingPid);
|
|
310
311
|
if (wasRunning) {
|
|
@@ -345,7 +346,8 @@ function createServices() {
|
|
|
345
346
|
env: bdsSpawnEnvExtra(bdsPath),
|
|
346
347
|
stopCommand: "stop",
|
|
347
348
|
stopTimeout: 3e4,
|
|
348
|
-
|
|
349
|
+
/* 崩溃拉起由 sfmc daemon 固定开启;不再读 bds_updater.crash_restart */
|
|
350
|
+
autoRestart: true,
|
|
349
351
|
restartDelay: 5e3,
|
|
350
352
|
validate: () => {
|
|
351
353
|
if (!fs.existsSync(bdsExe)) return `not found: ${bdsExe}`;
|
|
@@ -486,6 +488,9 @@ function forceStopAll() {
|
|
|
486
488
|
for (const service of Object.values(services)) service.forceStop();
|
|
487
489
|
}
|
|
488
490
|
function onServiceStateChange(fn) {
|
|
491
|
+
if (!isDaemonServer()) {
|
|
492
|
+
return onRemoteServiceStateChange(fn);
|
|
493
|
+
}
|
|
489
494
|
const handler = (ev) => {
|
|
490
495
|
fn(ev);
|
|
491
496
|
};
|
|
@@ -507,6 +512,13 @@ async function reconcileManagedAlive(service) {
|
|
|
507
512
|
return service.running;
|
|
508
513
|
}
|
|
509
514
|
async function queryServicesRuntime() {
|
|
515
|
+
if (!isDaemonServer()) {
|
|
516
|
+
const { queryRuntimeViaDaemon } = await import("./daemon/client.js");
|
|
517
|
+
return queryRuntimeViaDaemon();
|
|
518
|
+
}
|
|
519
|
+
return queryServicesRuntimeLocal();
|
|
520
|
+
}
|
|
521
|
+
async function queryServicesRuntimeLocal() {
|
|
510
522
|
return Promise.all(
|
|
511
523
|
SERVICE_NAMES.map(async (name) => {
|
|
512
524
|
const service = services[name];
|
|
@@ -621,9 +633,9 @@ export {
|
|
|
621
633
|
nonBlankOutputLines,
|
|
622
634
|
onServiceStateChange,
|
|
623
635
|
queryServicesRuntime,
|
|
636
|
+
queryServicesRuntimeLocal,
|
|
624
637
|
refreshServices,
|
|
625
638
|
services,
|
|
626
|
-
setArgvDaemonize,
|
|
627
639
|
startAll,
|
|
628
640
|
stopAll
|
|
629
641
|
};
|