支持无GUI的Server运行模式

This commit is contained in:
xintaofei
2026-03-29 18:36:30 +08:00
parent 7b73d7e1c2
commit 080a16f26c
49 changed files with 2169 additions and 1047 deletions

View File

@@ -4,11 +4,12 @@ This file provides guidance to Code Agent when working with code in this reposit
## 项目概述
codeg 是一个桌面应用,用于聚合和浏览本地 AI 编码代理的会话记录。它从多个代理Claude Code、Codex、OpenCode的本地文件系统中读取会话数据统一格式后在 UI 中展示。
codeg 是一个多模式应用,支持桌面客户端和独立服务器部署,用于聚合和浏览本地 AI 编码代理的会话记录。它从多个代理Claude Code、Codex、OpenCode、Gemini CLI、OpenClaw、Cline)的本地文件系统中读取会话数据,统一格式后在 UI 中展示。
## 技术栈
- **桌面运行时**: Tauri 2Rust 后端 + webview 前端)
- **服务器运行时**: 独立 Rust 二进制Axum HTTP + WebSocket无需 Tauri/GUI
- **前端**: Next.js 16静态导出模式+ React 19 + TypeScriptstrict
- **样式**: Tailwind CSS v4 + shadcn/uiradix-maia 风格)
- **包管理器**: pnpm
@@ -16,7 +17,7 @@ codeg 是一个桌面应用,用于聚合和浏览本地 AI 编码代理的会
## 开发命令
```bash
# 启动完整应用Tauri + Next.js Turbopack 开发服务器)
# 启动完整桌面应用Tauri + Next.js Turbopack 开发服务器)
pnpm tauri dev
# 仅启动前端
@@ -28,11 +29,18 @@ pnpm build
# 构建 Tauri 桌面应用
pnpm tauri build
# 启动独立服务器(无需 Tauri/GUI
pnpm server:dev
# 构建服务器 release 二进制
pnpm server:build
# Lint 检查
pnpm eslint .
# Rust 检查(在 src-tauri/ 目录下执行)
cargo check
cargo check # 桌面模式(默认)
cargo check --bin codeg-server --no-default-features # 服务器模式
cargo clippy
cargo build
```
@@ -41,31 +49,59 @@ cargo build
## 架构
### 双模式运行
项目通过 Cargo feature flags 支持两种运行模式:
- **`tauri-runtime`(默认)**:完整桌面应用,包含 Tauri 窗口管理、系统通知、自动更新等
- **无 feature`--no-default-features`**:独立服务器模式,仅编译 Axum HTTP API + WebSocket
### 共享核心
- **`app_state.rs`** — `AppState` 共享状态结构,两种模式通过 `EventEmitter` 枚举区分事件发射方式
- **`web/event_bridge.rs`** — `EventEmitter::Tauri(AppHandle)``EventEmitter::WebOnly(Arc<WebEventBroadcaster>)`
- **`web/router.rs`** — Axum 路由,接受 `Arc<AppState>`
- **`web/handlers/`** — 146 个 HTTP API 端点,全部使用 `Extension<Arc<AppState>>`
### Rust 后端(`src-tauri/src/`
后端负责读取和解析本地文件系统上的代理会话文件:
- **`app_state.rs`** — 共享状态db、连接管理器、终端管理器、事件广播器
- **`models/`** — 共享数据结构
- **`parsers/`** — 每个代理一个解析器
- **`commands/sessions.rs`** — 暴露给前端的 Tauri 命令
- **`commands/`** — 业务逻辑(`_core` 函数供两种模式共用,`#[tauri::command]` 函数仅桌面模式)
- **`web/`** — Axum HTTP API + WebSocket + 静态文件服务
- **`acp/`** — Agent Client Protocol 连接管理
- **`terminal/`** — PTY 终端管理
- **`db/`** — SeaORM + SQLite
### 前端(`src/`
- **`lib/types.ts`** — Rust 模型的 TypeScript 镜像。`AgentType``"claude_code" | "codex" | "open_code"`snake_case与 Rust serde 一致)
- **`lib/tauri.ts`** — 对每个 Tauri 命令的类型化 `invoke()` 封装
- **`lib/transport/`** — Transport 抽象层,自动检测 Tauri/Web 环境切换 `invoke()`/`fetch()`
- **`lib/types.ts`** — Rust 模型的 TypeScript 镜像
- **`app/`** — Next.js 页面,不使用动态路由
- **`app/login/`** — Web 模式 token 登录页
- **`components/`** — 项目组件
- **`components/ui/`** — shadcn 组件
### 数据流
前端调用 `invoke()` → Tauri 命令 → 解析器读取本地文件 → 返回 `SessionSummary[]` / `SessionDetail` → React 渲染
桌面模式:前端 `invoke()` → Tauri 命令 → 业务逻辑 → 返回数据
服务器模式:前端 `fetch()` → Axum HTTP API → 同一业务逻辑 → 返回 JSON
### 条件编译约定
- `#[cfg(feature = "tauri-runtime")]` — 仅桌面模式编译Tauri 窗口、通知、`tauri::State` 参数等)
- `#[cfg_attr(feature = "tauri-runtime", tauri::command)]` — 函数始终可用,仅在桌面模式标记为 Tauri 命令
- `_core` 后缀函数 — 接受普通引用参数(`&AppDatabase``&EventEmitter`),供 Web handlers 和 Tauri 命令共用
## 关键约束
- **仅支持静态导出**`next.config.ts` 设置 `output: "export"`,不支持动态路由(`[param]`),必须使用查询参数替代
- **路径别名**`@/*` 映射到 `./src/*`,导入写法为 `@/lib/utils``@/components/ui/button`
- **Rust serde 约定**`AgentType` 序列化为 snake_case`claude_code``open_code`。Tauri 命令参数在 JS 侧使用 camelCaseRust 侧使用 snake_case
- **服务器部署**:通过环境变量配置(`CODEG_PORT``CODEG_HOST``CODEG_TOKEN``CODEG_DATA_DIR``CODEG_STATIC_DIR`
## 代码风格