|
|
|
|
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 */
|
|
|
|
|
}
|