一个基于 **Flutter + Rust 混合架构**的 AI 智能体桌面客户端。前端用 Flutter 构建界面,通过 flutter_rust_bridge 与 Rust 引擎(`rust_lib_agent`、`code_forge`)通信。
应用围绕 AI 聊天展开:支持多智能体管理、流式输出、富文本编辑、MCP 服务接入、工具调用权限控制;内置 PTY 终端面板和独立文件编辑器窗口,并提供模型供应商管理、本地大模型推理(llamadart/llama.cpp)、检查点、技能与命令系统。状态管理使用 signals,支持跨窗口与跨进程同步,覆盖 Windows、macOS 及 Android/iOS 移动端。
整体上是一个"聊天 + 终端 + 编辑器"一体的 AI 编程工作台,前端负责交互,Rust 引擎驱动智能体执行,前后端通过统一事件流协作。
关键实现机制
### 1. 前后端通信:统一事件流(ENGINE_SINK)
- Rust 后端通过**单一 sink 推送全部事件**(文本 chunk、工具调用片段、MCP 状态、前端工具调用),`EngineClient` 启动时 `connectEngine()` 建立全局 stream,按 `session_id` 路由到各会话的 broadcast 流。
- 前端调用方向由 `LlmService` 用 mixin 拆分封装(`ProviderModelApi` / `ChatApi` / `SessionApi`),配合 `GuardedApi` 做初始化检查与错误包装。
- `StreamEventProcessor` 是**纯逻辑层**:chunk 按 `partId + totalLen` 去重、工具调用片段覆盖式更新、权限请求挂 pending 状态——保证 Dart 侧可独立测试。
### 2. 前端工具(双向能力)
工具 schema 注册在 Rust 侧、handler 实现于 Flutter 侧,结果经 `submitFrontendToolResult` 回传。已实现 `simulated_terminal`(持久 shell 会话中执行命令,靠 OSC 633 结束标记判定完成,通过 `terminal_id` 复用终端)和 `terminal_send_input`(回答交互式提示)。移动端无 shell,跳过注册。
### 3. 本地大模型:应用内嵌 OpenAI 兼容服务
`LocalModelService` 用 llamadart 载入 GGUF 模型后,在 Dart 侧开一个 `HttpServer`(端口 8947 起),实现 `/v1/models` 和 `/v1/chat/completions`(FIFO 串行队列,因为 llamadart 同时只支持单次生成)。亮点是**自动 GPU 卸载拟合**:加载失败时以纯 CPU 加载读取元数据,按文件大小估算每层权重,结合显存余量算出可卸载层数,失败逐级减半、最终兜底纯 CPU。就绪后自动把自身写进 `config.json` 的 `language_models.openai_compatible.local_llm`,让本地模型无缝变成普通 OpenAI 兼容 provider。
### 4. 状态管理:signals + 单例 Store
全部响应式状态用 `signals` 包(`signal` / `computed` / `SignalBuilder`),UI 自动追踪依赖。Store 都是单例:`SessionStore`(多会话并发、流式状态)、`ConfigStore`(继承 `JsonFileSignalStore`,类型化更新 c