v0.11.1: Agent Loop稳定性增强 + 6个系统工具 + 搜索引擎替换

【Agent Loop 稳定性】
- P0-1: 工具消息硬限制40条,超出自动删旧
- P0-2: 截断周期从5轮缩短为3轮
- P1-1: 增量记忆提取改为fire-and-forget
- P1-2: TOOLS_WITH_DATA_DEPS精简为仅web_fetch
- P2: 重复检测改为注入警告而非强制终止
- Final Answer检测增强: >300字自动放行 + 收紧反过早停止

【新增工具】(40→44)
- datetime: 系统精确时间(中文日期+时段+人性化)
- calculator: 安全数学计算(递归下降解析器)
- random: 随机数/随机选择(int/float/pick/string)
- uuid: UUID v4生成(crypto.randomUUID)
- json_format: JSON格式化+验证+键排序
- hash: MD5/SHA1/SHA256/SHA384/SHA512

【搜索引擎替换】
- Google+DuckDuckGo → 搜狗+360搜索
- 四引擎变为: Bing+百度+搜狗+360搜索

【删除】
- 联网搜索代理全部代码(search-proxy/ + 7文件代理逻辑)
- https-proxy-agent依赖

【UI】
- 模型栏: 上下文总长(蓝色)+剩余上下文(绿色)实时显示
- 设置面板上下文长度移至模型栏
- SOUL.md/AGENT.md精简为纯抽象定义

【系统提示词】
- OS环境信息改为从preload同步获取真实值(os.homedir/os.arch/os.userInfo)
This commit is contained in:
thzxx
2026-06-11 22:07:46 +08:00
parent b5d8d08986
commit 933ce7a082
26 changed files with 1040 additions and 1525 deletions
+20 -18
View File
@@ -45,13 +45,19 @@ import {
handleReplaceInFiles,
handleReadMultipleFiles,
handleGit,
handleCompress
handleCompress,
handleDateTime,
handleCalculator,
handleRandom,
handleUUID,
handleJsonFormat,
handleHash
} from './tool-handlers.js';
import { browserOpen, browserScreenshot, browserEvaluate, browserExtract, browserClick, browserType, browserScroll, browserClose, browserWait } from './browser.js';
import { startServer, stopServer, stopAllServers, callTool, getAllTools, getServerStatuses, refreshTools, setMCPTimeout } from './mcp-manager.js';
import { getAllowedDirs, getBlockedDirs, setAllowedDirs } from './tool-security.js';
import { startProcess, killProcess, getWorkspaceDir, setWorkspaceDir, listWorkspaceDir } from './workspace.js';
import { setHTTPTimeout, setProxyUrl } from './tool-handlers-system.js';
import { setHTTPTimeout } from './tool-handlers-system.js';
/** 工具结果摘要(用于日志面板) */
function summarizeResult(toolName: string, result: Record<string, unknown>): string {
@@ -75,6 +81,12 @@ function summarizeResult(toolName: string, result: Record<string, unknown>): str
case 'read_multiple_files': return `${result.total} 个文件`;
case 'git': return `${result.action}`;
case 'compress': return `${result.action}${result.archive || result.destination}`;
case 'datetime': return `${(result as any).date || (result as any).iso}`;
case 'calculator': return `${(result as any).expression} = ${(result as any).result}`;
case 'random': return `${(result as any).type === 'pick' ? '🎲 ' + String((result as any).result) : String((result as any).result)}`;
case 'uuid': return `${(result as any).result}`;
case 'json_format': return `${(result as any).keys || 0} keys, ${(result as any).formatted_size}B`;
case 'hash': return `${(result as any).algorithm}: ${(result as any).hash?.slice(0, 16)}...`;
default: return '完成';
}
}
@@ -187,6 +199,12 @@ export async function setupIPC(): Promise<void> {
case 'read_multiple_files':result = await handleReadMultipleFiles(args as { paths: string[]; max_chars_per_file?: number }); break;
case 'git': result = await handleGit(args as { action: string; path?: string; files?: string[]; message?: string; branch?: string; remote?: string; remote_url?: string; count?: number; all?: boolean; staged?: boolean; new_branch?: boolean; delete_branch?: boolean; force?: boolean; url?: string }); break;
case 'compress': result = await handleCompress(args as { action: string; path: string; destination?: string; format?: string }); break;
case 'datetime': result = handleDateTime(args as { format?: string; timezone?: string }); break;
case 'calculator': result = handleCalculator(args as { expression: string }); break;
case 'random': result = handleRandom(args as { type?: string; min?: number; max?: number; count?: number; items?: string[]; length?: number }); break;
case 'uuid': result = handleUUID(args as { count?: number }); break;
case 'json_format': result = handleJsonFormat(args as { json: string; indent?: number; sort_keys?: boolean }); break;
case 'hash': result = handleHash(args as { text: string; algorithm?: string }); break;
// v5.1 Browser 控制(增强版)
case 'browser_open': result = await browserOpen(args.url as string, args.wait_selector as string | undefined); break;
case 'browser_screenshot': result = await browserScreenshot({ full_page: args.full_page as boolean, selector: args.selector as string }); break;
@@ -231,22 +249,6 @@ export async function setupIPC(): Promise<void> {
return { success: true };
});
// ── 代理设置(web_search/web_fetch 走代理)──
ipcMain.handle('proxy:set', (_, url: string) => {
setProxyUrl(url);
if (url) {
process.env.HTTP_PROXY = url;
process.env.HTTPS_PROXY = url;
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
sendLog('info', `🌐 代理已设置`, url);
} else {
delete process.env.HTTP_PROXY;
delete process.env.HTTPS_PROXY;
delete process.env.NODE_TLS_REJECT_UNAUTHORIZED;
sendLog('info', `🌐 代理已禁用`);
}
});
// ── Workspace IPC ──
// 获取工作空间目录