import { sdkConfig } from '../../../sdk/sdkConfig'; /** * AI 调试打印。统一前缀 `[AI操作]`,紫色普通 log;由 sdkConfig.enableAiDecisionLog 控制。 * 控制台亦可 `setAiLogVerbose(true)` 临时强制开启。 */ /** 所有 AI 日志统一前缀(控制台过滤用) */ export const AI_LOG_PREFIX = '[AI操作]'; /** 紫色样式(与打点绿字同用 %c) */ const AI_LOG_STYLE = 'color:#9c27b0'; /** 运行时强制开关;null 表示跟随 sdkConfig */ let _forceVerbose: boolean | null = null; /** * 开关 AI 细节 console 打印(覆盖 sdkConfig,传 null 恢复跟随配置)。 * @param enabled 是否开启 */ export function setAiLogVerbose(enabled: boolean): void { _forceVerbose = !!enabled; } /** 当前是否开启 AI 决策打印 */ export function isAiLogVerbose(): boolean { if (_forceVerbose !== null) return _forceVerbose; return !!sdkConfig.enableAiDecisionLog; } /** * 给首参加上统一前缀。 * @param args 原始参数 */ function _withPrefix(args: unknown[]): unknown[] { if (args.length <= 0) return [AI_LOG_PREFIX]; const head = args[0]; const rest: unknown[] = []; for (let i = 1; i < args.length; i++) { const a = args[i]; if (a !== null && typeof a === 'object') continue; rest.push(a); } if (typeof head === 'string') { if (head.indexOf(AI_LOG_PREFIX) === 0) { const out: unknown[] = [head]; for (let i = 0; i < rest.length; i++) out.push(rest[i]); return out; } const out: unknown[] = [`${AI_LOG_PREFIX} ${head}`]; for (let i = 0; i < rest.length; i++) out.push(rest[i]); return out; } const out: unknown[] = [AI_LOG_PREFIX]; if (head !== null && typeof head !== 'object') out.push(head); for (let i = 0; i < rest.length; i++) out.push(rest[i]); return out; } /** * 紫色普通 log 输出。 * @param args 打印参数 */ function _printPurple(args: unknown[]): void { const out = _withPrefix(args); const head = out[0]; if (typeof head === 'string') { const rest: unknown[] = []; for (let i = 1; i < out.length; i++) rest.push(out[i]); if (rest.length <= 0) { console.log(`%c${head}`, AI_LOG_STYLE); return; } console.log(`%c${head}`, AI_LOG_STYLE, ...rest); return; } console.log(`%c${AI_LOG_PREFIX}`, AI_LOG_STYLE, ...out); } /** * AI 细节日志;关闭时为空操作。 * @param args 打印参数 */ export function aiLog(...args: unknown[]): void { if (!isAiLogVerbose()) return; _printPurple(args); } /** * AI 操作链日志(摆放/取舍/合成等);关闭时为空操作。 * @param args 打印参数 */ export function aiOp(...args: unknown[]): void { if (!isAiLogVerbose()) return; _printPurple(args); } /** * AI 告警;关闭时为空操作(紫色普通 log,避免浏览器 warn 刷屏)。 * @param args 打印参数 */ export function aiWarn(...args: unknown[]): void { if (!isAiLogVerbose()) return; _printPurple(args); } try { (globalThis as { setAiLogVerbose?: typeof setAiLogVerbose }).setAiLogVerbose = setAiLogVerbose; } catch { /* ignore */ }