Commit Graph
100 Commits
Author SHA1 Message Date
thzxx 4caa230c47 fix: 会话消息中工具卡片始终显示0 0且永远转圈执行中
根因:onNewIteration 保存工具记录时 status='running'、result=null,
工具执行完成后只更新了工作空间面板,未更新消息中的记录。

修复:
1. 新增 updateMessageToolRecord() 函数,从后往前查找消息中
   running 状态的同名工具记录并更新为最终状态
2. onToolCallResult/onToolCallError 回调中同步更新消息记录
3. onDone 多迭代模式下,最终消息也包含 toolRecords
2026-04-23 11:52:53 +08:00
thzxx f46edc308a fix: 工具页签底栏统计文字颜色不可见(白底白字)
.ws-tools-hint 从 rgba(245,240,232,0.4) 改为 var(--text-tertiary),
与终端页签底栏 .ws-term-hint 保持一致。
2026-04-23 11:51:03 +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 2496e04685 fix: 修复用户消息不显示和思考气泡残留
renderMessages() 中 existingCount 使用 children.length 计算,
包含了 currentPlaceholder(正在思考...)元素,导致:
1. 新用户消息被误判为已渲染而跳过
2. 旧 placeholder 残留 DOM 变成独立消息气泡

修复:existingCount 改用 querySelectorAll('.message') 只计算实际消息元素
2026-04-20 21:00:42 +08:00
thzxx 6656f16d30 docs: 根据实际代码更新 README.md 和 docs 文件
README.md:
- Agent Loop: 最大15轮→默认85轮(可配置),移除10分钟超时
- 架构图: tool-handlers 25→21 工具
- 工作空间: 新增工具Tab说明,3个页签
- 记忆系统: 新增容量上限500条
- Heartbeat: 补充默认1小时间隔

docs/BUILD.md:
- 新增v5.1.6构建日志(含构建产物和踩坑记录)

docs/CHANGELOG.md:
- v5.1.6新增构建产物信息

docs/DEVELOPMENT.md:
- Agent Loop: 最大15轮→85轮,移除所有超时限制
2026-04-20 20:52:55 +08:00
thzxx 3938cc8770 docs: 更新帮助面板内容,对齐实际代码
- Tool Calling: 工具分类从7类调整为6类,最大轮数15→85,移除超时限制说明
- 搜索引擎: web_search描述从DuckDuckGo+Bing更新为Bing+百度+Google三引擎
- 记忆系统: 新增容量上限500条、安全扫描说明
- 布局说明: 工作空间从2个Tab更新为3个Tab(命令行/工具/文件)
- 新增章节: 技能自动生成、系统诊断
- Heartbeat: 补充默认间隔1小时
- 工具面板卡片: web_search描述同步更新
2026-04-20 20:29:30 +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
thzxx a8e4f5208c docs: 更新 CHANGELOG / DEVELOPMENT / BUILD 文档(v5.1.5 最新改动) 2026-04-20 10:42:33 +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 eba0b4df5e fix: 新建会话时重置工作空间到空闲状态并切回终端页签 2026-04-20 09:56:25 +08:00
thzxx 23d0d1d3a3 docs: 推荐规则记忆新增联网前确认当前日期规则 #13 2026-04-20 09:50:13 +08:00
thzxx 145a2ab411 docs: 更新策略为第三方库本地化,不再要求零外部依赖 2026-04-19 20:55:31 +08:00
thzxx 771a48f35d refactor: vendor marked + dompurify 到项目内,实现零外部依赖
- marked (77行 ESM) + dompurify (1398行 ESM) 复制到 src/vendor/
- 包含 LICENSE 文件和类型声明(dompurify 类型去除 trusted-types 外部依赖)
- 移除 package.json 中 marked/dompurify/@types/dompurify 依赖
- 移除 electron-builder files 配置中的 node_modules 引用
- tsconfig.json include 新增 src/vendor/**/*.d.ts
2026-04-19 20:54:07 +08:00
thzxx 419938c667 docs: README 新增推荐规则记忆区域(12 条 Agent 行为约束规则) 2026-04-19 20:50:44 +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 586cd33563 fix: 工具页签卡片标题白底问题 — 覆盖全局亮色样式 2026-04-19 20:20:20 +08:00
thzxx d389581f37 fix: 空闲状态绝对定位居中,消除滚动条 2026-04-19 20:12:08 +08:00
thzxx 322a0abdd2 fix: 首次打开应用时渲染终端空闲状态 2026-04-19 20:10:30 +08:00
thzxx a13caaf1c5 docs: 更新 v5.1.4 CHANGELOG 和 BUILD 日志 2026-04-19 20:04:34 +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 f5fd851224 fix: 历史会话工具调用展示 — 可折叠工具卡片 2026-04-19 19:44:12 +08:00
thzxx aa33f8845e fix: 工具页签自动切换协调性修复 2026-04-19 19:40:41 +08:00
thzxx 6b1d790436 feat: 工具和文件页签空闲状态优化 — 图标网格 + 目录信息 2026-04-19 19:38:10 +08:00
thzxx 8973077abd fix: 自动记忆优化 — 禁止自动提取规则、提高提取门槛与质量 2026-04-19 19:36:41 +08:00
thzxx 2134e1be38 feat: 终端空闲状态优化 — ASCII Logo + 工作空间信息 + 轮转贴士 2026-04-19 19:35:24 +08:00
thzxx 8d03f42611 fix: 移除 workspace-panel.ts 中重复的 escapeHtml 声明 2026-04-19 19:06:00 +08:00
thzxx a79ce976f3 chore: 版本号更新至 5.1.4 2026-04-19 19:04:06 +08:00
thzxx c7f2fe0c27 feat: 工具卡片从聊天区域迁移到工作空间面板
- 工作空间新增「🔧 工具」页签,专门展示工具调用卡片
- 工具执行时自动切换到工具页签
- run_command 执行时自动切换到终端页签
- AI 回复消息不再显示工具卡片,保持聊天区域简洁
- 工具页签支持清空、自动滚动、状态统计
2026-04-19 19:01:43 +08:00
thzxx b81bb4dd60 docs: 根据 v5.1.3 实际代码更新全部 docs 文件
- BUILD.md: checkout 分支 v5.1.1→v5.1.3,any 计数修正
- DEVELOPMENT.md: 目录结构更新(tool-handlers 拆分、新服务文件),
  工具数 25→38,数据库 6→7 表,新增 browser/mcp/skill/cron/sub-agent
- OPENCLAW-HERMES-ANALYSIS.md: 10 个路线图功能标记已实现状态,
  更新优先级表和待实施清单
- HERMES-AGENT-DEEP-STUDY.md: 对比表更新(记忆/工具/Agent Loop),
  P0-P2 改进清单标记实施状态
2026-04-19 18:52:23 +08:00
thzxx 4fac36b941 docs: 更新 v5.1.3 发布信息(下载文件名、分支结构链) 2026-04-19 18:47:54 +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 c60ee2b4ae fix: 直播聊天时实时渲染工具调用卡片
- 新增 appendToolCallCardToPlaceholder: 工具开始执行时显示 running 卡片
- 新增 updateToolCallCardInPlaceholder: 工具完成后更新为 success/error 卡片
- 修复 onToolCallStart/onToolCallResult/onToolCallError 空回调问题
- 修复历史记录有工具卡片但直播聊天没有的不一致问题
2026-04-19 17:19:45 +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 fc60d5f2e8 chore: 版本号更新至 5.1.1 2026-04-19 16:51:56 +08:00
thzxx 09c3dc0d6f docs: 更新 README.md 补充 v5.1.0 新工具说明 2026-04-18 12:13:44 +08:00
thzxx 51a84bd0ad feat: v5.1.0 - 记忆replace/remove、Skill渐进式加载、安全扫描、预算可配置、工具截断配置 2026-04-18 12:09:27 +08:00
thzxx a3a523e2a8 docs: 新增 Hermes Agent 深度研究报告及 Metona 改进方案 2026-04-18 11:55:51 +08:00
thzxx 44fd2bfc99 docs: 更新 v5.0.1 构建产物信息 2026-04-18 11:52:50 +08:00
thzxx 9d68a07b47 fix: 修复搜索引擎/DuckDuckGo超时/web_fetch UA/Agent去重误杀,优化搜索fallback指导,版本号更新至5.0.1 2026-04-18 11:44:48 +08:00
thzxx 615e5fdf4f refactor: rewrite README.md with accurate feature list and clean layout 2026-04-18 11:17:40 +08:00
thzxx db16640385 docs: 重构 README.md + 更新 CHANGELOG.md v5.0.0
README.md 重构:
- 工具数量 25 → 34 + MCP 动态工具,完整列出所有工具
- 新增 MCP 章节(协议说明、功能特性、使用方式)
- 新增技能自动生成、用户画像、人格模式章节
- 架构图更新 v4.0 → v5.0(五大子系统)
- 项目结构更新(新增 browser.ts/mcp-manager.ts/cron-manager.ts/skill-manager.ts/sub-agent.ts/mcp-client.ts,删除已移除的 document-processor.ts)
- 精简安全/构建/下载章节

CHANGELOG.md v5.0.0 完善:
- 新增 MCP 完整实现条目(主进程/IPC/渲染端/工具路由/UI/启动集成/清理)
- 新增上下文管理接入条目
- 新增编译修复条目(useTools TDZ / loadURL timeout / browserScroll 类型)
- 新增 CSS 变量补全条目
- 新增全面代码清理条目(400+ 行 / 12 类死代码)
- 新增全链路执行日志条目
2026-04-18 10:30:08 +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 8ea7a056f3 fix: 修复 TypeScript 编译错误
- browser.ts: 移除 loadURL 不支持的 timeout 参数
- ipc.ts: 修正 browserScroll direction 参数类型断言
2026-04-18 09:42:41 +08:00
thzxx 17d684cbf5 chore: 版本号更新至 5.0.0 2026-04-18 09:35:17 +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 b2951d8cd0 docs: 添加 OpenClaw & Hermes Agent 对比分析及 Metona 改进路线图 2026-04-18 09:10:06 +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
thzxx 4e158e8783 fix: 修复文本解析兜底正则不匹配模型实际输出格式
模型实际输出格式:
  Action: write_file
  Action Input: {"path": "测试.md", "content": ""}

原正则用 [\r\n]+ 强制要求换行,且 Action: 后的冒号和
Action Input: 的冒号处理冲突导致匹配失败。
改为 [\r\n\s]* 灵活匹配空白/换行。
2026-04-18 08:21:08 +08:00
thzxx 445695c6e1 feat: Agent Engine 文本解析兜底 — 支持不支持 function calling 的模型
当模型没有通过 Ollama API 的 tool_calls 字段返回工具调用,
而是在回复文本中写出 Action/Action Input 时(如 gemma4 系列),
自动从文本中提取工具调用,确保 ReAct Loop 正常执行。

支持的文本格式:
- **Action:** tool_name  **Action Input:** {json}
- Action: tool_name  Action Input: {json}
- 工具名白名单校验 + JSON 解析容错(单引号、尾逗号等)
2026-04-18 08:15:56 +08:00
thzxx 95153e9171 fix: 修复打包后应用无法启动(sql.js WASM 不含 FTS5 模块)
根因分析:
- sql.js 默认 WASM 构建不包含 FTS5 全文搜索扩展
- initDatabase() 中 CREATE VIRTUAL TABLE USING fts5 直接抛异常
- app.whenReady() 链没有 .catch(),错误被静默吞掉
- 结果:进程启动但窗口永远不显示(用户看到双击没反应)

修复内容:
1. main.ts: 添加 app.whenReady().catch() 错误处理,失败时弹出错误对话框
2. main.ts: 添加全局 uncaughtException/unhandledRejection 处理,写入 startup-error.log
3. sqlite.ts: FTS5 虚拟表创建改为可选,缺失时自动降级为 LIKE 搜索
4. sqlite.ts: 所有 FTS5 同步操作(save/delete/clear)加 _hasFTS5 守卫
2026-04-18 07:42:54 +08:00
thzxx 4518929a4c fix: 修复 sql.js 未包含在 app.asar(files 排除顺序问题) 2026-04-17 20:44:21 +08:00
thzxx d98f1ff754 fix: 修复打包后 sql.js 未包含在 app.asar 导致启动报错
electron-builder 的 files 配置中 !node_modules/**/* 排除了所有
node_modules,但 sql.js 作为运行时依赖必须被打包。在排除规则前
显式包含 node_modules/sql.js/**/* 即可。
2026-04-17 17:44:41 +08:00
thzxx ea55264b5a fix: 修复 TypeScript 编译错误(sql.js 类型声明 + Row 转换) 2026-04-17 17:27:13 +08:00
thzxx 1b66ee5f19 docs: 更新 README 和 docs 中数据库描述为 sql.js (WASM) 2026-04-17 16:29:48 +08:00
thzxx 16266ebdde refactor: 数据库层从 better-sqlite3 迁移到 sql.js (WASM)
- 替换原生依赖 better-sqlite3 为纯 WASM 的 sql.js,消除 Electron ABI 版本不匹配问题
- 新增 sql.js 兼容层:runExec/queryOne/queryAll/runPragma/runTransaction
- initDatabase() 改为异步(WASM 加载需要)
- 每次写操作后自动 persist() 到磁盘
- electron-builder 配置:extraResources 打包 sql-wasm.wasm
- 移除 @electron/rebuild 依赖和 postinstall 脚本
- 设置 npmRebuild: false(不再需要原生模块重编译)
2026-04-17 16:26:53 +08:00
thzxx ba03b31677 feat: 重新设计应用图标,匹配暖色调珊瑚橙主题
- 羊驼面部更精致:比例优化、腮红渐变、瞳孔虹膜质感
- 新增 AI 星光元素(右耳上方),暗示 AI Tool Calling 能力
- 底部保留 </> 代码符号装饰
- 色彩严格匹配项目暖色调主题(#FAF7F2 背景 + #E8734A 珊瑚橙)
- 同步更新 llama.ico / llama.png / icon-new 全套图标
2026-04-17 15:13:59 +08:00
thzxx 69087f2854 fix: 添加 @electron/rebuild 解决 better-sqlite3 原生模块 ABI 不匹配问题
- 添加 @electron/rebuild 到 devDependencies
- 添加 postinstall 脚本自动为 Electron 重新编译原生模块
- electron-builder 配置添加 npmRebuild + buildDependenciesFromSource
2026-04-17 15:03:10 +08:00
Metona CI 3c65d69744 feat: 重新设计应用图标,匹配暖色调主题(奶白+珊瑚橙) 2026-04-17 14:54:21 +08:00
thzxx 24a5475a7f docs: 重构 README.md & 更新 docs 文件适配 v4.0.0
- README.md: 全面重写,反映实际项目状态(25工具、SQLite、ReAct、暖色主题)
- DEVELOPMENT.md: 更新技术栈(SQLite替代IndexedDB)、架构(ReAct)、工具数、UI规范
- CHANGELOG.md: v4.0.0条目补充UI主题改版说明
- BUILD.md: 新增v4.0.0构建日志
2026-04-17 13:59:44 +08:00
thzxx 5ea958e5c1 style: UI 主题改版 — 暗色→暖色调亮色主题
- 奶白背景 (#FAF7F2) + 珊瑚橙主色 (#E8734A)
- 圆润柔和设计: radius 8-20px, 柔和阴影
- 紫色辅助色 (Think/推理), 金色标签 (Token)
- 终端区域保留深色 (#2D2016 暖棕) 保证可读性
- 窗口背景色、导出 HTML、theme-color 同步更新
- 字体升级: Inter + JetBrains Mono
2026-04-17 13:52:55 +08:00
thzxx b4c7da87b7 chore: 版本号更新至 4.0.0 2026-04-17 13:44:41 +08:00
thzxx 26cbac71fe feat: v4.0.0 大版本升级 - SQLite3 + ReAct Agent
- P0: 存储层 IndexedDB → SQLite3 (better-sqlite3),7张表 + FTS5全文搜索
- P1: Agent Engine 升级为 ReAct 模式(思考→行动→观察→反思)
- P2: 新增 4 个工具(memory_search, memory_add, session_list, session_read)
- P3: 上下文管理器(滑动窗口 + 摘要压缩 + 记忆注入)
- P4: UI 改版(ReAct 执行面板样式 + 思考过程卡片)
- P5: IndexedDB → SQLite 数据迁移支持
- MAX_LOOPS 10→15, MAX_LOOP_TIME 5min→10min, 错误自动重试 2 次
2026-04-17 12:35:42 +08:00
thzxx 5fb36a93e6 docs: 根据 v3.3.4 实际代码更新 README 和开发规范
- README.md: Agent Loop 说明补充去重机制
- README.md: 记忆类型表增加检索方式列(规则/偏好始终注入)
- README.md: 记忆工作流程更新(规则/偏好始终注入 + 事实关键词检索)
- README.md: web_fetch 补充默认返回完整内容说明
- docs/DEVELOPMENT.md: Tool Calling 流程补充去重机制
- docs/DEVELOPMENT.md: 联网搜索联动补充 web_fetch 不截断说明
2026-04-17 10:44:56 +08:00
thzxx 1771b1e326 bump: 版本号更新至 3.3.4
- package.json: 3.3.3 → 3.3.4
- src/renderer/index.html: 版本显示 v3.3.4
- README.md: badge、下载链接、构建分支引用
- docs/CHANGELOG.md: 版本链 + v3.3.4 更新日志
- docs/BUILD.md: 构建分支引用 + v3.3.4 构建日志
- docs/DEVELOPMENT.md: 版本号
2026-04-17 10:38:21 +08:00
thzxx bc0025161e fix: 修复记忆系统rule/preference不生效的问题
- searchMemoriesByKeyword: rule和preference类型始终注入,不再依赖关键词匹配
- 只有fact类型保留关键词匹配逻辑
- buildMemoryContext: 区分三类记忆的system prompt措辞
  - rule: 【必须严格遵守的规则】无条件执行
  - preference: 【用户偏好】请遵循
  - fact: 【参考信息】无关可忽略
2026-04-17 10:33:44 +08:00
thzxx 5ee23387c0 fix: 修复Agent Loop工具调用重复问题,移除web_fetch截断
- 新增工具调用缓存机制,避免重复调用相同工具+参数
- 新增同轮内重复检测和跨轮次重复检测,连续两轮相同调用自动终止循环
- TOOLS_USAGE_GUIDE 新增第8条严禁重复调用规则
- web_fetch 默认不截断(max_chars=0),返回完整内容
- 移除 tool-registry.ts executeTool 中重复的 logToolStart 调用
2026-04-17 10:28:12 +08:00
thzxx b2c3e6eb84 docs: 同步更新 README/DEVELOPMENT/BUILD 文档与实际代码一致 2026-04-16 20:02:35 +08:00
thzxx a18b04a890 chore: 版本号更新至 3.3.2 2026-04-16 19:50:44 +08:00
thzxx c62fd4c7fd feat: run_command 改为下拉框设置自动/需确认/禁用三种模式
- 替换原有开关为下拉选择框(selectRunCommandMode)
- 新增 setRunCommandMode() 动态控制确认行为
- 需确认模式:弹窗确认后执行
- 自动模式:直接执行,无需确认
- 禁用模式:工具不可用
- 新增 .tool-card-badge.disabled 样式
- 状态从 runCommandEnabled(bool) 迁移为 runCommandMode(string)
2026-04-16 19:39:11 +08:00
thzxx fe0daf7075 chore: 除 run_command 外所有工具改为自动执行无需确认 2026-04-16 19:32:03 +08:00
thzxx 5de4cfbabb feat: 添加 web_search 联网搜索工具 (21个工具)
- 新增 web_search 工具:AI 可主动联网搜索获取实时信息
- 搜索引擎:DuckDuckGo 优先,Bing 作为备用
- 返回结构化结果:标题、URL、摘要
- 自动启用,无需用户确认(只读操作)
- 更新 README 工具列表和计数
2026-04-16 19:29:15 +08:00
thzxx d810fb84c0 docs: 更新 README.md AI 聊天客户端 → AI Agent客户端 2026-04-16 10:53:00 +08:00
thzxx 2b8f53bc81 fix: resolve TS2339 error in ipc.ts - cast result.error to String 2026-04-16 10:46:56 +08:00
thzxx 25ffd22639 docs: 全面同步文档与实际代码
README.md:
- Tool Calling 工具表扩展至 20 个(原 7 个)
- 移除已废弃的 RAG 知识库 section,更新为向量记忆说明
- 项目结构同步实际文件(移除 rag.ts/kb-modal.ts/memory-panel.ts,新增 memory-modal.ts 等)
- 架构图更新,移除 RAG 引用
- 记忆提取触发条件 ≥3 → ≥6
- 记忆类型表移除「事件」类型
- 技术栈 NSIS+Portable → NSIS
- 工作空间面板描述修正(固定 480px,单一终端进程)

docs/DEVELOPMENT.md:
- 子系统引用 rag.ts → vector-memory.ts
- 移除拖拽调整宽度描述

docs/CHANGELOG.md:
- v3.3.0 条目补充完整变更说明
2026-04-16 10:37:43 +08:00
thzxx f58be52e98 fix: 修正帮助面板描述与实际功能不一致
- 工作空间终端从「多终端 Tab」改为「单一终端进程」
- 移除工作空间面板拖拽调整宽度的描述(当前固定 480px)
2026-04-16 10:28:58 +08:00
thzxx 9f0c5ae7b5 chore: 版本号更新至 3.3.0 2026-04-16 10:19:51 +08:00
thzxx 759b5fa8db style: 更换应用图标为科幻 AI Agent 风格
- 六边形科技框架 + 青色发光双眼 + 电路纹路
- 轨道环动画 + METONA 标识
- 暗蓝底配青绿荧光,现代科幻感
- PNG 512x512 + ICO 6 尺寸
2026-04-15 19:58:18 +08:00
thzxx 466df86fe4 feat: 移除系统提示词功能,由记忆系统替代
- 移除设置面板中的系统提示词开关和文本框
- 移除 input-area 和 agent-engine 中的系统提示词注入逻辑
- 移除 state/KEYS 中 SYSTEM_PROMPT 和 SYSTEM_PROMPT_ENABLED
- 移除 types.d.ts 中对应的 StateKey 类型
- 更新 README.md 设置表和帮助文档
- 记忆系统已完全覆盖系统提示词的功能,且更智能:自动提取、跨会话持久化、按相关性动态注入
2026-04-15 19:53:54 +08:00
thzxx 83fa4c78f1 docs: 更新 v3.2.6 分支状态为发布分支 2026-04-15 17:43:37 +08:00
thzxx d9fa79c40f docs: 修正 README.md 和 CHANGELOG.md 与源码不一致的内容
- 记忆自动提取阈值 ≥6 → ≥3(源码 messages.length < 3)
- run_command 默认状态 禁用 → 开启(需确认)
- CHANGELOG.md v3.2.6 分支状态标注
2026-04-15 17:38:09 +08:00
thzxx fbd3e7c365 docs: 更新 BUILD.md v3.2.6 实际构建结果 2026-04-15 11:11:17 +08:00
thzxx 40b45db9c6 chore: 版本号更新至 3.2.6
- package.json version → 3.2.6
- index.html app-version → v3.2.6
- README badge、安装包名、git checkout 分支
- CHANGELOG 新增 v3.2.6 条目,更新标签链
- BUILD.md 新增 v3.2.6 构建日志,更新 checkout 命令
- DEVELOPMENT.md 补充 flex 子元素说明
2026-04-15 10:37:00 +08:00
thzxx b05a4785cc style: token 统计图标、数值、消息 token 信息加颜色
- header token 统计:琥珀色 (#FFD580),含背景色和边框
- 消息内 token 数:琥珀色 (.stat-tokens)
- 消息内耗时:主题蓝色 (.stat-duration)
- SVG token 图标同步上色,移除 opacity 透明度
2026-04-15 10:29:50 +08:00
thzxx d6373ffafe fix: 工作空间面板改为 flex 子元素,修复与主内容区错位
- workspace-panel 从 position:fixed 改为 flex 子元素,与日志面板布局模式一致
- 移除 margin-right:480px hack,工作空间自然占据宽度
- 移除 updateNavHeight() 和 --nav-height CSS 变量(不再需要)
- 移除 border-top(flex 布局下顶部自动对齐)
2026-04-15 10:17:04 +08:00
thzxx 8ab3fc5f68 docs: 更新 CHANGELOG/README/DEVELOPMENT/BUILD 适配 v3.2.5 实际变更 2026-04-14 19:19:06 +08:00