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构建日志
This commit is contained in:
thzxx
2026-04-17 13:59:44 +08:00
parent 5ea958e5c1
commit 24a5475a7f
4 changed files with 189 additions and 218 deletions
+74 -99
View File
@@ -1,8 +1,8 @@
# 🦙 Metona Ollama Desktop
基于 TypeScript + Electron 的 [Ollama](https://ollama.com) 桌面 AI Agent客户端,专为 Windows 打造。
基于 TypeScript + Electron 的 [Ollama](https://ollama.com) 桌面 AI Agent 客户端,专为 Windows 打造。
> 💻 桌面版仓库 | 🌐 [Web 版历史存档](https://gitee.com/thzxx/metona-ollama-web)
> 💡 全离线运行,数据本地存储,零外部依赖
![版本](https://img.shields.io/badge/version-4.0.0--desktop-brightgreen)
![平台](https://img.shields.io/badge/platform-Windows%20x64-blue)
@@ -22,8 +22,9 @@
- **多模态** — 图片上传,自动检测 Vision 模型能力
- **文件分析** — 支持 50+ 种文本/代码格式,单文件 ≤500KB
### 🔧 Tool Calling — AI 自主工具调用v3.0 新增,21 个工具
AI 可以在对话中主动调用本地工具来完成任务,所有操作在用户可视化监督下执行:
### 🔧 Tool Calling — 25 个工具(AI 自主工具调用)
AI 在对话中主动调用本地工具完成任务,所有操作在用户可视化监督下执行:
| 工具 | 说明 | 安全级别 |
|------|------|----------|
@@ -33,14 +34,14 @@ AI 可以在对话中主动调用本地工具来完成任务,所有操作在
| 🔍 `search_files` | 按文件名/内容搜索(支持扩展名过滤) | 自动 |
| 📂 `create_directory` | 创建目录(递归创建) | 自动 |
| 🗑️ `delete_file` | 删除文件/目录 | 自动 |
| 💻 `run_command` | 执行 Shell 命令(无超时,通过工作空间终端执行) | 自动/需确认/禁用 |
| 💻 `run_command` | 执行 Shell 命令(无超时,工作空间终端执行) | 自动/需确认/禁用 |
| 📦 `move_file` | 移动/重命名文件或目录 | 自动 |
| 📋 `copy_file` | 复制文件或目录 | 自动 |
| 🌐 `web_fetch` | 抓取网页内容(HTTP/HTTPS自动提取文本,默认返回完整内容) | 自动 |
| 🌐 `web_fetch` | 抓取网页内容(HTTP/HTTPS,默认返回完整内容) | 自动 |
| 🔍 `web_search` | 联网搜索(DuckDuckGo/Bing,返回标题+链接+摘要) | 自动 |
| `append_file` | 追加内容到文件末尾 | 自动 |
| ✂️ `edit_file` | 查找替换文件中的文本(比重写整个文件高效) | 自动 |
| `get_file_info` | 获取文件/目录详细信息(大小、日期、权限) | 自动 |
| ✂️ `edit_file` | 查找替换文件中的文本 | 自动 |
| `get_file_info` | 获取文件/目录详细信息 | 自动 |
| 🌳 `tree` | 以树形结构展示目录 | 自动 |
| ⬇️ `download_file` | 从 URL 下载文件到本地 | 自动 |
| 🔀 `diff_files` | 对比两个文件差异(unified diff | 自动 |
@@ -48,90 +49,61 @@ AI 可以在对话中主动调用本地工具来完成任务,所有操作在
| 📚 `read_multiple_files` | 批量读取多个文件内容 | 自动 |
| 🔖 `git` | Git 操作(status/log/diff/add/commit/push/pull/branch/checkout/merge/stash 等 16 个子操作) | 自动 |
| 🗜️ `compress` | 创建/解压归档(zip/tar.gz | 自动 |
| 🧠 `memory_search` | 搜索 Agent 记忆(语义/关键词) | 自动 |
| 💾 `memory_add` | 添加新记忆条目 | 自动 |
| 📋 `session_list` | 列出历史会话 | 自动 |
| 📖 `session_read` | 读取历史会话内容 | 自动 |
**Agent Loop**:用户请求 → 模型返回 tool_calls → 客户端执行 → 回传结果 → 循环直到无工具调用,支持流式 + 并行调用 + 最大 10 轮保护。自动检测并跳过重复工具调用(相同工具+参数),连续两轮完全相同则终止循环
**Agent LoopReAct 模式)**:用户请求 → Thought → Action → Observation → Reflection → 循环直到 Final Answer。支持流式 + 并行调用 + 最大 15 轮保护 + 10 分钟总超时。自动检测并跳过重复工具调用。
> ⚠️ 需要模型支持 Tool Calling(推荐 Qwen3、Llama 3.1+、Mistral
### 🖥️ 工作空间 — 终端 & 文件浏览器v3.2 新增)
右侧可折叠面板,提供终端命令行和文件浏览器:
### 🖥️ 工作空间 — 终端 & 文件浏览器
右侧常驻面板(480px,提供终端命令行和文件浏览器:
**终端**
- 终端界面,实时流式显示命令输出(支持 ANSI 颜色)
- 实时流式显示命令输出(支持 ANSI 颜色)
- 支持长时间运行命令(如 `ollama pull`),**无超时限制**
- 单一终端进程,可随时停止
- `ollama pull` 等进度条实时展示(`\r` 覆盖处理)
**文件浏览器**
- 浏览工作空间目录,目录树展示
- 点击文件预览内容(带行号)
- 支持上级目录导航、刷新
**工作原理**
```
用户/AI 建议命令 → 工作空间执行按钮 → 主进程 spawn 子进程
┌─────────────────────┘
IPC 双向通信(on/send 模式,无超时)
stdout/stderr 实时推送 → 渲染进程终端面板
进程退出 → 通知渲染进程显示退出状态
```
> ⚠️ Tool Calling 走 Agent Loop(有超时),工作空间走独立进程(无超时),由用户主动触发。
> ⚠️ 与 Tool Calling 的区别:Tool Calling 走 Agent Loop(有超时),工作空间走独立进程(无超时),由用户主动触发。
### 🧠 Agent 记忆系统
AI 自动从对话中学习并记住关键信息,跨会话持续积累:
### 🧠 Agent 记忆系统(v3.0 新增)
AI 会自动从对话中学习并记住关键信息,跨会话持续积累,无需手动配置:
**记忆类型**
| 类型 | 说明 | 检索方式 | 示例 |
|------|------|----------|------|
| 📌 事实 | 关于用户的事实 | 关键词匹配 | "用户正在开发一个 Electron 应用" |
| ⚙️ 偏好 | 用户的偏好习惯 | 始终注入 | "喜欢用中文回答,代码风格简洁" |
| 📏 规则 | 应遵守的规则 | 始终注入 | "项目中使用 TypeScript 严格模式" |
**工作流程**
```
会话结束 → LLM 自动提取关键信息 → 去重检测 → 存入 IndexedDB
新消息发送 → 规则/偏好始终注入 + 事实关键词检索 → 注入 system prompt
AI 基于记忆提供个性化回答
```
| 类型 | 说明 | 检索方式 |
|------|------|----------|
| 📌 事实 | 关于用户的事实 | 关键词 + 向量语义 |
| ⚙️ 偏好 | 用户的偏好习惯 | 始终注入 |
| 📏 规则 | 应遵守的规则 | 始终注入 |
**特性**
- **自动提取** — 对话 ≥6 条消息后自动触发LLM 智能识别值得记住的信息
- **智能检索** — 关键词 + 标签 + 重要性加权 + 使用频率 + 时间衰减
- **持久化** — IndexedDB 独立存储,跨会话、跨浏览器重启保留
- **可视化管理** — 记忆面板支持搜索、筛选、编辑、删除
- **完全可控** — 设置中一键开关,不影响其他功能
### 📚 向量记忆(记忆系统的语义检索层)
- 选择嵌入模型(如 `nomic-embed-text`)后,记忆系统启用向量语义搜索
- 记忆条目自动向量化 → IndexedDB 持久化
- IVF 索引优化(K-Means 聚类 + 倒排索引),支持大规模记忆高效检索
- 未选择嵌入模型时退化为关键词匹配检索
- 对话 ≥6 条消息后自动触发 LLM 提取
- FTS5 全文搜索 + 向量语义搜索(需选择嵌入模型)
- SQLite 持久化,跨会话保留
- 可视化管理面板(搜索、筛选、编辑、删除
- 设置中一键开关
### 📦 数据
- 历史记录 IndexedDB 持久化,支持搜索、分页
- 导出格式:Markdown / HTML / TXT / .metona 加密备份
- .metona 格式支持 AES-256-GCM 加密(HTTPS)或 XOR 混淆(HTTP
- 所有导入/导出均使用 Electron 原生文件对话框(不再依赖浏览器下载)
- SQLite (better-sqlite3) 持久化,WAL 模式高性能
- 6 张表:sessions、messages、tool_calls、memories、settings、traces
- 导出格式:Markdown / HTML / TXT / JSON(全量备份/恢复
- 所有导入/导出均使用 Electron 原生文件对话框
### 🖥️ 桌面原生
| 特性 | 说明 |
|------|------|
| Fluent Design 主题 | Windows 11 暗色风格,Mica 毛玻璃材质 |
| 执行日志面板 | 左侧面板实时显示应用运行日志(初始化、连接、模型加载、工具调用等),纯运行时不持久化,常驻显示不可关闭 |
| 工作空间面板 | 右侧面板(常驻显示):终端命令行(实时流式输出,单一终端进程)+ 文件浏览器,固定宽度 480px |
| 暖色调亮色主题 | 奶白背景 + 珊瑚橙主色,圆润柔和 |
| 执行日志面板 | 左侧面板实时显示应用运行日志 |
| 工作空间面板 | 右侧面板:终端 + 文件浏览器,固定 480px |
| Token 消耗统计 | Header 实时显示当前会话总 token 消耗 |
| 系统托盘 | 最小化到托盘,双击恢复,右键菜单 |
| 系统托盘 | 最小化到托盘,双击恢复 |
| 原生菜单 | 文件 / 编辑 / 视图 / 窗口 / 帮助完整菜单 |
| 原生文件对话框 | 文件选择/保存全部使用 Electron 原生对话框,支持文件类型过滤 |
| 系统通知 | Windows 原生通知中心推送 |
| 窗口管理 | 记忆窗口大小位置,支持置顶 |
| 原生文件对话框 | 文件选择/保存全部使用 Electron 原生对话框 |
| 单实例锁 | 防止重复启动 |
| 无 CORS 限制 | 直连本地 Ollama,无需配置 OLLAMA_ORIGINS |
@@ -139,13 +111,13 @@ AI 会自动从对话中学习并记住关键信息,跨会话持续积累,
## 🏗️ 架构
v3.3 四大子系统协调运作:
v4.0 四大子系统协调运作:
```
用户输入消息
├─→ ① Agent 记忆检索(关键词 + 向量语义) → 注入 system prompt
├─→ ② Tool Calling 检查 → Agent Loop 或普通流式
├─→ ② ReAct Agent Loop → Thought → Action → Observation → Reflection
Ollama API(携带组合后的 system prompt + tools
@@ -154,10 +126,13 @@ v3.3 四大子系统协调运作:
流式响应 → 渲染到聊天区域(含工具调用卡片)
保存会话 → 自动提取记忆(≥6 条消息时触发)
保存会话 → SQLite → 自动提取记忆(≥6 条消息时触发)
③ 工作空间(独立通道)
AI 建议命令 → 用户确认 → spawn 子进程 → IPC 流式推送 → 终端面板实时展示
④ 数据层(SQLite
sessions · messages · tool_calls · memories(FTS5) · settings · traces
```
```
@@ -175,19 +150,20 @@ v3.3 四大子系统协调运作:
│ │ ┌──────┴───────────────┴─────────────────────┴──────────┐ │ │
│ │ │ 核心服务层 │ │ │
│ │ │ agent-engine memory-manager vector-memory │ │ │
│ │ │ tool-registry vector-store workspace-panel │ │ │
│ │ │ tool-registry vector-store context-manager │ │ │
│ │ └──────────────────────────┬────────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌──────────────────────────┴────────────────────────────┐ │ │
│ │ │ ollama.ts (API) chat-db.ts (存储) │ │ │
│ │ │ ollama.ts (API) (SQLite via IPC) │ │ │
│ │ └──────────────────────────┬────────────────────────────┘ │ │
│ └─────────────────────────────┼──────────────────────────────┘ │
│ │ IPC │
│ ┌─────────────────────────────┴──────────────────────────────┐ │
│ │ 主进程 (Main) │ │
│ │ main.ts menu.ts tray.ts ipc.ts preload.ts │ │
│ │ tool-handlers.ts (21 个工具) tool-security.ts workspace.ts│ │
│ │ tool-handlers.ts (25 工具) tool-security.ts workspace.ts│ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ db/sqlite.ts: better-sqlite3 · WAL · FTS5 │ │ │
│ │ │ workspace.ts: spawn 进程管理 · 流式输出 · 安全检查 │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────┘ │
@@ -265,44 +241,43 @@ metona-ollama-desktop/
├── src/
│ ├── main/ # Electron 主进程
│ │ ├── main.ts # 应用入口、窗口管理、workspace 初始化
│ │ ├── preload.ts # contextBridge 安全暴露(含 workspace API
│ │ ├── preload.ts # contextBridge 安全暴露(含 workspace/DB API
│ │ ├── menu.ts # 原生菜单
│ │ ├── tray.ts # 系统托盘
│ │ ├── ipc.ts # IPCTool Calling + Workspace 流式通信
│ │ ├── ipc.ts # IPCTool Calling + Workspace + SQLite
│ │ ├── utils.ts # 工具函数
│ │ ├── tool-handlers.ts # 🔧 21 个工具实现
│ │ ├── tool-handlers.ts # 🔧 25 个工具实现
│ │ ├── tool-security.ts # 🔧 路径/命令安全检查
│ │ ── workspace.ts # 🖥️ spawn 进程管理、流式输出
│ │ ── workspace.ts # 🖥️ spawn 进程管理、流式输出
│ │ └── db/
│ │ └── sqlite.ts # 📦 SQLite 数据库(better-sqlite3, WAL, FTS5
│ └── renderer/ # 渲染进程
│ ├── index.html # 入口 HTML(含工作空间面板)
│ ├── index.html # 入口 HTML
│ ├── main.ts # 入口(全系统初始化)
│ ├── types.d.ts # 完整类型定义(含 Workspace 类型)
│ ├── types.d.ts # 完整类型定义
│ ├── api/
│ │ └── ollama.ts # Ollama REST API
│ ├── db/
│ │ └── chat-db.ts # IndexedDB v2(会话+记忆+向量)
│ ├── state/
│ │ └── state.ts # 响应式状态管理
│ │ └── ollama.ts # Ollama REST API 客户端
│ ├── components/
│ │ ├── chat-area.ts # 消息渲染、工具调用卡片
│ │ ├── chat-area.ts # 消息渲染、工具调用卡片、导出
│ │ ├── input-area.ts # 消息发送、记忆检索、自动提取
│ │ ├── memory-modal.ts # 🧠 记忆管理面板
│ │ ├── workspace-panel.ts # 🖥️ 工作空间面板(终端+文件)
│ │ ├── memory-modal.ts # 🧠 记忆管理面板
│ │ ├── tool-confirm-modal.ts # 🔧 工具确认对话框
│ │ ├── tools-modal.ts # 🔧 工具列表面板
│ │ ├── settings-modal.ts # 设置面板(含工作空间目录)
│ │ ├── settings-modal.ts # 设置面板
│ │ ├── history-modal.ts # 历史记录
│ │ ├── prompt-modal.ts # 自定义弹窗(替代原生 prompt/confirm
│ │ ├── prompt-modal.ts # 自定义弹窗
│ │ ├── header.ts # 顶部导航
│ │ ├── model-bar.ts # 模型选择栏
│ │ ├── toast.ts # 通知
│ │ └── lightbox.ts # 图片预览
│ ├── services/
│ │ ├── agent-engine.ts # 🔧 ReAct Agent Loop 引擎
│ │ ├── tool-registry.ts # 🔧 工具注册调度(25 个工具)
│ │ ├── memory-manager.ts # 🧠 记忆管理核心
│ │ ├── vector-memory.ts # 🧠 记忆向量索引(IVF 索引
│ │ ├── agent-engine.ts # 🔧 Agent Loop 引擎
│ │ ├── tool-registry.ts # 🔧 工具注册调度(21 个工具定义)
│ │ ├── vector-memory.ts # 🧠 记忆向量索引(IVF)
│ │ ├── vector-store.ts # 向量存储 + IVF 索引
│ │ ├── context-manager.ts # 上下文窗口管理
│ │ ├── document-processor.ts # 文档分块
│ │ ├── log-service.ts # 结构化执行日志
│ │ └── crypto.ts # AES-256-GCM 加密
@@ -310,8 +285,10 @@ metona-ollama-desktop/
│ │ ├── utils.ts # 工具函数
│ │ ├── sanitizer.ts # HTML 净化器
│ │ └── marked-config.ts # Markdown 渲染
│ ├── state/
│ │ └── state.ts # 响应式状态管理
│ └── styles/
│ └── style.css # Fluent Design 样式(含工作空间面板)
│ └── style.css # 暖色调亮色主题样式
├── assets/icons/ # 图标资源
├── docs/
│ ├── BUILD.md # 构建指南
@@ -358,9 +335,9 @@ metona-ollama-desktop/
- **TypeScript 5.7** — 严格类型,完整接口定义
- **Electron 33** — 桌面封装(Windows x64
- **Vite 5** — 渲染进程构建、HMR 热更新
- **IndexedDB** — 异步持久化(会话 + 向量 + 记忆
- **better-sqlite3 12.9** — SQLite 数据库(主进程,WAL 模式
- **Fetch + ReadableStream** — 流式 NDJSON 解析
- **CSS Variables** — 暗色主题,毛玻璃效果
- **CSS Variables** — 暖色调亮色主题
- **electron-builder** — NSIS 安装包
- **零外部依赖** — Markdown 解析器、SHA-256、HTML 净化器全部内联实现
@@ -385,14 +362,12 @@ metona-ollama-desktop/
- **IPC 双向通信**`on/send` 模式,不走 `invoke/handle`,无超时但有独立进程管理
- **命令安全检查**:复用 Tool Calling 的命令黑名单和路径检查
- **目录限制**:文件浏览器仅允许在工作空间目录内浏览
- **进程生命周期**:窗口关闭时自动 `SIGTERM` 所有子进程,防止进程泄漏
- **用户控制**:命令由用户手动执行或确认,AI 仅建议不直接执行
- **进程生命周期**:窗口关闭时自动 `SIGTERM` 所有子进程
### 记忆系统安全
### 数据安全
- SQLite 本地存储,不上传任何服务器
- 记忆提取仅基于对话内容,不读取文件系统
- 记忆存储在本地 IndexedDB,不上传到任何服务器
- 用户可随时查看、编辑、删除任意记忆条目
- 支持一键关闭自动记忆功能
---