@sfmc-bds/cli 0.2.0-beta.20 → 0.2.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/bds-runtime-version.d.ts +3 -0
  2. package/dist/bds-runtime-version.d.ts.map +1 -0
  3. package/dist/bds-runtime-version.js +15 -0
  4. package/dist/bds-runtime-version.js.map +7 -0
  5. package/dist/commands.d.ts.map +1 -1
  6. package/dist/commands.js +78 -75
  7. package/dist/commands.js.map +2 -2
  8. package/dist/llbot-launch.d.ts +3 -3
  9. package/dist/llbot-launch.js.map +1 -1
  10. package/dist/logs.js +3 -3
  11. package/dist/logs.js.map +2 -2
  12. package/dist/repl-windows/service-window.d.ts.map +1 -1
  13. package/dist/repl-windows/service-window.js +1 -0
  14. package/dist/repl-windows/service-window.js.map +2 -2
  15. package/dist/repl.d.ts.map +1 -1
  16. package/dist/repl.js +18 -12
  17. package/dist/repl.js.map +2 -2
  18. package/dist/send-target.d.ts.map +1 -1
  19. package/dist/send-target.js +2 -0
  20. package/dist/send-target.js.map +2 -2
  21. package/dist/services.d.ts +8 -1
  22. package/dist/services.d.ts.map +1 -1
  23. package/dist/services.js +151 -15
  24. package/dist/services.js.map +2 -2
  25. package/dist/ui-command.d.ts.map +1 -1
  26. package/dist/ui-command.js.map +2 -2
  27. package/dist/wizard.d.ts.map +1 -1
  28. package/dist/wizard.js +15 -8
  29. package/dist/wizard.js.map +2 -2
  30. package/package.json +4 -5
  31. package/scripts/module-install/lib/catalog.mjs +1 -1
  32. package/dist/command-surface.test.js +0 -92
  33. package/dist/command-surface.test.js.map +0 -7
  34. package/dist/debug-command.test.js +0 -76
  35. package/dist/debug-command.test.js.map +0 -7
  36. package/dist/log-filter.test.js +0 -181
  37. package/dist/log-filter.test.js.map +0 -7
  38. package/dist/log-translator.test.js +0 -120
  39. package/dist/log-translator.test.js.map +0 -7
  40. package/dist/logs-blank-line.test.js +0 -16
  41. package/dist/logs-blank-line.test.js.map +0 -7
  42. package/dist/module-toggle.test.js +0 -37
  43. package/dist/module-toggle.test.js.map +0 -7
  44. package/dist/pack-bundle.test.js +0 -111
  45. package/dist/pack-bundle.test.js.map +0 -7
  46. package/dist/player-session.test.js +0 -19
  47. package/dist/player-session.test.js.map +0 -7
  48. package/dist/repl-windows/host.test.js +0 -72
  49. package/dist/repl-windows/host.test.js.map +0 -7
  50. package/dist/services-output.test.js +0 -9
  51. package/dist/services-output.test.js.map +0 -7
  52. package/dist/world-packs-list.test.js +0 -11
  53. package/dist/world-packs-list.test.js.map +0 -7
  54. package/dist/world-packs-uninstall.test.js +0 -54
  55. package/dist/world-packs-uninstall.test.js.map +0 -7
  56. package/scripts/module-install/test/check-modules-config.test.ts +0 -46
  57. package/scripts/module-install/test/config-seeding.test.ts +0 -99
  58. package/scripts/module-install/test/install-resolver.test.ts +0 -47
  59. package/scripts/module-install/test/link-local.test.ts +0 -50
  60. package/scripts/module-install/test/local-resolver.test.ts +0 -44
  61. package/scripts/module-install/test/registry-index.test.ts +0 -27
package/dist/logs.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/logs.ts"],
4
- "sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n parseBdsEmbeddedLevel,\n stripBdsLogPrefix,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile, logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getCompiledLogFilter,\n shouldDropForDisk,\n shouldDropForDisplay,\n transformLogEntry,\n} from \"./log-filter.js\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\n/** \u518D\u5BFC\u51FA SDK BDS \u89E3\u6790\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u7528\u65B9\u7EDF\u4E00\u5165\u53E3\uFF0C\u6743\u5A01\u5728 @sfmc-bds/sdk/logs\uFF09 */\nexport { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u5265\u79BB BDS \u81EA\u5E26\u524D\u7F00\uFF1B\u82E5\u524D\u7F00\u540E\u6CA1\u6709\u6B63\u6587\uFF0C\u5219\u5224\u5B9A\u4E3A\u4EC5\u7528\u4E8E\u6392\u7248\u7684\u7A7A\u884C\u3002 */\nexport function normalizeBdsLogBody(text: string): string | null {\n const body = stripBdsLogPrefix(text);\n return body.trim().length > 0 ? body : null;\n}\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n let body = text;\n let lvl = level;\n /* BDS\uFF1A\u5148\u63D0\u53D6\u5185\u5D4C\u7EA7\u522B\uFF0C\u518D\u5265\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\uFF0C\u907F\u514D\u5C55\u793A/\u843D\u76D8\u91CD\u590D */\n if (source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(text);\n if (embedded) lvl = embedded;\n const normalized = normalizeBdsLogBody(text);\n if (normalized === null) return;\n body = normalized;\n }\n\n const rawEntry: LogEntry = { time: new Date(), text: body, source, level: lvl };\n const filter = getCompiledLogFilter((src) => {\n /* \u907F\u514D\u9012\u5F52\uFF1A\u975E\u6CD5\u6B63\u5219\u53EA\u5199\u6587\u4EF6 sink\uFF0C\u4E0D\u7ECF pushLog */\n try {\n const sink = sinkFor(\"system\");\n if (!sink) return;\n const warn: LogEntry = {\n time: new Date(),\n text: `log-filter: invalid regex skipped: ${src}`,\n source: \"system\",\n level: \"warn\",\n };\n sink.write(warn, formatLogLine(warn, false));\n } catch {\n /* ignore */\n }\n });\n\n const dropDisplay = shouldDropForDisplay(rawEntry, filter);\n const dropDisk = shouldDropForDisk(rawEntry, filter);\n const { entry: transformedEntry } = transformLogEntry(rawEntry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(transformedEntry.text, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n const diskEntry: LogEntry = filter.applyTo === \"all\" ? { ...rawEntry, text: transformedEntry.text } : rawEntry;\n sink.write(diskEntry, formatLogLine(diskEntry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4\uFF1B\u518D\u5957\u914D\u7F6E\u8FC7\u6EE4\uFF08display\uFF09 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7\uFF1B\u914D\u7F6E\u8FC7\u6EE4\u4EC5\u5F71\u54CD\u8FD4\u56DE\u89C6\u56FE\uFF08\u7F13\u51B2\u5185\u53EF\u80FD\u4ECD\u6709\u5168\u91CF\uFF0C\u89C6 push \u65F6 applyTo\uFF09 */\nexport function getAllLogs(): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/* ==================================================================\n * \u843D\u76D8\u6587\u4EF6\u8BFB\u53D6\uFF08/logs \u7A97\u7528\uFF0C\u4E0D\u8D70\u5185\u5B58\u7F13\u51B2\uFF09\n * ================================================================== */\n\n/** \u4E0E\u843D\u76D8\u7B56\u7565\u5BF9\u5E94\u7684\u6587\u4EF6\u57FA\u540D\uFF08\u4E0D\u542B .log\uFF09 */\nconst DISK_LOG_FILES = [\"bds\", \"llbot\", \"db\", \"qq\", \"bds-update\", \"sfmc\"] as const;\n\n/** source \u2192 \u843D\u76D8\u6587\u4EF6\u540D\uFF08\u542B\u5B50\u8FDB\u7A0B\u81EA\u5199\uFF09 */\nexport function diskFileForSource(source: string): string {\n if (source === \"update\") return \"bds-update\";\n if (source === \"bds\" || source === \"llbot\" || source === \"db\" || source === \"qq\") return source;\n return \"sfmc\";\n}\n\n/** formatLogLine \u65E0\u8272\u884C\uFF1A`YYYY-MM-DD HH:mm:ss [source] [LEVEL] text` */\nconst DISK_LINE_RE =\n /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[([^\\]]+)\\] \\[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\\]\\s?(.*)$/;\n\nfunction mapDiskLevelTag(tag: string): LogLevel {\n switch (tag) {\n case \"ERROR\":\n case \"FATAL\":\n return \"error\";\n case \"WARN\":\n return \"warn\";\n case \"OK\":\n case \"SUCCESS\":\n return \"success\";\n case \"DEBUG\":\n return \"debug\";\n default:\n return \"info\";\n }\n}\n\n/** \u89E3\u6790\u5355\u884C\u843D\u76D8\u65E5\u5FD7\uFF1B\u4E0D\u7B26\u683C\u5F0F\u8FD4\u56DE null */\nexport function parseDiskLogLine(raw: string): UnifiedLog | null {\n const m = DISK_LINE_RE.exec(raw);\n if (!m) return null;\n const ts = m[1]!;\n const source = m[2]!.trim();\n const level = mapDiskLevelTag(m[3]!);\n const body = m[4] ?? \"\";\n const time = new Date(ts.replace(\" \", \"T\") + \"Z\");\n return { time, source, level, text: body };\n}\n\nexport type ReadDiskLogsOpts = {\n levels?: LogLevel[];\n sources?: LogSource[];\n /** \u8986\u76D6\u65E5\u5FD7\u76EE\u5F55\uFF08\u6D4B\u8BD5\u7528\uFF09\uFF1B\u9ED8\u8BA4 `<ROOT>/.sfmc/logs` */\n dir?: string;\n};\n\n/**\n * \u4ECE `.sfmc/logs/*.log` \u8BFB\u53D6\u5E76\u89E3\u6790\u4E3A UnifiedLog\uFF08\u6309\u65F6\u95F4\u5347\u5E8F\uFF09\u3002\n * \u4F9B /logs \u7B5B\u9009\u7A97\u56DE\u653E\uFF1B\u4E0E\u5185\u5B58\u7F13\u51B2\u65E0\u5173\u3002\n */\nexport function readDiskLogs(opts: ReadDiskLogsOpts = {}): UnifiedLog[] {\n const levels = opts.levels ?? [];\n const sources = opts.sources ?? [];\n const dir = opts.dir ?? logsDir(ROOT);\n const fileNames = new Set<string>();\n if (sources.length === 0) {\n for (const n of DISK_LOG_FILES) fileNames.add(n);\n } else {\n for (const s of sources) fileNames.add(diskFileForSource(s));\n }\n\n const out: UnifiedLog[] = [];\n for (const name of fileNames) {\n const fp = path.join(dir, name.endsWith(\".log\") ? name : `${name}.log`);\n let text: string;\n try {\n text = fs.readFileSync(fp, \"utf8\");\n } catch {\n continue;\n }\n for (const raw of text.split(/\\r?\\n/)) {\n if (!raw) continue;\n const entry = parseDiskLogLine(raw);\n if (!entry) continue;\n if (sources.length && !sources.includes(entry.source)) continue;\n if (levels.length && !levels.includes(entry.level)) continue;\n out.push(entry);\n }\n }\n out.sort((a, b) => a.time.getTime() - b.time.getTime());\n return out;\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u65B9\u62EC\u53F7\u5185\u56FA\u5B9A 3 \u5B57\u7B26\uFF0C\u4E0E [INF] \u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDS\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DB \", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQ \", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \"BOT\", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \"SYS\", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \"UPD\", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \"PAK\", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"TOL\", paint: (s) => c.red(s) },\n];\n\n/** \u6E90\u6807\u7B7E\u65E0\u8272\u6587\u672C\uFF08formatSourceTag / logPrefixWidth \u5171\u7528\uFF09 */\nfunction sourceTagPlain(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return `[${meta.name}]`;\n return `[${source.toUpperCase().padEnd(3).slice(0, 3)}]`;\n}\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n const plain = sourceTagPlain(source);\n if (meta) return meta.paint(plain);\n return c.bold(plain);\n}\n\n/**\n * \u5C55\u793A\u7528\u7EA7\u522B\uFF1ABDS \u82E5\u4ECD\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u5219\u89E3\u6790\u5185\u5D4C\u7EA7\u522B\uFF1B\u5DF2\u5265\u79BB\uFF08pushLog \u5165\u5E93\uFF09\u5219\u4FE1\u4EFB entry.level\u3002\n * \u7981\u6B62\u5BF9\u6B63\u6587\u505A\u677E\u6563\u5173\u952E\u8BCD\u5339\u914D\uFF08\u4F1A\u628A `[Commands] Error on line` \u8BEF\u5224\u4E3A error\uFF09\u3002\n */\nexport function resolveDisplayLevel(l: UnifiedLog): LogLevel {\n if (l.source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(l.text);\n if (embedded) return embedded;\n }\n return l.level;\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u7EA7\u522B\uFF1A\u59D4\u6258\u5171\u4EAB\u5305\uFF08\u5185\u542B BDS \u65F6\u95F4\u6233\u89E3\u6790\uFF09 */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E\u6587\u672C\uFF08\u53EF\u89C1\u5BBD\u5EA6\u6743\u5A01\u6E90\uFF1B\u62EC\u53F7\u5185\u5747\u4E3A 3 \u5B57\u7B26\uFF09 */\nconst LEVEL_TAG_TEXT: Record<LogLevel, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagPlain(lvl: LogLevel): string {\n return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n const text = levelTagPlain(lvl);\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTag(level);\n const src = formatSourceTag(l.source);\n /* BDS\uFF1A\u53BB\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\u524D\u7F00\u540E\u518D\u672C\u5730\u5316\u7FFB\u8BD1\u4E0E\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u8F6C\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\u4E14\u8986\u76D6\u56DE\u653E\uFF09 */\n const body = l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text;\n const filter = getCompiledLogFilter();\n const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);\n const txt = highlightLogLine(entry.text);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\uFF08\u5171\u7528 resolveDisplayLevel / sourceTagPlain / levelTagPlain\uFF09\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const src = sourceTagPlain(l.source);\n const level = resolveDisplayLevel(l);\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n parseBdsEmbeddedLevel,\n stripBdsLogPrefix,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile, logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getCompiledLogFilter,\n shouldDropForDisk,\n shouldDropForDisplay,\n transformLogEntry,\n} from \"./log-filter.js\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\n/** \u518D\u5BFC\u51FA SDK BDS \u89E3\u6790\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u7528\u65B9\u7EDF\u4E00\u5165\u53E3\uFF0C\u6743\u5A01\u5728 @sfmc-bds/sdk/logs\uFF09 */\nexport { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u5265\u79BB BDS \u81EA\u5E26\u524D\u7F00\uFF1B\u82E5\u524D\u7F00\u540E\u6CA1\u6709\u6B63\u6587\uFF0C\u5219\u5224\u5B9A\u4E3A\u4EC5\u7528\u4E8E\u6392\u7248\u7684\u7A7A\u884C\u3002 */\nexport function normalizeBdsLogBody(text: string): string | null {\n const body = stripBdsLogPrefix(text);\n return body.trim().length > 0 ? body : null;\n}\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\" || source === \"tunnel\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n let body = text;\n let lvl = level;\n /* BDS\uFF1A\u5148\u63D0\u53D6\u5185\u5D4C\u7EA7\u522B\uFF0C\u518D\u5265\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\uFF0C\u907F\u514D\u5C55\u793A/\u843D\u76D8\u91CD\u590D */\n if (source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(text);\n if (embedded) lvl = embedded;\n const normalized = normalizeBdsLogBody(text);\n if (normalized === null) return;\n body = normalized;\n }\n\n const rawEntry: LogEntry = { time: new Date(), text: body, source, level: lvl };\n const filter = getCompiledLogFilter((src) => {\n /* \u907F\u514D\u9012\u5F52\uFF1A\u975E\u6CD5\u6B63\u5219\u53EA\u5199\u6587\u4EF6 sink\uFF0C\u4E0D\u7ECF pushLog */\n try {\n const sink = sinkFor(\"system\");\n if (!sink) return;\n const warn: LogEntry = {\n time: new Date(),\n text: `log-filter: invalid regex skipped: ${src}`,\n source: \"system\",\n level: \"warn\",\n };\n sink.write(warn, formatLogLine(warn, false));\n } catch {\n /* ignore */\n }\n });\n\n const dropDisplay = shouldDropForDisplay(rawEntry, filter);\n const dropDisk = shouldDropForDisk(rawEntry, filter);\n const { entry: transformedEntry } = transformLogEntry(rawEntry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(transformedEntry.text, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n const diskEntry: LogEntry = filter.applyTo === \"all\" ? { ...rawEntry, text: transformedEntry.text } : rawEntry;\n sink.write(diskEntry, formatLogLine(diskEntry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4\uFF1B\u518D\u5957\u914D\u7F6E\u8FC7\u6EE4\uFF08display\uFF09 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7\uFF1B\u914D\u7F6E\u8FC7\u6EE4\u4EC5\u5F71\u54CD\u8FD4\u56DE\u89C6\u56FE\uFF08\u7F13\u51B2\u5185\u53EF\u80FD\u4ECD\u6709\u5168\u91CF\uFF0C\u89C6 push \u65F6 applyTo\uFF09 */\nexport function getAllLogs(): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/* ==================================================================\n * \u843D\u76D8\u6587\u4EF6\u8BFB\u53D6\uFF08/logs \u7A97\u7528\uFF0C\u4E0D\u8D70\u5185\u5B58\u7F13\u51B2\uFF09\n * ================================================================== */\n\n/** \u4E0E\u843D\u76D8\u7B56\u7565\u5BF9\u5E94\u7684\u6587\u4EF6\u57FA\u540D\uFF08\u4E0D\u542B .log\uFF09 */\nconst DISK_LOG_FILES = [\"bds\", \"llbot\", \"tunnel\", \"db\", \"qq\", \"bds-update\", \"sfmc\"] as const;\n\n/** source \u2192 \u843D\u76D8\u6587\u4EF6\u540D\uFF08\u542B\u5B50\u8FDB\u7A0B\u81EA\u5199\uFF09 */\nexport function diskFileForSource(source: string): string {\n if (source === \"update\") return \"bds-update\";\n if (source === \"bds\" || source === \"llbot\" || source === \"tunnel\" || source === \"db\" || source === \"qq\") return source;\n return \"sfmc\";\n}\n\n/** formatLogLine \u65E0\u8272\u884C\uFF1A`YYYY-MM-DD HH:mm:ss [source] [LEVEL] text` */\nconst DISK_LINE_RE =\n /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[([^\\]]+)\\] \\[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\\]\\s?(.*)$/;\n\nfunction mapDiskLevelTag(tag: string): LogLevel {\n switch (tag) {\n case \"ERROR\":\n case \"FATAL\":\n return \"error\";\n case \"WARN\":\n return \"warn\";\n case \"OK\":\n case \"SUCCESS\":\n return \"success\";\n case \"DEBUG\":\n return \"debug\";\n default:\n return \"info\";\n }\n}\n\n/** \u89E3\u6790\u5355\u884C\u843D\u76D8\u65E5\u5FD7\uFF1B\u4E0D\u7B26\u683C\u5F0F\u8FD4\u56DE null */\nexport function parseDiskLogLine(raw: string): UnifiedLog | null {\n const m = DISK_LINE_RE.exec(raw);\n if (!m) return null;\n const ts = m[1]!;\n const source = m[2]!.trim();\n const level = mapDiskLevelTag(m[3]!);\n const body = m[4] ?? \"\";\n const time = new Date(ts.replace(\" \", \"T\") + \"Z\");\n return { time, source, level, text: body };\n}\n\nexport type ReadDiskLogsOpts = {\n levels?: LogLevel[];\n sources?: LogSource[];\n /** \u8986\u76D6\u65E5\u5FD7\u76EE\u5F55\uFF08\u6D4B\u8BD5\u7528\uFF09\uFF1B\u9ED8\u8BA4 `<ROOT>/.sfmc/logs` */\n dir?: string;\n};\n\n/**\n * \u4ECE `.sfmc/logs/*.log` \u8BFB\u53D6\u5E76\u89E3\u6790\u4E3A UnifiedLog\uFF08\u6309\u65F6\u95F4\u5347\u5E8F\uFF09\u3002\n * \u4F9B /logs \u7B5B\u9009\u7A97\u56DE\u653E\uFF1B\u4E0E\u5185\u5B58\u7F13\u51B2\u65E0\u5173\u3002\n */\nexport function readDiskLogs(opts: ReadDiskLogsOpts = {}): UnifiedLog[] {\n const levels = opts.levels ?? [];\n const sources = opts.sources ?? [];\n const dir = opts.dir ?? logsDir(ROOT);\n const fileNames = new Set<string>();\n if (sources.length === 0) {\n for (const n of DISK_LOG_FILES) fileNames.add(n);\n } else {\n for (const s of sources) fileNames.add(diskFileForSource(s));\n }\n\n const out: UnifiedLog[] = [];\n for (const name of fileNames) {\n const fp = path.join(dir, name.endsWith(\".log\") ? name : `${name}.log`);\n let text: string;\n try {\n text = fs.readFileSync(fp, \"utf8\");\n } catch {\n continue;\n }\n for (const raw of text.split(/\\r?\\n/)) {\n if (!raw) continue;\n const entry = parseDiskLogLine(raw);\n if (!entry) continue;\n if (sources.length && !sources.includes(entry.source)) continue;\n if (levels.length && !levels.includes(entry.level)) continue;\n out.push(entry);\n }\n }\n out.sort((a, b) => a.time.getTime() - b.time.getTime());\n return out;\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u65B9\u62EC\u53F7\u5185\u56FA\u5B9A 3 \u5B57\u7B26\uFF0C\u4E0E [INF] \u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDS\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DB \", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQ \", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \"BOT\", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \"SYS\", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \"UPD\", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \"PAK\", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"TOL\", paint: (s) => c.red(s) },\n];\n\n/** \u6E90\u6807\u7B7E\u65E0\u8272\u6587\u672C\uFF08formatSourceTag / logPrefixWidth \u5171\u7528\uFF09 */\nfunction sourceTagPlain(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return `[${meta.name}]`;\n return `[${source.toUpperCase().padEnd(3).slice(0, 3)}]`;\n}\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n const plain = sourceTagPlain(source);\n if (meta) return meta.paint(plain);\n return c.bold(plain);\n}\n\n/**\n * \u5C55\u793A\u7528\u7EA7\u522B\uFF1ABDS \u82E5\u4ECD\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u5219\u89E3\u6790\u5185\u5D4C\u7EA7\u522B\uFF1B\u5DF2\u5265\u79BB\uFF08pushLog \u5165\u5E93\uFF09\u5219\u4FE1\u4EFB entry.level\u3002\n * \u7981\u6B62\u5BF9\u6B63\u6587\u505A\u677E\u6563\u5173\u952E\u8BCD\u5339\u914D\uFF08\u4F1A\u628A `[Commands] Error on line` \u8BEF\u5224\u4E3A error\uFF09\u3002\n */\nexport function resolveDisplayLevel(l: UnifiedLog): LogLevel {\n if (l.source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(l.text);\n if (embedded) return embedded;\n }\n return l.level;\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u7EA7\u522B\uFF1A\u59D4\u6258\u5171\u4EAB\u5305\uFF08\u5185\u542B BDS \u65F6\u95F4\u6233\u89E3\u6790\uFF09 */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E\u6587\u672C\uFF08\u53EF\u89C1\u5BBD\u5EA6\u6743\u5A01\u6E90\uFF1B\u62EC\u53F7\u5185\u5747\u4E3A 3 \u5B57\u7B26\uFF09 */\nconst LEVEL_TAG_TEXT: Record<LogLevel, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagPlain(lvl: LogLevel): string {\n return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n const text = levelTagPlain(lvl);\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTag(level);\n const src = formatSourceTag(l.source);\n /* BDS\uFF1A\u53BB\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\u524D\u7F00\u540E\u518D\u672C\u5730\u5316\u7FFB\u8BD1\u4E0E\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u8F6C\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\u4E14\u8986\u76D6\u56DE\u653E\uFF09 */\n const body = l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text;\n const filter = getCompiledLogFilter();\n const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);\n const txt = highlightLogLine(entry.text);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\uFF08\u5171\u7528 resolveDisplayLevel / sourceTagPlain / levelTagPlain\uFF09\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const src = sourceTagPlain(l.source);\n const level = resolveDisplayLevel(l);\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
5
+ "mappings": "AAeA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,OAIK;AACP,SAAS,SAAS,eAAe;AACjC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,GAAG,wBAAwB;AACpC,SAAS,YAAY;AAOrB,SAAS,kBAAkB,yBAAAA,wBAAuB,qBAAAC,0BAAyB;AAE3E,MAAM,SAAS,mBAAmB,GAAI;AAGtC,MAAM,sBAAsB,oBAAI,IAAI,CAAC,MAAM,MAAM,QAAQ,CAAC;AAE1D,MAAM,YAAY,oBAAI,IAAsB;AAGrC,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,OAAO,kBAAkB,IAAI;AACnC,SAAO,KAAK,KAAK,EAAE,SAAS,IAAI,OAAO;AACzC;AAGA,SAAS,mBAAmB,QAA+B;AACzD,MAAI,oBAAoB,IAAI,MAAM,EAAG,QAAO;AAC5C,MAAI,WAAW,SAAS,WAAW,WAAW,WAAW,SAAU,QAAO;AAC1E,SAAO;AACT;AAEA,SAAS,QAAQ,QAAiC;AAChD,QAAM,OAAO,mBAAmB,MAAM;AACtC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,OAAO,UAAU,IAAI,IAAI;AAC7B,MAAI,CAAC,MAAM;AACT,WAAO,eAAe,QAAQ,MAAM,IAAI,CAAC;AACzC,cAAU,IAAI,MAAM,IAAI;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,QAAQ,GAAG,QAAQ,MAAM;AACvB,aAAW,QAAQ,UAAU,OAAO,EAAG,MAAK,MAAM;AACpD,CAAC;AAGM,SAAS,QAAQ,MAAc,QAAmB,OAAuB;AAC9E,MAAI,OAAO;AACX,MAAI,MAAM;AAEV,MAAI,WAAW,OAAO;AACpB,UAAM,WAAW,sBAAsB,IAAI;AAC3C,QAAI,SAAU,OAAM;AACpB,UAAM,aAAa,oBAAoB,IAAI;AAC3C,QAAI,eAAe,KAAM;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAqB,EAAE,MAAM,oBAAI,KAAK,GAAG,MAAM,MAAM,QAAQ,OAAO,IAAI;AAC9E,QAAM,SAAS,qBAAqB,CAAC,QAAQ;AAE3C,QAAI;AACF,YAAMC,QAAO,QAAQ,QAAQ;AAC7B,UAAI,CAACA,MAAM;AACX,YAAM,OAAiB;AAAA,QACrB,MAAM,oBAAI,KAAK;AAAA,QACf,MAAM,sCAAsC,GAAG;AAAA,QAC/C,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AACA,MAAAA,MAAK,MAAM,MAAM,cAAc,MAAM,KAAK,CAAC;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAED,QAAM,cAAc,qBAAqB,UAAU,MAAM;AACzD,QAAM,WAAW,kBAAkB,UAAU,MAAM;AACnD,QAAM,EAAE,OAAO,iBAAiB,IAAI,kBAAkB,UAAU,MAAM;AAEtE,MAAI,CAAC,aAAa;AAChB,WAAO,WAAW,iBAAiB,MAAM,QAAQ,GAAG;AAAA,EACtD;AAEA,MAAI,SAAU;AACd,QAAM,OAAO,QAAQ,MAAM;AAC3B,MAAI,CAAC,KAAM;AACX,MAAI;AACF,UAAM,YAAsB,OAAO,YAAY,QAAQ,EAAE,GAAG,UAAU,MAAM,iBAAiB,KAAK,IAAI;AACtG,SAAK,MAAM,WAAW,cAAc,WAAW,KAAK,CAAC;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,MAAM,IAA2C;AAC/D,SAAO,OAAO,UAAU,EAAE;AAC5B;AAGO,SAAS,cAAc,GAAW,QAAoB,SAAoC;AAC/F,QAAM,SAAS,qBAAqB;AACpC,SAAO,OAAO,UAAU,GAAG,QAAQ,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC;AAC5F;AAGO,SAAS,aAA2B;AACzC,QAAM,SAAS,qBAAqB;AACpC,SAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC;AACvE;AAOA,MAAM,iBAAiB,CAAC,OAAO,SAAS,UAAU,MAAM,MAAM,cAAc,MAAM;AAG3E,SAAS,kBAAkB,QAAwB;AACxD,MAAI,WAAW,SAAU,QAAO;AAChC,MAAI,WAAW,SAAS,WAAW,WAAW,WAAW,YAAY,WAAW,QAAQ,WAAW,KAAM,QAAO;AAChH,SAAO;AACT;AAGA,MAAM,eACJ;AAEF,SAAS,gBAAgB,KAAuB;AAC9C,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,iBAAiB,KAAgC;AAC/D,QAAM,IAAI,aAAa,KAAK,GAAG;AAC/B,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,KAAK,EAAE,CAAC;AACd,QAAM,SAAS,EAAE,CAAC,EAAG,KAAK;AAC1B,QAAM,QAAQ,gBAAgB,EAAE,CAAC,CAAE;AACnC,QAAM,OAAO,EAAE,CAAC,KAAK;AACrB,QAAM,OAAO,oBAAI,KAAK,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG;AAChD,SAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,KAAK;AAC3C;AAaO,SAAS,aAAa,OAAyB,CAAC,GAAiB;AACtE,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,QAAM,UAAU,KAAK,WAAW,CAAC;AACjC,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,MAAI,QAAQ,WAAW,GAAG;AACxB,eAAW,KAAK,eAAgB,WAAU,IAAI,CAAC;AAAA,EACjD,OAAO;AACL,eAAW,KAAK,QAAS,WAAU,IAAI,kBAAkB,CAAC,CAAC;AAAA,EAC7D;AAEA,QAAM,MAAoB,CAAC;AAC3B,aAAW,QAAQ,WAAW;AAC5B,UAAM,KAAK,KAAK,KAAK,KAAK,KAAK,SAAS,MAAM,IAAI,OAAO,GAAG,IAAI,MAAM;AACtE,QAAI;AACJ,QAAI;AACF,aAAO,GAAG,aAAa,IAAI,MAAM;AAAA,IACnC,QAAQ;AACN;AAAA,IACF;AACA,eAAW,OAAO,KAAK,MAAM,OAAO,GAAG;AACrC,UAAI,CAAC,IAAK;AACV,YAAM,QAAQ,iBAAiB,GAAG;AAClC,UAAI,CAAC,MAAO;AACZ,UAAI,QAAQ,UAAU,CAAC,QAAQ,SAAS,MAAM,MAAM,EAAG;AACvD,UAAI,OAAO,UAAU,CAAC,OAAO,SAAS,MAAM,KAAK,EAAG;AACpD,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,EACF;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC;AACtD,SAAO;AACT;AAaO,MAAM,cAA4B;AAAA,EACvC,EAAE,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;AAAA,EACtD,EAAE,OAAO,MAAM,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAAA,EACpD,EAAE,OAAO,MAAM,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EACtD,EAAE,OAAO,SAAS,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EACzD,EAAE,OAAO,UAAU,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAAA,EACxD,EAAE,OAAO,UAAU,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EAC1D,EAAE,OAAO,QAAQ,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EACxD,EAAE,OAAO,aAAa,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;AAC5D;AAGA,SAAS,eAAe,QAAwB;AAC9C,QAAM,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM;AACvD,MAAI,KAAM,QAAO,IAAI,KAAK,IAAI;AAC9B,SAAO,IAAI,OAAO,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AACvD;AAEO,SAAS,gBAAgB,QAAwB;AACtD,QAAM,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM;AACvD,QAAM,QAAQ,eAAe,MAAM;AACnC,MAAI,KAAM,QAAO,KAAK,MAAM,KAAK;AACjC,SAAO,EAAE,KAAK,KAAK;AACrB;AAMO,SAAS,oBAAoB,GAAyB;AAC3D,MAAI,EAAE,WAAW,OAAO;AACtB,UAAM,WAAW,sBAAsB,EAAE,IAAI;AAC7C,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,SAAO,EAAE;AACX;AAGO,SAAS,WAAW,MAAwB;AACjD,SAAO,iBAAiB,IAAI;AAC9B;AAGA,MAAM,iBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,cAAc,KAAuB;AAC5C,SAAO,eAAe,GAAG,KAAK,eAAe;AAC/C;AAEA,SAAS,SAAS,KAAuB;AACvC,QAAM,OAAO,cAAc,GAAG;AAC9B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,OAAO,IAAI;AAAA,IACtB,KAAK;AACH,aAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB;AACE,aAAO,EAAE,KAAK,IAAI;AAAA,EACtB;AACF;AAGO,SAAS,UAAU,GAAuB;AAC/C,QAAM,KAAK,EAAE,IAAI,EAAE,KAAK,mBAAmB,CAAC;AAC5C,QAAM,QAAQ,oBAAoB,CAAC;AACnC,QAAM,MAAM,SAAS,KAAK;AAC1B,QAAM,MAAM,gBAAgB,EAAE,MAAM;AAEpC,QAAM,OAAO,EAAE,WAAW,QAAQ,kBAAkB,EAAE,IAAI,IAAI,EAAE;AAChE,QAAM,SAAS,qBAAqB;AACpC,QAAM,EAAE,MAAM,IAAI,kBAAkB,EAAE,MAAM,MAAM,QAAQ,EAAE,QAAQ,MAAM,GAAG,MAAM;AACnF,QAAM,MAAM,iBAAiB,MAAM,IAAI;AACvC,SAAO,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AACnC;AAOA,SAAS,UAAU,IAAoB;AACrC,QAAM,KAAK,GAAG,YAAY,CAAC,KAAK;AAChC,MACE,MAAM,SACL,MAAM,QACJ,MAAM,SAAU,MAAM,SAAU,OAAO,SACvC,MAAM,SAAU,MAAM,SACtB,MAAM,SAAU,MAAM,SACtB,MAAM,SAAU,MAAM,SACtB,MAAM,SAAU,MAAM,SACtB,MAAM,SAAU,MAAM,SACtB,MAAM,UAAW,MAAM;AAE1B,WAAO;AACT,SAAO;AACT;AAGO,SAAS,aAAa,GAAmB;AAC9C,QAAM,WAAW,EAAE,QAAQ,mBAAmB,EAAE;AAChD,MAAI,IAAI;AACR,aAAW,MAAM,SAAU,MAAK,UAAU,EAAE;AAC5C,SAAO;AACT;AAMO,SAAS,eAAe,GAAuB;AACpD,QAAM,KAAK,EAAE,KAAK,mBAAmB;AACrC,QAAM,MAAM,eAAe,EAAE,MAAM;AACnC,QAAM,QAAQ,oBAAoB,CAAC;AACnC,SAAO,aAAa,GAAG,EAAE,IAAI,GAAG,IAAI,cAAc,KAAK,CAAC,GAAG;AAC7D;AAOO,SAAS,YAAY,GAAW,QAAwB;AAC7D,QAAM,UAAU,QAAQ,OAAO,WAAW;AAE1C,QAAM,OAAO,KAAK,IAAI,UAAU,GAAG,SAAS,CAAC;AAC7C,QAAM,WAAW,EAAE,MAAM,OAAO;AAChC,QAAM,MAAgB,CAAC;AACvB,WAAS,KAAK,GAAG,KAAK,SAAS,QAAQ,MAAM;AAC3C,UAAM,MAAM,SAAS,EAAE;AAEvB,UAAM,QAAQ,OAAO,IAAI,MAAM,IAAI,QAAQ,WAAW,EAAE;AACxD,QAAI,KAAK,YAAY,OAAO,MAAM,OAAO,IAAI,IAAI,QAAQ,MAAM,CAAC;AAAA,EAClE;AACA,SAAO,IAAI,KAAK,IAAI;AACtB;AAGA,SAAS,YAAY,GAAW,MAAc,UAAkB,YAA4B;AAC1F,MAAI,EAAE,WAAW,EAAG,QAAO,WAAW,IAAI,IAAI,OAAO,QAAQ,IAAI;AAEjE,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,WAAW,IAAI,IAAI,OAAO,QAAQ,IAAI;AAChD,MAAI,IAAI;AAER,QAAM,YAAsB,CAAC;AAE7B,QAAM,gBAAgB,MAAY;AAChC,QAAI,UAAU,OAAQ,QAAO;AAAA,EAC/B;AACA,QAAM,aAAa,MAAY;AAC7B,eAAW,QAAQ,UAAW,QAAO;AAAA,EACvC;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,EAAE,QAAQ;AACnB,UAAM,IAAI,kBAAkB,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3C,QAAI,GAAG;AACL,YAAM,OAAO,EAAE,CAAC;AAChB,aAAO;AACP,UAAI,SAAS,UAAW,WAAU,SAAS;AAAA,UACtC,WAAU,KAAK,IAAI;AACxB,WAAK,KAAK;AACV;AAAA,IACF;AAEA,UAAM,KAAK,EAAE,YAAY,CAAC;AAC1B,UAAM,KAAK,OAAO,cAAc,EAAE;AAClC,UAAM,KAAK,UAAU,EAAE;AACvB,UAAM,UAAU,GAAG;AAGnB,QAAI,IAAI,KAAK,QAAQ,IAAI,UAAU;AACjC,oBAAc;AACd,YAAM,KAAK,GAAG;AACd,YAAM,IAAI,OAAO,UAAU;AAC3B,iBAAW;AACX,UAAI;AACJ,iBAAW;AAAA,IACb;AAEA,WAAO;AACP,SAAK;AACL,SAAK;AAAA,EACP;AAEA,MAAI,UAAU,OAAQ,QAAO;AAC7B,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;",
6
6
  "names": ["parseBdsEmbeddedLevel", "stripBdsLogPrefix", "sink"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service-window.d.ts","sourceRoot":"","sources":["../../src/repl-windows/service-window.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAqBjE"}
1
+ {"version":3,"file":"service-window.d.ts","sourceRoot":"","sources":["../../src/repl-windows/service-window.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAqBjE"}
@@ -2,6 +2,7 @@ import { getQqBackendMode } from "../services.js";
2
2
  import { formatLogDisplay, logDisplayPrefixWidth } from "./format-display.js";
3
3
  import { serviceWindowId } from "./host.js";
4
4
  function serviceWindowTitle(name) {
5
+ if (name === "tunnel") return "QQ\xB7T";
5
6
  if (name === "qq") {
6
7
  return getQqBackendMode() === "llbot" ? "QQ\xB7LLBOT" : "QQ\xB7OFFICIAL";
7
8
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/repl-windows/service-window.ts"],
4
- "sourcesContent": ["/**\n * repl-windows/service-window.ts \u2014 \u6D3B\u8DC3\u670D\u52A1\u65E5\u5FD7\u7A97\uFF08\u7701\u7565\u6E90\u6807\u7B7E\uFF09\n */\nimport type { UnifiedLog } from \"../logs.js\";\nimport { getQqBackendMode, type ServiceName } from \"../services.js\";\nimport { formatLogDisplay, logDisplayPrefixWidth } from \"./format-display.js\";\nimport { serviceWindowId } from \"./host.js\";\nimport type { ReplWindow } from \"./types.js\";\n\nfunction serviceWindowTitle(name: ServiceName): string {\n if (name === \"qq\") {\n return getQqBackendMode() === \"llbot\" ? \"QQ\u00B7LLBOT\" : \"QQ\u00B7OFFICIAL\";\n }\n return name.toUpperCase();\n}\n\nexport function createServiceWindow(name: ServiceName): ReplWindow {\n const id = serviceWindowId(name);\n return {\n id,\n title: serviceWindowTitle(name),\n showsInput: true,\n footerShortcuts: \"\",\n serviceName: name,\n acceptLog(log: UnifiedLog): boolean {\n return log.source === name;\n },\n formatLogLine(log: UnifiedLog) {\n return {\n text: formatLogDisplay(log, { omitSource: true }),\n indent: logDisplayPrefixWidth(log, { omitSource: true }),\n };\n },\n getReplayFilter() {\n return { levels: [], sources: [name] };\n },\n };\n}\n"],
5
- "mappings": "AAIA,SAAS,wBAA0C;AACnD,SAAS,kBAAkB,6BAA6B;AACxD,SAAS,uBAAuB;AAGhC,SAAS,mBAAmB,MAA2B;AACrD,MAAI,SAAS,MAAM;AACjB,WAAO,iBAAiB,MAAM,UAAU,gBAAa;AAAA,EACvD;AACA,SAAO,KAAK,YAAY;AAC1B;AAEO,SAAS,oBAAoB,MAA+B;AACjE,QAAM,KAAK,gBAAgB,IAAI;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,OAAO,mBAAmB,IAAI;AAAA,IAC9B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,UAAU,KAA0B;AAClC,aAAO,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,cAAc,KAAiB;AAC7B,aAAO;AAAA,QACL,MAAM,iBAAiB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,QAChD,QAAQ,sBAAsB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,IACA,kBAAkB;AAChB,aAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE;AAAA,IACvC;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["/**\n * repl-windows/service-window.ts \u2014 \u6D3B\u8DC3\u670D\u52A1\u65E5\u5FD7\u7A97\uFF08\u7701\u7565\u6E90\u6807\u7B7E\uFF09\n */\nimport type { UnifiedLog } from \"../logs.js\";\nimport { getQqBackendMode, type ServiceName } from \"../services.js\";\nimport { formatLogDisplay, logDisplayPrefixWidth } from \"./format-display.js\";\nimport { serviceWindowId } from \"./host.js\";\nimport type { ReplWindow } from \"./types.js\";\n\nfunction serviceWindowTitle(name: ServiceName): string {\n if (name === \"tunnel\") return \"QQ\u00B7T\";\n if (name === \"qq\") {\n return getQqBackendMode() === \"llbot\" ? \"QQ\u00B7LLBOT\" : \"QQ\u00B7OFFICIAL\";\n }\n return name.toUpperCase();\n}\n\nexport function createServiceWindow(name: ServiceName): ReplWindow {\n const id = serviceWindowId(name);\n return {\n id,\n title: serviceWindowTitle(name),\n showsInput: true,\n footerShortcuts: \"\",\n serviceName: name,\n acceptLog(log: UnifiedLog): boolean {\n return log.source === name;\n },\n formatLogLine(log: UnifiedLog) {\n return {\n text: formatLogDisplay(log, { omitSource: true }),\n indent: logDisplayPrefixWidth(log, { omitSource: true }),\n };\n },\n getReplayFilter() {\n return { levels: [], sources: [name] };\n },\n };\n}\n"],
5
+ "mappings": "AAIA,SAAS,wBAA0C;AACnD,SAAS,kBAAkB,6BAA6B;AACxD,SAAS,uBAAuB;AAGhC,SAAS,mBAAmB,MAA2B;AACrD,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,MAAM;AACjB,WAAO,iBAAiB,MAAM,UAAU,gBAAa;AAAA,EACvD;AACA,SAAO,KAAK,YAAY;AAC1B;AAEO,SAAS,oBAAoB,MAA+B;AACjE,QAAM,KAAK,gBAAgB,IAAI;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,OAAO,mBAAmB,IAAI;AAAA,IAC9B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,UAAU,KAA0B;AAClC,aAAO,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,cAAc,KAAiB;AAC7B,aAAO;AAAA,QACL,MAAM,iBAAiB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,QAChD,QAAQ,sBAAsB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,IACA,kBAAkB;AAChB,aAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE;AAAA,IACvC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAcA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgN9B,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D;AAcD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAE1D;AAifD,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG9D,CAAC;AAmBJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA4R/C"}
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAcA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgN9B,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D;AAcD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAE1D;AAofD,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG9D,CAAC;AAmBJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiS/C"}
package/dist/repl.js CHANGED
@@ -46,8 +46,8 @@ import {
46
46
  SFMC_WINDOW_ID,
47
47
  WindowHost
48
48
  } from "./repl-windows/index.js";
49
- import { listActiveSendTargets, paintSendPrompt, paintSfmcPrompt, plainPrompt } from "./send-target.js";
50
- import { forceStopAll, onServiceStateChange, SERVICE_NAMES, stopAll } from "./services.js";
49
+ import { SEND_TARGET_ORDER, paintSendPrompt, paintSfmcPrompt, plainPrompt } from "./send-target.js";
50
+ import { forceStopAll, onServiceStateChange, queryServicesRuntime, SERVICE_NAMES, stopAll } from "./services.js";
51
51
  import { c, T } from "./theme.js";
52
52
  import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
53
53
  const REPL_MODE = "repl";
@@ -396,6 +396,7 @@ async function readLine(opts) {
396
396
  clearOverlay();
397
397
  stdout.write(p + line);
398
398
  if (suggestion) stdout.write(c.dim(suggestion));
399
+ else if (!line) stdout.write(c.dim(opts.getEmptyHint?.() ?? ""));
399
400
  if (slashMode()) {
400
401
  const view = paletteView();
401
402
  const indent = promptSlashColumn(p);
@@ -693,6 +694,7 @@ async function startRepl() {
693
694
  let logsFilterState = { levels: [], sources: [] };
694
695
  let preferredTarget = null;
695
696
  let activeTargets = [];
697
+ let activeServiceWindows = [];
696
698
  let pendingInput = "";
697
699
  const host = new WindowHost({
698
700
  writeLog: writeLogLineToTty,
@@ -753,22 +755,22 @@ async function startRepl() {
753
755
  onFilterChanged: () => showActiveWindow({ reseed: true })
754
756
  })
755
757
  );
756
- function syncServiceWindows(targets) {
757
- if (targets.length === 0) {
758
+ function syncServiceWindows(windows) {
759
+ if (windows.length === 0) {
758
760
  host.setServiceOrder([]);
759
761
  preferredTarget = null;
760
762
  return;
761
763
  }
762
- for (const name of targets) {
764
+ for (const name of windows) {
763
765
  const id = serviceWindowId(name);
764
766
  if (!host.has(id)) host.register(createServiceWindow(name));
765
767
  }
766
768
  if (!host.has(SFMC_WINDOW_ID)) {
767
- host.register(createSfmcWindow({ getActiveTargets: () => activeTargets }));
769
+ host.register(createSfmcWindow({ getActiveTargets: () => activeServiceWindows }));
768
770
  }
769
- host.setServiceOrder([...targets.map(serviceWindowId), SFMC_WINDOW_ID]);
771
+ host.setServiceOrder([...windows.map(serviceWindowId), SFMC_WINDOW_ID]);
770
772
  const svc = host.getActive()?.serviceName;
771
- if (svc) preferredTarget = svc;
773
+ if (svc && activeTargets.includes(svc)) preferredTarget = svc;
772
774
  }
773
775
  function openLogsWindow() {
774
776
  host.open("logs");
@@ -784,8 +786,10 @@ async function startRepl() {
784
786
  });
785
787
  async function refreshTargetsFromRuntime() {
786
788
  const prevId = host.getActiveId();
787
- activeTargets = await listActiveSendTargets();
788
- syncServiceWindows(activeTargets);
789
+ const running = new Set((await queryServicesRuntime()).filter((row) => row.running).map((row) => row.name));
790
+ activeTargets = SEND_TARGET_ORDER.filter((name) => running.has(name));
791
+ activeServiceWindows = SERVICE_NAMES.filter((name) => running.has(name));
792
+ syncServiceWindows(activeServiceWindows);
789
793
  if (preferredTarget && !activeTargets.includes(preferredTarget)) {
790
794
  preferredTarget = activeTargets[0] ?? null;
791
795
  }
@@ -812,6 +816,7 @@ async function startRepl() {
812
816
  function currentTarget() {
813
817
  if (activeTargets.length === 0) return null;
814
818
  if (host.getActive()?.id === SFMC_WINDOW_ID) return null;
819
+ if (host.getActive()?.showsInput === false || host.getActive()?.serviceName === "tunnel") return null;
815
820
  const fromWin = host.getActive()?.serviceName;
816
821
  if (fromWin && activeTargets.includes(fromWin)) {
817
822
  preferredTarget = fromWin;
@@ -832,8 +837,9 @@ async function startRepl() {
832
837
  await refreshTargetsFromRuntime();
833
838
  const result = await readLine({
834
839
  getPrompt: buildPrompt,
840
+ getEmptyHint: () => activeServiceWindows.length > 0 ? "\u6309\u4E0B TAB \u5207\u6362\u7A97\u53E3" : "",
835
841
  /* 无服务或在 SFMC 平台窗时默认加 /(与窗口系统前行为一致);用 getter 以便进程退出后即时生效 */
836
- autoSlash: () => activeTargets.length === 0 || host.getActive()?.id === SFMC_WINDOW_ID,
842
+ autoSlash: () => activeTargets.length === 0 || host.getActive()?.id === SFMC_WINDOW_ID || host.getActive()?.showsInput === false || host.getActive()?.serviceName === "tunnel",
837
843
  getChrome: () => host.getChrome(),
838
844
  onWindowKey: (ev) => {
839
845
  const r = host.onKey(ev);
@@ -843,7 +849,7 @@ async function startRepl() {
843
849
  cycleSendTarget: () => {
844
850
  const res = host.cycleServiceWindows();
845
851
  if (!res.switched) return false;
846
- preferredTarget = res.serviceName;
852
+ if (res.serviceName && activeTargets.includes(res.serviceName)) preferredTarget = res.serviceName;
847
853
  showActiveWindow();
848
854
  return true;
849
855
  },
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 { listActiveSendTargets, paintSendPrompt, paintSfmcPrompt, plainPrompt } from \"./send-target.js\";\nimport { forceStopAll, onServiceStateChange, SERVICE_NAMES, stopAll, type ServiceName } from \"./services.js\";\nimport { c, T } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst REPL_MODE: CommandMode = \"repl\";\n\nfunction getDisplayWidth(str: string) {\n // \u5148\u53BB\u9664 ANSI \u7801\n const plain = str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let width = 0;\n for (const ch of plain) {\n // \u7C97\u7565\u5224\u65AD\uFF1A\u975E ASCII \u5B57\u7B26\uFF08\u5982\u4E2D\u6587\uFF09\u89C6\u4E3A\u5360 2 \u5217\n if (ch.codePointAt(0)! > 127) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction charDisplayWidth(ch: string): number {\n return ch.codePointAt(0)! > 127 ? 2 : 1;\n}\n\nfunction setRaw(v: boolean): void {\n try {\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") stdin.setRawMode(v);\n } catch {}\n}\n\n/** \u5DE6\u4FA7 SFMC logo \u4E09\u884C\uFF08\u5E95\u884C\u542B\u63A5\u6A2A\u7EBF\u7684 \u2570\u2500\u2500\u2500\uFF0C\u4E0E\u6700\u7EC8\u5E03\u5C40\u4E00\u81F4\uFF09 */\nconst LOGO_ROWS = [\"\u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574\", \"\u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 \", \"\u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500\"] as const;\nconst LOGO_PAD = \" \";\nconst LOGO_TOP_GAP = \" \";\nconst LOGO_MID_GAP = \" \";\nconst SHORTCUT_HINT = ` / \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`;\n/** S\u2192F\u2192M\u2192C \u624B\u5199\u7B14\u987A\uFF08row, col\uFF09\uFF1B\u7A7A\u683C\u683C\u5728\u6784\u5EFA\u65F6\u8FC7\u6EE4 */\nconst LOGO_STROKE_RAW: ReadonlyArray<readonly [number, number]> = [\n // S\n [0, 1],\n [0, 2],\n [0, 0],\n [1, 0],\n [1, 1],\n [1, 2],\n [2, 2],\n [2, 1],\n [2, 0],\n // F\n [0, 3],\n [1, 3],\n [2, 3],\n [0, 4],\n [0, 5],\n [1, 4],\n // M\n [0, 6],\n [1, 6],\n [2, 6],\n [0, 7],\n [1, 7],\n [0, 8],\n [1, 8],\n [2, 8],\n // C\uFF08\u672B\u7B14\u843D\u5230 \u2570\u2500\u2500\u2500\uFF0C\u968F\u540E\u65E0\u7F1D\u63A5\u6A2A\u7EBF\u5EF6\u957F\uFF09\n [0, 10],\n [0, 11],\n [0, 9],\n [1, 9],\n [2, 9],\n [2, 10],\n [2, 11],\n [2, 12],\n];\nconst LOGO_STROKES = LOGO_STROKE_RAW.filter(([r, col]) => {\n const ch = LOGO_ROWS[r]?.[col];\n return ch !== undefined && ch !== \" \";\n});\n\n/** \u6B22\u8FCE\u6761\u7EAF\u6587\u672C\uFF08\u4E0E\u4E0B\u65B9\u6837\u5F0F\u5316 meta \u5185\u5BB9\u4E00\u81F4\uFF09 */\nconst metaPlain = `Scripts For Minecraft Server v${pkg.version}`;\n/** \u5F3A\u8C03\u9996\u5B57\u6BCD\u4E0B\u6807\uFF1AS / F / M / c */\nconst META_ACCENT_INDEX = new Set([0, 8, 12, 16]);\nconst metaUnlit = chalk.hex(T.subtle);\nconst meta = `${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}`;\nconst metaWidth = getDisplayWidth(metaPlain);\nconst lineLength = metaWidth + 5;\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE\u7EAF\u6587\u672C\uFF1BpaintLit \u51B3\u5B9A\u5DF2\u4EAE\u5B57\u7B26\u6837\u5F0F */\nfunction buildTextAtProgress(\n plain: string,\n litColumns: number,\n paintLit: (ch: string, index: number) => string\n): string {\n let cols = 0;\n let out = \"\";\n for (let i = 0; i < plain.length; i++) {\n const ch = plain[i]!;\n const w = charDisplayWidth(ch);\n if (cols + w <= litColumns) {\n out += paintLit(ch, i);\n } else {\n out += metaUnlit(ch);\n }\n cols += w;\n }\n return out;\n}\n\n/** \u6309\u663E\u793A\u5217\u8FDB\u5EA6\u70B9\u4EAE meta\uFF1A\u5DF2\u4EAE\u4FDD\u7559\u6700\u7EC8\u6837\u5F0F\uFF0C\u672A\u4EAE\u7528 subtle */\nfunction buildMetaAtProgress(litColumns: number): string {\n return buildTextAtProgress(metaPlain, litColumns, (ch, i) => (META_ACCENT_INDEX.has(i) ? c.text(ch) : c.dim(ch)));\n}\n\n/** \u5FEB\u6377\u952E\u63D0\u793A\u4E0E\u6A2A\u7EBF/meta \u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6 */\nfunction buildShortcutsAtProgress(litColumns: number): string {\n return buildTextAtProgress(SHORTCUT_HINT, litColumns, (ch) => c.dim(ch));\n}\n\n/** \u6309\u7B14\u987A\u8FDB\u5EA6\u6E32\u67D3 logo\uFF1B\u672A\u5199\u51FA\u7684\u58A8\u8FF9\u7528\u7A7A\u683C\u5360\u4F4D\uFF0C\u4FDD\u6301\u5E03\u5C40\u7A33\u5B9A */\nfunction buildLogoRows(strokeCount: number): [string, string, string] {\n const lit = new Set<string>();\n const n = Math.min(Math.max(0, strokeCount), LOGO_STROKES.length);\n for (let i = 0; i < n; i++) {\n const [r, col] = LOGO_STROKES[i]!;\n lit.add(`${r},${col}`);\n }\n return LOGO_ROWS.map((row, r) => {\n let out = \"\";\n for (let col = 0; col < row.length; col++) {\n const ch = row[col]!;\n if (ch === \" \") {\n out += \" \";\n } else if (lit.has(`${r},${col}`)) {\n out += c.text(ch);\n } else {\n out += \" \";\n }\n }\n return out;\n }) as [string, string, string];\n}\n\nfunction buildWelcomeLines(\n strokeCount: number,\n lineProgress: number,\n metaContent: string,\n shortcutContent: string\n): string[] {\n const [topLogo, midLogo, botLogo] = buildLogoRows(strokeCount);\n const line = \"\u2500\".repeat(Math.max(0, lineProgress));\n return [\n `\\n`,\n `${LOGO_PAD}${topLogo}${LOGO_TOP_GAP}${shortcutContent}`,\n `${LOGO_PAD}${midLogo}${LOGO_MID_GAP}${metaContent}`,\n `${LOGO_PAD}${botLogo}${line}`,\n ];\n}\n\n/** \u56DE\u5377\u91CD\u7ED8\uFF1A\u9996\u5E27\u76F4\u63A5\u5199\uFF0C\u4E4B\u540E\u5149\u6807\u4E0A\u79FB\u5E76\u9010\u884C ESC[2K \u6E05\u884C\u91CD\u5199 */\nfunction paintWelcomeLines(lines: string[], firstFrame: boolean): void {\n if (!firstFrame) {\n process.stdout.write(`\\x1b[${lines.length}A`);\n }\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\x1b[2K\\r${lines[i]}`);\n if (i < lines.length - 1) process.stdout.write(\"\\n\");\n }\n}\n\nexport async function playWelcomeAnimation(): Promise<void> {\n const strokeTotal = LOGO_STROKES.length;\n const totalSteps = strokeTotal + lineLength;\n const finalShortcuts = c.dim(SHORTCUT_HINT);\n\n // \u975E TTY\uFF1A\u76F4\u63A5\u8F93\u51FA\u6700\u7EC8\u5E27\uFF0C\u907F\u514D\u63A7\u5236\u5E8F\u5217\u6C61\u67D3\u7BA1\u9053\u8F93\u51FA\n if (!process.stdout.isTTY) {\n const lines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n process.stdout.write(`\\n${lines.join(\"\\n\")}\\n\\n`);\n return;\n }\n\n let step = 0;\n let firstFrame = true;\n\n process.stdout.write(\"\\x1b[?25l\");\n // \u5148\u7A7A\u4E00\u884C\uFF0C\u628A\u6B22\u8FCE\u5757\u4E0E\u4E0A\u65B9\u8F93\u51FA\u9694\u5F00\n process.stdout.write(\"\\n\");\n\n return new Promise((resolve) => {\n const done = (): void => {\n const finalLines = buildWelcomeLines(strokeTotal, lineLength, c.bold(meta), finalShortcuts);\n paintWelcomeLines(finalLines, firstFrame);\n process.stdout.write(\"\\x1b[?25h\\n\\n\");\n resolve();\n };\n\n const tick = (): void => {\n const inLogo = step < strokeTotal;\n const strokeCount = Math.min(step + 1, strokeTotal);\n // \u53F3\u4FA7\u4E09\u884C\uFF08shortcut / meta / \u6A2A\u7EBF\uFF09\u5171\u7528\u540C\u4E00\u5217\u8FDB\u5EA6\n const lineProgress = inLogo ? 0 : Math.min(step - strokeTotal + 1, lineLength);\n const metaContent = buildMetaAtProgress(Math.min(lineProgress, metaWidth));\n const shortcutContent = buildShortcutsAtProgress(lineProgress);\n const lines = buildWelcomeLines(strokeCount, lineProgress, metaContent, shortcutContent);\n paintWelcomeLines(lines, firstFrame);\n firstFrame = false;\n\n if (step >= totalSteps - 1) {\n done();\n return;\n }\n step += 1;\n // logo \u7B14\u987A\u7A0D\u6162\uFF1B\u63A5\u4E0A\u6A2A\u7EBF\u540E\u6062\u590D\u8F83\u5FEB\u8282\u594F\n setTimeout(tick, step < strokeTotal ? 22 : 5);\n };\n\n setTimeout(tick, 22);\n });\n}\n\n/* let welcome = `\\n\n ${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${meta}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\\n\n`; */\n\n/* welcome = `\\n\n \u256D\u2500\u256E\u256D\u2500\u2574\u256D\u252C\u256E\u256D\u2500\u2574 ${c.dim(`/ \u00B7 Tab \u00B7 Ctrl+P \u00B7 Ctrl+L \u00B7 \u2190\u2192 \u00B7 \u2191\u2193`)}\n \u2570\u2500\u256E\u251C\u2574 \u2502\u2502\u2502\u2502 ${meta}\n \u2570\u2500\u256F\u2575 \u2575 \u2575\u2570\u2500\u2500\u2500${\"\u2500\".repeat(getDisplayWidth(meta) + 3)}\\n`; */\n\nexport function getHelp(mode: CommandMode = \"argv\"): string {\n return buildHelp(mode);\n}\n\nfunction getCommands(): string[] {\n return listVisibleTopLevelNames(REPL_MODE);\n}\n\n/* ==================================================================\n * Context-aware completion\n * ================================================================== */\ninterface ParsedLine {\n cmd: string;\n /** cmd \u4E4B\u540E\u7684\u5168\u90E8 token(\u4E0D\u542B\u6B63\u5728\u8F93\u5165\u7684 current,\u82E5\u672B\u5C3E\u65E0\u7A7A\u683C\u5219\u4E0D\u542B\u6700\u540E\u4E00\u4E2A\u534A\u8BCD) */\n words: string[];\n argIndex: number;\n current: string;\n}\n\n/**\n * \u89E3\u6790\u5F53\u524D\u8F93\u5165\u884C,\u63D0\u53D6\u547D\u4EE4\u540D\u3001\u53C2\u6570\u4F4D\u7F6E\u3001\u6B63\u5728\u8F93\u5165\u7684 word\u3002\n * \u672B\u5C3E\u7A7A\u683C\u89C6\u4E3A\"\u521A\u7ED3\u675F\u4E00\u4E2A word,\u51C6\u5907\u8F93\u5165\u4E0B\u4E00\u4E2A\"\u3002\n */\nfunction parseLine(line: string): ParsedLine {\n const endsWithSpace = line.length > 0 && /\\s$/.test(line);\n const trimmed = line.trim();\n if (!trimmed) return { cmd: \"\", words: [], argIndex: 0, current: \"\" };\n const tokens = trimmed.split(/\\s+/);\n if (endsWithSpace) {\n return {\n cmd: tokens[0] ?? \"\",\n words: tokens.slice(1),\n argIndex: tokens.length - 1,\n current: \"\",\n };\n }\n if (tokens.length === 1) return { cmd: \"\", words: [], argIndex: 0, current: tokens[0]! };\n return {\n cmd: tokens[0]!,\n words: tokens.slice(1, -1),\n argIndex: tokens.length - 2,\n current: tokens[tokens.length - 1]!,\n };\n}\n\n/**\n * \u6839\u636E\u547D\u4EE4 + \u53C2\u6570\u4F4D\u7F6E\u8FD4\u56DE\u8865\u5168\u5019\u9009 (\u533A\u5206\u547D\u4EE4,\u4E0D\u518D\u628A\u670D\u52A1\u540D\u5F53\u6210\u6240\u6709\u6307\u4EE4\u7684\u4E8C\u7EA7\u53C2\u6570)\u3002\n */\nfunction getCompletions(parsed: ParsedLine): string[] {\n const { words, argIndex, current } = parsed;\n const cmd = parsed.cmd.startsWith(\"/\") ? parsed.cmd.slice(1) : parsed.cmd;\n const sw = (s: string): boolean => s.startsWith(current);\n if (!cmd) {\n const cmds = getCommands().map((n) => (n.startsWith(\"/\") ? n : n));\n return [\"/\", ...cmds].filter(sw);\n }\n switch (cmd) {\n case \"logs\":\n case \"log\":\n return [];\n case \"start\":\n case \"stop\":\n case \"restart\":\n if (argIndex === 0) return [\"-all\", ...SERVICE_NAMES].filter(sw);\n return [];\n case \"send\":\n if (argIndex === 0) return SERVICE_NAMES.filter(sw);\n return [];\n case \"update\":\n return [\"--check-only\", \"--force\", \"--channel=release\", \"--channel=preview\"].filter(sw);\n case \"packs\":\n case \"addon\":\n if (argIndex === 0) return [...listVisiblePacksSubs(REPL_MODE)].filter(sw);\n if (argIndex === 1 && [\"list\"].includes(words[0] ?? \"\")) {\n return [\"--kind\", \"--search\"].filter(sw);\n }\n return [];\n default: {\n if (!isModuleCommand(cmd)) return [];\n if (argIndex === 0) return [...getVisibleModuleSubcommands(REPL_MODE)].filter(sw);\n const verb = words[0] ?? \"\";\n if (argIndex === 1 && verb === \"search\") {\n return listRegistryModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && [\"info\", \"uninstall\", \"remove\", \"verify\", \"enable\", \"disable\"].includes(verb)) {\n return listInstalledModuleIdsSync().filter(sw);\n }\n if (argIndex === 1 && verb === \"reload\") {\n return [\"--build-only\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"install\") {\n return [\"--from\", \"--sha256\", \"--link\"].filter(sw);\n }\n if (argIndex >= 1 && verb === \"list\") {\n return [\"--from\", \"--sha256\"].filter(sw);\n }\n return [];\n }\n }\n}\n\n/* ==================================================================\n * Escape sequence consumer\n * ================================================================== */\nfunction consumeEscapeSeq(chunk: Buffer, i: number): number | null {\n if (chunk[i] !== 0x1b) return null;\n const rem = chunk.length - i - 1;\n if (rem >= 2 && chunk[i + 1] === 0x5b) {\n let j = i + 2;\n while (j < chunk.length && chunk[j]! >= 0x30 && chunk[j]! <= 0x3f) j++;\n while (j < chunk.length && chunk[j]! >= 0x20 && chunk[j]! <= 0x2f) j++;\n if (j < chunk.length && chunk[j]! >= 0x40 && chunk[j]! <= 0x7e) j++;\n return j;\n }\n if (rem >= 2 && chunk[i + 1] === 0x4f) return i + 3;\n if (rem >= 1) return i + 2;\n return i + 1;\n}\n\n/* ==================================================================\n * Line reader\n * ================================================================== */\nconst history: string[] = [];\nlet historyIdx = -1;\n\n/** \u5F53\u524D readLine \u7684\u91CD\u7ED8\u51FD\u6570 (\u7A97\u53E3 resize / \u65E5\u5FD7\u63A8\u9001\u65F6\u8C03\u7528) */\nlet currentRedraw: (() => void) | null = null;\n\ntype ReadLineOpts = {\n getPrompt: () => string;\n /** \u65E0\u6D3B\u8DC3\u670D\u52A1\u65F6\uFF0C\u666E\u901A\u5B57\u7B26\u81EA\u52A8\u524D\u7F6E /\uFF1B\u53EF\u4E3A getter \u4EE5\u4FBF\u670D\u52A1\u9000\u51FA\u540E\u5373\u65F6\u751F\u6548 */\n autoSlash: boolean | (() => boolean);\n /** Tab\uFF1A\u5728\u975E / \u884C\u4E0A\u5207\u6362\u53D1\u9001\u76EE\u6807\uFF1B\u8FD4\u56DE true \u8868\u793A\u5DF2\u5904\u7406 */\n cycleSendTarget: () => boolean;\n /** \u5F53\u524D\u7A97\u53E3 chrome\uFF08\u65E0\u8F93\u5165\u7A97\u753B shortcut \u6761\uFF09 */\n getChrome?: () => WindowChrome;\n /** \u4EA4\u7ED9\u6D3B\u52A8\u7A97\u7684\u6309\u952E\uFF08Esc / L / S \u7B49\uFF09 */\n onWindowKey?: (ev: WindowKeyEvent) => WindowKeyResult;\n initial?: string;\n};\n\ntype ReadLineResult =\n | { kind: \"line\"; value: string }\n | { kind: \"cancel\" }\n | { kind: \"open-logs\"; pending: string }\n | { kind: \"run\"; parts: string[] };\n\nasync function readLine(opts: ReadLineOpts): Promise<ReadLineResult> {\n const wasRaw = stdin.isRaw ?? false;\n setRaw(true);\n stdin.resume();\n\n let line = opts.initial ?? \"\";\n let cursor = line.length;\n let suggestion = \"\";\n /** \u5404\u7EA7\u5217\u9009\u4E2D / \u6EDA\u52A8\uFF08\u4EC5\u6700\u53F3\u5217\u53EF\u5BFC\u822A\uFF09 */\n let palSels: number[] = [0];\n let palScrolls: number[] = [0];\n let overlayRows = 0;\n\n function prompt(): string {\n return opts.getPrompt();\n }\n\n function showsInput(): boolean {\n return opts.getChrome?.().showsInput !== false;\n }\n\n function slashMode(): boolean {\n return showsInput() && line.startsWith(\"/\");\n }\n\n function paletteView() {\n return resolvePaletteView(line, palSels, palScrolls);\n }\n\n function syncPaletteState(view: ReturnType<typeof resolvePaletteView>): void {\n for (let i = 0; i < view.columns.length; i++) {\n palSels[i] = view.columns[i]!.selected;\n palScrolls[i] = view.columns[i]!.scroll;\n }\n }\n\n function resetPalette(): void {\n palSels = [0];\n palScrolls = [0];\n }\n\n function clearOverlay(): void {\n stdout.write(\"\\r\\x1B[J\");\n overlayRows = 0;\n }\n\n function applyWindowKey(ev: WindowKeyEvent): boolean {\n if (!opts.onWindowKey) return false;\n const r = opts.onWindowKey(ev);\n if (r.action === \"none\") return false;\n if (r.action === \"redraw\") redraw();\n return true;\n }\n\n function redraw(): void {\n const chrome = opts.getChrome?.();\n if (chrome && !chrome.showsInput) {\n clearOverlay();\n const foot = chrome.footerShortcuts || \"\";\n stdout.write(foot);\n stdout.write(\"\\r\");\n return;\n }\n\n const p = prompt();\n suggestion = \"\";\n\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (cursor === line.length) {\n suggestion = paletteGhost(view);\n }\n } else {\n const parsed = parseLine(line);\n const candidates = getCompletions(parsed);\n const first = candidates[0];\n if (\n cursor === line.length &&\n parsed.current &&\n first &&\n first !== parsed.current &&\n first.startsWith(parsed.current)\n ) {\n suggestion = first.slice(parsed.current.length);\n }\n }\n\n clearOverlay();\n stdout.write(p + line);\n if (suggestion) stdout.write(c.dim(suggestion));\n\n if (slashMode()) {\n const view = paletteView();\n const indent = promptSlashColumn(p);\n const list = formatPaletteCascadeLines(view, indent);\n if (list.length > 0) {\n stdout.write(\"\\n\" + list.join(\"\\n\"));\n overlayRows = list.length;\n stdout.write(`\\x1B[${overlayRows}A`);\n }\n }\n\n const col = promptSlashColumn(p) + cursor + 1;\n stdout.write(`\\r\\x1B[${col}G`);\n }\n\n redraw();\n currentRedraw = redraw;\n\n return new Promise<ReadLineResult>((resolve) => {\n const done = (value: ReadLineResult): void => {\n stdin.removeListener(\"data\", handler);\n setRaw(wasRaw);\n currentRedraw = null;\n resolve(value);\n };\n\n const finishLine = (value: string): void => {\n clearOverlay();\n stdout.write(prompt() + value + \"\\r\\n\");\n if (value.length > 0) {\n history.push(value);\n if (history.length > 100) history.shift();\n }\n historyIdx = history.length;\n done({ kind: \"line\", value });\n };\n\n /** \u2191\u2193/Tab\uFF1A\u4EC5\u5728\u6700\u53F3\u5217\u8F6E\u6362\u9009\u4E2D\uFF0C\u5199\u5165\u7070\u5B57\uFF0C\u4E0D\u6539\u8F93\u5165\u6846 */\n const movePalSel = (delta: number): boolean => {\n const view = paletteView();\n if (view.hidden) return false;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return false;\n const len = col.items.length;\n const cur = clampPaletteSelection(col.selected, len);\n const next = (((cur + delta) % len) + len) % len;\n palSels[view.active] = next;\n redraw();\n return true;\n };\n\n const handler = (chunk: Buffer) => {\n let i = 0;\n while (i < chunk.length) {\n if (chunk[i] === 0x1b) {\n const next = consumeEscapeSeq(chunk, i);\n if (next !== null) {\n const len = next - i;\n /* \u5355\u72EC Esc \u2192 \u4EA4\u7ED9\u7A97\u53E3\uFF08/logs \u8FD4\u56DE\uFF09 */\n if (len === 1) {\n if (applyWindowKey({ type: \"escape\" })) {\n i = next;\n continue;\n }\n i = next;\n continue;\n }\n if (!showsInput()) {\n i = next;\n continue;\n }\n if (len === 3 && chunk[i + 1] === 0x5b) {\n const fin = chunk[i + 2];\n if (fin === 0x41) {\n /* \u2191 */\n if (slashMode() && movePalSel(-1)) {\n i = next;\n continue;\n }\n if (historyIdx > 0) {\n historyIdx--;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x42) {\n /* \u2193 */\n if (slashMode() && movePalSel(1)) {\n i = next;\n continue;\n }\n if (historyIdx < history.length - 1) {\n historyIdx++;\n line = history[historyIdx] ?? \"\";\n cursor = line.length;\n resetPalette();\n redraw();\n } else if (historyIdx === history.length - 1) {\n historyIdx = history.length;\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n }\n } else if (fin === 0x43) {\n /* \u2192\uFF1A\u63A5\u53D7\u7070\u5B57\u6216\u79FB\u5149\u6807\uFF08\u4E0D\u5207\u6362\u9762\u677F\u7126\u70B9\uFF09 */\n if (cursor < line.length) {\n cursor++;\n redraw();\n } else if (suggestion) {\n line += suggestion;\n cursor = line.length;\n redraw();\n }\n } else if (fin === 0x44) {\n if (cursor > 0) {\n cursor--;\n redraw();\n }\n } else if (fin === 0x48) {\n cursor = 0;\n redraw();\n } else if (fin === 0x46) {\n cursor = line.length;\n redraw();\n }\n }\n i = next;\n } else i++;\n continue;\n }\n\n const byte = chunk[i]!;\n i++;\n\n if (byte === 0x0d || byte === 0x0a) {\n if (!showsInput()) continue;\n if (slashMode()) {\n const view = paletteView();\n syncPaletteState(view);\n if (!view.hidden && view.columns.some((col) => col.items.length > 0) && activeNode(view)) {\n const acc = commitSelection(line, view);\n if (acc.submit) {\n finishLine(acc.line);\n return;\n }\n line = acc.line;\n cursor = line.length;\n /* \u65B0\u5C42\u9009\u4E2D\u5F52\u96F6 */\n const depth = Math.max(0, acc.line.trimEnd().split(/\\s+/).length - 1);\n while (palSels.length <= depth + 1) palSels.push(0);\n while (palScrolls.length <= depth + 1) palScrolls.push(0);\n palSels[depth + 1] = 0;\n palScrolls[depth + 1] = 0;\n redraw();\n continue;\n }\n }\n finishLine(line);\n return;\n }\n\n if (byte === 0x03) {\n if (!showsInput()) {\n /* \u65E0\u8F93\u5165\u7A97\uFF1ACtrl+C \u8FD4\u56DE\u4E0A\u4E00\u7A97\uFF0C\u518D\u6309\u624D\u9000\u51FA */\n if (applyWindowKey({ type: \"escape\" })) continue;\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n if (line.length > 0) {\n line = \"\";\n cursor = 0;\n resetPalette();\n redraw();\n continue;\n }\n clearOverlay();\n stdout.write(\"\\r\\n\");\n done({ kind: \"cancel\" });\n return;\n }\n\n /* Ctrl+P \u2014 \u786E\u4FDD\u4EE5 / \u5F00\u5934 */\n if (byte === 0x10) {\n if (!showsInput()) continue;\n if (!line.startsWith(\"/\")) {\n line = \"/\" + line;\n cursor = Math.min(cursor + 1, line.length);\n }\n resetPalette();\n redraw();\n continue;\n }\n\n if (byte === 0x09) {\n /* Tab\uFF1A/ \u6A21\u5F0F = \u5217\u8868\u8F6E\u6362\uFF1B\u5426\u5219\u5207\u6362\u670D\u52A1\u7A97 */\n if (slashMode()) {\n movePalSel(1);\n continue;\n }\n if (opts.cycleSendTarget()) {\n redraw();\n continue;\n }\n continue;\n }\n\n if (byte === 0x0c) {\n /* Ctrl+L \u2192 \u6253\u5F00 /logs \u7B5B\u9009\u7A97 */\n clearOverlay();\n done({ kind: \"open-logs\", pending: showsInput() ? line : \"\" });\n return;\n }\n\n if (byte === 0x7f || byte === 0x08) {\n if (!showsInput()) continue;\n if (cursor > 0) {\n line = line.slice(0, cursor - 1) + line.slice(cursor);\n cursor--;\n }\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n\n if (byte >= 0x20 && byte <= 0x7e) {\n const ch = String.fromCharCode(byte);\n if (!showsInput()) {\n applyWindowKey({ type: \"char\", ch });\n continue;\n }\n let insert = ch;\n const autoSlash =\n typeof opts.autoSlash === \"function\" ? opts.autoSlash() : opts.autoSlash;\n if (autoSlash && line.length === 0 && insert !== \"/\") {\n insert = \"/\" + insert;\n }\n line = line.slice(0, cursor) + insert + line.slice(cursor);\n cursor += insert.length;\n if (slashMode()) {\n const view = paletteView();\n palSels[view.active] = 0;\n palScrolls[view.active] = 0;\n }\n redraw();\n continue;\n }\n }\n };\n stdin.on(\"data\", handler);\n });\n}\n\n/** \u6765\u6E90\u9009\u62E9\u9879:\u65B9\u62EC\u53F7 3 \u5B57\u7B26\u6807\u7B7E\u67D3\u8272\uFF08\u4F9B\u5916\u90E8/\u6D4B\u8BD5\u590D\u7528\uFF09 */\nexport const SOURCE_ITEMS: Array<{ label: string; value: string }> = SOURCE_META.map((m) => ({\n label: m.paint(`[${m.name}]`),\n value: m.value,\n}));\n\n/** REPL \u4EA4\u4E92\u6001\uFF1A\u65E0\u53C2 /logs \u6253\u5F00\u7B5B\u9009\u7A97\uFF08\u7531 startRepl \u6CE8\u5165\uFF09 */\nlet openLogsWindowHook: (() => void) | null = null;\n\nfunction writeLogLineToTty(wrapped: string): void {\n pauseAllProgress();\n try {\n stdout.write(`\\r\\x1B[K${wrapped}\\n`);\n } finally {\n resumeAllProgress();\n }\n currentRedraw?.();\n}\n\n/* ==================================================================\n * START REPL\n * ================================================================== */\n\nexport async function startRepl(): Promise<void> {\n let stopping = false;\n const onSigint = (): void => {\n stdout.write(c.yellow(\"\\n\" + t(\"repl.forceStop\") + \"\\n\"));\n forceStopAll();\n 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 pendingInput = \"\";\n\n const host = new WindowHost({\n writeLog: writeLogLineToTty,\n onChromeChange: () => currentRedraw?.(),\n });\n\n function clearTerminal(): void {\n /* \u6E05\u89C6\u53E3\uFF1B\u518D\u6E05 scrollback\uFF0C\u907F\u514D\u5F80\u4E0A\u6ED1\u4ECD\u770B\u5230\u4E0A\u4E00\u7A97\u5185\u5BB9 */\n console.clear();\n stdout.write(\"\\x1B[3J\");\n }\n\n /** \u9996\u6B21\u8FDB\u5165\u7A97\u53E3\uFF1A\u4ECE\u5185\u5B58/\u843D\u76D8\u62C9\u4E00\u6B21\u4F5C\u4E3A\u79CD\u5B50\u7F13\u5B58 */\n function seedWindowBuffer(w: {\n id: string;\n acceptLog: (l: UnifiedLog) => boolean;\n formatLogLine: (l: UnifiedLog) => { text: string; indent: number };\n getReplayFilter?: () => { levels: string[]; sources: string[] };\n }): string[] {\n const lines: string[] = [];\n if (w.id === \"logs\") {\n const f = w.getReplayFilter?.() ?? { levels: [], sources: [] };\n const disk = readDiskLogs({\n levels: f.levels as LogLevel[],\n sources: f.sources,\n });\n for (const log of disk) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n } else {\n for (const log of getAllLogs()) {\n if (!w.acceptLog(log)) continue;\n const { text, indent } = w.formatLogLine(log);\n lines.push(wrapLogLine(text, indent));\n }\n }\n host.setBuffer(w.id, lines);\n return lines;\n }\n\n /**\n * \u5C55\u793A\u6D3B\u52A8\u7A97\uFF1A\u5148\u6E05\u5C4F\uFF0C\u518D\u6062\u590D/seed\u3002\n * - /logs\uFF1A\u7528\u843D\u76D8\u79CD\u5B50\u7F13\u5B58\uFF08\u6539\u7B5B\u9009\u624D reseed\uFF09\uFF0C\u907F\u514D\u91CD\u590D\u8BFB\u6587\u4EF6\n * - \u670D\u52A1\u4E3B\u9762\u677F\uFF1A\u6BCF\u6B21\u4ECE\u5185\u5B58\u91CD seed\uFF0C\u4FDD\u8BC1\u79BB\u5F00 /logs \u6216 Tab \u56DE\u6765\u65F6\u5185\u5BB9\u5B9E\u65F6\n */\n function showActiveWindow(opts?: { reseed?: boolean }): void {\n clearTerminal();\n const w = host.getActive();\n if (!w) {\n currentRedraw?.();\n return;\n }\n let lines: readonly string[];\n if (w.id === \"logs\") {\n if (opts?.reseed) host.invalidateBuffer(w.id);\n lines = host.hasBuffer(w.id) ? host.getBuffer(w.id) : seedWindowBuffer(w);\n } else {\n /* \u4E3B\u9762\u677F\u5B9E\u65F6\uFF1A\u4E0D\u4F5C\u5E9F\u4E5F\u65E0\u59A8\uFF0C\u76F4\u63A5\u91CD\u62C9\u5185\u5B58\u7F13\u51B2 */\n host.invalidateBuffer(w.id);\n lines = seedWindowBuffer(w);\n }\n for (const l of lines) stdout.write(l + \"\\n\");\n currentRedraw?.();\n }\n\n host.register(\n createLogsFilterWindow({\n getState: () => logsFilterState,\n setState: (next) => {\n logsFilterState = next;\n },\n /* \u7B5B\u9009\u53D8\u66F4\uFF1A\u4F5C\u5E9F /logs \u7F13\u5B58\u5E76\u91CD\u65B0\u8BFB\u76D8\u4E00\u6B21 */\n onFilterChanged: () => showActiveWindow({ reseed: true }),\n })\n );\n\n function syncServiceWindows(targets: ServiceName[]): void {\n if (targets.length === 0) {\n host.setServiceOrder([]);\n preferredTarget = null;\n return;\n }\n for (const name of targets) {\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: () => activeTargets }));\n }\n host.setServiceOrder([...targets.map(serviceWindowId), SFMC_WINDOW_ID]);\n const svc = host.getActive()?.serviceName;\n if (svc) preferredTarget = svc;\n }\n\n function openLogsWindow(): void {\n /* \u79BB\u5F00\u4E3B\u9762\u677F\uFF1A\u5176\u7F13\u5B58\u53EF\u7559\u7740\uFF0C\u4F46\u5C55\u793A\u4E0A\u5148\u6E05\u5C4F\u518D\u8FDB /logs\uFF1BEsc \u56DE\u6765\u4F1A\u6309\u5B9E\u65F6\u91CD seed \u4E3B\u9762\u677F */\n host.open(\"logs\");\n showActiveWindow();\n }\n\n openLogsWindowHook = openLogsWindow;\n\n const unsub = onLog((log) => {\n if (host.getActive()) {\n host.routeLog(log);\n return;\n }\n /* \u65E0\u6D3B\u52A8\u7A97\uFF1A\u5168\u91CF\u5C55\u793A\uFF08\u5E26\u6E90\u6807\u7B7E\uFF09\uFF0C\u4E0E\u65E7\u7A7A\u95F2\u884C\u4E3A\u4E00\u81F4 */\n writeLogLineToTty(wrapLogLine(formatLog(log), logPrefixWidth(log)));\n });\n\n async function refreshTargetsFromRuntime(): Promise<void> {\n const prevId = host.getActiveId();\n activeTargets = await listActiveSendTargets();\n syncServiceWindows(activeTargets);\n if (preferredTarget && !activeTargets.includes(preferredTarget)) {\n preferredTarget = activeTargets[0] ?? null;\n }\n const nextId = host.getActiveId();\n /* \u65B0\u6FC0\u6D3B\u7A97\u6216\u9996\u6B21\u5C1A\u65E0\u7F13\u5B58\uFF1A\u6E05\u5C4F\u5E76 seed/\u6062\u590D */\n if (nextId && (nextId !== prevId || !host.hasBuffer(nextId))) {\n showActiveWindow();\n } else if (!nextId && prevId) {\n clearTerminal();\n currentRedraw?.();\n } else {\n currentRedraw?.();\n }\n }\n\n const unsubState = onServiceStateChange(() => {\n void refreshTargetsFromRuntime();\n });\n\n function onResize(): void {\n if (!currentRedraw) return;\n const id = host.getActiveId();\n if (id) host.invalidateBuffer(id);\n showActiveWindow();\n }\n\n process.stdout.on(\"resize\", onResize);\n\n function currentTarget(): ServiceName | null {\n if (activeTargets.length === 0) return null;\n if (host.getActive()?.id === SFMC_WINDOW_ID) 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 /* \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,\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 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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",
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
6
  "names": ["t"]
7
7
  }