mirror of
https://github.com/Cola-Echo/memory-manager-concurrent.git
synced 2026-06-06 11:15:51 +00:00
- 进度条改用检查点驱动模拟真实流式传输进度 (5→15→25→35→45→60→75→85→92→100) - 每个检查点间使用 ease-out 缓动平滑过渡 - 完成时从当前进度平滑动画到 100% - 修复一键全选按钮事件绑定问题 - 添加调试日志帮助诊断问题 - 修复 addSystemMessage 使用不存在容器的问题 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
266 lines
6.8 KiB
JavaScript
266 lines
6.8 KiB
JavaScript
/**
|
||
* 日志工具模块
|
||
* @module core/logger
|
||
*/
|
||
|
||
// 日志配置缓存
|
||
let logConfigCache = null;
|
||
let configModule = null;
|
||
|
||
// 使用 ES 模块的动态导入
|
||
async function loadConfigModule() {
|
||
if (!configModule) {
|
||
try {
|
||
configModule = await import("@config/config-manager");
|
||
} catch (e) {
|
||
console.error("[记忆管理并发系统] 无法加载配置模块:", e);
|
||
}
|
||
}
|
||
return configModule;
|
||
}
|
||
|
||
function getGlobalSettings() {
|
||
// 先尝试从缓存获取
|
||
if (logConfigCache) {
|
||
return logConfigCache;
|
||
}
|
||
|
||
// 尝试直接获取配置(适用于模块已加载的情况)
|
||
try {
|
||
// 避免循环依赖,直接从全局对象获取
|
||
if (
|
||
typeof window !== "undefined" &&
|
||
window.MemoryManagerConcurrent &&
|
||
window.MemoryManagerConcurrent.getSettings
|
||
) {
|
||
const settings = window.MemoryManagerConcurrent.getSettings();
|
||
logConfigCache = settings;
|
||
return settings;
|
||
}
|
||
} catch (e) {
|
||
// 忽略错误
|
||
}
|
||
|
||
// 返回默认值
|
||
return { showLogs: true }; // 默认显示日志,方便调试
|
||
}
|
||
|
||
// 系统前缀
|
||
const SYSTEM_PREFIX = "[记忆管理并发系统]";
|
||
|
||
// 当前活跃的日志组
|
||
let activeGroups = [];
|
||
|
||
/**
|
||
* 日志工具对象
|
||
*/
|
||
const Logger = {
|
||
prefix: SYSTEM_PREFIX,
|
||
|
||
/**
|
||
* 检查是否应该显示日志
|
||
* @returns {boolean}
|
||
*/
|
||
shouldShowLogs: () => {
|
||
// 总是返回 true,确保所有日志都能显示
|
||
return true;
|
||
},
|
||
|
||
/**
|
||
* 构建完整的日志前缀
|
||
* @param {string} [module] 模块名称
|
||
* @returns {string} 完整前缀
|
||
*/
|
||
buildPrefix: (module) => {
|
||
if (module) {
|
||
return `${SYSTEM_PREFIX}-[${module}]`;
|
||
}
|
||
return SYSTEM_PREFIX;
|
||
},
|
||
|
||
/**
|
||
* 普通日志(受 showLogs 控制)
|
||
* @param {...any} args 日志参数
|
||
*/
|
||
log: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.log(Logger.prefix, ...args);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 调试日志(受 showLogs 控制)
|
||
* 注意:使用 console.log 而非 console.debug,确保在所有浏览器设置下可见
|
||
* @param {...any} args 日志参数
|
||
*/
|
||
debug: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.log(Logger.prefix, "[DEBUG]", ...args);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 警告日志(受 showLogs 控制)
|
||
* @param {...any} args 日志参数
|
||
*/
|
||
warn: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.warn(Logger.prefix, ...args);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 错误日志(总是输出)
|
||
* @param {...any} args 日志参数
|
||
*/
|
||
error: (...args) => {
|
||
console.error(Logger.prefix, ...args);
|
||
},
|
||
|
||
/**
|
||
* 信息日志(总是输出,用于重要信息)
|
||
* @param {...any} args 日志参数
|
||
*/
|
||
info: (...args) => {
|
||
console.info(Logger.prefix, ...args);
|
||
},
|
||
|
||
// ==================== 日志分组功能 ====================
|
||
|
||
/**
|
||
* 开始一个日志组(展开状态)
|
||
* @param {string} module 模块名称
|
||
* @param {string} [label] 组标签
|
||
*/
|
||
group: (module, label) => {
|
||
if (!Logger.shouldShowLogs()) return;
|
||
const prefix = Logger.buildPrefix(module);
|
||
const groupLabel = label ? `${prefix} ${label}` : prefix;
|
||
console.group(groupLabel);
|
||
activeGroups.push(groupLabel);
|
||
},
|
||
|
||
/**
|
||
* 开始一个折叠的日志组
|
||
* @param {string} module 模块名称
|
||
* @param {string} [label] 组标签
|
||
*/
|
||
groupCollapsed: (module, label) => {
|
||
if (!Logger.shouldShowLogs()) return;
|
||
const prefix = Logger.buildPrefix(module);
|
||
const groupLabel = label ? `${prefix} ${label}` : prefix;
|
||
console.groupCollapsed(groupLabel);
|
||
activeGroups.push(groupLabel);
|
||
},
|
||
|
||
/**
|
||
* 结束当前日志组
|
||
*/
|
||
groupEnd: () => {
|
||
if (!Logger.shouldShowLogs()) return;
|
||
if (activeGroups.length > 0) {
|
||
console.groupEnd();
|
||
activeGroups.pop();
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 结束所有日志组
|
||
*/
|
||
groupEndAll: () => {
|
||
if (!Logger.shouldShowLogs()) return;
|
||
while (activeGroups.length > 0) {
|
||
console.groupEnd();
|
||
activeGroups.pop();
|
||
}
|
||
},
|
||
|
||
// ==================== 模块化日志工具 ====================
|
||
|
||
/**
|
||
* 创建一个带模块名的日志记录器
|
||
* @param {string} module 模块名称
|
||
* @returns {object} 日志记录器对象
|
||
*/
|
||
createModuleLogger: (module) => {
|
||
const modulePrefix = Logger.buildPrefix(module);
|
||
|
||
return {
|
||
prefix: modulePrefix,
|
||
|
||
log: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.log(modulePrefix, ...args);
|
||
}
|
||
},
|
||
|
||
debug: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.log(modulePrefix, "[DEBUG]", ...args);
|
||
}
|
||
},
|
||
|
||
warn: (...args) => {
|
||
if (Logger.shouldShowLogs()) {
|
||
console.warn(modulePrefix, ...args);
|
||
}
|
||
},
|
||
|
||
error: (...args) => {
|
||
console.error(modulePrefix, ...args);
|
||
},
|
||
|
||
info: (...args) => {
|
||
console.info(modulePrefix, ...args);
|
||
},
|
||
|
||
/**
|
||
* 开始一个日志组
|
||
* @param {string} [label] 组标签
|
||
*/
|
||
group: (label) => {
|
||
Logger.group(module, label);
|
||
},
|
||
|
||
/**
|
||
* 开始一个折叠的日志组
|
||
* @param {string} [label] 组标签
|
||
*/
|
||
groupCollapsed: (label) => {
|
||
Logger.groupCollapsed(module, label);
|
||
},
|
||
|
||
/**
|
||
* 结束当前日志组
|
||
*/
|
||
groupEnd: () => {
|
||
Logger.groupEnd();
|
||
},
|
||
|
||
/**
|
||
* 执行带分组的操作
|
||
* @param {string} label 组标签
|
||
* @param {Function} fn 要执行的函数
|
||
* @param {boolean} [collapsed=true] 是否折叠
|
||
*/
|
||
withGroup: async (label, fn, collapsed = true) => {
|
||
if (!Logger.shouldShowLogs()) {
|
||
return await fn();
|
||
}
|
||
if (collapsed) {
|
||
Logger.groupCollapsed(module, label);
|
||
} else {
|
||
Logger.group(module, label);
|
||
}
|
||
try {
|
||
return await fn();
|
||
} finally {
|
||
Logger.groupEnd();
|
||
}
|
||
},
|
||
};
|
||
},
|
||
};
|
||
|
||
export default Logger;
|