feat: 预算警告 & Shadowing 防护 & 记忆容量管理 (v5.1.2)

- 预算警告临时层:Agent Loop 剩余 ≤5 轮注入 WARNING,≤2 轮注入 CRITICAL
- MCP Shadowing 防护:MCP 工具注册时检测重名,自动跳过并警告
- 记忆容量限制:上限 500 条,超限自动清理低价值条目(rule 受保护)
- 版本号更新至 5.1.2
This commit is contained in:
Metona Build
2026-04-19 18:10:26 +08:00
parent bea52bf1b7
commit 71bd6e19ea
10 changed files with 114 additions and 10 deletions
+14 -3
View File
@@ -641,9 +641,20 @@ let _mcpToolCache: ToolDefinition[] = [];
/** 刷新 MCP 工具缓存(在 MCP 服务器配置变更时调用) */
export async function refreshMCPTools(): Promise<void> {
try {
_mcpToolCache = await getMCPToolDefinitions();
if (_mcpToolCache.length > 0) {
logInfo(`MCP 工具已注册: ${_mcpToolCache.length}`, _mcpToolCache.map(t => t.function.name).join(', '));
const rawTools = await getMCPToolDefinitions();
// v5.1.2 Shadowing 防护:MCP 工具不能覆盖内置工具
const builtInNames = new Set(TOOL_DEFINITIONS.map(d => d.function.name));
const filtered = rawTools.filter(t => {
if (builtInNames.has(t.function.name)) {
logWarn(`MCP 工具 "${t.function.name}" 与内置工具重名,已跳过`);
return false;
}
return true;
});
const skipped = rawTools.length - filtered.length;
_mcpToolCache = filtered;
if (filtered.length > 0) {
logInfo(`MCP 工具已注册: ${filtered.length}${skipped > 0 ? `${skipped} 个因重名被跳过)` : ''}`, filtered.map(t => t.function.name).join(', '));
}
} catch (err) {
logError('MCP 工具刷新失败', (err as Error).message);