Commit Graph
143 Commits
Author SHA1 Message Date
thzxx 2d03c5f348 子代理增强:支持只读工具调用 + 可配置参数 + 10轮/5分钟
- 15 个只读工具可用:文件读取、搜索、浏览器查看、记忆/会话/技能查询
- 内置 mini Agent Loop,独立执行工具调用链
- 可配置 maxLoops / timeout / model
- agent-engine 批次并行已天然支持多个 spawn_task 并行
2026-06-05 10:50:14 +08:00
thzxx 361e58b8d1 调整提示词顺序:USER.md 移至 AGENT.md 之后、记忆/工作空间之前 2026-06-05 10:10:17 +08:00
thzxx 988efd1733 v0.9.0: SOUL.md/AGENT.md/USER.md 化为工作空间文件,去掉代码内硬编码提示词
- 版本号 v1.1.0 → v0.9.0
- AGENT_SYSTEM_PROMPT + TOOL_USAGE_GUIDE 提取为 AGENT.md(工作空间优先,内置 fallback)
- SOUL.md 同级改造(工作空间优先,内置 fallback)
- 删除 inferUserProfile 自动用户画像,改为 USER.md 手动编辑
- 三个 .md 内置版本放在 src/renderer/public/(Vite publicDir 自动复制)
2026-06-05 09:35:39 +08:00
thzxx 968350861d fix: 系统提示词卡片包含 SOUL.md 内容
state.set('_lastSystemPrompt') 改为从 messages 中拼接所有 system 消息,
确保 SOUL.md 也出现在 AI 回复顶部的折叠卡片中。
2026-06-04 22:04:54 +08:00
thzxx db6cb8d2cc feat: v1.1.0 — 上下文引擎重构 + 技能系统升级 + SOUL.md 支持
- 版本号更新: 1.0.0 → 1.1.0,全量同步 package.json/lock/README/docs/UI
- 上下文长度自动检测: 切换模型时从 model_info 读取实际 context_length
- SOUL.md 支持: 每次发送自动扫描工作空间 SOUL.md,注入为首条 system 消息且不可压缩
- 系统提示词卡片: AI 回复顶部可折叠展示实际发送给模型的完整 system prompt
- Token 校准: 利用 Ollama 返回的实际计数动态修正估算器(EMA)
- 消息重要性评分: 纯规则打分,trim/summarize 按重要性而非时间顺序
- 结构化压缩: LLM 压缩输出 JSON 格式(topics/decisions/pendingTasks/constraints)
- 技能系统 v1.1: 语义匹配(embedding) + 参数自优化 + 未使用衰减 + 技能链合并
- 修复: 100+ TypeScript strict 模式编译错误清零
2026-06-04 21:47:18 +08:00
thzxx 4a7b84c9a2 fix: 调整搜索结果来源引导,优先官方文档而非知乎 2026-04-28 14:46:43 +08:00
OpenClaw Agent 4781abadf0 optimize: enhance web_search, web_fetch, browser tools
- browser.ts: Fix XSS injection in browserClick/browserType via JSON.stringify
- browser.ts: Replace fixed 1000ms wait with did-finish-load event + 30s timeout
- web_fetch: Add 15s HTTP timeout via AbortController
- web_fetch: Improve HTML→text conversion (block-level tags→newlines, nav/header/footer removal, comprehensive HTML entity decoding)
- web_fetch: Add content-length pre-check (10MB limit)
- web_search: Add 15s HTTP timeout per engine request
- web_search: Add URL deduplication across results
- web_search: Clean residual HTML tags/entities from snippets
- download_file: Add 60s download timeout
- tool-registry: Fix missing logWarn import
- Extract shared decodeHTMLEntities with 40+ entity mappings
2026-04-28 11:30:55 +08:00
thzxx 9cb6c243a7 refactor: use typed window.metonaDesktop instead of (window as any)
Replaced all '(window as any).metonaDesktop' with the properly typed
'window.metonaDesktop' across mcp-client.ts, skill-manager.ts,
agent-engine.ts, and log-service.ts. The MetonaDesktopAPI type is
already declared in types.d.ts, so the 'as any' cast was unnecessary
and bypassed type checking.
2026-04-24 14:03:34 +08:00
thzxx 0065ded925 fix: replace 'any' type with ChatDB for state.get(KEYS.DB)
The DB state variable in agent-engine.ts was typed as 'any', bypassing
type checking for getSetting() calls. Replaced with proper ChatDB type
import and null-safe typing.
2026-04-24 14:02:56 +08:00
thzxx e4dc7f945f fix: correct search_files result field name in formatToolResultForModel
The search_files tool handler returns results in a 'results' field
(containing per-file match arrays), but formatToolResultForModel was
referencing 'result.matches' which is undefined. This caused the model
to never see actual search file results, breaking the search → read
tool chain workflow.
2026-04-24 13:55:53 +08:00
thzxx 74f5e384b5 fix: import missing logSuccess in agent-engine.ts
logSuccess was used on line 509 for auto-compress completion logging
but was never imported from log-service.ts, causing a runtime
ReferenceError when context auto-compression triggers.
2026-04-24 13:55:33 +08:00
Metona Dev 9f38d35b1e fix: 修复 agent-engine 中 abortController 在自动压缩前未定义导致 ReferenceError 的严重 bug
compressWithLLM() 调用时引用的 abortController 变量在 while 循环内才定义,
但自动压缩逻辑在 while 循环之前执行,导致运行时 ReferenceError。
修复方式:使用 state 中已有的 AbortController 或创建新的实例。
2026-04-24 12:43:30 +08:00
Metona Dev 8e53a411d6 feat: /compress 上下文压缩 + Skill 渐进式加载 2026-04-24 12:35:49 +08:00
Metona Dev 4292e7d54c fix: 补充 memory-manager.ts 中缺失的 logInfo 导入 2026-04-24 11:33:42 +08:00
Metona Dev f7fb47939d refactor: 移除人格模式、后台检查、系统诊断、定时任务功能 2026-04-24 11:29:52 +08:00
thzxx 21b9a14824 fix: Token统计准确性修复 + 仪表盘增强
1. 修复eval_count只记最后一轮的bug:改为每轮累加
2. 新增prompt_eval_count(输入token)统计
3. 修复total_duration使用Ollama实际推理时间而非墙钟时间
4. 数据库messages表新增prompt_eval_count列(含兼容迁移)
5. 仪表盘显示输入/输出token分项统计
6. 柱状图堆叠显示输入(紫色)+输出(橙色)比例
7. 明细表格新增输入/输出/合计三列
2026-04-23 16:11:17 +08:00
thzxx 72565b3220 fix: 彻底修复 TDZ 错误和用户消息不显示问题
1. agent-engine.ts: onNewIteration 改用 prevToolCalls 传递上一轮工具调用,
   避免引用未声明的 toolCalls 导致 TDZ (Cannot access 'B' before initialization)
2. chat-area.ts: 新增 resetCurrentPlaceholder() 清理悬空 DOM 引用
3. input-area.ts: 错误处理器删除 placeholder 后清理 currentPlaceholder 引用,
   防止后续 updateLastAssistantMessage 操作已脱离 DOM 的旧节点
2026-04-22 09:40:38 +08:00
thzxx 9915b71da1 fix: Agent Loop 多轮迭代消息保存和 token 统计
- 修复 onDone 多轮迭代时更新旧消息而非创建新消息,导致 post-tool 回复丢失
- 修复 pre-tool 消息的 toolCalls 未保存(onNewIteration 未传递 toolCalls)
- 修复最后两条 AI 消息无 token 显示(统计附着到被覆盖的消息上)
- onNewIteration 回调增加 toolCalls 参数,保存消息时附带工具调用记录
- handleRetry 同步修复
2026-04-21 14:08:07 +08:00
thzxx dc3d6e4b69 fix: 修复第二条消息不显示和上传文件AI读取失败
Bug 1: renderMessages() 统计 .message 元素时把 loading placeholder 也计入,
导致第二条用户消息被跳过不渲染。改为 .message:not(.loading) 排除加载占位符。

Bug 2: Agent Loop system prompt 缺少文件内容感知规则,用户上传文件后让AI读取,
AI 调用 read_file 去工作空间找文件导致失败。在 TOOL_USAGE_GUIDE 新增规则 16,
明确告知模型上传文件内容已在对话消息中,无需调用 read_file 工具。
2026-04-21 11:29:33 +08:00
thzxx e5acf646c8 fix: 修复多迭代 Agent Loop 的两个UI bug
Bug 1: 正在思考占位符作为独立消息残留
- 根因: renderMessages() 将 loading placeholder 计入 existingCount,
  导致新保存的消息不被渲染,旧 placeholder 永远留在页面上
- 修复: onNewIteration 保存消息前先移除旧 placeholder

Bug 2: 只有最后一条AI消息显示 token 统计
- 根因: onNewIteration 保存中间消息时不附带 token/duration 统计,
  只有 onDone 对最后一条才添加 loopStats(总累计值)
- 修复: 追踪每轮迭代的 eval_count 增量和耗时,
  中间消息和最后消息均保存 per-iteration 统计,
  确保 updateTotalTokens 求和不重复计数
2026-04-21 09:05:07 +08:00
thzxx 875d04d1e1 fix: Agent Loop 多轮迭代消息互相覆盖 — 每轮创建独立消息气泡
问题:Agent Loop 多轮迭代(thought→action→observation→循环)时,每轮
onContent 回调都通过 updateLastAssistantMessage 替换同一个 placeholder
的 innerHTML,导致前一轮的回复内容被后一轮覆盖,只有最后一轮保留。

修复:
- agent-engine.ts: AgentCallbacks 新增 onNewIteration 回调,每轮迭代
  开始前通知 UI 层
- input-area.ts: sendMessageWithAgentLoop + handleRetry 添加
  onNewIteration 处理——保存当前轮内容为独立消息、重置状态、创建新
  placeholder。onDone 根据 agentModeIterations 判断是否需要重复保存
2026-04-20 20:07:47 +08:00
Metona 3265b26fba fix: remove all tool execution timeouts
- tool-registry.ts: remove 25s/60s IPC hard timeout on all tools
- browser.ts: remove executeJsWithTimeout wrapper, direct executeJavaScript
- No timeout on any tool — user controls lifecycle
2026-04-20 18:15:57 +08:00
Metona 9999e669d3 fix: browser tool IPC timeout — add executeJsWithTimeout + isBrowserOpen guard
- browser.ts: add executeJsWithTimeout() wrapping executeJavaScript with 10-15s timeout
  (renderer 冻结时不再无限挂起导致 IPC 25s 超时)
- All browser functions (evaluate/extract/click/type/scroll/screenshot) check isBrowserOpen()
  before execution, return clear error instead of auto-recreating empty browser window
- tool-registry.ts: browser tool IPC timeout increased from 25s to 60s
- Root cause: heavy pages (718+ links) can freeze Chromium renderer, executeJavaScript hangs
  indefinitely; after browser_close, getAgentBrowser() auto-created blank window confusing agent
2026-04-20 18:10:58 +08:00
thzxx fde63f73f1 fix: system prompt 开头注入真实系统日期,防止AI用知识库旧日期构造搜索查询 2026-04-20 10:34:36 +08:00
thzxx d0ba265daa fix: 修复模板字符串中反引号转义问题 2026-04-20 10:23:12 +08:00
thzxx 21557de02e fix: 禁止AI使用知识库日期,强制依赖工具返回的真实日期 2026-04-20 10:19:53 +08:00
thzxx 6be27f4cfd fix: 联网搜索强制注入当前日期(system prompt + 工具层双保险) 2026-04-20 10:17:34 +08:00
thzxx 8805858b79 refactor: 第三方库替换 & 代码精简 — v5.1.5
- Markdown 解析器:内联正则 → marked 库(完整 GFM 支持)
- HTML 净化器:内联 DOM 遍历 → DOMPurify(业界标准)
- crypto.ts:删除 sha256js/xorBytes 死代码回退路径
- 消除 5 个文件中 escapeHtml/formatSize 重复定义
- 版本号升级至 5.1.5
2026-04-19 20:48:56 +08:00
thzxx 01c17a66fc fix: 工作流完整性和协调性修复
修复 6 个问题:
1. 新一轮对话清理上轮工具卡片和终端输出(避免越积越多)
2. 中止 Agent Loop 时保留已执行的工具记录(不再丢失)
3. 切换历史会话时清理工作空间状态
4. handleRetry 保存 think 内容(之前丢失)
5. 中止流程统一:agent-engine 抛出 AbortError 由消费方处理(消除重复消息风险)
6. 导出 clearToolCardsExternal/clearTerminalExternal 供外部调用
2026-04-19 19:48:46 +08:00
thzxx 8973077abd fix: 自动记忆优化 — 禁止自动提取规则、提高提取门槛与质量 2026-04-19 19:36:41 +08:00
Metona Build 69a28a8500 refactor: 修复 any 滥用 & 拆分 tool-handlers.ts & 记忆数据治理 (v5.1.3)
Fix 2 - 类型安全:
- (window as any).metonaDesktop → window.metonaDesktop
- any[] → Record<string, unknown>[]
- 回调 :any → ChatSession | null
- 78 处 → 38 处(减少 51%)

Fix 3 - 架构拆分:
- tool-handlers.ts (1308行) → 4 个模块:
  - tool-handlers-shared.ts: 共享工具函数
  - tool-handlers-fs.ts: 15 个文件系统操作
  - tool-handlers-system.ts: 6 个系统网络操作
  - tool-handlers-git.ts: 1 个 Git 操作

Fix 4 - 记忆数据治理:
- 90 天未使用自动降低 importance
- 清理评分新增 agePenalty
- 向量错误日志增强(记忆ID、内容摘要、模型、栈)
- 去重增强(前缀匹配)
2026-04-19 18:38:31 +08:00
Metona Build 71bd6e19ea feat: 预算警告 & Shadowing 防护 & 记忆容量管理 (v5.1.2)
- 预算警告临时层:Agent Loop 剩余 ≤5 轮注入 WARNING,≤2 轮注入 CRITICAL
- MCP Shadowing 防护:MCP 工具注册时检测重名,自动跳过并警告
- 记忆容量限制:上限 500 条,超限自动清理低价值条目(rule 受保护)
- 版本号更新至 5.1.2
2026-04-19 18:10:26 +08:00
Metona Build a8fe322b67 fix: 修复 esbuild 正则/模板字面量解析问题(反引号兼容性) 2026-04-19 17:52:57 +08:00
thzxx f817abd5e1 chore: 清理死代码,retry handler 工具卡片渲染补全
- 移除 agent-engine.ts 中未使用的 logThink 导入
- 移除 settings-modal.ts 中未使用的 isVectorMemoryEnabled 导入
- 修复 retry handler 中 onToolCallStart/onToolCallResult/onToolCallError 空回调
2026-04-19 17:21:55 +08:00
thzxx 1f99d61a12 fix: 日志导出移至日志顶栏, 搜索引擎Bing优先 2026-04-19 17:10:42 +08:00
thzxx e2cb87a060 fix: 搜索引擎DuckDuckGo→百度, 移除全部超时限制, 默认85轮可配置, 执行日志导出
- 搜索引擎从 DuckDuckGo 换成百度(Baidu),解决国内不可达问题
- 移除全部超时限制:Agent Loop、流式响应、工具执行、web_fetch、download_file
- Agent 最大轮数从 15 改为默认 85 轮,设置面板可配置
- 日志面板新增导出按钮,支持导出为 TXT 文件
- TOOL_USAGE_GUIDE 新增禁止猜 URL 和中文搜索结果利用规则
- 版本号更新至 5.1.1
2026-04-19 17:08:46 +08:00
thzxx 51a84bd0ad feat: v5.1.0 - 记忆replace/remove、Skill渐进式加载、安全扫描、预算可配置、工具截断配置 2026-04-18 12:09:27 +08:00
thzxx 9d68a07b47 fix: 修复搜索引擎/DuckDuckGo超时/web_fetch UA/Agent去重误杀,优化搜索fallback指导,版本号更新至5.0.1 2026-04-18 11:44:48 +08:00
Metona Dev 8ffba1a857 fix: 全面审查修复 - 日志/死代码/工具卡片/技能描述
- sqlite.ts: 移除 console.warn,改用状态变量跟踪 FTS5 可用性
- tool-handlers.ts: download_file/append_file/edit_file 补充 sendLog 执行日志
- chat-area.ts: 工具卡片补齐 29 个工具的图标/名称/参数/结果渲染
- main.ts: 移除未使用的 stopAllMCPServers 导入
- skill-manager.ts: 修复 /** 注释语法错误,补充 browser*/spawn_task 工具描述
2026-04-18 10:47:38 +08:00
thzxx 3a33ebf949 fix: 补充执行日志 + 清理死代码
日志补充:
- browser.ts: 全部 8 个函数新增 sendLog (打开/截图/JS/提取/点击/输入/滚动/关闭)
- mcp-manager.ts: callTool 新增工具调用日志

死代码清理:
- skill-manager.ts: 删除 getAllSkillsForUI, deleteSkillById, clearAllSkills (39 行)
- memory-manager.ts: 删除 getVectorSearchResults (4 行)
- mcp-manager.ts: 删除 isServerRunning
2026-04-18 10:24:39 +08:00
thzxx 22a33ae241 feat: 实现 MCP (Model Context Protocol) 完整功能
主进程:
- 新增 mcp-manager.ts: JSON-RPC 2.0 over stdio 通信
  - 服务器生命周期管理 (spawn/initialize/handshake/stop)
  - tools/list 动态工具发现
  - tools/call 工具执行 (30 秒超时)
  - 消息分帧 (newline-delimited JSON)
  - 优雅清理 (pending 请求超时 + SIGTERM)

IPC 通道 (7 个):
- mcp:startServer / mcp:stopServer / mcp:stopAll
- mcp:callTool / mcp:getTools / mcp:getStatuses / mcp:refreshTools

渲染端:
- mcp-client.ts 完整重写: 配置管理 + 服务器生命周期 + 工具定义获取 + 工具执行
- tool-registry.ts: MCP 工具路由 (mcp_ 前缀识别 → executeMCPTool)
- settings-modal.ts: MCP 服务器管理 UI (添加/启用/禁用/删除/状态显示)
- main.ts: 启动时自动启动已启用的 MCP 服务器

数据流:
settings.mcp_servers → startAllMCPServers → initialize → tools/list → getMCPToolDefinitions → Agent Loop → mcp_ 工具调用 → callTool → JSON-RPC → MCP Server
2026-04-18 10:14:33 +08:00
thzxx d2468cd6fc refactor: 全面清理死代码 — 删除 348 行无用代码
删除文件:
- training-export.ts: 训练数据导出(零引用,UI 已移除)

删除函数:
- workspace.ts: isProcessAlive, getActiveProcessCount, execWorkspaceCommand, terminateWorkspaceCommand
- sqlite.ts: deleteMessagesBySession, getSkill, closeDatabase
- tool-registry.ts: isToolEnabled
- cron-manager.ts: clearAllTimers
- workspace-panel.ts: setOnToolTerminated, setWorkspaceDirPath

删除 UI:
- index.html: 训练数据导出按钮及说明
- settings-modal.ts: 训练数据导出事件绑定
2026-04-18 10:08:01 +08:00
thzxx 6c9ffa5135 fix: 消除死代码 — context-manager 接入 + mcp-client 接线 + 删除 document-processor
- agent-engine.ts: 接入 context-manager buildContext(),长对话自动滑动窗口+摘要压缩+token 裁剪
- tool-registry.ts: 导入 mcp-client,getEnabledToolDefinitions() 合并 MCP 工具缓存
- main.ts: 启动时 refreshMCPTools() 注册已启用的 MCP 工具
- 删除 document-processor.ts(RAG 遗留,完全无引用)
2026-04-18 10:00:14 +08:00
thzxx c6fc8b116c fix: 全面测试修复 — useTools TDZ 错误 + CSS 变量缺失
- agent-engine.ts: 修复 useTools 在声明前使用导致运行时 ReferenceError
- style.css: 补充 --primary, --primary-bg, --bg-hover 三个缺失的 CSS 变量
2026-04-18 09:55:32 +08:00
thzxx 889d34b484 feat: v5.0 全面进化 — 浏览器控制 + 训练数据导出 + Cron 定时任务
新增功能:

1. 🌐 浏览器控制(8 个工具)
   - 主进程 browser.ts: 基于隐藏 BrowserWindow 的浏览器引擎
   - browser_open: 加载 URL,返回标题和最终 URL
   - browser_screenshot: 页面截图(base64 PNG)
   - browser_evaluate: 执行任意 JS,支持 DOM 操作
   - browser_extract: 提取页面文本 + 链接(最多 50 条)
   - browser_click: CSS 选择器点击
   - browser_type: 输入框文本输入
   - browser_scroll: 上下滚动/顶部/底部
   - browser_close: 关闭浏览器释放资源
   - 应用退出时自动清理 (before-quit)
   - 工具总数:34 个

2. 📚 训练数据导出
   - training-export.ts: 从 traces + messages 提取 SFT 格式训练数据
   - 输出 JSONL 格式(instruction/input/output/tools/observations/metadata)
   - 设置面板一键导出,Electron 原生文件对话框选择保存位置

3.  Cron 定时任务
   - cron-manager.ts: one-shot(指定时间)+ recurring(周期性)
   - 任务配置持久化到 settings
   - 设置面板添加/删除/启用/禁用
   - 任务触发时自动填入聊天输入框 + toast 通知
   - 应用启动时自动恢复所有已启用任务

新增文件:browser.ts, cron-manager.ts, training-export.ts
修改文件:ipc.ts, main.ts, settings-modal.ts, index.html, main.ts(渲染), tool-registry.ts
2026-04-18 09:29:29 +08:00
thzxx 374d86086e feat: v4.3 生态扩展 — 诊断系统 + Heartbeat + 子代理 + MCP
新增功能:

1. 🩺 一键诊断系统
   - 设置面板添加「一键诊断」按钮
   - 检查项:Ollama 连接、模型可用性、模型能力(Tools/Vision/Think)、
     SQLite 数据库、技能系统、应用版本信息
   - 实时渲染诊断结果,/⚠️/ 状态标识

2. 💓 Heartbeat 后台检查
   - 设置面板添加开关 + 间隔选择(10分/30分/1小时/2小时)
   - 定时检查 Ollama 连接,异常时系统通知
   - 配置持久化到 settings,启动时自动恢复
   - startHeartbeat/stopHeartbeat/restoreHeartbeat 三件套

3. 🤖 子代理委派(spawn_task)
   - 新增 spawn_task 工具(26 个工具)
   - 子 Agent 独立运行(独立消息上下文,5 轮上限,2 分钟超时)
   - 不支持工具调用,专注于文本推理任务
   - 主 Agent 可传入附加上下文
   - 结果返回主 Agent Loop

4. 🔌 MCP Client 框架
   - mcp-client.ts: MCP 服务器配置管理(增删改查、启用禁用)
   - 配置存储在 settings.mcp_servers
   - 工具注册框架就绪,待主进程 MCP bridge 实现协议通信

新增文件:mcp-client.ts, sub-agent.ts
修改文件:settings-modal.ts, index.html, main.ts, tool-registry.ts
2026-04-18 09:25:40 +08:00
thzxx f1625b4353 feat: v4.2 智能进化 — 技能自动生成 + 用户画像 + 人格模板
新增功能:

1. 技能自动生成系统 (Skill Loop)
   - 新增 skills 表:id/name/description/trigger_keywords/tool_chain/success_count/fail_count
   - skill-manager.ts: 从成功工具调用链自动提取可复用技能
   - 关键词匹配 + 成功率加权的技能检索
   - 匹配到的技能自动注入 system prompt(含工具链步骤和成功率)
   - Agent Loop 结束后自动提取,开始前自动匹配注入
   - DB/IPC/Preload 全链路支持

2. 用户画像模型
   - 自动从对话中推断技术栈(14 种技术关键词检测)
   - 画像存储在 settings.user_profile
   - 自动注入 system prompt(技术栈/角色/风格)
   - 随使用不断积累完善

3. 人格模板切换(6 种预设)
   - 🤖 通用助手(默认,温度跟随设置)
   - 💻 编程助手(温度 0.3,注重代码质量)
   - ✍️ 写作助手(温度 0.8,注重文采流畅)
   - 📊 数据分析(温度 0.2,注重精确逻辑)
   - 🌐 翻译助手(温度 0.4,注重信达雅)
   - 🔍 代码审查(温度 0.3,注重安全性能)
   - 设置面板 3×2 网格按钮,点击切换 + 自动调整温度

修改文件:9 个已有 + 1 个新建(skill-manager.ts)
2026-04-18 09:22:25 +08:00
thzxx d8f89ad097 feat: v4.1 会话增强 — /retry /undo /compress + 工具并行执行
新增功能:
- /retry:重试上一轮对话,删除最后的 AI 回复并重新触发 Agent Loop
- /undo:撤销最后的用户+AI 消息对
- /compress:用 LLM 摘要压缩中间对话,保留首尾上下文
- 工具并行执行:同一批次内互相独立的工具用 Promise.all 并行执行

技术细节:
- input-area.ts: 命令检测在 sendMessage() 入口处,/retry 支持普通聊天和 Agent Loop 两种模式
- chat-area.ts: 新增 clearMessagesDOM() 用于 undo/compress 后强制重建 DOM
- agent-engine.ts: 工具调用分批算法 — 根据 TOOLS_WITH_DATA_DEPS 集合检测依赖关系,
  独立工具同批并行,有依赖的工具跨批串行
2026-04-18 09:15:10 +08:00
thzxx 137b8d86ef fix: 彻底修复工具调用链断裂问题
问题根因:
1. 工具结果直接 JSON.stringify 生成臃肿 JSON(含 results 数组、formatted 长字符串等),
   干扰模型理解,导致模型拿到搜索结果后不知道该继续调用 web_fetch
2. 模型返回空内容时,Agent Loop 直接终止,丢失了已有的工具调用上下文
3. 系统提示词对工具链式调用的约束力不足

修复方案:
- 新增 formatToolResultForModel():按工具类型精简结果,web_search 只保留 top 5,
  web_fetch 截断 15K,移除冗余元数据字段
- 重写 AGENT_SYSTEM_PROMPT:明确要求工具链式调用(search→fetch→answer),
  列出常见链式模式,强调「说了就要做」
- 重写 TOOL_USAGE_GUIDE:强化 web_search→web_fetch 强制链式规则
- 空响应处理:模型返回空内容时移除空消息、添加引导性提示、继续循环而非中断
- 记忆提取移到 Agent Loop 结束后,避免中途干扰
2026-04-18 08:40:52 +08:00
thzxx 93d7555a6f fix: 去掉 ReAct 格式 prompt,恢复模型自然使用 API tool_calls
根因:REACT_SYSTEM_PROMPT 要求模型用 Thought/Action/Action Input
格式回复,导致模型用文本写工具调用而不是走 Ollama API 的
tool_calls 字段。v3.3.4 之前没有 ReAct prompt 时模型能正常调用。

改为简洁的 AGENT_SYSTEM_PROMPT,只描述工作方式和注意事项,
不规定输出格式,让模型自然使用 API function calling。
文本解析兜底保留作为安全网。
2026-04-18 08:24:02 +08:00