@sfmc-bds/cli 0.2.0-beta.19 → 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.
- package/dist/bds-runtime-version.d.ts +3 -0
- package/dist/bds-runtime-version.d.ts.map +1 -0
- package/dist/bds-runtime-version.js +15 -0
- package/dist/bds-runtime-version.js.map +7 -0
- package/dist/command-surface.d.ts.map +1 -1
- package/dist/command-surface.js +2 -0
- package/dist/command-surface.js.map +2 -2
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +78 -75
- package/dist/commands.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +8 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +8 -0
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +8 -0
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/llbot-launch.d.ts +3 -3
- package/dist/llbot-launch.js.map +1 -1
- package/dist/logs.js +3 -3
- package/dist/logs.js.map +2 -2
- package/dist/main.js +5 -0
- package/dist/main.js.map +2 -2
- package/dist/repl-windows/service-window.d.ts.map +1 -1
- package/dist/repl-windows/service-window.js +1 -0
- package/dist/repl-windows/service-window.js.map +2 -2
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +23 -12
- package/dist/repl.js.map +2 -2
- package/dist/send-target.d.ts.map +1 -1
- package/dist/send-target.js +2 -0
- package/dist/send-target.js.map +2 -2
- package/dist/services.d.ts +8 -1
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +151 -15
- package/dist/services.js.map +2 -2
- package/dist/ui-command.d.ts +6 -0
- package/dist/ui-command.d.ts.map +1 -0
- package/dist/ui-command.js +68 -0
- package/dist/ui-command.js.map +7 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +15 -8
- package/dist/wizard.js.map +2 -2
- package/package.json +4 -5
- package/scripts/module-install/lib/catalog.mjs +1 -1
- package/dist/command-surface.test.js +0 -92
- package/dist/command-surface.test.js.map +0 -7
- package/dist/debug-command.test.js +0 -76
- package/dist/debug-command.test.js.map +0 -7
- package/dist/log-filter.test.js +0 -181
- package/dist/log-filter.test.js.map +0 -7
- package/dist/log-translator.test.js +0 -120
- package/dist/log-translator.test.js.map +0 -7
- package/dist/logs-blank-line.test.js +0 -16
- package/dist/logs-blank-line.test.js.map +0 -7
- package/dist/module-toggle.test.js +0 -37
- package/dist/module-toggle.test.js.map +0 -7
- package/dist/pack-bundle.test.js +0 -111
- package/dist/pack-bundle.test.js.map +0 -7
- package/dist/player-session.test.js +0 -19
- package/dist/player-session.test.js.map +0 -7
- package/dist/repl-windows/host.test.js +0 -72
- package/dist/repl-windows/host.test.js.map +0 -7
- package/dist/services-output.test.js +0 -9
- package/dist/services-output.test.js.map +0 -7
- package/dist/world-packs-list.test.js +0 -11
- package/dist/world-packs-list.test.js.map +0 -7
- package/dist/world-packs-uninstall.test.js +0 -54
- package/dist/world-packs-uninstall.test.js.map +0 -7
- package/scripts/module-install/test/check-modules-config.test.ts +0 -46
- package/scripts/module-install/test/config-seeding.test.ts +0 -99
- package/scripts/module-install/test/install-resolver.test.ts +0 -47
- package/scripts/module-install/test/link-local.test.ts +0 -50
- package/scripts/module-install/test/local-resolver.test.ts +0 -44
- package/scripts/module-install/test/registry-index.test.ts +0 -27
package/dist/logs.js
CHANGED
|
@@ -27,7 +27,7 @@ function normalizeBdsLogBody(text) {
|
|
|
27
27
|
}
|
|
28
28
|
function resolveDiskLogName(source) {
|
|
29
29
|
if (CHILD_OWNED_SOURCES.has(source)) return null;
|
|
30
|
-
if (source === "bds" || source === "llbot") return source;
|
|
30
|
+
if (source === "bds" || source === "llbot" || source === "tunnel") return source;
|
|
31
31
|
return "sfmc";
|
|
32
32
|
}
|
|
33
33
|
function sinkFor(source) {
|
|
@@ -94,10 +94,10 @@ function getAllLogs() {
|
|
|
94
94
|
const filter = getCompiledLogFilter();
|
|
95
95
|
return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));
|
|
96
96
|
}
|
|
97
|
-
const DISK_LOG_FILES = ["bds", "llbot", "db", "qq", "bds-update", "sfmc"];
|
|
97
|
+
const DISK_LOG_FILES = ["bds", "llbot", "tunnel", "db", "qq", "bds-update", "sfmc"];
|
|
98
98
|
function diskFileForSource(source) {
|
|
99
99
|
if (source === "update") return "bds-update";
|
|
100
|
-
if (source === "bds" || source === "llbot" || source === "db" || source === "qq") return source;
|
|
100
|
+
if (source === "bds" || source === "llbot" || source === "tunnel" || source === "db" || source === "qq") return source;
|
|
101
101
|
return "sfmc";
|
|
102
102
|
}
|
|
103
103
|
const DISK_LINE_RE = /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[([^\]]+)\] \[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\]\s?(.*)$/;
|
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": "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,
|
|
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
|
}
|
package/dist/main.js
CHANGED
|
@@ -81,6 +81,11 @@ async function main() {
|
|
|
81
81
|
case "debug":
|
|
82
82
|
console.log(await cmdDebug(rest));
|
|
83
83
|
break;
|
|
84
|
+
case "ui": {
|
|
85
|
+
const { cmdUi } = await import("./ui-command.js");
|
|
86
|
+
console.log(await cmdUi(rest, { block: true }));
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
84
89
|
case "status":
|
|
85
90
|
console.log(await cmdStatus());
|
|
86
91
|
break;
|
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport process from \"node:process\";\nimport { mapPacksSubAlias, parseGlobalArgv } from \"./argv-parse.js\";\nimport { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { getHelp, playWelcomeAnimation, startRepl } from \"./repl.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { setArgvDaemonize } from \"./services.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst MODE = \"argv\" as const;\n\nasync function printVersion(): Promise<void> {\n await playWelcomeAnimation();\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp(\"argv\")}`);\n}\n\nfunction deny(msg: string): never {\n console.log(msg);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n const { packsMode, args } = parseGlobalArgv(stripped.args);\n\n if (args.length > 0 || packsMode) {\n setArgvDaemonize(true);\n }\n\n if (args.length === 0 && !packsMode) {\n const { isRuntimeInitialized } = await import(\"./runtime.js\");\n if (!isRuntimeInitialized()) {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n const { refreshServices } = await import(\"./services.js\");\n refreshServices();\n }\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n await startRepl();\n return;\n }\n\n if (packsMode) {\n const [subRaw, ...subRest] = args;\n const sub = mapPacksSubAlias(subRaw);\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n process.exit(0);\n }\n\n const [cmd, ...rest] = args;\n\n if (cmd && ![\"--help\", \"-h\", \"--version\", \"-v\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, MODE);\n if (topGate) deny(topGate);\n }\n\n const moduleSub = resolveModuleTopShorthand(cmd);\n if (moduleSub) {\n const g = gateModuleSub(moduleSub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(moduleSub, rest));\n process.exit(0);\n }\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n await printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"debug\":\n console.log(await cmdDebug(rest));\n break;\n case \"status\":\n console.log(await cmdStatus());\n break;\n case \"logs\":\n case \"log\":\n /* channel=repl\uFF1A\u6B63\u5E38\u7531 gateTopLevel \u62E6\u622A\uFF1B\u6B64\u5904\u515C\u5E95 */\n deny(gateTopLevel(\"logs\", MODE) ?? c.yellow(t(\"cli.replOnly\", { cmd: \"logs\" })));\n break;\n case \"start\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdStart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.start.usage\")));\n }\n break;\n case \"stop\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStopAll());\n } else if (rest[0]) {\n console.log(await cmdStop(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.stop.usage\")));\n }\n break;\n case \"restart\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n await cmdStopAll();\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdRestart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.restart.usage\")));\n }\n break;\n case \"update\":\n console.log(await cmdUpdate(rest));\n break;\n case \"packs\":\n case \"addon\": {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gateModuleSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n console.log(c.red(t(\"common.unknownCommand\", { cmd: cmd ?? \"\" })));\n printUsage();\n process.exit(1);\n }\n process.exit(0);\n}\n\nmain().catch((err) => {\n console.error(c.red(err?.message ? t(\"common.error\", { message: err.message }) : t(\"common.fatal\")));\n process.exit(1);\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport process from \"node:process\";\nimport { mapPacksSubAlias, parseGlobalArgv } from \"./argv-parse.js\";\nimport { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { getHelp, playWelcomeAnimation, startRepl } from \"./repl.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { setArgvDaemonize } from \"./services.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst MODE = \"argv\" as const;\n\nasync function printVersion(): Promise<void> {\n await playWelcomeAnimation();\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp(\"argv\")}`);\n}\n\nfunction deny(msg: string): never {\n console.log(msg);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n const { packsMode, args } = parseGlobalArgv(stripped.args);\n\n if (args.length > 0 || packsMode) {\n setArgvDaemonize(true);\n }\n\n if (args.length === 0 && !packsMode) {\n const { isRuntimeInitialized } = await import(\"./runtime.js\");\n if (!isRuntimeInitialized()) {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n const { refreshServices } = await import(\"./services.js\");\n refreshServices();\n }\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n await startRepl();\n return;\n }\n\n if (packsMode) {\n const [subRaw, ...subRest] = args;\n const sub = mapPacksSubAlias(subRaw);\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n process.exit(0);\n }\n\n const [cmd, ...rest] = args;\n\n if (cmd && ![\"--help\", \"-h\", \"--version\", \"-v\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, MODE);\n if (topGate) deny(topGate);\n }\n\n const moduleSub = resolveModuleTopShorthand(cmd);\n if (moduleSub) {\n const g = gateModuleSub(moduleSub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(moduleSub, rest));\n process.exit(0);\n }\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n await printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"debug\":\n console.log(await cmdDebug(rest));\n break;\n case \"ui\": {\n const { cmdUi } = await import(\"./ui-command.js\");\n console.log(await cmdUi(rest, { block: true }));\n break;\n }\n case \"status\":\n console.log(await cmdStatus());\n break;\n case \"logs\":\n case \"log\":\n /* channel=repl\uFF1A\u6B63\u5E38\u7531 gateTopLevel \u62E6\u622A\uFF1B\u6B64\u5904\u515C\u5E95 */\n deny(gateTopLevel(\"logs\", MODE) ?? c.yellow(t(\"cli.replOnly\", { cmd: \"logs\" })));\n break;\n case \"start\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdStart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.start.usage\")));\n }\n break;\n case \"stop\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStopAll());\n } else if (rest[0]) {\n console.log(await cmdStop(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.stop.usage\")));\n }\n break;\n case \"restart\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n await cmdStopAll();\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdRestart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.restart.usage\")));\n }\n break;\n case \"update\":\n console.log(await cmdUpdate(rest));\n break;\n case \"packs\":\n case \"addon\": {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gateModuleSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n console.log(c.red(t(\"common.unknownCommand\", { cmd: cmd ?? \"\" })));\n printUsage();\n process.exit(1);\n }\n process.exit(0);\n}\n\nmain().catch((err) => {\n console.error(c.red(err?.message ? t(\"common.error\", { message: err.message }) : t(\"common.fatal\")));\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
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;
|
|
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
|
}
|
package/dist/repl.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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(
|
|
757
|
-
if (
|
|
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
|
|
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: () =>
|
|
769
|
+
host.register(createSfmcWindow({ getActiveTargets: () => activeServiceWindows }));
|
|
768
770
|
}
|
|
769
|
-
host.setServiceOrder([...
|
|
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
|
-
|
|
788
|
-
|
|
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
|
},
|
|
@@ -956,6 +962,11 @@ async function execCmd(parts) {
|
|
|
956
962
|
case "debug":
|
|
957
963
|
stdout.write(await cmdDebug(args) + "\n");
|
|
958
964
|
break;
|
|
965
|
+
case "ui": {
|
|
966
|
+
const { cmdUi } = await import("./ui-command.js");
|
|
967
|
+
stdout.write(await cmdUi(args, { block: false }) + "\n");
|
|
968
|
+
break;
|
|
969
|
+
}
|
|
959
970
|
case "init": {
|
|
960
971
|
const wasRaw = stdin.isRaw ?? false;
|
|
961
972
|
setRaw(false);
|