本文档说明 CodexManager 当前仓库结构、运行关系和发布链路,目标是帮助协作者快速判断改动应该落在哪一层。
CodexManager 由两类运行模式组成:
- 桌面模式:Tauri 桌面端 + 本地 service 进程
- Service 模式:独立 service + web UI,可用于服务器、Docker 或无桌面环境
统一目标:
- 管理账号、用量、平台 Key
- 提供本地网关能力
- 对外兼容 OpenAI 风格入口,并适配多种上游协议
.
├─ apps/ # 前端与 Tauri 桌面端
│ ├─ src/ # Vite + 原生 JavaScript 前端
│ ├─ src-tauri/ # Tauri 桌面壳与原生命令桥接
│ ├─ tests/ # 前端 UI/结构测试
│ └─ dist/ # 前端构建产物
├─ crates/
│ ├─ core/ # 数据库迁移、存储基础、认证/用量底层能力
│ ├─ service/ # 本地 HTTP/RPC 服务、网关、协议适配、设置持久化
│ ├─ web/ # Web UI 服务壳,可嵌入前端静态资源
│ └─ start/ # Service 一键启动器(拉起 service + web)
├─ scripts/ # 本地构建、统一版本、测试探针、发布辅助脚本
├─ docker/ # Dockerfile 与 compose 配置
├─ assets/ # README 图片、Logo 等静态资源
└─ .github/workflows/ # CI / release workflow
apps/src/main.js:前端启动装配入口apps/src/runtime/app-bootstrap.js:界面初始化编排apps/src/runtime/app-runtime.js:刷新流程与运行期协同apps/src/settings/controller.js:设置域门面,继续向子模块分发
apps/src-tauri/src/lib.rs:Tauri 应用装配入口apps/src-tauri/src/settings_commands.rs:桌面端设置桥接命令apps/src-tauri/src/service_runtime.rs:桌面内嵌 service 生命周期apps/src-tauri/src/rpc_client.rs:桌面端 RPC 调用基础设施
crates/service/src/lib.rs:service 总入口与运行时装配crates/service/src/http/:HTTP 路由入口crates/service/src/rpc_dispatch/:RPC 分发入口crates/service/src/gateway/mod.rs:网关聚合入口crates/service/src/gateway/observability/http_bridge.rs:请求追踪、协议桥接、日志写入crates/service/src/gateway/protocol_adapter/request_mapping.rs:OpenAI/Codex 输入映射crates/service/src/gateway/protocol_adapter/response_conversion.rs:非流式结果总转换入口crates/service/src/gateway/protocol_adapter/response_conversion/sse_conversion.rs:流式 SSE 转换入口crates/service/src/gateway/protocol_adapter/response_conversion/openai_chat.rs:OpenAI Chat 结果适配crates/service/src/gateway/protocol_adapter/response_conversion/tool_mapping.rs:工具名缩短与还原
crates/service/src/app_settings/:设置持久化、环境变量覆盖、运行时同步crates/service/src/web_access.rs:Web 访问密码与会话令牌
桌面模式由以下部分组成:
apps/src/:前端 UIapps/src-tauri/:桌面壳crates/service/:本地 service
运行方式:
- 用户启动桌面应用。
- Tauri 壳负责窗口、托盘、更新、单实例、设置桥接等桌面行为。
- 桌面端通过 RPC 或本地地址与
codexmanager-service通信。 - 前端 UI 展示账号、用量、请求日志、设置等页面。
Service 模式由以下二进制组成:
codexmanager-servicecodexmanager-webcodexmanager-start
职责:
codexmanager-service:核心服务进程,提供账号管理、网关转发、请求日志、设置持久化、RPC/HTTP 接口。codexmanager-web:Web UI 服务壳,可直接提供前端页面,并代理到本地 service。codexmanager-start:面向发布包的一键启动器,负责同时拉起 service 和 web。
主要负责:
- 页面渲染
- 用户交互
- 状态管理
- 调用本地 API / Tauri command
- 设置页与账号页的前端逻辑
主要负责:
- Tauri 应用启动
- 单实例控制
- 系统托盘与窗口事件
- 桌面更新与安装器行为
- 将前端操作桥接到 service / 本地运行时
主要负责:
- SQLite 迁移
- 存储底层能力
- 认证 / usage 等核心基础逻辑
- 可被 service 复用的数据访问能力
主要负责:
- HTTP / RPC 入口
- 账号、用量、API Key 管理
- 本地网关能力
- 协议适配与上游转发
- 请求日志与设置持久化
- 运行时配置同步
重点子目录:
src/gateway/:网关、协议适配、流式与非流式转换src/http/:HTTP 路由入口src/rpc_dispatch/:RPC 分发src/account/、src/apikey/、src/requestlog/、src/usage/:领域逻辑
主要负责:
- 提供 Web UI 静态资源
- 挂载或代理到 service
- 可选把
apps/dist内嵌到二进制,形成单文件发布物
主要负责:
- 在 Service 发布包里提供一个更直接的启动入口
- 协调 service 与 web 的生命周期
当前项目使用 SQLite。 数据库迁移位于:
crates/core/migrations/
数据库里不只存账号,也已经承担:
- API Key
- 请求日志
- token 统计
- app settings
配置主要来源包括:
- 环境变量
CODEXMANAGER_* - 应用运行目录下的
.env/codexmanager.env app_settings持久化表- 桌面端设置页
当前约定:
- 启动前必须生效的配置保留在环境变量层。
- 运行时可调配置优先通过设置页 +
app_settings管理。 - 设置变更不应无边界地散落在桌面端、前端和 service 各处。
典型请求链路如下:
- 客户端或 UI 发起请求。
- 请求进入
crates/service的 HTTP / RPC 层。 - 网关模块决定转发策略、账号、头部策略、上游代理等。
- 协议适配层负责处理:
/v1/chat/completions/v1/responses- 流式 SSE
- 非流式 JSON
tool_calls/ tools 映射与聚合
- 结果回写请求日志和统计信息,再返回给调用方。
前端:
pnpm -C apps run devpnpm -C apps run buildpnpm -C apps run check
Rust:
cargo test --workspacecargo build -p codexmanager-service --releasecargo build -p codexmanager-web --releasecargo build -p codexmanager-start --release
桌面端:
scripts/rebuild.ps1scripts/rebuild-linux.shscripts/rebuild-macos.sh
版本目前由根工作区统一维护:
- 根
Cargo.toml的[workspace.package].version
桌面端额外同步:
apps/src-tauri/Cargo.tomlapps/src-tauri/tauri.conf.json
统一修改入口:
scripts/bump-version.ps1
主要发布入口:
.github/workflows/release-all.yml
职责:
- 构建 Windows / macOS / Linux 桌面产物
- 构建 Service 版本产物
- 上传 GitHub Release 附件
- 根据 tag /
prerelease输入决定发布类型
当前仓库需要重点关注以下问题:
apps/src-tauri/src/lib.rs仍偏厚,桌面壳层装配与命令实现尚需继续拆开。crates/service/src/lib.rs配置、运行时同步、副作用边界不够清晰。crates/service/src/gateway/protocol_adapter/response_conversion.rs兼容分支较多,回归风险高。.github/workflows/release-all.yml仍然较长,多平台逻辑需要持续约束。
为了减少结构污染,新增需求尽量按以下原则落点:
- 新页面或前端交互:优先落在
apps/src/views/、apps/src/services/、apps/src/ui/ - 新桌面能力:优先落在
apps/src-tauri/src/的独立模块,而不是全部继续塞进lib.rs - 新设置项:先判断属于环境变量、持久化配置还是运行时状态
- 新协议兼容:优先落在 gateway / protocol adapter 子模块,不要把条件分支继续无序堆叠
- 新发布逻辑:优先抽成脚本或复用步骤,不要三平台重复改三份