Files
2026-07-13 12:31:29 +08:00

119 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div align="center">
# codex-provider-sync
### 切换 provider 后,让 Codex 历史会话重新可见
[![CI](https://github.com/Dailin521/codex-provider-sync/actions/workflows/ci.yml/badge.svg)](https://github.com/Dailin521/codex-provider-sync/actions/workflows/ci.yml)
[![Platform](https://img.shields.io/badge/platform-Windows-lightgrey.svg)](https://github.com/Dailin521/codex-provider-sync)
[![Node](https://img.shields.io/badge/node-16%2B-brightgreen.svg)](https://nodejs.org/)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
中文 | [English](docs/README_EN.md)
</div>
## 解决什么问题
Codex 切换 `model_provider` 后,旧会话可能在 Desktop 或 `/resume` 里不可见。原因通常不是会话文件丢了,而是 rollout 文件、SQLite 线程表、项目路径缓存里的 provider / 可见性 metadata 不一致。
本工具同步这些位置:
- `~/.codex/sessions`
- `~/.codex/archived_sessions`
- `~/.codex/state_5.sqlite`
- `.codex-global-state.json` 中的项目根路径缓存
## 快速使用
Windows 用户优先下载 Release 里的 `CodexProviderSync.exe`
1. 打开 `CodexProviderSync.exe`
2. 点击 `Refresh`
3. 选择目标 Provider
4. 点击 `Execute`
macOS 用户可使用 Avalonia 桌面版,构建说明见 [README_MAC_GUI_ZH.md](docs/README_MAC_GUI_ZH.md)。
其它环境使用 CLI
```bash
npm install -g git+https://github.com/Dailin521/codex-provider-sync.git
codex-provider sync
```
CLI 需要 Node.js `16+`。Node 24+ 会优先使用内置 `node:sqlite`;旧版 Node 会使用可选依赖 `better-sqlite3`
更多 CLI 常用命令:
```bash
codex-provider status
codex-provider sync
codex-provider sync --provider openai
codex-provider switch apigather
codex-provider restore C:\Users\you\.codex\backups_state\provider-sync\<timestamp>
codex-provider prune-backups --keep 5
```
命令含义:
- `status`:只检查当前 provider、rollout、SQLite、项目可见性诊断。
- `sync`:不切换登录状态,只把历史会话 metadata 同步到当前 provider。
- `switch <provider-id>`:修改 `config.toml` 根级 `model_provider`,然后执行同步。
- `restore <backup-dir>`:从备份恢复,支持 `--no-config``--no-db``--no-sessions`
- `prune-backups --keep <n>`:只清理本工具创建的旧备份。
## 能力边界
本工具只修复“历史会话可见性”相关 metadata,不修改会话内容。
- 不处理登录、认证、`auth.json` 或第三方切号工具。
- 不修改消息历史、会话标题、对话内容。
- 不修改 `updated_at`,不通过改变历史排序来修复 Desktop 显示。
- 不把旧会话里的 `encrypted_content` 重新加密到另一个 provider / account。
-`encrypted_content` 的旧会话跨 provider/account 后,通常只能恢复列表可见性,继续对话或 compact 仍可能报 `invalid_encrypted_content`
## Codex Desktop 最近 50 条限制
目前 Codex Desktop 的 Recent/项目侧会话列表存在一个上游显示限制:前端首屏只拉取最近 `50` 条会话。
影响:
- CLI `/resume` 能看到的旧会话,Desktop 项目侧可能仍显示“暂无对话”。
- 旧项目会话如果排在全局最近 50 条之后,Desktop 首屏可能不会展示。
- `codex-provider-sync status` / GUI Refresh 会显示 `first page 0/50``ranks 64-77` 这类诊断,帮助判断是不是这个问题。
本工具不会通过修改 `updated_at` 或文件时间把旧会话强行挤进前 50。这个问题应由 Codex Desktop 上游改成按项目分页加载,或提高/开放首屏加载数量。
## 安全与排障
每次 `sync` / `switch` 前都会备份到:
```text
~/.codex/backups_state/provider-sync/<timestamp>
```
注意:
- 如果 `state_5.sqlite` 被占用,关闭 Codex / Codex App / app-server 后重试。
- 如果 `state_5.sqlite` 损坏,工具会提示 malformed/unreadable 并停止同步。
- 如果活跃会话锁住 rollout 文件,工具会跳过该文件并继续处理其它历史会话。
- 如果 EXE 双击无反应,先确认已解压,再查看 `%AppData%\codex-provider-sync\startup-error.log`,或在 PowerShell 里运行 `./CodexProviderSync.exe`
Windows GUI 说明见 [README_GUI_ZH.md](docs/README_GUI_ZH.md)macOS GUI 说明见 [README_MAC_GUI_ZH.md](docs/README_MAC_GUI_ZH.md)。AI / Agent 说明见 [AGENTS.md](AGENTS.md)。
## 开发
```bash
git clone https://github.com/Dailin521/codex-provider-sync.git
cd codex-provider-sync
npm test
dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj
pwsh ./scripts/publish-gui.ps1
./scripts/publish-gui-macos.sh
```
## License
MIT