diff --git a/README.md b/README.md index e2a18fd..d0c7812 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,35 @@ AI 可以在对话中主动调用本地工具来完成任务,所有操作在 > ⚠️ 需要模型支持 Tool Calling(推荐 Qwen3、Llama 3.1+、Mistral) +### 🖥️ 工作空间 — 终端 & 文件浏览器(v3.2 新增) +右侧可折叠面板,提供终端命令行和文件浏览器两个 Tab: + +**命令行 Tab**: +- 终端界面,实时流式显示命令输出(支持 ANSI 颜色) +- 支持长时间运行命令(如 `ollama pull`),**无超时限制** +- 多终端 Tab,每个 Tab 独立进程,可随时停止 +- `ollama pull` 等进度条实时展示(`\r` 覆盖处理) + +**文件 Tab**: +- 浏览工作空间目录,目录树展示 +- 点击文件预览内容(带行号) +- 支持上级目录导航、刷新 + +**工作原理**: +``` +用户/AI 建议命令 → 工作空间执行按钮 → 主进程 spawn 子进程 + │ + ┌─────────────────────┘ + ▼ + IPC 双向通信(on/send 模式,无超时) + │ + stdout/stderr 实时推送 → 渲染进程终端面板 + │ + 进程退出 → 通知渲染进程显示退出状态 +``` + +> ⚠️ 与 Tool Calling 的区别:Tool Calling 走 Agent Loop(有超时),工作空间走独立进程(无超时),由用户主动触发。 + ### 🧠 Agent 记忆系统(v3.0 新增) AI 会自动从对话中学习并记住关键信息,跨会话持续积累,无需手动配置: @@ -83,6 +112,7 @@ AI 会自动从对话中学习并记住关键信息,跨会话持续积累, |------|------| | Fluent Design 主题 | Windows 11 暗色风格,Mica 毛玻璃材质 | | 执行日志面板 | 左侧面板实时显示应用运行日志(初始化、连接、模型加载、工具调用等),纯运行时不持久化,常驻显示不可关闭 | +| 工作空间面板 | 右侧面板:终端命令行(实时流式输出)+ 文件浏览器,宽度可拖拽调整 | | Token 消耗统计 | Header 实时显示当前会话总 token 消耗 | | 系统托盘 | 最小化到托盘,双击恢复,右键菜单 | | 原生菜单 | 文件 / 编辑 / 视图 / 窗口 / 帮助完整菜单 | @@ -96,7 +126,7 @@ AI 会自动从对话中学习并记住关键信息,跨会话持续积累, ## 🏗️ 架构 -v3.0 三大子系统协调运作: +v3.2 四大子系统协调运作: ``` 用户输入消息 @@ -113,38 +143,43 @@ v3.0 三大子系统协调运作: │ ▼ 保存会话 → 自动提取记忆(≥6 条消息时触发) + +④ 工作空间(独立通道) + 用户手动/AI 建议命令 → spawn 子进程 → IPC 流式推送 → 终端面板实时展示 ``` ``` -┌─────────────────────────────────────────────────────────┐ -│ Electron 应用 │ -│ ┌───────────────────────────────────────────────────┐ │ -│ │ 渲染进程 (Renderer) │ │ -│ │ │ │ -│ │ ┌─────────────┐ ┌──────────────┐ ┌─────────┐ │ │ -│ │ │ chat-area │ │ input-area │ │ memory │ │ │ -│ │ │ 消息渲染 │ │ 消息发送 │ │ panel │ │ │ -│ │ │ 工具卡片 │ │ 记忆检索 │ │ 记忆管理 │ │ │ -│ │ └──────┬──────┘ └──────┬───────┘ └────┬────┘ │ │ -│ │ │ │ │ │ │ -│ │ ┌──────┴───────────────┴───────────────┴──────┐ │ │ -│ │ │ 核心服务层 │ │ │ -│ │ │ agent-engine memory-manager rag │ │ │ -│ │ │ 工具调用循环 记忆管理 知识检索 │ │ │ -│ │ │ tool-registry vector-store doc-proc │ │ │ -│ │ └──────────────────────┬──────────────────────┘ │ │ -│ │ │ │ │ -│ │ ┌──────────────────────┴──────────────────────┐ │ │ -│ │ │ ollama.ts (API) chat-db.ts (存储) │ │ │ -│ │ └──────────────────────┬──────────────────────┘ │ │ -│ └─────────────────────────┼─────────────────────────┘ │ -│ │ IPC │ -│ ┌─────────────────────────┴─────────────────────────┐ │ -│ │ 主进程 (Main) │ │ -│ │ main.ts menu.ts tray.ts ipc.ts preload.ts │ │ -│ │ tool-handlers.ts tool-security.ts │ │ -│ └───────────────────────────────────────────────────┘ │ -└─────────────────────────────────────────────────────────┘ +┌─────────────────────────────────────────────────────────────────┐ +│ Electron 应用 │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 渲染进程 (Renderer) │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌──────────────┐ ┌────────────────────┐ │ │ +│ │ │ chat-area │ │ input-area │ │ workspace-panel │ │ │ +│ │ │ 消息渲染 │ │ 消息发送 │ │ 💻 命令行 Tab │ │ │ +│ │ │ 工具卡片 │ │ 记忆检索 │ │ 📁 文件 Tab │ │ │ +│ │ └──────┬──────┘ └──────┬───────┘ └─────────┬──────────┘ │ │ +│ │ │ │ │ │ │ +│ │ ┌──────┴───────────────┴─────────────────────┴──────────┐ │ │ +│ │ │ 核心服务层 │ │ │ +│ │ │ agent-engine memory-manager rag workspace-panel │ │ │ +│ │ │ tool-registry vector-store doc-proc │ │ │ +│ │ └──────────────────────────┬────────────────────────────┘ │ │ +│ │ │ │ │ +│ │ ┌──────────────────────────┴────────────────────────────┐ │ │ +│ │ │ ollama.ts (API) chat-db.ts (存储) │ │ │ +│ │ └──────────────────────────┬────────────────────────────┘ │ │ +│ └─────────────────────────────┼──────────────────────────────┘ │ +│ │ IPC │ +│ ┌─────────────────────────────┴──────────────────────────────┐ │ +│ │ 主进程 (Main) │ │ +│ │ main.ts menu.ts tray.ts ipc.ts preload.ts │ │ +│ │ tool-handlers.ts tool-security.ts workspace.ts │ │ +│ │ ┌──────────────────────────────────────────────────────┐ │ │ +│ │ │ workspace.ts: spawn 进程管理 · 流式输出 · 安全检查 │ │ │ +│ │ └──────────────────────────────────────────────────────┘ │ │ +│ └────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ ``` --- @@ -217,18 +252,19 @@ npm run dist:portable # 仅便携版 metona-ollama-desktop/ ├── src/ │ ├── main/ # Electron 主进程 -│ │ ├── main.ts # 应用入口、窗口管理 -│ │ ├── preload.ts # contextBridge 安全暴露 +│ │ ├── main.ts # 应用入口、窗口管理、workspace 初始化 +│ │ ├── preload.ts # contextBridge 安全暴露(含 workspace API) │ │ ├── menu.ts # 原生菜单 │ │ ├── tray.ts # 系统托盘 -│ │ ├── ipc.ts # IPC(含 Tool Calling) +│ │ ├── ipc.ts # IPC(Tool Calling + Workspace 流式通信) │ │ ├── utils.ts # 工具函数 │ │ ├── tool-handlers.ts # 🔧 7 个工具实现 -│ │ └── tool-security.ts # 🔧 路径/命令安全检查 +│ │ ├── tool-security.ts # 🔧 路径/命令安全检查 +│ │ └── workspace.ts # 🖥️ spawn 进程管理、流式输出 │ └── renderer/ # 渲染进程 -│ ├── index.html # 入口 HTML +│ ├── index.html # 入口 HTML(含工作空间面板) │ ├── main.ts # 入口(全系统初始化) -│ ├── types.d.ts # 完整类型定义 +│ ├── types.d.ts # 完整类型定义(含 Workspace 类型) │ ├── api/ │ │ └── ollama.ts # Ollama REST API │ ├── db/ @@ -239,13 +275,13 @@ metona-ollama-desktop/ │ │ ├── chat-area.ts # 消息渲染、工具调用卡片 │ │ ├── input-area.ts # 消息发送、记忆检索、自动提取 │ │ ├── memory-panel.ts # 🧠 记忆管理面板 +│ │ ├── workspace-panel.ts # 🖥️ 工作空间面板(终端+文件) │ │ ├── tool-confirm-modal.ts # 🔧 工具确认对话框 │ │ ├── kb-modal.ts # RAG 知识库管理 -│ │ ├── settings-modal.ts # 设置面板 +│ │ ├── settings-modal.ts # 设置面板(含工作空间目录) │ │ ├── history-modal.ts # 历史记录 │ │ ├── header.ts # 顶部导航 │ │ ├── model-bar.ts # 模型选择栏 -│ │ ├── preset-bar.ts # Agent 预设栏(兼容) │ │ ├── toast.ts # 通知 │ │ └── lightbox.ts # 图片预览 │ ├── services/ @@ -262,7 +298,7 @@ metona-ollama-desktop/ │ │ ├── sanitizer.ts # HTML 净化器 │ │ └── marked-config.ts # Markdown 渲染 │ └── styles/ -│ └── style.css # Fluent Design 样式 +│ └── style.css # Fluent Design 样式(含工作空间面板) ├── assets/icons/ # 图标资源 ├── docs/ │ ├── BUILD.md # 构建指南 @@ -300,6 +336,7 @@ metona-ollama-desktop/ | 工具调用 | 关闭 | AI 主动调用本地工具 | | 命令执行 | 关闭 | Shell 命令执行(高风险) | | Agent 记忆 | 开启 | 自动学习+跨会话记忆 | +| 工作空间目录 | `userData/workspace` | 命令行默认执行目录 | --- @@ -331,6 +368,13 @@ metona-ollama-desktop/ - **用户确认**:写入/删除/命令执行必须用户确认 - **安全提示词注入**:自动向 system prompt 追加工具使用安全规则 +### 工作空间安全 +- **IPC 双向通信**:`on/send` 模式,不走 `invoke/handle`,无超时但有独立进程管理 +- **命令安全检查**:复用 Tool Calling 的命令黑名单和路径检查 +- **目录限制**:文件浏览器仅允许在工作空间目录内浏览 +- **进程生命周期**:窗口关闭时自动 `SIGTERM` 所有子进程,防止进程泄漏 +- **用户控制**:命令由用户手动执行或确认,AI 仅建议不直接执行 + ### 记忆系统安全 - 记忆提取仅基于对话内容,不读取文件系统 - 记忆存储在本地 IndexedDB,不上传到任何服务器 @@ -345,7 +389,16 @@ metona-ollama-desktop/ ### 最新版本 -**v3.2.0** — 代码质量 & 桌面原生化 +**v3.2.0** — 工作空间面板 +- 🖥️ 右侧可折叠工作空间面板:命令行 Tab + 文件浏览器 Tab +- 💻 终端界面:实时流式输出、ANSI 颜色支持、多终端 Tab、无超时限制 +- 📁 文件浏览器:目录树、文件预览(带行号)、上级导航 +- 🔌 IPC 双向通信:`on/send` 模式实现流式推送,独立于 Agent Loop 超时体系 +- ⚙️ 设置面板新增工作空间目录配置(默认 `userData/workspace`) +- 🔒 工作空间安全:复用命令/路径黑名单,窗口关闭自动清理子进程 +- 📦 启动时自动创建工作空间目录 + +**v3.1.1** — 代码质量 & 桌面原生化 - ♻️ 渲染进程 58 处 console.log 全部迁移至结构化 log-service - 🖥️ 所有文件对话框(上传/保存/导入)改用 Electron 原生对话框 - 🪙 Header 新增当前会话总 token 消耗统计