Commit Graph
38 Commits
Author SHA1 Message Date
thzxx aa13a98f63 feat: 升级至 v0.2.2 — 工作空间路径注入、Provider 切换修复、编码与样式优化
功能增强:
- System Prompt 注入当前工作空间路径到动态区(LLM 可使用绝对路径调用工具)
- ContextBuilder.buildSystemPrompt 新增 workspacePath 参数

Provider 切换修复:
- reloadAdapter 返回 boolean,失败时 sendMessage 中止发送
- 切换 Provider 时自动清空 apiKey(不同 Provider key 不通用)
- apiKey 为空时显示警告提示
- Provider 切换事件加 sessionId 字段

编码修复:
- run_command 使用 encoding: 'buffer' 获取原始字节
- 新增 decodeBuffer 智能解码:UTF-8 严格 → GBK → UTF-8 宽松
- 修复不响应 chcp 的 Windows 命令中文乱码问题

样式优化:
- 代码块底色改用主题变量(灰底主题色文字,双主题适配)
- 表格标题 th/td 底色和文字色改用主题变量
- CodeBlock 组件 pre 背景从 secondary.main 改为 background.default
- 设置面板已自动执行工具行 opacity 0.8→0.15(淡绿底,文字清晰)

版本号 0.2.1 → 0.2.2
2026-07-12 13:46:09 +08:00
thzxx 6e49c44742 style: 加宽侧边栏(260→300)和详情栏(320→360) 2026-07-12 13:03:11 +08:00
thzxx 3c5aea8fb7 feat: 升级至 v0.2.1 — 流式渲染修复、安全增强、工具自动执行
流式渲染修复:
- runId 机制防止 abort 后旧流事件污染新 run
- run lock 防止并发 run 污染引擎状态
- abort race 提前退出工具执行等待
- TERMINATED 状态通过 stateChange 发射
- tool_call_delta 流式参数拼接 + pending 占位替换
- 首轮卡片创建路径统一,traceStep 按 ID 精确匹配
- compressed 事件转发为 toast 通知

安全增强:
- ConfirmationHook 支持持久化自动执行(跨会话)
- 设置面板新增自动执行工具管理 UI
- SandboxManager 双重安全校验 fail-closed
- 审计日志链式哈希防篡改
- PromptInjectionDefender 中文注入标记清理
- scanCode 28 模式 + base64/$() 检测
- validatePath realpathSync 防符号链接逃逸
- code-search 使用 execFile 防命令注入

新增工具:
- file_editor、code_search、task_manager、diff_viewer

其他:
- Agent Loop 加 PARSING/REFLECTING 状态 + 指数退避重试
- MemoryManager TF-IDF 语义检索
- run_command Windows 中文编码修复(chcp 65001)
- 版本号 0.2.0 → 0.2.1
2026-07-12 12:54:52 +08:00
thzxx 153468f8f9 fix: 切换 Provider 后不生效 + Ollama 模式 API Key 输入框仍显示
1. reloadAdapter 加 try-catch: 配置中间状态 createAdapter 抛异常时不阻断 IPC, 记录日志即可

2. sendMessage 时兜底调用 reloadAdapter: 确保每次发消息用最新 adapter, 不依赖 config:set 的逐字段 reload

3. Ollama 模式隐藏 API Key 输入框, 切换到 Ollama 时自动清空旧 key

4. 切换 Provider 时自动填充默认 URL(仅旧 URL 为默认值或空时)
2026-07-09 20:35:13 +08:00
thzxx 9b6bdaea32 fix: 状态指示器重叠与 Trace Viewer 状态丢失
1. StreamingIndicator: 最后一条是 assistant 消息时不显示'正在连接', 避免与 AssistantMessage 的'正在思考'重叠

2. useAgentStream: 跳过 INIT(iteration=0) 的 trace step, 引擎初始化无实际内容不应展示

3. useAgentStream: 状态转换追加到 states 数组而非覆盖 state 字段, 保留完整 THINKING->EXECUTING->OBSERVING 进度

4. TraceStep: header 显示状态进度链(如'思考 -> 执行 -> 观察')而非仅最终状态

5. agent-store: 旧数据兼容, 加载时为缺少 states 的 trace step 补全
2026-07-07 22:02:20 +08:00
thzxx ed59305b5e fix: Trace Viewer 内容渲染修复
1. useAgentStream: 每轮迭代只创建一个 TraceStep, 状态转换时更新而非新建; tool_result 反向搜索包含 toolCallId 的步骤, 修复工具结果丢失

2. TraceStep: 渲染工具状态图标/结果/错误/耗时; Thought 添加 maxHeight 200+滚动; 展开状态用户操作后不被自动覆盖

3. ToolResultBlock: 移除 500 字符截断, 改为 maxHeight 300+滚动

4. ToolCallCard: 参数区域添加 overflowY auto+wordBreak
2026-07-07 21:13:51 +08:00
thzxx 6f08759f63 v0.1.2: 全项目代码审查修复 + 子代理编排器 + 上下文压缩 + 并行工具执行
后端修复: Ollama adapter 移除死代码/修复超时硬编码/iteration硬编码/pullModel无超时/流异常断开补发DONE; SSE解析器支持非字符串arguments; Sandbox fail-closed安全加固; IPC移除未使用变量

新增功能: TaskOrchestrator子任务编排器; DelegateTaskTool委派工具; Agent Loop并行工具执行; 上下文自动压缩; 记忆检索注入System Prompt

前端修复: useAgentStream text_delta thought累积bug; 工具调用状态正确流转; 修复重复stateChange事件; TraceStep.thought正确填充
2026-07-06 22:48:33 +08:00
thzxx 8cdb93f8bf feat: MEMORY.md 访问保护、格式简化及预存问题修复
MEMORY.md 保护: 新建 file-guard.ts 共享守卫模块; read_file/write_file/search_files/run_command 禁止访问根目录 MEMORY.md; permissions.ts 增加 deniedPatterns 深度防御。格式简化: 元数据从 # 注释改为 > 引用语法; 校验规则从 6 条简化为 3 条; context-builder extractContent 适配。预存问题: 修复路径遍历前缀碰撞漏洞; 移除 browser_extract 内容截断; SearXNG 配置实时读取; web_search/web_fetch 移除截断; 侧边栏动态获取工具列表; 版本号 0.1.1
2026-07-05 21:24:22 +08:00
thzxx f4532a2bb2 refactor: 移除多余依赖,统一 MUI 为唯一 UI 库
- 移除 radix-ui、clsx、tailwind-merge、class-variance-authority、react-router-dom

- 前后端全面适配 MUI 组件,清理残留 Tailwind 工具类引用

- 优化 Agent Loop 引擎、IPC 处理器、Provider Adapter 等后端模块

- 新增 Agent 网络工具通用设计文档 v2
2026-07-05 19:15:48 +08:00
thzxx 97a3d3d53b fix: 全面修复审计问题并优化系统提示词
**崩溃/挂死修复 (5):**
- 统一 TrayManager.isQuitting 变量,修复 Cmd+Q 无法退出
- useAgentStream 闭包过期快照 → 每次 getState()
- Agnes chatStream 添加 AbortSignal.timeout
- SSE JSON.parse 添加 try-catch 保护
- Orchestrator setTools 污染 → save/restore 模式

**功能修复 (14):**
- 上下文压缩实现 (每5轮 COMPRESSING 状态)
- 修复 requestId 硬编码空串
- ConfigService.set() 保留已有 category
- MemoryManager 新增 working 类型搜索
- PromptInjectionDefender 补全 sanitize()
- Ollama: 补全 dynamicReminders + reasoningContent
- openai-format: 所有 assistant 消息保留 reasoningContent
- SSE: finish_reason 时提前 flush tool_calls
- DeepSeek thinking effort 映射注释
- Ollama done_reason load→stop
- RateLimitHook >= 边界修复
- WorkspaceService isValid 首次启动修复
- sessions:archive IPC handler
- 托盘/窗口图标路径生产环境修复

**系统提示词优化:**
- SOUL.md 存在时不显示兜底身份,原文放最前
- 兜底身份改为中文 (MetonaAI 自身描述)
- 用户文本在前,附件内容在后

**文件上传:**
- 非图片文件不再 base64 编码,保留 JSON 结构
- 用户文本优先于文件内容

**UI 修复:**
- 首页 Logo 路径修复 (public/ + 相对路径)
- TokenUsage contextWindow 动态计算 (Provider 感知)
- 切换 Provider 同步 contextWindow
- 托盘图标始终显示 Logo (状态由右键菜单展示)
2026-06-30 23:17:38 +08:00
thzxx ad0cbc8d47 chore: 消息卡片时间加上年月日 (yyyy-MM-dd HH:mm) 2026-06-27 23:12:16 +08:00
thzxx d8c559a010 style: 底部栏全局加粗 2026-06-27 23:08:17 +08:00
thzxx f34ee258e8 style: TokenUsage + AgentMonitor 所有数值加粗 fontWeight:600 2026-06-27 23:07:11 +08:00
thzxx 2d276feda5 fix: 迭代计数修复 — stateChange 也携带迭代号,双通道同步
- IPC handler 将 stateChange 事件转发到渲染进程
- useAgentStream 同时监听 streamEvent 和 stateChange 更新迭代
- 切换会话/发消息时重置 currentIteration 为 0
- 添加 console.log 诊断日志
2026-06-27 23:06:14 +08:00
thzxx 4f20205aba fix: 迭代计数不再卡住 — 发消息/切换会话时重置为0 2026-06-27 23:03:47 +08:00
thzxx 2de89ad631 fix: 代码块 [object Object] — rehype-highlight 替换 span 后 String() 失败
根因: rehype-highlight 将代码文本替换为 <span class='hljs-*'> 元素后,
children 变成 React 元素数组, String(children) → '[object Object]'

修复: extractTextContent 递归提取纯文本,绕过语法高亮 span
2026-06-27 23:00:16 +08:00
thzxx 15d59e9f8f fix: 代码块显式设置浅色文字+高亮颜色,不再依赖 highlight.js 主题自动配色 2026-06-27 22:57:33 +08:00
thzxx 22f7ec39c5 fix: 代码块文字不可见 — 导入 highlight.js atom-one-dark 主题 2026-06-27 22:54:39 +08:00
thzxx e7c564112c chore: 消息输入框加高加大 (minH 36, fontSize 14) 2026-06-27 22:48:47 +08:00
thzxx 203552920a chore: Sidebar 搜索框高度 34px 2026-06-27 22:47:43 +08:00
thzxx 354d13105f refactor: Sidebar 搜索框从手写 InputBase+Stack 改为 MUI TextField 2026-06-27 22:46:19 +08:00
thzxx 2cf6422169 chore: 底部栏加高至36px,字体+图标加大 2026-06-27 22:44:32 +08:00
thzxx 68ec4bb7bb chore: 底部栏高度 28→32px,常量同步更新 2026-06-27 22:43:03 +08:00
thzxx 239bd8703b refactor: 移除顶部栏,设置按钮移至底部栏右侧,StatusBar 全面改 MUI Table
- StatusBar: 全 MUI Table 布局,左侧状态/Provider/Token,右侧版本+设置
- Header: 已删除(功能合并到 StatusBar)
- App.tsx: 移除 Header 引用
2026-06-27 22:41:59 +08:00
thzxx a5ef816763 refactor: AgentMonitor 改用 MUI Table 布局标签-值对 2026-06-27 22:39:59 +08:00
thzxx 8dd593e747 refactor: TokenUsage 底部汇总改用 MUI Table,标题与值自然分离 2026-06-27 22:38:53 +08:00
thzxx a45b4c321b refactor: 详情面板布局优化 — 固定高度 + 空值占位
- DetailPanel: TraceViewer flex:1 撑满, TokenUsage/AgentMonitor flexShrink:0 固定
- TraceViewer: 空内容时「等待 Agent 活动」居中撑满剩余空间
- TokenUsage: 始终展示完整结构(无会话时显示 -/0 而非隐藏)
- AgentMonitor: 固定 flexShrink:0 防止被挤压
2026-06-27 22:36:21 +08:00
thzxx 8a385b8e1a refactor: AI 回复卡片渲染 UX 优化
问题:
- 思考过程默认折叠,流式时看不到实时思考
- StreamingIndicator 独立展示,与卡片内容脱节
- 思考和回复在同一卡片无阶段分隔
- 加载态只有光秃秃闪烁块
- 流式中的卡片和无流式的卡片看不出区别

优化:
- 思考过程: 流式时自动展开(defaultExpanded),完成后可手动折叠
- 三阶段标签: 💭思考 / 🔧工具 / ✏️回复,带颜色和脉冲动画
- 流式无内容时显示「正在思考.../正在生成回复...」带打字光标
- 有内容时末尾添加闪烁光标指示持续输出中
- 卡片流式时边框高亮(borderColor + boxShadow)
- StreamingIndicator 仅在没有可见内容时显示「正在连接 AI...」
2026-06-27 22:33:51 +08:00
thzxx 4924e2d339 fix: 图片上传增加压缩(1024px/JPEG 0.7),对齐 AgnesAIDesktop 方案
问题: 上传图片后 AI 无法识别,回复没有图像分析工具
根因: 原图 base64 直接发送(5-10MB),Agnes AI 可能因体积过大拒绝处理

对比 AgnesAIDesktop(可正常工作):
- 上传后用 canvas 压缩: max 1024px, JPEG quality 0.7
- 小图(<500KB且尺寸未超标)保留原图

修复:
- ChatInput 新增 compressImage 函数(来自 AgnesAIDesktop 验证方案)
- processFile 中图片读取后立即压缩再存 preview
2026-06-27 22:27:56 +08:00
thzxx baeff6e958 fix: 图片附件时llmContent多余换行 + AgnesAdapter加图片诊断日志 2026-06-27 22:26:14 +08:00
thzxx fcdd1629f6 fix: Agent 迭代数从未更新,始终显示 0/N 2026-06-27 22:17:58 +08:00
thzxx a6397f07db refactor: 总超时从滑块改为数字输入框(120-3600秒),移除未用的Slider导入 2026-06-27 22:12:36 +08:00
thzxx c5ae4c9efa refactor: 最大迭代次数从滑块改为固定值下拉选择 (10/20/50/85/128/256/512) 2026-06-27 22:10:42 +08:00
thzxx 8f687f77a6 fix: 右侧面板布局和间距修复
- TraceViewer: 移除底部重复的 Token/Provider 摘要(与TokenUsage重复)
- TraceViewer: height:100% → flexShrink+maxHeight 避免撑破布局
- TokenUsage: StatCard/SummaryRow 增加内边距和间距
2026-06-27 22:05:52 +08:00
thzxx e4c0259afc feat: Agnes上下文512K→1M + Ollama支持配置num_ctx
Agnes AI:
- adapter注释和API文档更新: 上下文512K→1M (官方已升级)

Ollama num_ctx 支持:
- MetonaGenerationParams 新增 contextLength 字段
- OllamaAdapter.toNativeRequest 发送 options.num_ctx
- AgentLoopEngine 从 config 读取并传递到请求参数
- database.service 新增 ollama.numCtx 默认配置(null=由模型决定)
- SettingsModal LLM设置: Ollama 选中时显示上下文长度输入框
- main.ts 启动时从 configService 读取 ollama.numCtx

数据流:
Settings → configService → main.ts → AgentLoopEngine.config
→ MetonaRequest.params → OllamaAdapter → options.num_ctx
2026-06-27 21:57:05 +08:00
thzxx 8b3dc4298d feat: DeepSeek 选择时禁止上传图片附件
DeepSeek 不支持多模态,前端层面阻止用户选择图片文件:

- ChatInput 根据 provider 动态控制 accept 属性(DeepSeek不包含image/*)
- addFiles 中过滤图片文件(DeepSeek自动跳过)
- Paperclip 按钮 Tooltip 区分提示
- provider 切换后即时生效(通过 useAgentStore 响应式读取)
2026-06-27 21:50:31 +08:00
thzxx a879b4f38a fix: 修复上传图片后 AI 无法识别图片的问题
根因:图片从 ChatInput → agent-store → IPC → adapter 的链路中有两处断裂:

1. DeepSeekAdapter.toNativeRequest 完全忽略 message.images 字段
   - 用户消息中的图片 base64 数据未转换为 OpenAI 多模态 content
     数组格式,导致 LLM 收不到图片数据,只能尝试用工具查磁盘文件

2. AgnesAdapter.toNativeRequest 图片处理存在数组索引错位
   - base.messages[0] 固定为 system 消息(父类插入)
   - request.messages.filter(m => m.role !== 'system') 去掉了 system
   - 同一索引 i 访问两个不同长度的数组,导致图片消息匹配到错误位置

3. agent-store sendMessage 中 images 参数被局部变量遮蔽
   - ChatInput 传入的 images 被  覆盖
   - 改为直接使用参数,避免重复从 attachments 提取

修复:
- DeepSeekAdapter: 在 toNativeRequest 中添加图片→OpenAI content 数组转换
- AgnesAdapter: 移除冗余图片处理(基类已处理),仅保留 Thinking/max_tokens
- agent-store: 移除 images 变量遮蔽,直接使用参数

影响范围: DeepSeek / Agnes AI / Ollama 三个 Provider 的图片传递均已验证
2026-06-27 21:39:24 +08:00
thzxx 1d185db6b3 feat: MetonaAI Desktop 初始项目
- Electron + React + TypeScript 架构
- 三栏布局: Sidebar | ChatPanel | DetailPanel
- 9 个内置工具 (文件系统/网络/记忆/命令)
- SQLite 持久化 (better-sqlite3)
- MUI 暗色/亮色主题系统
- Agent Loop ReAct 状态机引擎
- DeepSeek / Agnes AI / Ollama Provider 适配器
- MCP 协议集成
- 系统托盘 + 全局快捷键
- Tailwind CSS v4 + Tailwind Merge
- 修复: Sidebar 缺失 TextField 导入导致黑屏
2026-06-27 21:33:27 +08:00