---
date: "2026-06-13"
status: active
depth: standard
origin: null
---
# feat: Tauri 2.x Desktop Client
## Summary
创建 Tauri 2.x 桌面客户端外壳,将现有 Vue 3 GUI 包装为跨平台桌面应用(Windows/macOS/Linux)。Tauri 管理窗口和 Python 后端进程生命周期,前端代码仅做最小适配(动态 API baseURL + Splash 启动流程),不修改任何 GUI 组件、布局、样式或业务逻辑。
## Problem Frame
当前 AgentKit GUI 只能通过浏览器访问(`agentkit gui` 启动后自动打开浏览器),用户需要:
1. 手动启动后端进程
2. 在浏览器中操作,缺乏原生体验(无系统托盘、无桌面集成、无自动更新)
3. 无法像桌面应用一样安装、启动、关闭
竞品(Cursor、Devin)均提供原生桌面客户端。AgentKit 需要对齐这一体验标准。
## Key Technical Decisions
**KTD-1: Tauri 2.x 作为桌面壳。** Tauri 使用系统 WebView(不打包 Chromium),安装包 ~5-10MB + PyInstaller 产物 ~30-80MB,总计远小于 Electron 方案(~200MB+)。启动快(窗口 <500ms),内存低(~110-200MB vs Electron ~300-500MB)。Tauri 2.x 插件化架构更灵活,capabilities 权限模型更安全,且是长期维护版本。
**KTD-2: PyInstaller 打包 Python 后端为 sidecar。** PyInstaller 将 Python 后端打包为独立单文件二进制,Tauri 通过 `tauri-plugin-shell` sidecar API 管理其生命周期。比 Nuitka 兼容性更好,社区更成熟。
**KTD-3: 端口 0 + stdout 解析实现端口发现。** Python 后端以 `--port 0` 启动,OS 分配随机可用端口,uvicorn 启动后通过 stdout 输出 `AGENTKIT_PORT=XXXXX`,Rust 侧解析后通过 Tauri IPC 传递给前端。避免端口冲突,无需用户配置。
**KTD-4: 前端最小适配策略。** 仅修改 `api/base.ts`(动态 baseURL)和 `App.vue`(Splash 启动流程),新增 `api/tauri.ts`(Tauri invoke 封装)和 `TitleBar.vue`(自定义标题栏)。所有现有 GUI 组件、布局、样式、业务逻辑不做任何修改。
**KTD-5: 双窗口 Splash 方案。** Tauri 配置两个窗口:splash(小窗口,加载动画)和 main(主窗口,初始隐藏)。后端就绪后 Rust 侧关闭 splash、显示 main。比前端内 Splash 更干净,不侵入现有 App.vue 的布局逻辑。
## High-Level Technical Design
```
┌──────────────────────────────────────────────────────┐
│ Tauri Application (Rust) │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │
│ │ Splash │ │ Main Window │ │ System Tray │ │
│ │ (loading) │ │ (Vue 3 SPA) │ │ (minimize) │ │
│ └─────────────┘ └──────┬───────┘ └─────────────┘ │
│ │ HTTP/WS │
│ ┌───────────────────────▼──────────────────────────┐│
│ │ Python Backend (sidecar process) ││
│ │ FastAPI + uvicorn on random port ││
│ └──────────────────────────────────────────────────┘│
│ │
│ Rust Modules: │
│ - sidecar.rs: start/stop/health Python process │
│ - tray.rs: system tray menu │
│ - lib.rs: Tauri Builder + plugin registration │
└──────────────────────────────────────────────────────┘
```
**启动序列:**
```
1. 用户双击桌面图标 → Tauri 启动
2. Rust setup() → 创建系统托盘
3. Splash 窗口显示(加载动画)
4. 前端 invoke('start_backend')
5. Rust spawn sidecar: agentkit-server --port 0
6. Python 绑定随机端口 → stdout: AGENTKIT_PORT=XXXXX
7. Rust 解析端口 → 存入 BackendState → emit('backend-ready')
8. 前端设置 apiBaseURL → 健康检查通过
9. Rust 关闭 splash → 显示 main 窗口
```
**关闭序列:**
```
1. 用户点击关闭按钮 → 窗口隐藏到托盘(不退出)
2. 托盘菜单"退出" → Rust 发送 SIGTERM 给 Python 进程
3. Python 优雅关闭 → Tauri app.exit(0)
```
## Scope Boundaries
**在范围内:**
- Tauri 2.x 项目脚手架和配置
- Rust 侧 sidecar 进程管理(启动/停止/健康检查/端口发现)
- 前端最小适配(api/base.ts 动态 baseURL、api/tauri.ts 封装、App.vue Splash 流程、TitleBar.vue)
- 系统托盘(显示/隐藏窗口、退出)
- 单实例锁
- 自定义标题栏(无边框窗口)
- PyInstaller 打包脚本
- 跨平台 CI 构建(GitHub Actions)
**延迟到后续迭代:**
- 自动更新器(tauri-plugin-updater 集成 + 签名密钥 + 发布服务器)
- 应用签名和公证(macOS code signing / Windows Authenticode)
- 多语言支持
- 离线模式
- 深度链接(deep link / URL scheme 注册)
- 文件关联
**不在范围内:**
- 修改现有 GUI 组件、布局、样式
- 修改后端 API 或业务逻辑
- 移动端适配(Tauri 2.x 支持 iOS/Android,但不在本次范围)
- 多用户协作
## Implementation Units
### U1. Tauri 2.x 项目脚手架
**Goal:** 创建 Tauri 2.x 项目结构,配置构建管线,验证 dev 模式可运行。
**Requirements:** KTD-1, KTD-4
**Dependencies:** 无
**Files:**
- `src-tauri/Cargo.toml` — Rust 依赖(tauri 2, tauri-plugin-shell, tauri-plugin-single-instance, serde, tokio, reqwest)
- `src-tauri/tauri.conf.json` — Tauri 核心配置(窗口、sidecar 声明、bundle 设置)
- `src-tauri/capabilities/default.json` — 权限声明
- `src-tauri/src/main.rs` — Rust 入口
- `src-tauri/src/lib.rs` — Tauri Builder(占位,后续单元填充)
- `src-tauri/build.rs` — 构建脚本
- `src-tauri/icons/` — 应用图标(占位)
- `package.json` — 添加 Tauri CLI 和 API 依赖
**Approach:**
1. 在项目根目录初始化 Tauri 2.x:`npm create tauri-app@latest` 或手动创建 `src-tauri/` 目录
2. `tauri.conf.json` 配置双窗口(splash + main),main 初始 `visible: false`
3. `build.beforeDevCommand` 指向前端 dev 脚本,`build.beforeBuildCommand` 指向前端 build 脚本
4. `build.frontendDist` 指向前端构建输出目录
5. `bundle.externalBin` 声明 sidecar 二进制名
6. 安装前端依赖:`@tauri-apps/api@^2`, `@tauri-apps/plugin-shell@^2`
7. 验证 `npm run tauri dev` 能启动窗口
**Patterns to follow:** Tauri 2.x 官方项目结构
**Test scenarios:**
- `npm run tauri dev` 启动后显示 Tauri 窗口(前端内容可能为空,因为后端未启动)
- `npm run tauri build` 能生成安装包(可能因缺少 sidecar 二进制而失败,此为预期)
**Verification:** `npm run tauri dev` 能启动 Tauri 窗口并加载前端页面
---
### U2. Rust Sidecar 进程管理
**Goal:** 实现 Python 后端进程的启动、停止、健康检查和端口发现。
**Requirements:** KTD-2, KTD-3
**Dependencies:** U1
**Files:**
- `src-tauri/src/sidecar.rs` — sidecar 管理模块(新建)
- `src-tauri/src/lib.rs` — 注册 invoke handler 和 BackendState
- `src-tauri/Cargo.toml` — 添加 `regex` 依赖
**Approach:**
1. 定义 `BackendState` 结构体:`port: Mutex