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:
+20
-18
@@ -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 ──
|
||||
|
||||
// 获取工作空间目录
|
||||
|
||||
Reference in New Issue
Block a user