Commit Graph
21 Commits
Author SHA1 Message Date
thzxx dc5f8aedcd refactor: 内置搜索与 SearXNG 参数完全独立
内置模式: maxResults=30, fetchTop=5 固定默认值, 不读取 SearXNG 配置

SearXNG 模式: max_results/fetch_count 由配置面板控制

统一使用 useSearXNG 变量判断模式
2026-07-07 22:31:28 +08:00
thzxx b07e226bc1 fix: SearXNG 配置完全失效 — 三层根因修复
根因1: 工具定义暴露 max_results/fetch_top 给 AI, AI 自行决定传 10 覆盖配置面板的 30

修复1: 从工具参数移除 max_results/fetch_top, 配置面板为唯一权威, AI 不可覆盖

根因2: 缓存 key 不含 maxResults/fetchTop, 配置变更后命中旧缓存返回错误结果数

修复2: 缓存 key 加入 maxResults 和 fetchTop

根因3: SearXNG API 用非标准 results_count 参数, 标准实例不认, 每页只返回约 10 条

修复3: 改用标准 pageno 分页, 多页获取直到达到 maxResults 或无更多结果

附加: 添加日志输出实际 maxResults/fetchTop 便于调试
2026-07-07 22:24:32 +08:00
thzxx 8718f5ac6f fix: SearXNG max_results 配置被 AI 参数覆盖
根因: ?? 空值回退链让 AI 传入的 max_results:10 直接生效, 配置面板的 30 被跳过

修复: 改用 Math.max() 让配置面板作为下限, AI 参数不得低于配置值

同时修复 fetch_top 的相同问题
2026-07-07 21:45:26 +08:00
thzxx 9ed4837950 fix: 上下文压缩阈值与摘要截断修复
1. engine: 压缩阈值改用 contextLength ?? contextWindow, Ollama 小 numCtx 时正确触发压缩

2. main: reloadAdapter 在 provider 切换时同步 contextLength, 非 Ollama 清除避免残留

3. engine: compressMessages 移除每条消息 500 字符截断, 摘要请求是独立 API 调用无需截断

4. delegate-task: 修复 items 缺少 description 的 TS2741 预存错误
2026-07-07 21:22:24 +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 ba85328c4f fix: LLM 配置变更后立即生效 — 热重载 Provider Adapter
- AgentLoopEngine 新增 setAdapter() 热切换方法
- main.ts 提取 createAdapter 工厂函数
- IPC config:set 监听 LLM 相关 key 变更,触发热重载
- 覆盖 provider/model/apiKey/baseURL/numCtx 五个关键配置
2026-07-01 20:04:05 +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 782bff5ea4 fix: audit_logs 表缺少 iteration 列导致写入失败
- CREATE TABLE 加入 iteration INTEGER
- 新增迁移 ALTER TABLE audit_logs ADD COLUMN iteration
2026-06-27 23:11:29 +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 baeff6e958 fix: 图片附件时llmContent多余换行 + AgnesAdapter加图片诊断日志 2026-06-27 22:26:14 +08:00
thzxx f2d76f699b fix: 最大迭代次数和超时设置从未生效
main.ts 启动时未读取 agent.maxIterations/agent.totalTimeoutMs
配置,Engine 始终使用硬编码默认值(20/600000)。

现在启动时从 configService 读取并传入 AgentLoopEngine,
设置中的值终于生效。需重启应用后生效。
2026-06-27 22:07:18 +08:00
thzxx f99c65ee28 chore: maxTokens 65536 → 63488 (62K) 2026-06-27 22:01:27 +08:00
thzxx 594652f27a feat: 默认 maxTokens 8192 → 65536 (64K)
- engine.ts: 默认 maxTokens 8192 → 65536
- database.service: llm.maxTokens 种子值同步更新
- deepseek.adapter: 补充模型规格注释(1M上下文, 384K最大输出)
2026-06-27 22:00:18 +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 aa0dd464ac fix: 对照 API 文档修复 3 个 Adapter 的 8 个实现差异
通过逐接口对比 DeepSeek/AgnesAI/Ollama 官方文档与实现代码,发现并修复:

DeepSeek (4 fix):
- temperature 默认值: 错误发送 0(API默认=1),改为 undefined 让 API 用默认值
- thinking 禁用: API 默认 enabled,不传=开启。改为显式发送 {type:disabled}
- reasoning_effort: 补充 xhigh→max 映射(文档规定)
- stream 请求: 补充 AbortSignal.timeout 超时控制

Agnes AI (2 fix):
- temperature 默认值: 同上
- 图片 image_url: 移除文档未提及的 detail 字段

Ollama (3 fix):
- temperature 默认值: 同上(Ollama默认≈0.8)
- tool_calls arguments: 从对象改为 JSON 字符串(REST API 要求)
- finishReason: 使用 done_reason 字段正确映射(之前始终返回 STOP)
2026-06-27 21:48:15 +08:00
thzxx 7f975de20e fix: 从共享工具中移除图片处理,DeepSeek 不应接收图片
问题:shared/openai-format.ts 对所有 OpenAI 兼容 Adapter 统一处理
多模态图片 → content 数组。但 DeepSeek 不支持多模态,不应发送图片。

修复:
- shared/openai-format.ts: 移除图片处理逻辑(由各 Provider 自行决定)
- AgnesAdapter.toNativeRequest: 添加多模态图片转换(OpenAI content 数组)
- DeepSeekAdapter: 不处理图片(DeepSeek 不支持多模态)
- OllamaAdapter: 已有独立的图片处理(images: [base64] 数组)

各 Provider 多模态支持:
  DeepSeek   不支持 → 不发送 images 字段
  Agnes AI   支持 → OpenAI content 数组 [{type:image_url}]
  Ollama     支持 → images: [base64]
2026-06-27 21:43:53 +08:00
thzxx bd6856c7e4 refactor: 解耦 Provider Adapter 继承关系
问题:AgnesAdapter extends DeepSeekAdapter 在架构上不合理。
DeepSeek、Agnes AI、Ollama 是三个完全不同的 API,不应有继承关系。

重构:
  BaseAdapter
  ├── DeepSeekAdapter  (独立)
  ├── AgnesAdapter     (独立)
  └── OllamaAdapter    (独立)

变更:
- 新增 shared/openai-format.ts — 提取 OpenAI 兼容消息/工具格式构建
- 新增 shared/sse-stream.ts   — 提取 SSE 流式解析逻辑
- DeepSeekAdapter  重写为独立继承 BaseAdapter,使用共享工具
- AgnesAdapter     重写为独立继承 BaseAdapter,使用共享工具
- OllamaAdapter    无需变更(原本就独立继承)
- adapters/index.ts 清理导出,移除隐式耦合
2026-06-27 21:41:43 +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