Files
metona-ai-desktop/README.md
T
2026-07-22 20:53:43 +08:00

859 lines
47 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<p align="center">
<img src="assets/logo.png" alt="MetonaAI Logo" width="120" height="120" />
</p>
<h1 align="center">MetonaAI Desktop</h1>
<p align="center">
<strong>生产级通用 AI Agent 智能体桌面应用</strong>
</p>
<p align="center">
<img src="https://img.shields.io/badge/version-0.3.19-blue?style=flat-square" alt="Version" />
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="License" />
<img src="https://img.shields.io/badge/Electron-35-47848F?style=flat-square&logo=electron" alt="Electron" />
<img src="https://img.shields.io/badge/React-19-61DAFB?style=flat-square&logo=react" alt="React" />
<img src="https://img.shields.io/badge/TypeScript-5.8-3178C6?style=flat-square&logo=typescript" alt="TypeScript" />
<img src="https://img.shields.io/badge/MUI-9-007FFF?style=flat-square&logo=mui" alt="MUI" />
</p>
<p align="center">
<img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat-square" alt="Platform" />
<img src="https://img.shields.io/badge/DeepSeek-Supported-4D6BFE?style=flat-square" alt="DeepSeek" />
<img src="https://img.shields.io/badge/Agnes%20AI-Supported-8B5CF6?style=flat-square" alt="Agnes AI" />
<img src="https://img.shields.io/badge/MiMo-Supported-FF6B35?style=flat-square" alt="MiMo" />
<img src="https://img.shields.io/badge/Ollama-Supported-000000?style=flat-square&logo=ollama" alt="Ollama" />
</p>
---
<p align="center">
Metona 是一款<strong>基于 Electron 的本地优先 AI Agent 桌面应用</strong>,内置<strong> ReAct 状态机驱动</strong>的智能体循环引擎、<strong>30+ 内置工具</strong>、<strong>三层记忆系统</strong>、<strong>四层纵深安全防线</strong>与<strong>完整可观测性链路</strong>。支持四种 LLM Provider,兼容 <strong>MCP 协议</strong>扩展,为开发者提供开箱即用的 AI 编程伙伴。
</p>
---
## 📑 目录
- [✨ 核心亮点](#-核心亮点)
- [🛠 技术栈](#-技术栈)
- [🚀 快速开始](#-快速开始)
- [🧠 智能体引擎](#-智能体引擎)
- [🔧 工具系统](#-工具系统)
- [🔌 LLM 适配器](#-llm-适配器)
- [🧩 记忆系统](#-记忆系统)
- [🛡 安全机制](#-安全机制)
- [🏗 项目架构](#-项目架构)
- [📊 可观测性](#-可观测性)
- [🎨 桌面体验](#-桌面体验)
- [⚙️ 配置说明](#-配置说明)
- [📁 项目结构](#-项目结构)
- [📝 开发命令](#-开发命令)
- [📄 许可证](#-许可证)
---
## ✨ 核心亮点
<table>
<tr>
<td width="50%">
<h3>🧠 生产级 Agent 引擎</h3>
<p>ReAct 八状态闭环、流式对话 (SSE/NDJSON)、Thinking 推理模式、死循环检测、上下文自动压缩、指数退避重试</p>
</td>
<td width="50%">
<h3>🔧 30+ 内置工具</h3>
<p>文件系统 · 代码搜索 · 网络搜索 · 浏览器自动化 · Git · Shell 命令 · HTTP 请求 · 记忆存储 · 任务管理</p>
</td>
</tr>
<tr>
<td>
<h3>🔌 多 Provider 支持</h3>
<p>DeepSeek V4 · Agnes AI 2.0 · Xiaomi MiMo 2.5 · Ollama 本地模型 — 一键切换,热重载适配器</p>
</td>
<td>
<h3>🧩 三层记忆架构</h3>
<p>情节记忆 (Episodic) + 语义记忆 (Semantic) + 工作记忆 (Working)TF-IDF 语义检索 + 时间衰减</p>
</td>
</tr>
<tr>
<td>
<h3>🛡 四层纵深防御</h3>
<p>路径边界校验 + Shell 沙箱 + 三级权限策略 + Prompt 注入检测 + 幻觉校验 — 层层设防</p>
</td>
<td>
<h3>📡 MCP 协议兼容</h3>
<p>支持 stdio / SSE 两种传输方式的 MCP Server,动态发现工具,无需重启应用</p>
</td>
</tr>
<tr>
<td>
<h3>📊 全链路可观测</h3>
<p>ReAct 迭代追踪 · JSONL 会话录制 · 链式哈希审计 · Token 用量统计 · SLO 健康监控</p>
</td>
<td>
<h3>🎨 精致桌面体验</h3>
<p>三栏 IDE 布局 · 系统托盘 · 全局快捷键 · 暗色/亮色主题 · 5 步引导向导 · 命令面板</p>
</td>
</tr>
</table>
---
## 🛠 技术栈
| 层级 | 技术 | 版本 | 用途 |
|:---|:---|:---|:---|
| 🖥 运行时 | **Electron** | 35 | 跨平台桌面框架 |
| ⚛️ 前端 | **React** | 19 | UI 渲染引擎 |
| 🎨 组件库 | **Material UI (MUI)** | 9 | 统一 UI 组件体系 |
| 📘 类型 | **TypeScript** | 5.8 | 全量类型安全 |
| 🗄 数据库 | **better-sqlite3** | 11 | 本地 SQLite 持久化 (WAL 模式) |
| 📦 状态管理 | **Zustand** | 5 | 轻量级响应式状态 |
| 🔧 构建 | **electron-vite + Vite** | 3 / 6 | 双端构建 (Main + Renderer) |
| 🛰 MCP | **@modelcontextprotocol/sdk** | 1.12 | 外部工具协议集成 |
| 🎨 样式 | **Tailwind CSS** | 4 | 辅助原子化样式 |
| 📝 Markdown | **react-markdown + remark-gfm** | 10 / 4 | 富文本渲染 |
| 🔢 UUID | **nanoid** | 5 | 唯一 ID 生成 |
| ✅ 校验 | **Zod** | 3 | 运行时类型校验 |
| 💾 缓存 | **lru-cache** | 11 | 内存缓存 |
| 📋 日志 | **electron-log** | 5 | 分级结构化日志 |
| ⚙️ 配置 | **electron-store** | 10 | 键值对持久化配置 |
---
## 🚀 快速开始
### 环境要求
- **Node.js** ≥ 18
- **npm** ≥ 9
- **Windows** / **macOS** / **Linux**
### 安装与运行
```bash
# 1. 克隆仓库
git clone https://github.com/your-org/metona-ai-desktop.git
cd metona-ai-desktop
# 2. 安装依赖
npm install
# 3. 配置 API Key
cp .env.example .env
# 编辑 .env,填入你的 LLM API Key
# 4. 启动开发模式
npm run dev
# 5. 构建生产包
npm run build
```
### 配置 LLM Provider
`.env` 中填入密钥,或在应用内通过 **设置 → LLM 配置** 可视化配置:
```env
# DeepSeek API (https://platform.deepseek.com)
DEEPSEEK_API_KEY=sk-your-key-here
DEEPSEEK_BASE_URL=https://api.deepseek.com
# Agnes AI API (https://apihub.agnes-ai.com)
AGNES_API_KEY=your-key-here
AGNES_BASE_URL=https://apihub.agnes-ai.com/v1
# Xiaomi MiMo API (https://api.xiaomimimo.com)
MIMO_API_KEY=your-key-here
MIMO_BASE_URL=https://api.xiaomimimo.com/v1
# Ollama (本地运行, 无需 API Key)
OLLAMA_BASE_URL=http://localhost:11434
```
---
## 🧠 智能体引擎
### ReAct 八状态闭环
Metona 的核心是一个 **ReAct (Reasoning + Acting)** 状态机驱动引擎,通过 8 个状态完成完整的推理-执行-观测-反思循环:
```
┌──────────────────────────────────────────────────────────┐
│ 用户消息输入 │
└────────────────────────┬─────────────────────────────────┘
┌───────────────────────────────┐
│ INIT(初始化) │
└───────────────┬───────────────┘
┌───────────────────────────────┐
│ THINKING(思考推理) │ ←──────────┐
└───────────────┬───────────────┘ │
▼ │
┌───────────────────────────────┐ │
│ PARSING(解析输出) │ │
└───────────────┬───────────────┘ │
▼ │
┌───────────────────────────────┐ │
│ EXECUTING(执行工具调用) │ │
└───────────────┬───────────────┘ │
▼ │
┌───────────────────────────────┐ │
│ OBSERVING(观测工具结果) │ │
└───────────────┬───────────────┘ │
▼ │
┌───────────────────────────────┐ │
│ REFLECTING(反思与决策) │──────────────┘
└───────────────┬───────────────┘
┌───────────────────────────────┐
│ COMPRESSING(上下文压缩 - 可选) │
└───────────────┬───────────────┘
┌───────────────────────────────┐
│ TERMINATED(任务完成) │
└───────────────────────────────┘
```
### 引擎关键特性
| 特性 | 说明 |
|:---|:---|
| 🔄 **流式对话** | SSE (DeepSeek/Agnes/MiMo) + NDJSON (Ollama) 双协议流式响应 |
| 💭 **Thinking 模式** | 支持 deepseek-v4-pro / agnes-2.0-flash / qwen3 等推理模型的思维链展示 |
| 🔁 **死循环检测** | 连续 3 轮相同工具调用签名自动终止 |
| 📦 **上下文压缩** | 80% 阈值触发 LLM 摘要压缩,保留最近 10 条消息 |
| 🔄 **错误重试** | 指数退避 (1s/2s/4s) + ±20% jitter,上限 30s |
| ⏱️ **可配置迭代** | 最大迭代次数 (默认 20)、总超时 (默认 600s)、工具执行超时 (默认 120s) |
| 🧵 **子任务委派** | TaskOrchestrator 支持最大 3 层深度的 SubAgent 编排 |
---
## 🔧 工具系统
### 工具分类总览
Metona 内置 **30+ 工具**,按安全风险分为五个等级:
```
SAFE (无需确认) LOW (无需确认) MEDIUM (可配自动) HIGH (强制确认) CRITICAL (双人复核)
│ │ │ │ │
├─ read_file ├─ web_search ├─ write_file ├─ delete_file ├─ (预留)
├─ list_directory ├─ web_fetch ├─ file_editor ├─ run_command
├─ search_files ├─ http_request ├─ memory_store ├─ web_browser
├─ code_search ├─ run_tests ├─ delegate_task ├─ git_commit
├─ diff_viewer ├─ task_manager ├─ file_move └─ browser actions
├─ git_status └─ think (open/navigate)
├─ git_diff
├─ git_log
├─ lint_code
├─ project_info
├─ memory_search
├─ view_image
└─ file_info
```
### 详细工具列表
#### 📂 文件系统 (7 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `read_file` | SAFE | 否 | 读取文本文件,二进制检测,offset/limit 分页 |
| `write_file` | MEDIUM | 是 | 原子写入 (tmp+rename),支持 overwrite/append 模式 |
| `list_directory` | SAFE | 否 | 列出目录,depth (max 5)、glob 模式、include_hidden |
| `search_files` | SAFE | 否 | 按名称/内容模式搜索,支持 context_lines |
| `delete_file` | HIGH | 是 | 删除文件,禁止删除工作空间根目录和 MEMORY.md |
| `file_move` | MEDIUM | 是 | 移动/重命名文件,跨工作空间拒绝 |
| `file_info` | SAFE | 否 | 获取文件元信息 (大小、修改时间、MIME 类型) |
#### ✏️ 编辑与搜索 (3 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `file_editor` | MEDIUM | 是 | 精准编辑:replace / insert / delete / regex / find_replace,支持 dry_run |
| `code_search` | SAFE | 否 | 基于 ripgrep 高速代码搜索,自动回退 JS fallback |
| `diff_viewer` | SAFE | 否 | LCS 算法生成 unified diff 格式差异 |
#### 🌐 网络与浏览器 (4 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `web_search` | LOW | 否 | 双模式搜索 (SearXNG 元搜索 / 四引擎内置降级) |
| `web_fetch` | LOW | 否 | 三阶段回退获取 (HTTP → SPA 升级 → 浏览器渲染),10MB 限制 |
| `web_browser` | HIGH | 是 | 统一浏览器工具:open / screenshot / evaluate / extract / click / type / scroll / wait / close |
| `http_request` | LOW | 否 | HTTP 请求,6 种 methodSSRF 防护 (DNS IP 校验) |
#### 🧠 记忆 (2 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `memory_store` | MEDIUM | 否 | 存储记忆到三层 (Episodic / Semantic / Working) |
| `memory_search` | SAFE | 否 | TF-IDF 语义检索记忆,时间衰减加权 |
#### 💻 命令与开发 (5 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `run_command` | HIGH | 是 | Shell 命令执行,shell-quote 解析 + SandboxManager 28+ 模式扫描 |
| `lint_code` | SAFE | 否 | TypeScript tsc 或 ESLint 检查 |
| `run_tests` | LOW | 否 | 运行测试套件 (jest/vitest/mocha)filter 白名单防注入 |
| `project_info` | SAFE | 否 | 项目结构分析,4 种 detail 级别 |
| `delegate_task` | MEDIUM | 否 | 子任务委派给独立 SubAgent,最大深度 3 层 |
#### 🔀 Git (4 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `git_status` | SAFE | 否 | 工作树状态,porcelain v1 格式解析 |
| `git_diff` | SAFE | 否 | 差异输出,50KB 截断,5MB maxBuffer |
| `git_log` | SAFE | 否 | 提交历史,支持 --oneline / --stat 等格式 |
| `git_commit` | MEDIUM | 是 | 暂存 + 提交,校验文件在工作空间内 |
#### 📋 任务与辅助 (4 tools)
| 工具 | 风险 | 需确认 | 功能描述 |
|:---|:---|:---|:---|
| `task_manager` | LOW | 否 | 持久化任务 CRUD,支持父子关系,写入后通知 UI 实时刷新 |
| `think` | SAFE | 否 | 结构化思考空间,零副作用,纯推理 |
| `view_image` | SAFE | 否 | 读取图片返回 base64,5MB 限制,支持 7 种格式 |
| `mcp:*` | 可变 | 可变 | MCP 协议扩展工具,运行时动态发现加载 |
---
## 🔌 LLM 适配器
Metona 通过统一的 `IMetonaProviderAdapter` 接口抽象了所有 LLM Provider,支持热重载切换:
| 适配器 | Provider | 模型 | 上下文 | 流式格式 | Thinking | 多模态 |
|:---|:---|:---|:---|:---|:---|:---|
| **DeepSeekAdapter** | `deepseek` | deepseek-v4-pro / deepseek-v4-flash | 1M tokens | SSE | `thinking.type` + `reasoning_effort` | 否 |
| **AgnesAdapter** | `agnes` | agnes-2.0-flash | 1M tokens | SSE | `chat_template_kwargs` / Anthropic 兼容 | 是 (URL + Base64) |
| **MimoAdapter** | `mimo` | mimo-v2.5-pro / mimo-v2.5 | 1M tokens | SSE | `thinking.type: enabled` | 是 (URL + Base64) |
| **OllamaAdapter** | `ollama` | qwen3 / gemma3 / deepseek-r1 等 | 可配 (num_ctx) | NDJSON | `think` 参数 | 是 (Base64) |
### 适配器核心能力
- **统一 IR 格式**:所有 Provider 均转换为 `MetonaRequest` / `MetonaResponse` / `MetonaStreamEvent` 内部指令,上层代码零感知差异
- **热重载切换**:切换 Provider 时自动清空 API Key,配置签名比对,无需重启
- **流式解析**:共享 SSE 流解析器 (`sse-stream.ts`) + OpenAI 兼容格式构建器 (`openai-format.ts`)
- **API 健康检查**`healthCheck()` 方法在各适配器中独立实现,支持状态监控
---
## 🧩 记忆系统
### 三层记忆架构
```
┌──────────────────────────────────────────────────────┐
│ L1: 工作记忆 (Working Memory) │
│ 当前任务临时状态,精确键值查找,会话级别生命周期 │
├──────────────────────────────────────────────────────┤
│ L2: 情节记忆 (Episodic Memory) │
│ 会话事件流、工具调用历史、用户交互记录 │
│ 检索方式: TF-IDF 语义检索 + 时间衰减 (30 天半衰期) │
├──────────────────────────────────────────────────────┤
│ L3: 语义记忆 (Semantic Memory) │
│ 知识事实、用户偏好、项目经验累积 │
│ 检索方式: 精确匹配 + 模糊匹配 + 重要性评分 │
└──────────────────────────────────────────────────────┘
```
### 记忆生命周期
```
新记忆写入 → 重要性评分 (0~1)
├── 高 (>0.8) → 永久保存,核心知识
├── 中 (0.4~0.8) → 定期回顾,逐渐衰减
└── 低 (<0.4) → 短期保留,自然遗忘
会话结束 → MemoryConsolidator (LLM 驱动提取)
→ 写入 MEMORY.md (5 个允许的 section)
→ 同步写入 semantic_memories 表 (双轨同步)
```
### 磁盘文件 (工作空间内)
| 文件 | 用途 | 是否必需 | 保护机制 |
|:---|:---|:---|:---|
| `SOUL.md` | AI 角色定义 (灵魂),定义 Agent 的行为准则与个性 | 是 (自动创建) | 不可通过工具删除 |
| `MEMORY.md` | 动态记忆存储,LLM 会话结束后自动追加 | 是 (仅根目录受保护) | 仅根目录版本受保护 |
---
## 🛡 安全机制
### 四层纵深防御
```
┌─────────────────────────────────────────────────────────────────┐
│ 第 1 层:路径安全 │
│ isPathWithinWorkspace() + realpathSync (符号链接逃逸检测) │
│ + 根目录 MEMORY.md 保护 + 工作空间边界校验 │
├─────────────────────────────────────────────────────────────────┤
│ 第 2 层:命令安全 │
│ SandboxManager (28+ 正则模式扫描: child_process/eval/路径遍历/ │
│ 反弹Shell/fork炸弹/编码执行/动态导入) │
│ + shell-quote 双层防御 + 受保护文件白名单检查 │
├─────────────────────────────────────────────────────────────────┤
│ 第 3 层:权限控制 │
│ PolicyEngine (35+ 默认策略) │
│ READ / WRITE / EXTERNAL_ACTION 三级权限 │
│ 滑动窗口频率限制 (20 次/分钟) │
│ ConfirmationHook: HIGH/CRITICAL 工具需用户确认 │
│ 会话内同类免确认 + 持久化自动执行 (Auto-Execute) │
├─────────────────────────────────────────────────────────────────┤
│ 第 4 层:内容安全 │
│ PromptInjectionDefender: │
│ 40+ 正则模式 (指令覆写/分隔符注入/Base64编码/角色扮演攻击) │
│ + 语义检测 (命令式动词密度/角色边界异常/嵌套分隔符) │
│ + Unicode 归一化 (NFKC + 零宽字符移除 + 混合脚本检测) │
│ OutputValidator: │
│ 格式校验 + PII/API Key 泄漏检测 + 事实一致性校验 + 幻觉检测 │
└─────────────────────────────────────────────────────────────────┘
```
### 风险分级
| 风险等级 | 示例工具 | 确认要求 | 自动执行 |
|:---|:---|:---|:---|
| 🟢 **SAFE** | read_file, list_directory, code_search, git_status | 无需确认 | 默认允许 |
| 🔵 **LOW** | web_search, web_fetch, http_request, task_manager | 无需确认 | 默认允许 |
| 🟡 **MEDIUM** | write_file, file_editor, memory_store, delegate_task | 可配置自动 | 用户可选 |
| 🟠 **HIGH** | delete_file, run_command, web_browser, git_commit | 强制确认 | 不支持 |
| 🔴 **CRITICAL** | (预留) | 双人复核 | 不支持 |
---
## 🏗 项目架构
### 四层 Harness 架构
Metona 的 Agent 引擎采用分层架构,每层职责清晰:
```
┌──────────────────────────────────────────────────────────────────┐
│ L1 推理与编排层 (Reasoning & Orchestration) │
│ ┌─────────────────────┐ ┌──────────────────────────────────┐ │
│ │ AgentLoopEngine │ │ TaskOrchestrator │ │
│ │ ReAct 八状态机 │ │ 子任务分解 · 并行执行 · 结果聚合 │ │
│ │ 流式解析 · 死循环检测 │ │ SubAgent 最大深度 3 层 │ │
│ └─────────────────────┘ └──────────────────────────────────┘ │
│ 类型: MetonaRequest / MetonaResponse / MetonaStreamEvent │
├──────────────────────────────────────────────────────────────────┤
│ L2 上下文与记忆层 (Context & Memory) │
│ ┌─────────────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ ContextBuilder │ │ MemoryManager│ │ Consolidator │ │
│ │ System Prompt 组装 │ │ TF-IDF 检索 │ │ LLM 记忆提取 │ │
│ │ SOUL + MEMORY + 安全 │ │ 三层记忆 CRUD │ │ MEMORY.md 写入 │ │
│ └─────────────────────┘ └──────────────┘ └───────────────┘ │
│ 类型: MetonaContext / MetonaMemoryItem │
├──────────────────────────────────────────────────────────────────┤
│ L3 工具与安全执行层 (Tools & Security) │
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ ToolRegistry│ │ Sandbox │ │PolicyEng │ │ InjectionDefender│ │
│ │ 30+ 工具注册│ │ 28+ 扫描 │ │ 35+ 策略 │ │ 40+ 正则 + 语义 │ │
│ │ MCP 适配 │ │ 路径校验 │ │ 频率限制 │ │ 输出校验 │ │
│ └────────────┘ └──────────┘ └──────────┘ └─────────────────┘ │
│ 类型: MetonaToolDef / MetonaToolCall / MetonaToolResult │
├──────────────────────────────────────────────────────────────────┤
│ L4 支撑与基础架构层 (Infrastructure) │
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ Config │ │ Database │ │ Audit │ │ Session Services │ │
│ │ 全局+工作空间│ │ SQLite │ │ 链式哈希 │ │ 会话 · 录制 · MCP │ │
│ │ 分层配置 │ │ WAL 9 表 │ │ INSERT │ │ 托盘 · 更新 · 窗口│ │
│ └────────────┘ └──────────┘ └──────────┘ └─────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
```
### 进程模型
| 进程 | 运行时 | 职责 |
|:---|:---|:---|
| **Main Process** | Node.js | Agent 引擎、工具调度、SQLite 数据库、MCP 管理、配置服务 |
| **Preload Script** | 沙箱 | `contextBridge` 安全暴露 `window.metona` (15 个 API 命名空间) |
| **Renderer** | Chromium | React 19 + MUI 9 界面渲染,Zustand 状态管理 |
### 核心数据流
```
用户输入 → ChatInput → agent-store.sendMessage
→ IPC: agent:sendMessage → handlers.ts
→ reloadAdapter (配置签名比对,热重载)
→ 保存用户消息到 SQLite messages 表
→ 加载历史消息 + 注入相关记忆 (MemoryManager.search)
→ ContextBuilder.buildSystemPrompt (SOUL.md + MEMORY.md + 安全准则)
→ PromptInjectionDefender.detect (riskScore ≥ 7 阻断)
→ AgentLoopEngine.runStream
→ Adapter.sendStream (SSE / NDJSON 流式调用)
→ 流式事件 → webContents.send('agent:streamEvent')
→ 工具调用 → PreToolHooks (权限验证 + 频率限制 + 用户确认)
→ ToolRegistry.execute → PostToolHooks (审计记录 + 记忆触发)
→ 80% 阈值触发 Compressing (LLM 摘要压缩)
→ 死循环检测 (3 轮相同签名)
→ OutputValidator.validate (幻觉检测 + PII 检查)
→ 保存 assistant 消息 + tool 结果消息到 SQLite
→ MemoryConsolidator.consolidate (异步 LLM 提取记忆 → MEMORY.md)
→ AuditService.logSessionEnd (链式哈希审计)
← useAgentStream Hook 监听事件 → Zustand Store → React 重渲染
```
---
## 📊 可观测性
### 全链路追踪
- **TraceViewer**:按 `runId` 分组可视化展示每轮 ReAct 迭代,包括思考过程、工具调用参数/结果/耗时、状态转换链
- **Token 用量面板**:输入/输出 Token、当前上下文占用百分比 (按 60%/80% 阈值变色)、压缩节省的 Token
### 会话录制
- **9 种事件类型**session_start, user_message, assistant_message, tool_call, tool_result, state_change, context_compressed, error, session_end
- 录制到 JSONL 文件,支持回放重放
- 录制格式:每行一条结构化 JSON 事件
### 审计日志
- **链式哈希防篡改**:每条记录哈希 = SHA-256(prev_hash + 记录内容)INSERT-ONLY 触发器
- **完整性校验**`verifyChain()` 逐条验证哈希链
- **导出**:支持只读 JSONL (chmod 0o444)、CSV、归档 (90 天保留)
### SLO 监控
| 指标 | 目标 |
|:---|:---|
| Agent Loop 成功率 | 95% |
| P99 延迟 | < 60s (95%) |
| 工具调用成功率 | 98% |
| 死循环发生率 | < 0.1% (99.9%) |
| MCP Server 可用性 | 99% |
| 应用崩溃率 | < 0.1% (99.9%) |
---
## 🎨 桌面体验
### 三栏 IDE 布局
```
┌──────────┬──────────────────────────────┬──────────────┐
│ │ Header 顶部栏 │ │
│ Sidebar │ Provider · Model · 面板切换 │ DetailPanel │
│ 260px ├──────────────────────────────┤ 360px │
│ │ │ │
│ 会话列表 │ ChatPanel 聊天区域 │ Trace View │
│ 搜索 │ │ Memory │
│ 工具管理 │ MessageList + ChatInput │ Tasks │
│ │ │ Workspace │
│ │ │ │
├──────────┴──────────────────────────────┴──────────────┤
│ StatusBar · 状态 · Token · 版本 │
└────────────────────────────────────────────────────────┘
```
### 交互特性
| 特性 | 描述 |
|:---|:---|
| 🔔 **系统托盘** | 4 状态指示 (idle / thinking / executing / error),最小化到托盘 |
| ⌨️ **全局快捷键** | `Cmd/Ctrl+Shift+M` 唤起应用 |
| 🎹 **应用内快捷键 (16 个)** | 会话管理 / 布局切换 / 主题切换 / 命令面板 / 详情面板 |
| 🌓 **暗色/亮色主题** | 跟随系统自动切换 + 手动切换 (Ctrl+D 循环) |
| 🧭 **5 步引导向导** | 欢迎 → 配置 LLM → 自定义 Agent → 工作空间 → 开始使用 |
| 🔍 **命令面板** | `Cmd/Ctrl+K` 快速搜索会话与命令 |
| 🖼️ **附件支持** | 拖拽/粘贴图片与文件,自动压缩与注入上下文 |
| 📝 **消息编辑** | 双击用户消息原地编辑 (Ctrl+Enter 重发) |
### 多平台构建
| 平台 | 构建格式 |
|:---|:---|
| 🪟 **Windows** | NSIS 安装包 (x64) + 便携版 (Portable, x64) |
| 🍎 **macOS** | DMG (x64 + arm64) + ZIP (Universal) |
| 🐧 **Linux** | AppImage (x64) + DEB (x64) |
---
## ⚙️ 配置说明
### 环境变量 (`.env`)
```env
# ===========================================
# LLM API 密钥
# ===========================================
# DeepSeek (https://platform.deepseek.com)
DEEPSEEK_API_KEY=sk-your-key
DEEPSEEK_BASE_URL=https://api.deepseek.com
# Agnes AI (https://apihub.agnes-ai.com)
AGNES_API_KEY=your-key
AGNES_BASE_URL=https://apihub.agnes-ai.com/v1
# Xiaomi MiMo (https://api.xiaomimimo.com)
MIMO_API_KEY=your-key
MIMO_BASE_URL=https://api.xiaomimimo.com/v1
# Ollama (本地运行)
OLLAMA_BASE_URL=http://localhost:11434
# 应用标题
VITE_APP_TITLE=MetonaAI Desktop
```
### 应用配置 (`app_config` 表)
| 配置项 | 默认值 | 说明 |
|:---|:---|:---|
| `llm.provider` | `deepseek` | LLM Provider ID |
| `llm.model` | `deepseek-v4-pro` | 模型标识符 |
| `agent.maxIterations` | `20` | ReAct 最大迭代轮次 |
| `agent.totalTimeoutMs` | `600000` | Agent 总超时 (ms) |
| `agent.toolTimeoutMs` | `120000` | 单个工具执行超时 (ms) |
| `agent.thinkingEnabled` | `true` | 启用 Thinking 推理模式 |
| `agent.thinkingEffort` | `high` | 推理强度 (high / max) |
| `agent.confirmationTimeoutMs` | `120000` | 确认弹窗超时 (30s ~ 600s) |
| `deepseek.contextWindow` | `1000000` | DeepSeek 上下文窗口 |
| `agnes.contextWindow` | `1000000` | Agnes 上下文窗口 |
| `mimo.contextWindow` | `1000000` | MiMo 上下文窗口 |
| `ollama.numCtx` | `4096` | Ollama num_ctx 参数 |
### SearXNG 元搜索引擎 (可选)
启用 SearXNG 替代内置四引擎搜索,支持 12 项细粒度配置:
- **基础配置**enabled / base_url / timeout / max_results
- **搜索范围**categories (general/news/scihub 等)、engines filter
- **安全与隐私**safe_search、language、认证方式 (Basic Auth / Token)
- **连接测试**:内置测试功能,点击即可验证
---
## 📁 项目结构
```
MetonaAI-Desktop/
├── 📂 electron/ # Electron 主进程 (~60+ 文件)
│ ├── 📄 main.ts # 应用入口
│ ├── 📄 preload.ts # contextBridge 安全桥接 (15 个 API)
│ ├── 📂 ipc/
│ │ └── 📄 handlers.ts # IPC 通道处理 (50+ 通道)
│ ├── 📂 services/ # 业务服务层 (9 个 Service)
│ │ ├── 📄 audit.service.ts # 审计日志 (链式哈希防篡改)
│ │ ├── 📄 config.service.ts # 配置管理 (全局+工作空间分层)
│ │ ├── 📄 database.service.ts # SQLite 数据库 (WAL 模式, 9 张表)
│ │ ├── 📄 global-config.service.ts # 机器级全局配置 (JSON 文件)
│ │ ├── 📄 mcp-manager.service.ts # MCP Server 生命周期管理
│ │ ├── 📄 session-recorder.service.ts# 会话 JSONL 录制
│ │ ├── 📄 session.service.ts # 会话 CRUD
│ │ ├── 📄 tray-manager.service.ts # 系统托盘 (4 状态)
│ │ ├── 📄 update.service.ts # 自动更新
│ │ ├── 📄 window-manager.service.ts # 窗口管理 + 全局快捷键
│ │ └── 📄 workspace.service.ts # 工作空间 (SOUL.md + MEMORY.md)
│ ├── 📂 harness/ # Agent 智能体核心引擎
│ │ ├── 📂 agent-loop/ # ReAct 状态机
│ │ │ ├── 📄 engine.ts # 循环引擎 (8 状态, 1293 行)
│ │ │ └── 📄 types.ts # 状态枚举 · 终止原因 · 配置类型
│ │ ├── 📂 adapters/ # LLM Provider 适配器
│ │ │ ├── 📄 base-adapter.ts # 抽象基类 (fetchWithTimeout)
│ │ │ ├── 📄 deepseek.adapter.ts # DeepSeek v4 (SSE, 1M ctx)
│ │ │ ├── 📄 agnes-ai.adapter.ts # Agnes AI 2.0 (SSE, 多模态)
│ │ │ ├── 📄 mimo.adapter.ts # MiMo 2.5 (SSE, 1M ctx)
│ │ │ ├── 📄 ollama.adapter.ts # Ollama (NDJSON, 600 行)
│ │ │ └── 📂 shared/ # 共享: OpenAI 格式 · SSE 解析
│ │ ├── 📂 tools/ # 工具系统
│ │ │ ├── 📄 registry.ts # 工具注册 · PolicyEngine · 超时管理
│ │ │ └── 📂 built-in/ # 30+ 内置工具实现
│ │ │ ├── 📄 filesystem.ts # 文件系统 (7 tools)
│ │ │ ├── 📄 file-editor.ts # 精准编辑
│ │ │ ├── 📄 file-guard.ts # 路径安全共享工具
│ │ │ ├── 📄 code-search.ts # 代码搜索 (ripgrep + JS fallback)
│ │ │ ├── 📄 diff-viewer.ts # 差异查看 (LCS 算法)
│ │ │ ├── 📄 web-search.ts # 网络搜索 (SearXNG + 四引擎)
│ │ │ ├── 📄 web-fetch.ts # 网页抓取 (3 阶段回退)
│ │ │ ├── 📄 browser.ts # 浏览器自动化 (9 actions)
│ │ │ ├── 📄 http-request.ts # HTTP 请求 (SSRF 防护)
│ │ │ ├── 📄 memory.ts # 记忆存储/搜索
│ │ │ ├── 📄 command.ts # Shell 命令执行
│ │ │ ├── 📄 git.ts # Git 工具集 (4 tools)
│ │ │ ├── 📄 dev-tools.ts # 开发工具 (3 tools)
│ │ │ ├── 📄 task-manager.ts # 任务管理
│ │ │ ├── 📄 delegate-task.ts # 子任务委派
│ │ │ ├── 📄 think.ts # 思考工具
│ │ │ ├── 📄 view-image.ts # 图片查看
│ │ │ └── 📄 network-utils.ts # 网络共享工具
│ │ ├── 📂 types/ # Metona IR 类型定义
│ │ │ ├── 📄 metona-request.ts # 请求类型
│ │ │ ├── 📄 metona-response.ts # 响应/流事件类型 (19 错误码)
│ │ │ ├── 📄 metona-tool.ts # 工具定义/执行上下文类型
│ │ │ ├── 📄 metona-context.ts # 上下文/记忆类型
│ │ │ └── 📄 metona-adapter.ts # 适配器接口
│ │ ├── 📂 sandbox/ # 沙箱安全
│ │ │ ├── 📄 sandbox.ts # SandboxManager (28+ 模式)
│ │ │ └── 📄 permissions.ts # PolicyEngine (35+ 策略)
│ │ ├── 📂 security/ # 安全防御
│ │ │ └── 📄 prompt-injection-defense.ts # 三层注入检测 (40+ 正则)
│ │ ├── 📂 memory/ # 记忆系统
│ │ │ ├── 📄 manager.ts # MemoryManager (TF-IDF, CJK 分词)
│ │ │ └── 📄 consolidator.ts # MemoryConsolidator (LLM 提取)
│ │ ├── 📂 orchestration/ # 编排
│ │ │ └── 📄 orchestrator.ts # TaskOrchestrator (深度限制 3)
│ │ ├── 📂 prompts/ # 提示词构建
│ │ │ └── 📄 context-builder.ts # ContextBuilder (SOUL + MEMORY)
│ │ ├── 📂 hooks/ # 钩子
│ │ │ ├── 📄 pre-tool.ts # 前钩 (权限 + 频率)
│ │ │ ├── 📄 post-tool.ts # 后钩 (审计 + 记忆)
│ │ │ └── 📄 confirmation-hook.ts # 确认钩 (IPC 弹窗)
│ │ ├── 📂 verification/ # 验证
│ │ │ └── 📄 output-validator.ts # OutputValidator (幻觉检测)
│ │ └── 📂 utils/ # 工具函数
│ │ └── 📄 token-estimator.ts # Token 估算 (CJK/ASCII)
│ └── 📂 utils/
│ └── 📄 slo.ts # 健康检查 · SLO 监控
├── 📂 src/ # React 渲染进程 (~42 文件)
│ ├── 📄 main.tsx # 渲染进程入口
│ ├── 📄 App.tsx # 根组件 (三栏布局 + Store 连接)
│ ├── 📂 components/
│ │ ├── 📂 chat/ # 聊天组件 (11 个)
│ │ │ ├── 📄 ChatPanel.tsx # 聊天主面板
│ │ │ ├── 📄 MessageList.tsx # 消息列表 (content-visibility 虚拟滚动)
│ │ │ ├── 📄 MessageItem.tsx # 消息路由 (memo)
│ │ │ ├── 📄 AssistantMessage.tsx # Agent 回复 (Markdown + 代码高亮)
│ │ │ ├── 📄 UserMessage.tsx # 用户消息 (附件 + 双击编辑)
│ │ │ ├── 📄 SystemMessage.tsx # 系统通知
│ │ │ ├── 📄 ChatInput.tsx # 输入框 (附件 + / 命令)
│ │ │ ├── 📄 ThoughtBlock.tsx # 思考过程 (可折叠)
│ │ │ ├── 📄 ToolCallCard.tsx # 工具调用卡片 (5 状态)
│ │ │ ├── 📄 ToolResultBlock.tsx # 工具结果块
│ │ │ └── 📄 StreamingIndicator.tsx # 流式加载指示器
│ │ ├── 📂 layout/ # 布局组件 (5 个)
│ │ │ ├── 📄 Header.tsx # 顶部栏 (Provider · 面板切换)
│ │ │ ├── 📄 Sidebar.tsx # 侧边栏 (会话列表 · 工具管理)
│ │ │ ├── 📄 DetailPanel.tsx # 详情面板 (4 Tab)
│ │ │ ├── 📄 AgentMonitor.tsx # Agent 状态指示器
│ │ │ └── 📄 StatusBar.tsx # 底部状态栏
│ │ ├── 📂 settings/
│ │ │ └── 📄 SettingsModal.tsx # 设置弹窗 (8 标签页)
│ │ ├── 📂 memory/
│ │ │ └── 📄 MemoryViewer.tsx # 记忆浏览器 (3 类型)
│ │ ├── 📂 tasks/
│ │ │ └── 📄 TaskList.tsx # 任务列表
│ │ ├── 📂 trace/ # 追踪组件 (3 个)
│ │ │ ├── 📄 TraceViewer.tsx # ReAct 迭代时间轴
│ │ │ ├── 📄 TraceStep.tsx # 单步详情 (Thought + ToolCalls)
│ │ │ └── 📄 TokenUsage.tsx # Token 统计面板
│ │ ├── 📂 workspace/
│ │ │ └── 📄 WorkspaceViewer.tsx # 工作空间浏览器
│ │ ├── 📂 onboarding/
│ │ │ └── 📄 OnboardingWizard.tsx # 5 步引导向导
│ │ ├── 📂 common/
│ │ │ └── 📄 ErrorBoundary.tsx # 错误边界
│ │ ├── 📄 CommandPalette.tsx # Cmd+K 命令面板
│ │ ├── 📄 ConfirmationDialog.tsx # 工具确认弹窗 (批量审批)
│ │ ├── 📄 ContextMenu.tsx # 右键菜单
│ │ └── 📄 ToastContainer.tsx # Toast 通知 (metona-toast v2)
│ ├── 📂 hooks/
│ │ ├── 📄 useAgentStream.ts # 流式事件监听 (rAF 批处理)
│ │ ├── 📄 useKeyboardShortcuts.ts # 键盘快捷键 (16 个)
│ │ └── 📄 useTheme.ts # 主题管理
│ ├── 📂 stores/
│ │ ├── 📄 agent-store.ts # Agent 状态 (消息·流·Trace·Token)
│ │ ├── 📄 session-store.ts # 会话列表 (搜索·置顶·归档)
│ │ └── 📄 ui-store.ts # UI 状态 (主题·面板·专注模式)
│ ├── 📂 lib/
│ │ ├── 📄 constants.ts # 常量 (布局·颜色·快捷键)
│ │ ├── 📄 formatters.ts # 格式化 (时间·Token·文件大小)
│ │ ├── 📄 theme.ts # MUI 暗色/亮色主题
│ │ └── 📄 cn.ts # className 合并
│ ├── 📂 styles/
│ │ └── 📄 globals.css # 全局样式 (Tailwind + 动画 + Markdown)
│ └── 📂 types/
│ └── 📄 global.d.ts # window.metona API 类型声明
├── 📂 docs/ # 设计文档 (~10K 行)
│ ├── 📄 Agentic-Loop详解.md # Agent Loop 理论 (637 行)
│ ├── 📄 Agent网络工具通用设计-v2.md # 网络工具链设计 (953 行)
│ ├── 📄 MetonaAI-Desktop UI UX 设计集成方案.html # UI/UX 设计 (741 行)
│ ├── 📄 MetonaAI-Desktop 内部API请求与响应标准.html # Metona IR 标准 (1262 行)
│ ├── 📄 MetonaAI-Desktop 架构与交互设计.html # 系统架构 (999 行)
│ └── 📄 生产级通用AI Agent智能体桌面应用:完整设计与构建指南.html # 完整指南 (6616 行)
├── 📂 standard/ # 开发规范
│ └── 📄 开发规范.md # 第一铁律 + 常用库清单
├── 📂 apis/ # LLM API 文档
│ ├── 📄 deepseek-api-docs-20260518.html # DeepSeek API (Chat + FIM + Balance)
│ ├── 📄 agnes-ai-api-docs-20260625.html # Agnes AI API (1M ctx, 多模态)
│ ├── 📄 mimo-api-docs-20260715.html # MiMo API (Chat + TTS + Web Search)
│ └── 📄 ollama-api-docs-20260518.html # Ollama API (12 endpoints)
├── 📂 assets/ # 应用图标 (构建资源)
│ ├── 🖼️ logo.ico # Windows 图标 (264KB)
│ └── 🖼️ logo.png # macOS/Linux 图标 (2MB)
├── 📂 public/
│ └── 🖼️ logo.png # 渲染进程 Logo
├── 📄 .env.example # 环境变量模板
├── 📄 electron-builder.yml # 多平台构建配置
├── 📄 electron.vite.config.ts # electron-vite 配置
├── 📄 vite.config.ts # Vite + Vitest 配置
├── 📄 tsconfig.json # TypeScript 根配置
├── 📄 tsconfig.node.json # Node 端 TS 配置
├── 📄 tsconfig.web.json # Web 端 TS 配置
├── 📄 package.json # 依赖与脚本
├── 📄 index.html # HTML 入口
└── 📄 LICENSE # MIT 许可证
```
---
## 📝 开发命令
```bash
# ─── 开发 ─────────────────────────────────
npm run dev # 启动开发模式 (Electron + Vite 热重载)
npm run typecheck # 全量 TypeScript 类型检查
npm run typecheck:node # Node 端类型检查
npm run lint # ESLint 代码检查
npm run lint:fix # ESLint 自动修复
npm run format # Prettier 格式化
# ─── 测试 ─────────────────────────────────
npm test # 运行单元测试 (Vitest)
npm run test:watch # 测试监听模式
npm run test:e2e # E2E 测试 (Playwright)
# ─── 构建 ─────────────────────────────────
npm run build # 构建生产包 (Windows NSIS + 便携版)
npm run build:renderer # 仅构建渲染进程
npm run build:electron # 仅编译主进程 TypeScript
npm run preview # 预览构建产物
```
### 数据库 Schema
| 表名 | 用途 | 关键特性 |
|:---|:---|:---|
| `sessions` | 会话管理 | title, created_at, updated_at, pinned, archived |
| `messages` | 消息持久化 | role, content, reasoning_content, tool_calls (JSON), token_usage |
| `app_config` | 应用配置 | 键值对,5 大分类 (llm/agent/tools/security/logging) |
| `audit_logs` | 审计日志 | chain_hash (SHA-256), INSERT-ONLY 触发器 |
| `mcp_servers` | MCP Server 配置 | name, transport (stdio/sse), command, args, env, url |
| `episodic_memories` | 情节记忆 | content, importance, access_count, last_accessed, created_at |
| `semantic_memories` | 语义记忆 | content, embedding (JSON), importance, decay_factor |
| `working_memories` | 工作记忆 | key-value, session_id, expires_at |
| `tasks` | 持久化任务 | title, description, status, priority, parent_id, session_id |
---
## 📄 许可证
本项目基于 [MIT License](./LICENSE) 开源。
---
<p align="center">
<sub>Made with ❤️ by the Metona Team · 2026</sub>
</p>