# Everjoy Tech Stack > **Everjoy is not only an IDE but a completely fresh AI workflow.** > > An ideal agent tool with a TUI interacting interface, divided into several workspaces: > file editing, vibe interacting, and project/life management. --- ## 1. TUI 渲染与交互框架 | 库 | 用途 | |----|------| | **ratatui** | TUI 渲染核心,多工作区布局、面板分割、状态管理 | | **crossterm** | 跨平台输入输出(键鼠事件、颜色、光标、屏幕缓冲) | | **tui-textarea** | 编辑器工作区的文本编辑组件 | | **tui-term** | 内置终端面板(Agent 执行命令时展示实时输出) | ### 为什么选 ratatui - 工作区(Workspace)需要复杂布局:侧边栏 + 编辑区 + AI 对话面板 + 状态栏 - 支持鼠标点击切换面板、拖拽分割线 - 活跃的组件生态,适合快速组装多面板界面 ```bash cargo add ratatui crossterm tui-textarea tui-term ``` --- ## 2. 异步运行时与网络通信 | 库 | 用途 | |----|------| | **tokio** | 异步运行时,同时处理 UI 事件、AI 流式响应、文件监听 | | **reqwest** | HTTP 客户端,调用 LLM API(OpenAI、Claude、本地 Ollama 等) | | **tokio-tungstenite** | WebSocket 客户端(实时连接、本地服务通信) | | **futures** | 流处理工具 | ### AI 流式响应处理 ```bash cargo add tokio --features full cargo add reqwest --features json,stream,rustls-tls cargo add tokio-tungstenite cargo add futures ``` --- ## 3. Agent 核心引擎 这是 Everjoy 的灵魂。不依赖现有框架,自研一个轻量但可扩展的 Agent 循环。 ### 核心架构 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Observer │ --> │ Thinker │ --> │ Actor │ │ (观察环境) │ │ (推理决策) │ │ (执行动作) │ └─────────────┘ └─────────────┘ └─────────────┘ ^ | └────────────── Feedback <─────────────┘ ``` ### Agent 相关依赖 | 库 | 用途 | |----|------| | **serde** + **serde_json** | LLM API 请求/响应的结构化序列化 | | **schemars** | 为工具函数生成 JSON Schema,供 LLM function calling 使用 | | **async-trait** | Agent 组件的异步 trait 抽象 | ```bash cargo add serde --features derive cargo add serde_json cargo add schemars cargo add async-trait ``` ### 工具系统(Tools) Agent 需要能操作环境的工具集: | 工具 | 实现方式 | |------|---------| | 文件读写 | `std::fs` + `ropey`(大文件) | | 命令执行 | `tokio::process::Command` + `tui-term` 展示输出 | | 代码搜索 | `regex` + `ignore`(支持 .gitignore) | | 网络请求 | `reqwest`(Agent 自主查询文档/API) | | 任务管理 | 调用 SQLite 存储层(见第 5 节) | ```bash cargo add regex ignore ``` --- ## 4. 记忆系统(Memory) Agent 不能金鱼脑。需要短期对话记忆 + 长期知识记忆。 ### 短期记忆:对话上下文 直接维护 `Vec`,按 token 限制滑动窗口截断。 ### 长期记忆:向量检索 | 库 | 用途 | |----|------| | **rusqlite** | 主数据库(对话历史、任务、配置、笔记) | | **sqlite-vec** 或 **pgvector 本地版** | 向量存储与相似度检索 | | **fastembed-rs** | 本地文本 Embedding(不依赖外部 API) | > 如果追求极简,可以先只用 SQLite 全文搜索(`fts5`),后期再上向量。 ```bash cargo add rusqlite --features bundled # 向量检索后续按需添加 ``` --- ## 5. 数据持久化层 Everjoy 管理项目和人生,需要稳定的数据层。 | 库 | 用途 | |----|------| | **rusqlite** | 嵌入式数据库,存储一切 | | **chrono** | 时间处理、截止日期、日历事件 | | **uuid** | 任务/对话/项目的唯一标识 | ### 数据库表设计(初版) ```sql -- 对话历史 CREATE TABLE conversations ( id TEXT PRIMARY KEY, title TEXT, created_at DATETIME, updated_at DATETIME ); CREATE TABLE messages ( id TEXT PRIMARY KEY, conversation_id TEXT, role TEXT, -- 'user' | 'assistant' | 'system' | 'tool' content TEXT, tool_calls TEXT, -- JSON created_at DATETIME ); -- 任务/项目管理 CREATE TABLE tasks ( id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, -- 'todo' | 'doing' | 'done' | 'archived' priority INTEGER, due_date DATETIME, project TEXT, tags TEXT, -- JSON array created_at DATETIME ); -- 笔记/知识 CREATE TABLE notes ( id TEXT PRIMARY KEY, title TEXT, content TEXT, tags TEXT, linked_file TEXT, created_at DATETIME ); ``` ```bash cargo add chrono --features serde cargo add uuid --features v4,serde ``` --- ## 6. 内容渲染与解析 | 库 | 用途 | |----|------| | **pulldown-cmark** | 解析 AI 回复的 Markdown,渲染到 TUI 面板 | | **syntect** | 代码块语法高亮(Markdown 中的 ```rust 块) | | **syntect-tui** | syntect 与 ratatui 的桥接 | > AI 回复基本是 Markdown,需要解析成 ratatui 的 `Text`/`Span` 结构渲染。 ```bash cargo add pulldown-cmark cargo add syntect syntect-tui ``` --- ## 7. 文件系统与项目感知 | 库 | 用途 | |----|------| | **ropey** | 大文件高效编辑(编辑工作区核心) | | **notify** | 监听文件变化,Agent 实时感知项目改动 | | **ignore** | 按 .gitignore 规则遍历文件树 | | **walkdir** | 目录遍历 | ```bash cargo add ropey notify ignore walkdir ``` --- ## 8. 配置管理 | 库 | 用途 | |----|------| | **toml** | 用户配置(AI API key、主题、快捷键、Agent 人设) | | **serde** | 配置反序列化 | | **directories** | 跨平台定位配置目录 `~/.config/everjoy/` | ### 配置文件结构 ```toml # ~/.config/everjoy/config.toml [ai] provider = "openai" api_key = "sk-..." model = "gpt-4o" stream = true [agent] personality = "你是一位高效且略带幽默的编程伙伴..." auto_execute_tools = false -- 危险操作需确认 [ui] theme = "everforest" sidebar_width = 30 editor_tab_size = 4 [keymap] "ctrl+space" = "toggle_agent_panel" "ctrl+shift+a" = "ask_agent" ``` ```bash cargo add toml serde --features derive directories ``` --- ## 9. 实用工具库 | 库 | 用途 | |----|------| | **anyhow** | 快速原型期的错误处理 | | **thiserror** | 后期结构化错误定义 | | **parking_lot** | 更轻量的同步原语 | | **indexmap** | 有序 HashMap(保持面板顺序、配置项顺序) | | **which** | 查找系统命令路径(检查 git、node 等是否存在) | | **tempfile** | 临时文件(Agent 编辑前备份) | | **glob** | 文件通配匹配 | ```bash cargo add anyhow thiserror parking_lot indexmap which tempfile glob ``` --- ## 10. 完整 Cargo.toml ```toml [package] name = "everjoy" version = "0.1.0" edition = "2024" [dependencies] # TUI 渲染 ratatui = "0.29" crossterm = "0.28" tui-textarea = "0.7" tui-term = "0.2" # 异步 + 网络 tokio = { version = "1.4", features = ["full"] } reqwest = { version = "0.12", features = ["json", "stream", "rustls-tls"] } tokio-tungstenite = "0.26" futures = "0.3" # 序列化 + Agent 协议 serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" schemars = "0.8" async-trait = "0.1" # 数据持久化 rusqlite = { version = "0.34", features = ["bundled", "chrono"] } chrono = { version = "0.4", features = ["serde"] } uuid = { version = "1.16", features = ["v4", "serde"] } # 文本 + 文件 ropey = "1.6" pulldown-cmark = "0.13" syntect = "5.2" # syntect-tui = "..." # 视情况选择或自研桥接 notify = "8.0" ignore = "0.4" walkdir = "2.5" # 配置 + 工具 toml = "0.8" directories = "5.0" regex = "1.11" which = "7.0" tempfile = "3.19" glob = "0.3" # 基础设施 anyhow = "1.0" thiserror = "2.0" parking_lot = "0.12" indexmap = "2.7" [dev-dependencies] # 测试工具后续添加 ``` --- ## 12. 关键设计决策 | 维度 | 决策 | 理由 | |------|------|------| | **编辑模式** | **非模态**(直接打字) | 开箱即用,AI 随时可介入 | | **Agent 架构** | **自研 ReAct 循环** | 现有框架太重,自研更灵活 | | **LLM 接入** | **多 Provider 抽象** | 支持 OpenAI/Claude/Ollama/本地模型 | | **流式响应** | **SSE 实时渲染** | AI 思考过程实时展示在对话面板 | | **数据存储** | **SQLite 单文件** | 用户项目 + 人生数据一盘棋 | | **工具执行** | **人工确认 + 自动执行分级** | 读文件自动,写文件/执行命令需确认 | | **文件编辑** | **临时缓冲 + 用户确认写入** | Agent 的修改先预览,用户 OK 再落盘 | --- ## 13. 开发里程碑(建议) | 阶段 | 目标 | 核心组件 | |------|------|---------| | **MVP** | TUI 多面板 + 基本编辑器 + 能聊天的 Agent | ratatui, tui-textarea, reqwest, 简单 ReAct | | **v0.2** | 文件工具 + 项目内代码问答 | ropey, ignore, notify, 文件读写工具 | | **v0.3** | 任务/笔记管理 + SQLite 持久化 | rusqlite, chrono, 任务面板 | | **v0.4** | 内嵌终端 + Agent 自主执行命令 | tui-term, tokio-process, 命令工具 | | **v0.5** | 记忆系统 + 跨对话上下文 | sqlite-vec, embedding, 长期记忆检索 | --- *for Hoshu Chiu & Everjoy Chiu 🐕* *Just have fun with Everjoy.*