@sfmc-bds/cli 0.2.0-beta.0 → 0.2.0-beta.10
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/argv-parse.d.ts +11 -0
- package/dist/argv-parse.d.ts.map +1 -0
- package/dist/argv-parse.js +28 -0
- package/dist/argv-parse.js.map +7 -0
- package/dist/cli-gate.d.ts +11 -0
- package/dist/cli-gate.d.ts.map +1 -0
- package/dist/cli-gate.js +46 -0
- package/dist/cli-gate.js.map +7 -0
- package/dist/command-palette.d.ts +61 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +352 -0
- package/dist/command-palette.js.map +7 -0
- package/dist/command-surface.d.ts +85 -0
- package/dist/command-surface.d.ts.map +1 -0
- package/dist/command-surface.js +292 -0
- package/dist/command-surface.js.map +7 -0
- package/dist/commands-reload.js +2 -2
- package/dist/commands-reload.js.map +2 -2
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +196 -21
- package/dist/commands.js.map +2 -2
- package/dist/debug-command.d.ts +5 -0
- package/dist/debug-command.d.ts.map +1 -0
- package/dist/debug-command.js +118 -0
- package/dist/debug-command.js.map +7 -0
- package/dist/help-text.d.ts +3 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +160 -0
- package/dist/help-text.js.map +7 -0
- package/dist/i18n/locales/en.d.ts +103 -89
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +105 -91
- 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 +138 -118
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +2 -2
- package/dist/llbot-launch.d.ts +20 -0
- package/dist/llbot-launch.d.ts.map +1 -0
- package/dist/llbot-launch.js +40 -0
- package/dist/llbot-launch.js.map +7 -0
- package/dist/log-filter.d.ts +69 -0
- package/dist/log-filter.d.ts.map +1 -0
- package/dist/log-filter.js +150 -0
- package/dist/log-filter.js.map +7 -0
- package/dist/logs.d.ts +29 -7
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +164 -72
- package/dist/logs.js.map +3 -3
- package/dist/main.js +55 -46
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +17 -40
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +129 -85
- package/dist/module-commands.js.map +2 -2
- package/dist/module-pack-build.d.ts +10 -0
- package/dist/module-pack-build.d.ts.map +1 -0
- package/dist/module-pack-build.js +434 -0
- package/dist/module-pack-build.js.map +7 -0
- package/dist/module-toggle.d.ts +33 -0
- package/dist/module-toggle.d.ts.map +1 -0
- package/dist/module-toggle.js +28 -0
- package/dist/module-toggle.js.map +7 -0
- package/dist/node-service-probe.d.ts +18 -0
- package/dist/node-service-probe.d.ts.map +1 -0
- package/dist/node-service-probe.js +97 -0
- package/dist/node-service-probe.js.map +7 -0
- package/dist/pack-lifecycle.d.ts +1 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +14 -4
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/pack-update/index.d.ts +18 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +113 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/registry.d.ts +7 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -3
- package/dist/registry.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts +10 -0
- package/dist/repl-windows/format-display.d.ts.map +1 -0
- package/dist/repl-windows/format-display.js +57 -0
- package/dist/repl-windows/format-display.js.map +7 -0
- package/dist/repl-windows/host.d.ts +60 -0
- package/dist/repl-windows/host.d.ts.map +1 -0
- package/dist/repl-windows/host.js +179 -0
- package/dist/repl-windows/host.js.map +7 -0
- package/dist/repl-windows/index.d.ts +9 -0
- package/dist/repl-windows/index.d.ts.map +1 -0
- package/dist/repl-windows/index.js +13 -0
- package/dist/repl-windows/index.js.map +7 -0
- package/dist/repl-windows/logs-filter-window.d.ts +15 -0
- package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
- package/dist/repl-windows/logs-filter-window.js +77 -0
- package/dist/repl-windows/logs-filter-window.js.map +7 -0
- package/dist/repl-windows/service-window.d.ts +4 -0
- package/dist/repl-windows/service-window.d.ts.map +1 -0
- package/dist/repl-windows/service-window.js +35 -0
- package/dist/repl-windows/service-window.js.map +7 -0
- package/dist/repl-windows/types.d.ts +56 -0
- package/dist/repl-windows/types.d.ts.map +1 -0
- package/dist/repl-windows/types.js +1 -0
- package/dist/repl-windows/types.js.map +7 -0
- package/dist/repl.d.ts +6 -9
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +698 -427
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +6 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +23 -28
- package/dist/runtime.js.map +2 -2
- package/dist/send-target.d.ts +11 -0
- package/dist/send-target.d.ts.map +1 -0
- package/dist/send-target.js +42 -0
- package/dist/send-target.js.map +7 -0
- package/dist/services.d.ts +50 -4
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +244 -20
- package/dist/services.js.map +2 -2
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +2 -2
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +76 -16
- package/dist/wizard.js.map +2 -2
- package/dist/world-packs.d.ts +15 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +90 -87
- package/dist/world-packs.js.map +2 -2
- package/package.json +24 -21
- package/scripts/module-install/check-modules.mjs +204 -0
- package/scripts/module-install/fetch-module.mjs +1007 -0
- package/scripts/module-install/install-resolver.test.mjs +48 -0
- package/scripts/module-install/lib/catalog.mjs +96 -0
- package/scripts/module-install/lib/io.mjs +37 -0
- package/scripts/module-install/lib/link-from.mjs +80 -0
- package/scripts/module-install/lib/lock.mjs +78 -0
- package/scripts/module-install/lib/npm-resolver.mjs +55 -0
- package/scripts/module-install/lib/packages.mjs +142 -0
- package/scripts/module-install/lib/paths.mjs +48 -0
- package/scripts/module-install/lib/registry-index.mjs +50 -0
- package/scripts/module-install/link-local.test.mjs +51 -0
- package/scripts/module-install/local-resolver.test.mjs +51 -0
- package/scripts/module-install/registry-index.test.mjs +28 -0
- package/dist/module-wizard.d.ts +0 -14
- package/dist/module-wizard.d.ts.map +0 -1
- package/dist/module-wizard.js +0 -313
- package/dist/module-wizard.js.map +0 -7
- package/dist/pack-update/bindings.d.ts +0 -12
- package/dist/pack-update/bindings.d.ts.map +0 -1
- package/dist/pack-update/bindings.js +0 -64
- package/dist/pack-update/bindings.js.map +0 -7
- package/dist/pack-update/config.d.ts +0 -22
- package/dist/pack-update/config.d.ts.map +0 -1
- package/dist/pack-update/config.js +0 -141
- package/dist/pack-update/config.js.map +0 -7
- package/dist/pack-update/providers/curseforge.d.ts +0 -23
- package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
- package/dist/pack-update/providers/curseforge.js +0 -209
- package/dist/pack-update/providers/curseforge.js.map +0 -7
- package/dist/pack-update/providers/index.d.ts +0 -16
- package/dist/pack-update/providers/index.d.ts.map +0 -1
- package/dist/pack-update/providers/index.js +0 -37
- package/dist/pack-update/providers/index.js.map +0 -7
- package/dist/pack-update/service.d.ts +0 -21
- package/dist/pack-update/service.d.ts.map +0 -1
- package/dist/pack-update/service.js +0 -567
- package/dist/pack-update/service.js.map +0 -7
- package/dist/pack-update/types.d.ts +0 -126
- package/dist/pack-update/types.d.ts.map +0 -1
- package/dist/pack-update/types.js +0 -8
- package/dist/pack-update/types.js.map +0 -7
- package/dist/pack-update/version-policy.d.ts +0 -80
- package/dist/pack-update/version-policy.d.ts.map +0 -1
- package/dist/pack-update/version-policy.js +0 -216
- package/dist/pack-update/version-policy.js.map +0 -7
- package/dist/remote-agent.d.ts +0 -18
- package/dist/remote-agent.d.ts.map +0 -1
- package/dist/remote-agent.js +0 -196
- package/dist/remote-agent.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/log-filter.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * log-filter.ts \u2014 configs/log-filter.json \u52A0\u8F7D\u4E0E\u5339\u914D\uFF08\u7EAF\u5224\u5B9A + \u70ED\u8BFB\u7F13\u5B58\uFF09\n */\nimport { ensureSchemaConfig, readJson, stripConfigMeta } from \"@sfmc-bds/sdk/node/config\";\nimport type { LogLevel } from \"@sfmc-bds/sdk/logs\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogFilterMode = \"drop\" | \"keep\";\nexport type LogFilterApplyTo = \"display\" | \"all\";\n\nexport interface LogFilterRule {\n enabled?: boolean;\n sources?: string[];\n levels?: LogLevel[];\n contains?: string;\n /** JS RegExp \u6E90\uFF1B\u652F\u6301\u524D\u7F00 (?i) \u8868\u793A\u5FFD\u7565\u5927\u5C0F\u5199 */\n regex?: string;\n}\n\nexport interface LogFilterConfig {\n enabled: boolean;\n mode: LogFilterMode;\n applyTo: LogFilterApplyTo;\n rules: LogFilterRule[];\n}\n\nexport type LogFilterEntry = {\n text: string;\n source: string;\n level: LogLevel;\n};\n\nconst DEFAULTS: LogFilterConfig = {\n enabled: false,\n mode: \"drop\",\n applyTo: \"display\",\n rules: [],\n};\n\nexport function logFilterConfigPath(): string {\n return path.join(ROOT, \"configs\", \"log-filter.json\");\n}\n\n/** \u786E\u4FDD configs/log-filter.json \u5B58\u5728\uFF08\u59D4\u6258 SDK ensureSchemaConfig\uFF0C\u7981\u6B62\u624B\u5199 withConfigSchema\uFF09 */\nexport function ensureLogFilterConfigFile(): string {\n ensureSchemaConfig(ROOT, \"log-filter.json\", \"log_filter\", { ...DEFAULTS } as Record<string, unknown>);\n return logFilterConfigPath();\n}\n\ntype CompiledRule = {\n sources?: Set<string>;\n levels?: Set<string>;\n contains?: string;\n regex?: RegExp;\n};\n\ntype CompiledFilter = {\n enabled: boolean;\n mode: LogFilterMode;\n applyTo: LogFilterApplyTo;\n rules: CompiledRule[];\n mtimeMs: number;\n};\n\nlet cache: CompiledFilter | null = null;\n\n/** \u5C06 (?i) \u524D\u7F00\u8F6C\u4E3A RegExp i \u65D7\u6807\uFF08JS \u65E0\u5185\u8054 (?i)\uFF09 */\nexport function compileLogFilterRegex(src: string): RegExp | null {\n let pattern = String(src ?? \"\");\n let flags = \"\";\n if (pattern.startsWith(\"(?i)\")) {\n pattern = pattern.slice(4);\n flags = \"i\";\n }\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n}\n\nfunction compileRules(rules: LogFilterRule[], onBadRegex?: (src: string) => void): CompiledRule[] {\n const out: CompiledRule[] = [];\n for (const r of rules) {\n if (r.enabled === false) continue;\n const hasAny =\n (r.sources && r.sources.length > 0) ||\n (r.levels && r.levels.length > 0) ||\n (typeof r.contains === \"string\" && r.contains.length > 0) ||\n (typeof r.regex === \"string\" && r.regex.length > 0);\n if (!hasAny) continue;\n\n const compiled: CompiledRule = {};\n if (r.sources && r.sources.length > 0) {\n compiled.sources = new Set(r.sources.map((s) => s.toLowerCase()));\n }\n if (r.levels && r.levels.length > 0) {\n compiled.levels = new Set(r.levels.map((l) => l.toLowerCase()));\n }\n if (typeof r.contains === \"string\" && r.contains.length > 0) {\n compiled.contains = r.contains;\n }\n if (typeof r.regex === \"string\" && r.regex.length > 0) {\n const re = compileLogFilterRegex(r.regex);\n if (!re) {\n onBadRegex?.(r.regex);\n continue;\n }\n compiled.regex = re;\n }\n out.push(compiled);\n }\n return out;\n}\n\nfunction normalizeConfig(raw: Record<string, unknown>): LogFilterConfig {\n const stripped = stripConfigMeta(raw);\n const mode = stripped.mode === \"keep\" ? \"keep\" : \"drop\";\n const applyTo = stripped.applyTo === \"all\" ? \"all\" : \"display\";\n const rules = Array.isArray(stripped.rules) ? (stripped.rules as LogFilterRule[]) : [];\n return {\n enabled: Boolean(stripped.enabled),\n mode,\n applyTo,\n rules,\n };\n}\n\n/**\n * \u52A0\u8F7D\u5E76\u7F16\u8BD1\u8FC7\u6EE4\u914D\u7F6E\uFF08\u6309\u6587\u4EF6 mtime \u70ED\u8BFB\uFF09\u3002\n * onBadRegex\uFF1A\u6B63\u5219\u975E\u6CD5\u65F6\u56DE\u8C03\uFF08\u7531 logs \u5C42\u6253 warn\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\uFF09\u3002\n */\nexport function getCompiledLogFilter(onBadRegex?: (src: string) => void): CompiledFilter {\n const p = ensureLogFilterConfigFile();\n let mtimeMs = 0;\n try {\n mtimeMs = fs.statSync(p).mtimeMs;\n } catch {\n mtimeMs = 0;\n }\n if (cache && cache.mtimeMs === mtimeMs) return cache;\n\n let cfg = { ...DEFAULTS };\n const raw = readJson<Record<string, unknown>>(p);\n if (raw) {\n try {\n cfg = normalizeConfig(raw);\n } catch {\n cfg = { ...DEFAULTS };\n }\n }\n\n const rules = compileRules(cfg.rules, onBadRegex);\n\n cache = {\n enabled: cfg.enabled,\n mode: cfg.mode,\n applyTo: cfg.applyTo,\n rules,\n mtimeMs,\n };\n return cache;\n}\n\n/** \u5355\u6761\u89C4\u5219\u662F\u5426\u547D\u4E2D\uFF08\u540C\u6761 AND\uFF09 */\nexport function ruleMatchesEntry(rule: CompiledRule, entry: LogFilterEntry): boolean {\n if (rule.sources && !rule.sources.has(entry.source.toLowerCase())) return false;\n if (rule.levels && !rule.levels.has(entry.level.toLowerCase())) return false;\n if (rule.contains != null && !entry.text.includes(rule.contains)) return false;\n if (rule.regex && !rule.regex.test(entry.text)) return false;\n return true;\n}\n\n/** \u4EFB\u4E00\u89C4\u5219\u547D\u4E2D\u5373\u4E3A matched */\nexport function entryMatchesAnyRule(entry: LogFilterEntry, rules: CompiledRule[]): boolean {\n if (rules.length === 0) return false;\n return rules.some((r) => ruleMatchesEntry(r, entry));\n}\n\n/**\n * \u662F\u5426\u5E94\u4E22\u5F03\u8BE5\u6761\uFF08\u5BF9\u5C55\u793A/\u5185\u5B58\u800C\u8A00\uFF09\u3002\n * enabled=false \u2192 \u4E0D\u4E22\uFF1Bkeep \u6A21\u5F0F\u672A\u5339\u914D \u2192 \u4E22\uFF1Bdrop \u6A21\u5F0F\u5339\u914D \u2192 \u4E22\u3002\n */\nexport function shouldDropForDisplay(entry: LogFilterEntry, filter: CompiledFilter): boolean {\n if (!filter.enabled) return false;\n const matched = entryMatchesAnyRule(entry, filter.rules);\n if (filter.mode === \"keep\") return !matched;\n return matched;\n}\n\n/** \u662F\u5426\u5E94\u8DF3\u8FC7\u843D\u76D8\uFF08\u4EC5 applyTo=all \u65F6\u4E0E display \u4E00\u81F4\uFF09 */\nexport function shouldDropForDisk(entry: LogFilterEntry, filter: CompiledFilter): boolean {\n if (filter.applyTo !== \"all\") return false;\n return shouldDropForDisplay(entry, filter);\n}\n\n/** \u6D4B\u8BD5\u7528\uFF1A\u6E05\u7A7A\u7F13\u5B58 */\nexport function resetLogFilterCacheForTests(): void {\n cache = null;\n}\n\n/**\n * \u7EAF\u51FD\u6570\u5224\u5B9A\uFF08\u4E0D\u8BFB\u76D8\uFF09\uFF1A\u4F9B\u5355\u6D4B\u4E0E\u8C03\u7528\u65B9\u8868\u9A71\u52A8\u3002\n * dropDisplay / dropDisk \u8BED\u4E49\u4E0E pushLog \u4E00\u81F4\u3002\n */\nexport function evaluateLogFilter(\n entry: LogFilterEntry,\n cfg: LogFilterConfig\n): { dropDisplay: boolean; dropDisk: boolean; matched: boolean } {\n const compiled = {\n enabled: cfg.enabled,\n mode: cfg.mode,\n applyTo: cfg.applyTo,\n rules: compileRules(cfg.rules),\n mtimeMs: 0,\n };\n return {\n matched: entryMatchesAnyRule(entry, compiled.rules),\n dropDisplay: shouldDropForDisplay(entry, compiled),\n dropDisk: shouldDropForDisk(entry, compiled),\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/logs.d.ts
CHANGED
|
@@ -17,31 +17,53 @@ export type LogLevel = SharedLogLevel;
|
|
|
17
17
|
export type LogSource = string;
|
|
18
18
|
export interface UnifiedLog extends LogEntry {
|
|
19
19
|
}
|
|
20
|
+
/** 再导出 SDK BDS 解析(测试与调用方统一入口,权威在 @sfmc-bds/sdk/logs) */
|
|
21
|
+
export { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from "@sfmc-bds/sdk/logs";
|
|
20
22
|
/** 推送一条日志到内存缓冲,并按策略落盘 */
|
|
21
23
|
export declare function pushLog(text: string, source: LogSource, level: LogLevel): void;
|
|
22
24
|
/** 订阅新日志事件,返回取消订阅函数 */
|
|
23
25
|
export declare function onLog(fn: (log: UnifiedLog) => void): () => void;
|
|
24
|
-
/**
|
|
25
|
-
export declare function getAllLogs(): UnifiedLog[];
|
|
26
|
-
/** 获取最近 n 条,可按 level / source 过滤 */
|
|
26
|
+
/** 获取最近 n 条,可按 level / source 过滤;再套配置过滤(display) */
|
|
27
27
|
export declare function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[];
|
|
28
|
-
/**
|
|
29
|
-
export declare function
|
|
28
|
+
/** 获取全部日志;配置过滤仅影响返回视图(缓冲内可能仍有全量,视 push 时 applyTo) */
|
|
29
|
+
export declare function getAllLogs(): UnifiedLog[];
|
|
30
|
+
/** source → 落盘文件名(含子进程自写) */
|
|
31
|
+
export declare function diskFileForSource(source: string): string;
|
|
32
|
+
/** 解析单行落盘日志;不符格式返回 null */
|
|
33
|
+
export declare function parseDiskLogLine(raw: string): UnifiedLog | null;
|
|
34
|
+
export type ReadDiskLogsOpts = {
|
|
35
|
+
levels?: LogLevel[];
|
|
36
|
+
sources?: LogSource[];
|
|
37
|
+
/** 覆盖日志目录(测试用);默认 `<ROOT>/.sfmc/logs` */
|
|
38
|
+
dir?: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* 从 `.sfmc/logs/*.log` 读取并解析为 UnifiedLog(按时间升序)。
|
|
42
|
+
* 供 /logs 筛选窗回放;与内存缓冲无关。
|
|
43
|
+
*/
|
|
44
|
+
export declare function readDiskLogs(opts?: ReadDiskLogsOpts): UnifiedLog[];
|
|
30
45
|
export interface SourceMeta {
|
|
31
46
|
value: string;
|
|
32
|
-
/**
|
|
47
|
+
/** 方括号内固定 3 字符,与 [INF] 对齐 */
|
|
33
48
|
name: string;
|
|
34
49
|
paint: (s: string) => string;
|
|
35
50
|
}
|
|
36
51
|
export declare const SOURCE_META: SourceMeta[];
|
|
37
52
|
export declare function formatSourceTag(source: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* 展示用级别:BDS 若仍带时间戳前缀则解析内嵌级别;已剥离(pushLog 入库)则信任 entry.level。
|
|
55
|
+
* 禁止对正文做松散关键词匹配(会把 `[Commands] Error on line` 误判为 error)。
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveDisplayLevel(l: UnifiedLog): LogLevel;
|
|
58
|
+
/** 从原始文本推断级别:委托共享包(内含 BDS 时间戳解析) */
|
|
59
|
+
export declare function inferLevel(text: string): LogLevel;
|
|
38
60
|
/** 格式化日志用于 REPL 展示 (用 theme.ts chalk 配色) */
|
|
39
61
|
export declare function formatLog(l: UnifiedLog): string;
|
|
40
62
|
/** 字符串在终端的可见宽度 (strip ANSI 后按 CJK 宽度累加) */
|
|
41
63
|
export declare function visibleWidth(s: string): number;
|
|
42
64
|
/**
|
|
43
65
|
* 日志前缀可见宽度(时间 + 源 + 级别 + 尾空格),供悬挂缩进对齐正文起点。
|
|
44
|
-
* 与 formatLog
|
|
66
|
+
* 与 formatLog 拼接顺序保持一致(共用 resolveDisplayLevel / sourceTagPlain / levelTagPlain)。
|
|
45
67
|
*/
|
|
46
68
|
export declare function logPrefixWidth(l: UnifiedLog): number;
|
|
47
69
|
/**
|
package/dist/logs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAY5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAE/C,wDAAwD;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+BhG,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CA2C9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAG/F;AAED,qDAAqD;AACrD,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AASD,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxD;AAuBD,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS/D;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,UAAU,EAAE,CA+BtE;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EASnC,CAAC;AASF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAM3D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA+BD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAQ/C;AAwBD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D"}
|
package/dist/logs.js
CHANGED
|
@@ -2,11 +2,21 @@ import {
|
|
|
2
2
|
createFileSink,
|
|
3
3
|
createMemoryBuffer,
|
|
4
4
|
formatLogLine,
|
|
5
|
-
inferLevel as sharedInferLevel
|
|
5
|
+
inferLevel as sharedInferLevel,
|
|
6
|
+
parseBdsEmbeddedLevel,
|
|
7
|
+
stripBdsLogPrefix
|
|
6
8
|
} from "@sfmc-bds/sdk/logs";
|
|
7
|
-
import { logFile } from "@sfmc-bds/sdk/node/config";
|
|
9
|
+
import { logFile, logsDir } from "@sfmc-bds/sdk/node/config";
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import {
|
|
13
|
+
getCompiledLogFilter,
|
|
14
|
+
shouldDropForDisk,
|
|
15
|
+
shouldDropForDisplay
|
|
16
|
+
} from "./log-filter.js";
|
|
8
17
|
import { c, highlightLogLine } from "./theme.js";
|
|
9
18
|
import { ROOT } from "./runtime.js";
|
|
19
|
+
import { mapBdsLevelToken, parseBdsEmbeddedLevel as parseBdsEmbeddedLevel2, stripBdsLogPrefix as stripBdsLogPrefix2 } from "@sfmc-bds/sdk/logs";
|
|
10
20
|
const buffer = createMemoryBuffer(5e3);
|
|
11
21
|
const CHILD_OWNED_SOURCES = /* @__PURE__ */ new Set(["db", "qq", "update"]);
|
|
12
22
|
const fileSinks = /* @__PURE__ */ new Map();
|
|
@@ -29,10 +39,36 @@ process.on("exit", () => {
|
|
|
29
39
|
for (const sink of fileSinks.values()) sink.close();
|
|
30
40
|
});
|
|
31
41
|
function pushLog(text, source, level) {
|
|
32
|
-
|
|
42
|
+
let body = text;
|
|
43
|
+
let lvl = level;
|
|
44
|
+
if (source === "bds") {
|
|
45
|
+
const embedded = parseBdsEmbeddedLevel(text);
|
|
46
|
+
if (embedded) lvl = embedded;
|
|
47
|
+
body = stripBdsLogPrefix(text);
|
|
48
|
+
}
|
|
49
|
+
const entry = { time: /* @__PURE__ */ new Date(), text: body, source, level: lvl };
|
|
50
|
+
const filter = getCompiledLogFilter((src) => {
|
|
51
|
+
try {
|
|
52
|
+
const sink2 = sinkFor("system");
|
|
53
|
+
if (!sink2) return;
|
|
54
|
+
const warn = {
|
|
55
|
+
time: /* @__PURE__ */ new Date(),
|
|
56
|
+
text: `log-filter: invalid regex skipped: ${src}`,
|
|
57
|
+
source: "system",
|
|
58
|
+
level: "warn"
|
|
59
|
+
};
|
|
60
|
+
sink2.write(warn, formatLogLine(warn, false));
|
|
61
|
+
} catch {
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const dropDisplay = shouldDropForDisplay(entry, filter);
|
|
65
|
+
const dropDisk = shouldDropForDisk(entry, filter);
|
|
66
|
+
if (!dropDisplay) {
|
|
67
|
+
buffer.pushDirect(body, source, lvl);
|
|
68
|
+
}
|
|
69
|
+
if (dropDisk) return;
|
|
33
70
|
const sink = sinkFor(source);
|
|
34
71
|
if (!sink) return;
|
|
35
|
-
const entry = { time: /* @__PURE__ */ new Date(), text, source, level };
|
|
36
72
|
try {
|
|
37
73
|
sink.write(entry, formatLogLine(entry, false));
|
|
38
74
|
} catch {
|
|
@@ -41,74 +77,142 @@ function pushLog(text, source, level) {
|
|
|
41
77
|
function onLog(fn) {
|
|
42
78
|
return buffer.subscribe(fn);
|
|
43
79
|
}
|
|
80
|
+
function getRecentLogs(n, levels, sources) {
|
|
81
|
+
const filter = getCompiledLogFilter();
|
|
82
|
+
return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));
|
|
83
|
+
}
|
|
44
84
|
function getAllLogs() {
|
|
45
|
-
|
|
85
|
+
const filter = getCompiledLogFilter();
|
|
86
|
+
return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));
|
|
46
87
|
}
|
|
47
|
-
|
|
48
|
-
|
|
88
|
+
const DISK_LOG_FILES = ["bds", "llbot", "db", "qq", "bds-update", "sfmc"];
|
|
89
|
+
function diskFileForSource(source) {
|
|
90
|
+
if (source === "update") return "bds-update";
|
|
91
|
+
if (source === "bds" || source === "llbot" || source === "db" || source === "qq") return source;
|
|
92
|
+
return "sfmc";
|
|
49
93
|
}
|
|
50
|
-
|
|
51
|
-
|
|
94
|
+
const DISK_LINE_RE = /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[([^\]]+)\] \[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\]\s?(.*)$/;
|
|
95
|
+
function mapDiskLevelTag(tag) {
|
|
96
|
+
switch (tag) {
|
|
97
|
+
case "ERROR":
|
|
98
|
+
case "FATAL":
|
|
99
|
+
return "error";
|
|
100
|
+
case "WARN":
|
|
101
|
+
return "warn";
|
|
102
|
+
case "OK":
|
|
103
|
+
case "SUCCESS":
|
|
104
|
+
return "success";
|
|
105
|
+
case "DEBUG":
|
|
106
|
+
return "debug";
|
|
107
|
+
default:
|
|
108
|
+
return "info";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function parseDiskLogLine(raw) {
|
|
112
|
+
const m = DISK_LINE_RE.exec(raw);
|
|
113
|
+
if (!m) return null;
|
|
114
|
+
const ts = m[1];
|
|
115
|
+
const source = m[2].trim();
|
|
116
|
+
const level = mapDiskLevelTag(m[3]);
|
|
117
|
+
const body = m[4] ?? "";
|
|
118
|
+
const time = /* @__PURE__ */ new Date(ts.replace(" ", "T") + "Z");
|
|
119
|
+
return { time, source, level, text: body };
|
|
120
|
+
}
|
|
121
|
+
function readDiskLogs(opts = {}) {
|
|
122
|
+
const levels = opts.levels ?? [];
|
|
123
|
+
const sources = opts.sources ?? [];
|
|
124
|
+
const dir = opts.dir ?? logsDir(ROOT);
|
|
125
|
+
const fileNames = /* @__PURE__ */ new Set();
|
|
126
|
+
if (sources.length === 0) {
|
|
127
|
+
for (const n of DISK_LOG_FILES) fileNames.add(n);
|
|
128
|
+
} else {
|
|
129
|
+
for (const s of sources) fileNames.add(diskFileForSource(s));
|
|
130
|
+
}
|
|
131
|
+
const out = [];
|
|
132
|
+
for (const name of fileNames) {
|
|
133
|
+
const fp = path.join(dir, name.endsWith(".log") ? name : `${name}.log`);
|
|
134
|
+
let text;
|
|
135
|
+
try {
|
|
136
|
+
text = fs.readFileSync(fp, "utf8");
|
|
137
|
+
} catch {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
141
|
+
if (!raw) continue;
|
|
142
|
+
const entry = parseDiskLogLine(raw);
|
|
143
|
+
if (!entry) continue;
|
|
144
|
+
if (sources.length && !sources.includes(entry.source)) continue;
|
|
145
|
+
if (levels.length && !levels.includes(entry.level)) continue;
|
|
146
|
+
out.push(entry);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
out.sort((a, b) => a.time.getTime() - b.time.getTime());
|
|
150
|
+
return out;
|
|
52
151
|
}
|
|
53
152
|
const SOURCE_META = [
|
|
54
|
-
{ value: "bds", name: "
|
|
55
|
-
{ value: "db", name: "
|
|
56
|
-
{ value: "qq", name: "
|
|
57
|
-
{ value: "llbot", name: "
|
|
58
|
-
{ value: "system", name: "
|
|
59
|
-
{ value: "update", name: "
|
|
60
|
-
{ value: "pack", name: "
|
|
61
|
-
{ value: "bds-tools", name: "
|
|
153
|
+
{ value: "bds", name: "BDS", paint: (s) => c.green(s) },
|
|
154
|
+
{ value: "db", name: "DB ", paint: (s) => c.blue(s) },
|
|
155
|
+
{ value: "qq", name: "QQ ", paint: (s) => c.purple(s) },
|
|
156
|
+
{ value: "llbot", name: "BOT", paint: (s) => c.yellow(s) },
|
|
157
|
+
{ value: "system", name: "SYS", paint: (s) => c.cyan(s) },
|
|
158
|
+
{ value: "update", name: "UPD", paint: (s) => c.orange(s) },
|
|
159
|
+
{ value: "pack", name: "PAK", paint: (s) => c.purple(s) },
|
|
160
|
+
{ value: "bds-tools", name: "TOL", paint: (s) => c.red(s) }
|
|
62
161
|
];
|
|
162
|
+
function sourceTagPlain(source) {
|
|
163
|
+
const meta = SOURCE_META.find((m) => m.value === source);
|
|
164
|
+
if (meta) return `[${meta.name}]`;
|
|
165
|
+
return `[${source.toUpperCase().padEnd(3).slice(0, 3)}]`;
|
|
166
|
+
}
|
|
63
167
|
function formatSourceTag(source) {
|
|
64
168
|
const meta = SOURCE_META.find((m) => m.value === source);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
function stripLogPrefix(line) {
|
|
69
|
-
const prefixRegex = /^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}:\d{3} (INFO|WARNING|ERROR|FATAL|DEBUG)\]\s*/;
|
|
70
|
-
return line.replace(prefixRegex, "");
|
|
71
|
-
}
|
|
72
|
-
function getLogLevel(line) {
|
|
73
|
-
const levelNames = ["INFO", "WARNING", "ERROR", "FATAL", "DEBUG", "TRACE", "WARN"];
|
|
74
|
-
const levelPattern = levelNames.join("|");
|
|
75
|
-
let match = line.match(new RegExp(`\\[(${levelPattern})\\]`, "i"));
|
|
76
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
77
|
-
match = line.match(new RegExp(`^\\[.*?\\]\\s*(${levelPattern})`, "i"));
|
|
78
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
79
|
-
match = line.match(new RegExp(`^(${levelPattern})\\s*:`, "i"));
|
|
80
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
81
|
-
match = line.match(new RegExp(`\\[.*?\\]\\s*(${levelPattern})\\s*:`, "i"));
|
|
82
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
83
|
-
return "UNKNOWN";
|
|
169
|
+
const plain = sourceTagPlain(source);
|
|
170
|
+
if (meta) return meta.paint(plain);
|
|
171
|
+
return c.bold(plain);
|
|
84
172
|
}
|
|
85
|
-
function
|
|
86
|
-
const ts = c.dim(l.time.toLocaleTimeString());
|
|
87
|
-
let lvl = levelTag(l.level);
|
|
88
|
-
let txt = highlightLogLine(l.text);
|
|
89
|
-
const src = formatSourceTag(l.source);
|
|
173
|
+
function resolveDisplayLevel(l) {
|
|
90
174
|
if (l.source === "bds") {
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
txt = highlightLogLine(stripLogPrefix(l.text));
|
|
94
|
-
lvl = levelTag(mapped);
|
|
175
|
+
const embedded = parseBdsEmbeddedLevel(l.text);
|
|
176
|
+
if (embedded) return embedded;
|
|
95
177
|
}
|
|
96
|
-
return
|
|
178
|
+
return l.level;
|
|
179
|
+
}
|
|
180
|
+
function inferLevel(text) {
|
|
181
|
+
return sharedInferLevel(text);
|
|
182
|
+
}
|
|
183
|
+
const LEVEL_TAG_TEXT = {
|
|
184
|
+
error: "[ERR]",
|
|
185
|
+
warn: "[WRN]",
|
|
186
|
+
success: "[SUC]",
|
|
187
|
+
debug: "[DBG]",
|
|
188
|
+
info: "[INF]"
|
|
189
|
+
};
|
|
190
|
+
function levelTagPlain(lvl) {
|
|
191
|
+
return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;
|
|
97
192
|
}
|
|
98
193
|
function levelTag(lvl) {
|
|
194
|
+
const text = levelTagPlain(lvl);
|
|
99
195
|
switch (lvl) {
|
|
100
196
|
case "error":
|
|
101
|
-
return c.red(
|
|
197
|
+
return c.red(text);
|
|
102
198
|
case "warn":
|
|
103
|
-
return c.yellow(
|
|
199
|
+
return c.yellow(text);
|
|
104
200
|
case "success":
|
|
105
|
-
return c.green(c.bold(
|
|
201
|
+
return c.green(c.bold(text));
|
|
106
202
|
case "debug":
|
|
107
|
-
return c.dim(
|
|
203
|
+
return c.dim(text);
|
|
108
204
|
default:
|
|
109
|
-
return c.blue(
|
|
205
|
+
return c.blue(text);
|
|
110
206
|
}
|
|
111
207
|
}
|
|
208
|
+
function formatLog(l) {
|
|
209
|
+
const ts = c.dim(l.time.toLocaleTimeString());
|
|
210
|
+
const level = resolveDisplayLevel(l);
|
|
211
|
+
const lvl = levelTag(level);
|
|
212
|
+
const src = formatSourceTag(l.source);
|
|
213
|
+
const txt = highlightLogLine(l.source === "bds" ? stripBdsLogPrefix(l.text) : l.text);
|
|
214
|
+
return `${ts} ${src} ${lvl} ${txt}`;
|
|
215
|
+
}
|
|
112
216
|
function charWidth(ch) {
|
|
113
217
|
const cp = ch.codePointAt(0) ?? 0;
|
|
114
218
|
if (cp >= 4352 && (cp <= 4447 || cp >= 11904 && cp <= 42191 && cp !== 12351 || cp >= 44032 && cp <= 55203 || cp >= 63744 && cp <= 64255 || cp >= 65072 && cp <= 65103 || cp >= 65280 && cp <= 65376 || cp >= 65504 && cp <= 65510 || cp >= 131072 && cp <= 196605))
|
|
@@ -121,29 +225,10 @@ function visibleWidth(s) {
|
|
|
121
225
|
for (const ch of stripped) w += charWidth(ch);
|
|
122
226
|
return w;
|
|
123
227
|
}
|
|
124
|
-
function levelTagPlain(lvl) {
|
|
125
|
-
switch (lvl) {
|
|
126
|
-
case "error":
|
|
127
|
-
return "[ERR]";
|
|
128
|
-
case "warn":
|
|
129
|
-
return "[WRN]";
|
|
130
|
-
case "success":
|
|
131
|
-
return "[OK]";
|
|
132
|
-
case "debug":
|
|
133
|
-
return "[DBG]";
|
|
134
|
-
default:
|
|
135
|
-
return "[INF]";
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
228
|
function logPrefixWidth(l) {
|
|
139
229
|
const ts = l.time.toLocaleTimeString();
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
let level = l.level;
|
|
143
|
-
if (l.source === "bds") {
|
|
144
|
-
const parsed = getLogLevel(l.text);
|
|
145
|
-
level = parsed === "WARNING" || parsed === "WARN" ? "warn" : parsed === "ERROR" || parsed === "FATAL" ? "error" : parsed === "DEBUG" || parsed === "TRACE" ? "debug" : "info";
|
|
146
|
-
}
|
|
230
|
+
const src = sourceTagPlain(l.source);
|
|
231
|
+
const level = resolveDisplayLevel(l);
|
|
147
232
|
return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);
|
|
148
233
|
}
|
|
149
234
|
function wrapLogLine(s, indent) {
|
|
@@ -203,14 +288,21 @@ function wrapSegment(s, cols, startPad, hangIndent) {
|
|
|
203
288
|
}
|
|
204
289
|
export {
|
|
205
290
|
SOURCE_META,
|
|
291
|
+
diskFileForSource,
|
|
206
292
|
formatLog,
|
|
207
293
|
formatSourceTag,
|
|
208
294
|
getAllLogs,
|
|
209
295
|
getRecentLogs,
|
|
210
296
|
inferLevel,
|
|
211
297
|
logPrefixWidth,
|
|
298
|
+
mapBdsLevelToken,
|
|
212
299
|
onLog,
|
|
300
|
+
parseBdsEmbeddedLevel2 as parseBdsEmbeddedLevel,
|
|
301
|
+
parseDiskLogLine,
|
|
213
302
|
pushLog,
|
|
303
|
+
readDiskLogs,
|
|
304
|
+
resolveDisplayLevel,
|
|
305
|
+
stripBdsLogPrefix2 as stripBdsLogPrefix,
|
|
214
306
|
visibleWidth,
|
|
215
307
|
wrapLogLine
|
|
216
308
|
};
|
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 type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile } from \"@sfmc-bds/sdk/node/config\";\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\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/** \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 buffer.pushDirect(text, source, level);\n const sink = sinkFor(source);\n if (!sink) return;\n const entry: LogEntry = { time: new Date(), text, source, level };\n try {\n sink.write(entry, formatLogLine(entry, 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\u5168\u90E8\u65E5\u5FD7 (\u6309\u65F6\u95F4\u987A\u5E8F) */\nexport function getAllLogs(): UnifiedLog[] {\n return buffer.getAll();\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n return buffer.getRecent(n, levels, sources);\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u65E5\u5FD7\u7EA7\u522B (\u59D4\u6258\u5171\u4EAB\u5305) */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\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 /** \u663E\u793A\u540D,\u5C3D\u91CF 8 \u5BBD\u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDServer\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DataBase\", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQBridge\", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \" LL-BOT \", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \" SYSTEM \", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \" UPDATE \", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \" PACK \", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"BDSTools\", paint: (s) => c.red(s) },\n];\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return meta.paint(`[${meta.name}]`);\n return c.bold(`[${source.padEnd(7).slice(0, 8)}]`);\n}\n\n/** \u7B80\u5316BDS\u65E5\u5FD7 */\nfunction stripLogPrefix(line: string): string {\n // \u5339\u914D\u683C\u5F0F: [2026-07-18 23:56:06:778 INFO]\n const prefixRegex = /^\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}:\\d{3} (INFO|WARNING|ERROR|FATAL|DEBUG)\\]\\s*/;\n return line.replace(prefixRegex, \"\");\n}\n\n/**\n * \u4ECE\u4E00\u884C BDS \u65E5\u5FD7\u4E2D\u63D0\u53D6\u65E5\u5FD7\u7B49\u7EA7\n * @param line \u65E5\u5FD7\u884C\u5B57\u7B26\u4E32\n * @returns \u65E5\u5FD7\u7B49\u7EA7\uFF08\u5927\u5199\uFF09\uFF0C\u82E5\u65E0\u6CD5\u8BC6\u522B\u5219\u8FD4\u56DE 'UNKNOWN'\n */\nfunction getLogLevel(line: string): string {\n const levelNames = [\"INFO\", \"WARNING\", \"ERROR\", \"FATAL\", \"DEBUG\", \"TRACE\", \"WARN\"];\n const levelPattern = levelNames.join(\"|\");\n\n let match = line.match(new RegExp(`\\\\[(${levelPattern})\\\\]`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`^\\\\[.*?\\\\]\\\\s*(${levelPattern})`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`^(${levelPattern})\\\\s*:`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`\\\\[.*?\\\\]\\\\s*(${levelPattern})\\\\s*:`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n return \"UNKNOWN\";\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 let lvl = levelTag(l.level);\n let txt = highlightLogLine(l.text);\n const src = formatSourceTag(l.source);\n if (l.source === \"bds\") {\n const parsed = getLogLevel(l.text);\n const mapped: LogLevel =\n parsed === \"WARNING\" || parsed === \"WARN\"\n ? \"warn\"\n : parsed === \"ERROR\" || parsed === \"FATAL\"\n ? \"error\"\n : parsed === \"DEBUG\" || parsed === \"TRACE\"\n ? \"debug\"\n : \"info\";\n /* \u53BB\u6389 BDS \u81EA\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u540E\u518D\u9AD8\u4EAE\u6B63\u6587 */\n txt = highlightLogLine(stripLogPrefix(l.text));\n lvl = levelTag(mapped);\n }\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n switch (lvl) {\n case \"error\":\n return c.red(\"[ERR]\");\n case \"warn\":\n return c.yellow(\"[WRN]\");\n case \"success\":\n return c.green(c.bold(\"[OK]\"));\n case \"debug\":\n return c.dim(\"[DBG]\");\n default:\n return c.blue(\"[INF]\");\n }\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/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E,\u4E0E levelTag \u53EF\u89C1\u5BBD\u5EA6\u4E00\u81F4 */\nfunction levelTagPlain(lvl: LogLevel): string {\n switch (lvl) {\n case \"error\":\n return \"[ERR]\";\n case \"warn\":\n return \"[WRN]\";\n case \"success\":\n return \"[OK]\";\n case \"debug\":\n return \"[DBG]\";\n default:\n return \"[INF]\";\n }\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\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const meta = SOURCE_META.find((m) => m.value === l.source);\n const src = meta ? `[${meta.name}]` : `[${l.source.padEnd(7).slice(0, 8)}]`;\n let level: LogLevel = l.level;\n if (l.source === \"bds\") {\n const parsed = getLogLevel(l.text);\n level =\n parsed === \"WARNING\" || parsed === \"WARN\"\n ? \"warn\"\n : parsed === \"ERROR\" || parsed === \"FATAL\"\n ? \"error\"\n : parsed === \"DEBUG\" || parsed === \"TRACE\"\n ? \"debug\"\n : \"info\";\n }\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,
|
|
6
|
-
"names": []
|
|
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} 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/** \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 body = stripBdsLogPrefix(text);\n }\n\n const entry: 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(entry, filter);\n const dropDisk = shouldDropForDisk(entry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(body, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n sink.write(entry, formatLogLine(entry, 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\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u5265\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\uFF09 */\n const txt = highlightLogLine(l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.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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",
|
|
6
|
+
"names": ["parseBdsEmbeddedLevel", "stripBdsLogPrefix", "sink"]
|
|
7
7
|
}
|