本项目在开发中借鉴了多个开源上游的实现。本文档详细记录每条借鉴在本项目里的形式、范围、落地位置(file:line)、本地差异与同步策略,作为 catalog,供贡献者 / 未来维护者快速完成以下 3 类任务:
| Use case | 入口 |
|---|---|
| 定位 — 看到 codebase 某段代码不理解,想知道借鉴来源 | grep 文件 → 在本文档"借鉴清单"列里反查上游 |
| 索引 — 新增 / 修改借鉴时落 entry | 按下方 Entry Schema 加 / 改一个 ### 项目名 section |
| 更新 — 上游有重要变更想同步 | 通过"借鉴清单 file:line"定位本项目实现 → 按"同步策略"判断如何 sync |
README.md / README.en.md 致谢段只列一句话概览;详情全部在本文档维护。 新增借鉴 = 同 PR 内 ① README 致谢段加一行概览 + ② 本文档加完整 entry,缺一不可。
- 定位:先看"借鉴形式术语",理解 entry 标记的强度;然后看"借鉴清单"每条 → 本项目 file:line。
- 索引:每个上游唯一
### 项目名section,GitHub 自动生成 TOC,Ctrl+F 项目名即跳。 - 更新:
- 小修(同步常量 / fix bug):按"借鉴清单"定位 file:line,改完同步 entry 的"代码层引用 quote"
- 上游主线大改 / 失效:在 Linear workspace
Mochance(team Mochance,labelImprovement)开 followup issue,长跨度跟踪 - License 变更 / 上游归档:必看 entry 的 License + TOS 字段做合规判断
每个上游对应一个 ### 项目名 section,按以下字段顺序写:
| 字段 | 必填 / 可选 | 用途 |
|---|---|---|
| Link | 必填 | 上游 GitHub URL |
| License | 必填(算法/数据/wire 类),可选(思路/启发类) | 合规硬要求 — 算法 1:1 复刻 / 整体借鉴必须明确 license |
| 借鉴形式 | 必填 | 按下方术语表选 1-3 个 tag |
| 首次借鉴 PR / 时间 | 必填 | PR # 或 "v1.x 起继承"。追溯何时入库,future 重写时知道决策 baseline |
| 借鉴清单 | 必填 | 每条 "<上游做了什么 / 本项目借了什么>" → 本项目 file:line |
| 本项目差异 / 扩展 | 可选,有重要本地改造时填 | future 维护者关键信息 — 跟上游同步前知道哪些是本地改造不能覆盖 |
| 同步策略 | 可选 | 上游变更怎么 detect + 怎么 sync。无策略可标 "monitor only" |
| TOS / 法律注意 | 条件性 | 灰色区 / 反向工程 / API ToS 限制时强制填 |
| 关联 PR / followup / issue | 可选 | 交叉索引(关联本项目内的 PR / issue / followup) |
| 代码层引用 quote | 可选 | 贴 1-2 段本项目代码注释原文,evidence 无需翻代码 |
| Tag | 含义 | License 处置 |
|---|---|---|
| 算法 1:1 复刻 / 整体借鉴 | 上游核心逻辑 byte-for-byte 或语义级移植 | 必须 保留 license + 作者署名,代码注释带上游 file:line |
| 数据模式参照 | 上游数据结构 / 静态注册表 / 常量原样镜像 | 同上,加版本 / 同步日期 |
| Wire-level 对齐 | HTTP/SSE 协议字节级行为复现(headers / endpoint / param 顺序) | 同上 |
| 反向工程产物借鉴 | 上游对闭源 / 灰色 API 的反向工程结论被直接复用 | 必须明示 reference;本项目不重复反向工程 |
| 算法借鉴 | 上游某条 helper / 算法 idea 借走,细节自行实现 | 注释提及上游归属 |
| Prompt 蓝本 | 上游 prompt 文本作为骨架,本项目调整后使用 | 注释标注 prompt 起源 |
| 思路 / 模式借鉴 | 设计思路启发,无代码复用 | 注释提一句即可 |
| 配置迁移参照 | 因历史 fork / 迁移需对齐旧上游字段命名 | 注释标注历史背景 |
| 产品形态启发 | 概念 / UX 启发,无代码层借鉴 | README 致谢即可 |
| 架构基座 | 框架依赖,非严格"借鉴" | README 致谢即可 |
- Link: https://github.com/farion1231/cc-switch
- License: 见上游 LICENSE(未在本项目代码注释中固化版本)
- 借鉴形式: 产品形态启发
- 首次借鉴 PR / 时间: 项目早期(v1.x 之前),无具体 PR
- 借鉴清单:
- provider switching 范式(把 ~/.codex / ~/.config/codex 多账号 / 多 provider 切换抽象成桌面 first-class 概念) → 整个 v1.x → v2.x provider 管理 UX(无代码 file:line — 概念级启发)
- 同步策略: monitor only(产品形态参考,无代码 sync 需求)
- Link: https://github.com/lonr-6/cc-desktop-switch
- License: 见上游 LICENSE
- 借鉴形式: 早期 fork 演化基础 + 配置迁移参照
- 首次借鉴 PR / 时间: v1.x 起继承(本项目即由此 fork 演化)
- 借鉴清单:
- v1.x 桌面壳骨架 + README 结构 → v1.x 时代产品基础(v2 重写时基本替换,无残留 file:line)
- 历史
updateUrl字段默认值(指向lonr-6/codex-app-transfer) →crates/registry/src/healing.rsLEGACY_OWNERS常量。老 config.json 残留旧 updateUrl 时自愈到当前 owner
- 本项目差异 / 扩展:
- 整个 v2 架构(Tauri v2 + Rust crates + cas:// in-process router)已完全重写,不再共享上游代码
- 仅保留 healing 逻辑兼容老用户的 config.json 迁移
- 同步策略: monitor only — 仅 healing 字段如发现更多 legacy owner 字段时补 LEGACY_OWNERS
- 代码层引用(
crates/registry/src/healing.rs节选):背景:本项目由 lonr-6/cc-desktop-switch 及后续 fork 演化而来,早期默认 updateUrl 指向
lonr-6/codex-app-transfer。用户老 config.json 里残留该值时,迁移到当前 owner 防 update 失效。
- Link: https://github.com/BerriAI/litellm
- License: MIT(本项目代码注释引用为参考,未 fork 代码)
- 借鉴形式: 数据模式参照 + 算法 1:1 复刻 + 思路借鉴
- 首次借鉴 PR / 时间: 多 PR 持续借鉴(协议转换是核心场景,长期参考)
- 借鉴清单:
response.in_progressSSE 事件生成时机(严格客户端 — litellm 自身 / Anthropic 工具链 — 期望的事件序列) →crates/adapters/src/responses/converter.rs:236-254- usage 字段规范化(litellm
_transform_chat_completion_usage_to_responses_usage字段映射,chat→responses reasoning_tokens / cached_tokens / total_tokens 等) →crates/adapters/src/responses/converter.rs(greplitellm多处) - Vertex AI TypedDict 1:1 镜像(
litellm/types/llms/vertex_ai.py) →crates/adapters/src/gemini_native/types.rs(顶部注释明示 "1:1 镜像") - tool result 配对修复(防 Anthropic 400 invalid request) →
crates/adapters/src/responses/request.rs - per-provider
get_supported_openai_params白名单(各家llms/<provider>/chat/transformation.py)作为 reasoning_effort 入表证据交叉验证:llms/deepseek/chat/transformation.py:41-63— DeepSeek 折叠 all non-none 到 thinking.type=enabled(本项目信官方 docs 而非 LiteLLM 保守实现,见 issue #254)llms/moonshot/chat/transformation.py:91-146get_supported_openai_params— Kimi 不收 reasoning_effortllms/zai/chat/transformation.py:36-58get_supported_openai_params— GLM 只承认thinking字段llms/minimax/chat/transformation.py:87-102get_supported_openai_params— MiniMax 只承认thinking+reasoning_splitllms/dashscope/chat/transformation.py(全文 82 行,无get_supported_openai_params)— 百炼 Qwen 走父类透传,effort 字段可能被 silent ignored →crates/registry/src/reasoning_effort_policy.rs(各 match arm 注释引用上游 file:line)
- 本项目差异 / 扩展:
- 按 Rust 类型系统重写,不引入 PyO3 / pyo3-runtime
- 转换逻辑保留 litellm 行为语义,但实现路径完全独立(Rust async/await 而非 Python)
- usage 字段映射跟随 litellm 主线;本项目额外加了 reasoning_tokens 非 0 校验防上游 0 漏统计
- DeepSeek reasoning_effort 映射主动偏离 litellm 保守实现(litellm 折叠成 thinking.type=enabled,不区分档位);本项目按官方 docs xhigh→max 真实映射(issue #254 用户报告 litellm 行为让 max 档不可达)
- 同步策略:
- litellm 主线 issue 关注协议层变更(尤其 OpenAI/Anthropic protocol updates)
- 类型镜像变更时手动 diff
litellm/types/llms/vertex_ai.py同步gemini_native/types.rs - 各 provider
get_supported_openai_params变更时同步reasoning_effort_policy.rs对应 match arm
- 代码层引用(节选):
//! 1:1 镜像 LiteLLM
litellm/types/llms/vertex_ai.py的 TypedDict 定义response.in_progress,严格客户端(litellm 自身、Anthropic 工具链) 与 litellm 的_transform_chat_completion_usage_to_responses_usage(docs/litellm/.../litellm_completion_transformation/transformation.py) LiteLLMllms/deepseek/chat/transformation.py:41-63实际把所有非 none 折叠成thinking.type=enabled,不区分档位 — 比官方 docs 保守。本项目信官方 docs。 Kimi (Moonshot) —llms/moonshot/chat/transformation.py:91-146get_supported_openai_params不收 reasoning_effort。 智谱 GLM (Z.AI) —llms/zai/chat/transformation.py:36-58get_supported_openai_params只承认thinking字段。 MiniMax M2.x —llms/minimax/chat/transformation.py:87-102get_supported_openai_params只承认thinking+reasoning_split。
- Link: https://tauri.app · https://github.com/tauri-apps/tauri
- License: Apache-2.0 / MIT(双 license)
- 借鉴形式: 架构基座(框架依赖,非严格"借鉴")
- 首次借鉴 PR / 时间: v2.x 重写时引入(替换 v1.x 的 Electron 壳)
- 借鉴清单:
- Tauri v2 桌面应用框架 → 整个
src-tauri/树 - 自定义 URI scheme
cas://localhost/→ in-process axum router 模式(借助register_asynchronous_uri_scheme_protocol) →src-tauri/src/main.rs(.register_asynchronous_uri_scheme_protocol("cas", ...)) tauri-plugin-single-instance单实例 →src-tauri/src/main.rssetup chaintauri-plugin-shell跨平台进程管理 → 同上
- Tauri v2 桌面应用框架 → 整个
- 本项目差异 / 扩展:
- cas:// 协议把 Tauri webview 跟内嵌 axum router 拼成"in-process HTTP",前端 fetch 不出 webview 沙箱,免 CORS / 免本机端口监听
- frontend 直接
include_dir!进二进制,运行时零文件依赖
- 同步策略: Tauri 主线版本升级走
cargo update -p tauri+ 跑 CI(workspace check + Tauri check) - 关联 PR / followup: 整个 v2 架构迁移历史在 git log;v1→v2 切换是分水岭 commit
- Link: https://github.com/openai/codex
- License: Apache-2.0
- 借鉴形式: Prompt 蓝本(精简移植)+ 协议反查(数据模式参照)+ 落盘布局思路(blob 内容寻址 + 会话 append-only)
- 首次借鉴 PR / 时间: v2.0.x 起协议结构反查;fix/219 起 prompt 结构借鉴;MOC-142 起 blob 落盘布局;MOC-168 起会话 append-only 思路
- 借鉴清单:
COMPACT_SUMMARIZATION_PROMPT基础骨架 →crates/adapters/src/responses/compact.rs:82-92(源文件:codex-rs/core/templates/compact/prompt.md,~460 chars)COMPACT_SUMMARY_PREFIX常量文本(明文,历史字段名encrypted_content是包袱) →crates/adapters/src/responses/compact.rs:97(源文件:codex-rs/core/templates/compact/summary_prefix.md)CompactionInput请求结构 →compact.rs反序列化逻辑 (源文件:codex-rs/codex-api/src/common.rs)CompactHistoryResponse { output: Vec<ResponseItem> }+ResponseItem::Compaction { encrypted_content }响应结构 →compact.rs序列化路径 (源文件:codex-rs/codex-api/src/endpoint/compact.rs+codex-rs/protocol/src/models.rs:882)- MOC-142 内容寻址 blob 外置:大
data:图片按 sha256 落独立文件、messages_json仅存轻量 引用,消除 stateless 逐轮快照对同一张图的重复存储(实测 64 张唯一图被存 5500 次 → 去重) →crates/adapters/src/responses/blob_store.rs(思路观察自 Codex~/.codex/generated_images/ig_<hash>.png落盘布局;另参 Claude Code~/.claude/paste-cache/<hash>.txt同类内容寻址 —— 均为运行时目录观察,非源码借鉴) - MOC-168 消息级内容寻址:每条消息按 sha256 存
message_contents表去重,行只留引用, 消除 stateless 逐轮快照对同一条消息的重复存储(实测 11 万实例 → 2687 唯一,41×,省 97%) →crates/adapters/src/responses/message_store.rs(借 Codex 会话记录~/.codex/sessions/.../rollout-*.jsonl的 per-session append-only 每 event 只落一次思路;我们 stateless 无 session 串联,用内容寻址等效"每条唯一消息只存一份")
- 本项目差异 / 扩展:
- prompt 补两条 Claude Code 关键 bullet("All user messages verbatim" + "Next Step verbatim quote"), 借鉴自 Piebald-AI/claude-code-system-prompts 反编译公开版本第 6 / 9 段(见下方同名 entry)
- 本地加 quality-check gate(
validate_compact_summary_quality) + input budget pruning, upstream codex-rs 无对应逻辑
- 同步策略:
codex-rs/core/templates/compact/路径改动时手动 diffprompt.md/summary_prefix.md
- Link: https://github.com/Piebald-AI/claude-code-system-prompts
- License: 反编译公开版本,作者发布(见上游 LICENSE)
- 借鉴形式: Prompt 蓝本(精简移植)
- 首次借鉴 PR / 时间: v2.0.12(从原 Codex CLI 86 字符 prompt 升级为 9-section 长 prompt);fix/219 简化为 2 条补充 bullet
- 借鉴清单:
- v2.0.12(历史,已替换):9-section 结构化 autocompact prompt 整体骨架
(
agent-prompt-conversation-summarization.md反编译公开版本) - fix/219(当前):"All user messages verbatim" + "Next Step verbatim quote" 两条 bullet 措辞
→
crates/adapters/src/responses/compact.rs:89-90(对应原文第 6 / 9 段)
- v2.0.12(历史,已替换):9-section 结构化 autocompact prompt 整体骨架
(
- 本项目差异 / 扩展:
- fix/219 起,主 prompt 骨架改从
openai/codex借(见上方 entry);Piebald-AI 仅贡献 2 条锚定 bullet - 去掉了
<analysis>+<summary>二段输出 schema、9-section 强结构、few-shot example
- fix/219 起,主 prompt 骨架改从
- 同步策略: 上游 prompt 变化频率低;若 Claude Code 主线 prompt 大改可手动 diff 第 6 / 9 段措辞
- 代码层引用(
crates/adapters/src/responses/compact.rs节选):v2.0.12 prompt rewrite:从原 Codex CLI 的 86 字符 prompt 改为 Claude Code 风格的 9-section 结构化 prompt(精简移植自 Piebald-AI/claude-code-system-prompts 反编译公开版本
agent-prompt-conversation-summarization.md)。fix/219 prompt simplification:回退到
openai/codex短 prompt 骨架(~460 chars),补充 Piebald-AI 第 6/9 段两条锚定 bullet,合计 ~800 chars。真机 DeepSeek v4-pro:比 9-section 长版本快 ~40% / 省 ~48% token。
- Link: https://github.com/7as0nch/mimo2codex
- License: 见上游 LICENSE
- 借鉴形式: 算法 1:1 复刻(跨多 provider 复用)+ 思路借鉴
- 首次借鉴 PR / 时间: MiMo 集成早期(具体 PR 见 git log
mimo2codex) - 借鉴清单:
buildResponseSnapshotSSE 响应快照算法(streamToSse.ts:75-105) →crates/adapters/src/responses/converter.rs(grepmimo2codex10+ 处)sequence_number单调递增(state.nextSeq(),streamToSse.ts:71-72) → 同上- annotation 解析与映射(
streamToSse.ts:156-163, 338-352) → 同上(跨所有 provider 复用,不仅 MiMo) warnOnce全局去重日志策略(reqToChat.ts:158-172) →crates/adapters/src/lib.rs
- 本项目差异 / 扩展:
- 算法跨所有 provider 复用(MiMo / DeepSeek / Kimi / GLM / Bailian / MiniMax 等都走同一套 SSE 状态机)
- 按 Rust 类型系统重写,event ordering / state machine 用 enum + state transition
- 同步策略:
- mimo2codex 主线变动手动 diff 关键 SSE 行为(
streamToSse.ts改动是优先关注点) - 新加 SSE event type 时同步本项目 enum
- mimo2codex 主线变动手动 diff 关键 SSE 行为(
- 代码层引用(
converter.rs多处节选):借鉴 mimo2codex
streamToSse.ts:75-105buildResponseSnapshot。 借鉴 mimo2codexstreamToSse.ts:71-72sequence_number: state.nextSeq()。 借鉴 mimo2codexstreamToSse.ts:156-163, 338-3521:1 复刻,跨所有 provider。 7as0nch/mimo2codexreqToChat.ts:158-172的warnOnce思路:全局去重。
- Link: https://github.com/router-for-me/CLIProxyAPI
- License: 见上游 LICENSE
- 借鉴形式: Wire-level 对齐 + 数据模式参照
- 首次借鉴 PR / 时间: Gemini OAuth 集成期 + 后续 Antigravity 集成期(具体 PR 见 git log
CLIProxyAPI) - 借鉴清单:
- Gemini CLI / Antigravity OAuth ClientMetadata / UA / version 常量(
header_utils.go::DetectUserAgent,auth/antigravity/constants.go,antigravity_version.go) →crates/gemini_oauth/src/constants.rs(10+ 处明示锚点) - OAuth callback query 参数顺序(必须与上游一致让 Google 端识别,
auth/antigravity/auth.go:60-68) →crates/gemini_oauth/src/antigravity/flow.rs - Code Assist 模型清单(交集对齐 gemini-cli upstream + CLIProxyAPI
internal/registry/models/models.jsonprovider=gemini-cli) →src-tauri/src/admin/handlers/providers/models.rs:336-372 - Antigravity
:fetchAvailableModels调用模式 + 静态种子 fallback(cmd/fetch_antigravity_models/main.go) →src-tauri/src/admin/handlers/providers/models.rs:268-333
- Gemini CLI / Antigravity OAuth ClientMetadata / UA / version 常量(
- 本项目差异 / 扩展:
- CLIProxyAPI 有 background goroutine 拉最新版本号;本项目用 hardcode fallback 每次重新授权时刷新(简化运维)
- Rust async/await 代替 Go goroutine
- 静态 antigravity 模型种子内嵌成
antigravity_static_models()(crate 内)而非 model.json
- 同步策略:
- CLIProxyAPI 主线 commit 关注(尤其 Google 端协议更新)
- Antigravity model 列表跟随 CLIProxyAPI
models.json同步 - 任何 ClientMetadata 字段变更必须立刻同步,否则 Google 端可能拒绝
- 代码层引用(节选):
//! 借鉴
router-for-me/CLIProxyAPICLIProxyAPIheader_utils.go::DetectUserAgent一致(format ...)。 CLIProxyAPI 有 background goroutine 拉最新版本号,Rust 当前用 hardcode fallback,每次重新授权时刷新。 query 参数顺序对齐 CLIProxyAPIauth/antigravity/auth.go:60-68。
- Link: https://github.com/chenyme/grok2api
- License: 见上游 LICENSE
- 借鉴形式: 反向工程产物借鉴 + 算法借鉴 + 数据模式参照
- 首次借鉴 PR / 时间: Grok Web 集成 PR(R1 Plan A,2026-05-12 加 grok-web preset)
- 借鉴清单:
- Grok Web endpoint 表 + SSE schema(闭源 web app 反向工程,
xai_chat.py) →crates/adapters/src/grok_web/types.rs - dynamic statsig ID 生成算法(
app/dataplane/proxy/adapters/headers.py::_statsig_id) →crates/adapters/src/grok_web/auth.rs(15+ 处明示chenyme锚点) sso={t}; sso-rw={t}cookie 双写行为(用户只提供 sso 时自动双写) →crates/adapters/src/grok_web/auth.rs- tool_calls flatten 模式(v2.1.6 加,处理 Grok Web 多 tool 嵌套) →
crates/adapters/src/grok_web/request.rs - 内置工具 emoji 图标映射(
xai_chat.py::_TOOL_FMT) →crates/adapters/src/grok_web/response.rs
- Grok Web endpoint 表 + SSE schema(闭源 web app 反向工程,
- 本项目差异 / 扩展:
- Rust 实现,statsig 算法去 Python 依赖
- tool_calls flatten 在 v2.1.6 加(chenyme 早期版本无)
- 同步策略:
- Grok Web 上游协议变动时(grok.com 改 endpoint / SSE format / statsig 算法),关注 chenyme/grok2api 主线 commit
- statsig 算法尤其关键 — 上游一改本项目立刻挂
- TOS / 法律注意:
⚠️ 反代 grok.com Web 端,grok TOS 灰色区。沿用 chenyme 立场:仅限本机个人使用本机 SuperGrok 账号,不应作为对外服务发布。Provider 表单 UI 同步显示该警告(frontend/js/i18n.jsgrokWeb.tosWarning)。 - 代码层引用(节选):
内置工具名 → emoji 图标(对照 chenyme
xai_chat.py::_TOOL_FMT)。 chenyme/grok2api 反向工程产出借鉴(endpoint table + SSE schema) 算法(参考 chenyme/grok2apiapp/dataplane/proxy/adapters/headers.py::_statsig_id):... chenymesso={t}; sso-rw={t}行为复刻:用户只提供 sso 时自动双写。
- Link: https://github.com/galaxywk223/codex-plugin-unlocker
- License: MIT(明确,本项目代码注释固化)
- 借鉴形式: 算法整体借鉴 + 本地差异
- 首次借鉴 PR / 时间: 2026-05-11(本项目 plugin unlock 集成 PR,见 git log
codex-plugin-unlocker) - 借鉴清单:
- 整套 Plugins 解锁注入脚本算法(上游
packages/codex_plugin_unlocker/inject/plugin-unlock.js) →src-tauri/src/codex_plugin_unlocker.rs:389-541(~150 行 JS in Rust raw string) - React Context.Provider 反查
setAuthMethod(沿 fiber.return 向上爬,找带 setAuthMethod + authMethod 字段的 Provider value) → 同上(line 392-433) - DOM 级 enable(清 disabled 属性 +
__reactProps.disabled) → 同上(line 461-477) - MutationObserver 持续 enforce(防 SPA 路由 / sidebar 重渲冲掉) → 同上(line 532-537)
- CDP
--remote-debugging-port=9222 --remote-allow-origins=*flag(Chrome 111+ / Electron 同代起的硬性要求,见上游launcher.py:55-58) →src-tauri/src/admin/handlers/desktop.rs:320-329 - HTTP API 路由 →
src-tauri/src/admin/handlers/plugin_unlock.rs - 启动时 auto unlock daemon(可由
autoUnlockCodexPlugins关) →src-tauri/src/main.rs:63-85
- 整套 Plugins 解锁注入脚本算法(上游
- 本项目差异 / 扩展:
- 关键改造:上游早期版本走 useState hook 链找 setter;Codex Desktop 26.513+ 之后 React state 结构改了导致 hook-scan 失效。本项目改走 React Context.Provider 反查,更稳定
- 加 DOM-level strict fallback:即使 setter 找不到也能让按钮可点
- inject script 内 short-circuit
if (auth.authMethod === 'chatgpt') return true;(避免重复注入,但首次必然触发一次 — 历史 followup #27 已 resolved by PR #191,详情归档在本地docs/)
- 同步策略:
- Codex Desktop 主线升级若让脚本失效,优先看 galaxywk223 主线是否有修
- 若上游也跟进新版 Codex Desktop,本项目同步 inject script(注意保留本地 React Context 改造跟 DOM fallback)
- 关联 PR / followup: PR #191 主修;长期"setAuthMethod 触发 AuthContext 重 mount"消除调研 → Linear MOC-5
- 代码层引用(
codex_plugin_unlocker.rs:389-401节选):算法借鉴 galaxywk223/codex-plugin-unlocker (MIT, 2026-05-11) https://github.com/galaxywk223/codex-plugin-unlocker/blob/main/codex_plugin_unlocker/inject/plugin-unlock.js 关键差异 vs. 早期版本(找 useState hook 链上的 setAuthMethod setter):
- 新策略走 React Context — 从 plugin 入口 DOM 节点拿 fiber,沿
fiber.return向上爬,检查每层memoizedProps.value/pendingProps.value,找带setAuthMethod+authMethod字段的对象(即AuthContext.Providervalue)
- 新策略走 React Context — 从 plugin 入口 DOM 节点拿 fiber,沿
- Link: https://github.com/QwenLM/qwen-code
- License: Apache-2.0(明确,本项目代码注释固化)
- 借鉴形式: 数据模式参照
- 首次借鉴 PR / 时间: PR #188(2026-05-17,百炼 Token Plan 套餐适配 + 获取模型 fix)
- 借鉴清单:
- 阿里官方 Qwen CLI 对百炼 Token Plan 套餐的处理思路:不调上游 list models API,直接静态硬编码模型清单(因 Token Plan gateway 不暴露
/modelsendpoint,所有 unknown path 返 401) →src-tauri/src/admin/handlers/providers/models.rs:380-394 - host 检测 helper(
token-plan.cn-beijing.maas.aliyuncs.com) →src-tauri/src/admin/handlers/providers/models.rs:71-82 - 模型清单
TOKEN_PLAN_MODELS4 条(qwen3.6-plus / deepseek-v3.2 / glm-5 / MiniMax-M2.5,跟上游packages/cli/src/auth/providers/alibaba/tokenPlan.ts对齐) → 同上
- 阿里官方 Qwen CLI 对百炼 Token Plan 套餐的处理思路:不调上游 list models API,直接静态硬编码模型清单(因 Token Plan gateway 不暴露
- 本项目差异 / 扩展:
- 普通百炼(
dashscope.aliyuncs.com)不命中此 short-circuit — 它的/compatible-mode/v1/models用户实测可用,继续走通用 HTTP probe - 跟现有
gemini_cli_oauth的 short-circuit 同模式(两者上游都不暴露 list models)
- 普通百炼(
- 同步策略:
- 上游
tokenPlan.tsTOKEN_PLAN_MODELS数组变化(新增 / 退役模型)时,同步本项目硬编码列表 + 加单元测试 case - 关注阿里云 Token Plan 套餐文档新增 endpoint(若未来真支持
/models,可移除 short-circuit)
- 上游
- 关联 PR / followup: PR #188(主修),issue #187(根 issue)
- 代码层引用(
models.rs:380-394节选):百炼 Token Plan 套餐 (
token-plan.cn-beijing.maas.aliyuncs.com) 不暴露compatible-mode/v1/modelsendpoint(网关在所有 unknown path 都返 401,routing 在 auth 之后)。阿里官方 Qwen CLI 自身就走静态硬编码 — 见 QwenLM/qwen-codepackages/cli/src/auth/providers/alibaba/tokenPlan.ts里TOKEN_PLAN_MODELS数组(Apache-2.0)。这里跟 Qwen CLI 的 canonical 4 条对齐。
- Link: https://github.com/BigPizzaV3/CodexPlusPlus
- License: MIT(明确,本项目代码注释固化)
- 借鉴形式: 算法 1:1 复刻(Rust 翻译版)+ Wire-level 对齐(COM API 调用)
- 首次借鉴 PR / 时间: PR #191(2026-05-17,Windows Plugin Unlock MSIX 实施)
- 借鉴清单:
IApplicationActivationManager::ActivateApplicationWin32 COM 调用(launcher.py:347-395,CLSID45BA127D-...+ IID2e941141-...+ vtable[3])→src-tauri/src/windows_msix.rs:50-96activate_packaged_app(Rust 用 windows-rs 官方 binding 而非手搓 ctypes COM)- AUMID 自动解析(
launcher.py:298-304+app_paths.py:30-49):Get-AppxPackagePowerShell 反推OpenAI.Codex_<publisher>!App→src-tauri/src/windows_msix.rs:111-137resolve_codex_aumid - cmdline 序列化(
launcher.py:411用subprocess.list2cmdline):MSIX activation 的arguments参数是单一 PWSTR 不是 argv 数组 →src-tauri/src/windows_msix.rs:157-199list2cmdline+escape_cmdline(WindowsCommandLineToArgvWquoting 规则) - Codex Desktop 启动入口 Windows 分支:
open_codex_app走 COM activation 替代explorer.exe shell:AppsFolder\...(后者剥 args)→src-tauri/src/admin/handlers/desktop.rs:335-405 - 端口冲突探测(
launcher.py:267-281SO_EXCLUSIVEADDRUSEsocket 占位探测思路):9222 被占时 fallback OS 分配的随机空闲端口,daemon 通过CDP_PORTatomic 读最新值 →src-tauri/src/admin/handlers/desktop.rs::detect_free_cdp_port+src-tauri/src/codex_plugin_unlocker.rs::CDP_PORT/current_cdp_url(issue #226 Task 1,PR 同期落地)
- 本项目差异 / 扩展:
- Rust 实现用
windowscrate 0.59+ 官方 binding(Win32_UI_Shellfeature)而非 Python ctypes 手搓 vtable - ActivateApplication 失败时 fallback 到老
explorer.exe路径让 Codex 至少能启动(args 丢失,Plugin Unlock 在 fallback 路径下不工作,但 Codex 本身可用) - PowerShell CIM 进程清理已在 PR #201 实施(对照
launcher.py:434-451) - 端口探测 Rust 用
std::net::TcpListener::bind而非 PythonSO_EXCLUSIVEADDRUSEsocket option — Tokio + std 在跨平台 bind 行为已足够区分占用,无需 Windows 专属 socket option(跨平台一致更易测) - 非-Store .exe fallback(Method 6)留作 issue #226 Task 2 后续 PR
- Rust 实现用
- 同步策略:
- 上游 launcher.py COM 调用约定变动(Microsoft 更新 ActivateApplication 接口的可能性极低)→ 跟踪 windows-rs major version 升级
- AUMID 解析逻辑跟随 Codex Desktop AppxManifest 命名约定;若 OpenAI 改 package family name 命名(如改
OpenAI.CodexCLI),resolve_codex_aumid的 PowerShell-Name 'OpenAI.Codex'filter 需更新
- 关联 PR / followup: PR #191(主修),历史 followup #33 已 resolved by PR #227(端口冲突探测)+ Task 2 非-Store .exe fallback dropped(issue #226 closed)
- 代码层引用(
windows_msix.rs:18-25节选):实现路径 1:1 借鉴
BigPizzaV3/CodexPlusPlus(MIT,2699 stars)的 Python 实现codex_session_delete/launcher.py:283-451(2026-05-17 同步)。同道项目实证可工作。本 Rust 实现用windowscrate 官方 binding 而非手搓 ctypes COM,稳定性更好。
- Link: https://github.com/borawong/AiMaMi
- License: MIT(明确,本项目
managed_block.rs头注释固化) - 借鉴形式: 算法借鉴(受管块设计:marker 切分 + 六操作 + Protected mode;细节本地重写)
- 首次借鉴 PR / 时间: PR #206(2026-05-20,Codex 资产管理 managed block + Agents tab MVP);Protected mode 后续 PR #229
- 借鉴清单:
- 受管块算法(上游
src-tauri/src/core/custom_instructions.rs:1-130):注释 marker 把"app 受管区"与"用户手写区"物理隔离 + parse / preview / apply / rollback / clear / history 六操作 + Protected mode → 本项目src-tauri/src/admin/services/managed_block.rs
- 受管块算法(上游
- 本项目差异 / 扩展:
- marker 前缀改成
cas:(如cas:managed:agents:v1:start)做项目隔离,避免与上游 / 其他工具 marker 冲突 - 受管对象从单一 custom instructions 扩展到
~/.codex/AGENTS.md+config.tomlMCP 段 +skills/*/SKILL.md三类
- marker 前缀改成
- 关联 PR / followup / issue: PR #206(主修)/ PR #229(Protected mode);issue #24 #25
- 代码层引用(
managed_block.rs:1节选):Codex 配置文件"受管块"管理 — 借鉴 borawong/AiMaMi(MIT):
src-tauri/src/core/custom_instructions.rs:1-130。
- Link: https://github.com/ryoppippi/ccusage
- License: MIT(Copyright 2025 ryoppippi)
- 借鉴形式: 整体 vendor — Rust 源码直接复制到本仓 + namespace 重定向 + 删 CLI/terminal/output/blocks 等表现层
- 首次借鉴 PR / 时间: PR #279(2026-05-26,Token 用量统计功能)
- 上游版本: ccusage v20.0.5,upstream commit
2b9599ca(2026-05-26 拉取) - 借鉴清单(全部位于本项目
crates/usage_tracker/src/vendored_ccusage/):codex/parser.rs←rust/crates/ccusage/src/adapter/codex/parser.rs(rollout JSONL line-by-linememchr::memmem::Finderfast-path 解析)codex/types.rs←rust/crates/ccusage/src/adapter/codex/types.rs(CodexSessionLogEntry/CodexLogEntry/CodexPayload/CodexInfo/CodexModelMetadata/CodexResultFields/CodexTimestamp)codex/paths.rs←rust/crates/ccusage/src/adapter/codex/paths.rs(CODEX_HOMEenv + 默认~/.codex/sessions/路径发现)types.rs←rust/crates/ccusage/src/types.rs(CodexRawUsage/CodexTokenUsageEvent/TokenUsageRaw/TokenCounts/ModelBreakdown/CodexGroup等)fast.rs←rust/crates/ccusage/src/fast.rs(FxHashMap/FxHashSet/ByteLines等基础 utility)home.rs←rust/crates/ccusage/src/home.rs(home_dir)date_utils.rs←rust/crates/ccusage/src/date_utils.rs(TimestampMs/parse_ts_timestamp/format_date_tz/parse_tz/format_rfc3339_millis等)utils.rs←rust/crates/ccusage/src/utils.rs(json_value_u64/total_usage_tokens/apply_total_token_fallback)error.rs←rust/crates/ccusage/src/main.rs:64-95(CliError/Result/cli_errorhelper,ccusage 上游放 main.rs 顶层,本项目拎独立模块)- MIT LICENSE 副本 + 顶层 attribution 见
crates/usage_tracker/src/vendored_ccusage/{LICENSE,mod.rs}
- 本项目差异 / 扩展:
- 不 vendor:
adapter/codex/{loader,aggregate}.rs(CLI 耦合SharedArgs/progress)、summary.rs/blocks.rs/output.rs/cli.rs/main.rs/commands/等 CLI 表现层 → 本项目自写薄壳crates/usage_tracker/src/lib.rs替代,算法对照 ccusageloader.rs/aggregate.rs1:1(参 lib.rs 顶部文档) - Phase 1 不 vendor pricing / cost:
pricing.rs/cost.rs/fast-multiplier-overrides.json/ LiteLLM JSON 嵌入留 Phase 2 加 token cost 显示时再 vendor - 不并行加载:ccusage
loader.rs用thread::scope并行,本项目桌面端单 user 数据量小(~250 文件 1.2GB 实测串行 ~1-2s)走串行,降并发复杂度 - 输出层全替:ccusage 走 CLI stdout / terminal table,本项目走 Axum admin
/api/usage/summaryJSON + Tauri vanilla JS 前端<table>渲染 - 可见性:vendor 后所有
pub(crate)/pub(super)统一改pub,保 vendor 子模块对父 crate 可见
- 不 vendor:
- 同步策略:
- 上游 codex adapter 主线修改(新 token 字段 / parser bug fix)→ 跟随 ccusage 版本号手动 sync,改动小直接 cherry-pick 对应文件
- 上游 LiteLLM pricing snapshot 升级 → Phase 2 vendor pricing 后再考虑
- 不自动跟随;固定 vendor commit hash 避免 break(参
vendored_ccusage/mod.rs顶部Upstream commit:注释)
- 关联 PR / followup: PR #279(主修),issue #279 + Linear MOC-15
- 代码层引用(
crates/usage_tracker/src/lib.rs:5-12节选):借鉴自 ryoppippi/ccusage (MIT)。解析 + 数据类型 + paths 见 vendored_ccusage 模块,直接 vendor 自 ccusage
rust/crates/ccusage/src/adapter/codex/{parser,types,paths}.rs与同 cratetypes.rs/fast.rs/home.rs/date_utils.rs/utils.rs。本文件 loader + aggregator 算法 1:1 对照 ccusagerust/crates/ccusage/src/adapter/codex/{loader.rs,aggregate.rs},但移除 CLI 层(SharedArgs/progress::track_usage_load)+ 不做并行。
- Link: https://github.com/Cmochance/Codex_Account_Switch
- License: 同作者自有项目(Cmochance);借鉴仍按上游惯例记录归属。
- 借鉴形式: 算法借鉴(
codex login子进程调起 / 等待-取消模式)+ 数据模式参照(ChatGPT OAuth client_id / refresh endpoint / auth.json chatgpt 结构)+ 思路借鉴(~/.codex之外维护持久镜像、Windows 进程辅助) - 首次借鉴 PR / 时间: 早期 Windows 进程辅助起继承(PR #191 期);MOC-104 真实账号 plugin 模式集中借鉴(PR #338,2026-05-31)
- 借鉴清单:
- ChatGPT OAuth 常量 + refresh 请求格式(上游
src-tauri/shared/runtime/chatgpt_api.rs:96-108,~400-450):issuerhttps://auth.openai.com、public client_idapp_EMoamEEZ73f0CkXaXp7hrann、POST /oauth/tokengrant_type=refresh_token表单格式 →src-tauri/src/codex_real_account.rs(OPENAI_ISSUER/OPENAI_OAUTH_CLIENT_ID/refresh_if_needed) - chatgpt 模式 auth.json 结构(
{auth_mode:"chatgpt", tokens:{access_token,refresh_token,id_token,account_id}, last_refresh})→codex_real_account.rs::parse_chatgpt_auth/apply_refresh_response codex login子进程调起 + 等待/取消模式(上游mac/runtime/process.rs::run_codex_login+shared/runtime/login_cancel.rs::wait_for_login_or_cancel)→codex_real_account.rs::{start_login,cancel_login,login_status}(本项目用后台线程 reap + pid kill,不 1:1 复刻)~/.codex之外维护持久镜像 + 失效恢复思路(上游 account_backup 多账号目录 + switch overlay)→codex_real_account.rs::{imported_mirror_path,import_auth,reconcile_on_startup}(本项目单账号镜像,不引多账号 switch 体系)- Windows
hide_console_window(CREATE_NO_WINDOWflag)(上游src-tauri/win/runtime/process.rs::hide_console_window)→src-tauri/src/admin/services/desktop/process.rs:175 - OpenAI 官方 Windows Store 包 ID 对齐 →
src-tauri/src/admin/services/desktop/process.rs:16 - 纯配置写入模式(代理不参与转发)思路 →
src-tauri/src/admin/services/desktop/snapshot.rs:82 - Windows 进程辅助参照 →
src-tauri/src/windows_msix.rs:235
- ChatGPT OAuth 常量 + refresh 请求格式(上游
- 本项目差异 / 扩展:
- 不自建 OpenAI OAuth,登录复用官方
codex login(轻、稳、不怕 OpenAI 改 OAuth);上游也是调官方 login。 - 单账号持久镜像 + 「活动文件失效才自动恢复」,不引入上游的多账号 switch / overlay / plan 查询体系。
- token 刷新整个 exchange 在
tokio::Mutex内串行,防 single-use refresh_token 并发双 POST。
- 不自建 OpenAI OAuth,登录复用官方
- 同步策略: client_id / refresh endpoint 跟随官方 codex 变化(上游同源);monitor only。
- 代码层引用(
codex_real_account.rs节选):ChatGPT desktop / Codex CLI 公开 OAuth client id(借鉴 Codex_Account_Switch chatgpt_api.rs:100,该处注明已对照官方 codex 与 codex-switcher 验证)。
- Link: https://github.com/deedy5/duckduckgo_search
- License: 见上游 LICENSE(算法 / 思路借鉴,未在本项目代码固化版本)
- 借鉴形式: 算法借鉴 / 思路 · 模式借鉴(DDG html 版结果解析模式,代码自行实现)
- 首次借鉴 PR / 时间: #386 / 2026-06-04(MOC-12 web_search 工具)
- 借鉴清单:
- DDG html 版(
html.duckduckgo.com/html/)结果解析模式 ——.result__a(标题 + href)/.result__snippet(摘要)CSS selector →crates/http/src/search.rs::parse_ddg_html uddg重定向解码 —— href//duckduckgo.com/l/?uddg=<urlencoded 真实 URL>&rut=...取uddg参数 urldecode 出真实落地 URL →crates/http/src/search.rs::decode_href
- DDG html 版(
- 本项目差异 / 扩展:
- 上游是 Python 完整 SDK(纯 HTTP 请求);本项目仅借其 html 版解析模式,用 Rust
dom_query自行实现。 - 关键差异:抓取走 headless 而非纯 HTTP —— 实测 DDG 对纯 HTTP(含 wreq Chrome120 指纹 + 完整 header + POST + lite 共 6 变体)一律 202 anti-bot 拦,故经 headless Chromium 真跑 JS 过反爬(上游纯 HTTP 模式在本项目环境不可用)。
- 广告过滤(
is_ad)+ anomaly 页检测(has_anomaly_markers)按本项目 spike 实测自行实现,非上游。
- 上游是 Python 完整 SDK(纯 HTTP 请求);本项目仅借其 html 版解析模式,用 Rust
- 同步策略: monitor only —— DDG 改
.result__a/.result__snippetclass 或uddg格式时,按借鉴清单 file:line 定位本项目解析处同步。 - 关联: MOC-12 / PR #386
- Link: https://github.com/CloakHQ/CloakBrowser
- License: 见上游(stealth Chromium,源码级 C++ 指纹 patch + persistent profile;概念借鉴,未引入其二进制 / 代码)
- 借鉴形式: 思路借鉴(per-origin 持久 profile 复用 cookie 跳过重复挑战;非代码移植)
- 首次借鉴 PR / 时间: #416 / 2026-06-06(MOC-156 ③ headless 持久 profile)
- 借鉴清单:
- per-origin persistent profile —— headless 档按 origin 持久化
user-data-dir,Chrome 落盘的 cookie(含cf_clearance)跨调用复用、同 origin 下次跳过重复 CF 挑战 →crates/http/src/headless/mod.rs::fetch_rendered_html(顶层)+persistent_profile_dir/HeadlessBrowser::launch_persistent
- per-origin persistent profile —— headless 档按 origin 持久化
- 本项目差异 / 扩展:
- 上游是完整 stealth 浏览器(C++ patch ~200MB 独立 license);本项目仅借持久 profile 复用
cf_clearance的思路,用 chromiumoxide + 系统 Chrome / chrome-headless-shell 自实现,不引入其二进制。 - 约束自实现:per-origin async Mutex 串行(避 Chrome profile lock 冲突)+ TTL 1h(clearance 失效即清,减少 cookie 留存)+ 仅 headless 档(curl/wreq UA 与 headless 不一致,
cf_clearance跨档失效)。
- 上游是完整 stealth 浏览器(C++ patch ~200MB 独立 license);本项目仅借持久 profile 复用
- 同步策略: monitor only(概念借鉴,无 API 耦合)。
- 关联: MOC-156 / PR #416
- Link: https://github.com/Xewdy444/CF-Clearance-Scraper
- License: 见上游(
cf_clearance抓取工具;约束认知 + 概念借鉴,未引入代码) - 借鉴形式: 思路借鉴(CF challenge 等待清除 +
cf_clearance复用约束;非代码移植) - 首次借鉴 PR / 时间: #416 / 2026-06-06(MOC-156 ② wait-for-clear + ③ 复用约束)
- 借鉴清单:
- wait-for-clear(②) —— headless 渲染后若仍是 CF 挑战页,原地轮询同页等 stealth 解出(而非立即失败),到 marker 消失或超时 →
crates/http/src/headless/mod.rs::fetch_rendered_html(challenge_wait_timeout轮询) cf_clearance复用约束(③) —— clearance cookie 绑定 UA + IP(上游 README 实证),据此定"仅 headless 同档复用"(curl/wreq UA 不一致跨档失效)→headless/mod.rs持久 profile 仅 headless 档
- wait-for-clear(②) —— headless 渲染后若仍是 CF 挑战页,原地轮询同页等 stealth 解出(而非立即失败),到 marker 消失或超时 →
- 本项目差异 / 扩展:
- 上游是 Python 专用 clearance 抓取器;本项目借其 challenge 等待思路 + clearance UA/IP 绑定约束认知,用 Rust chromiumoxide 自实现,不抓 / 不导出 cookie(profile 内部复用)。
- 同步策略: monitor only(概念借鉴)。
- 关联: MOC-156 / PR #416
- Link: https://github.com/liaohch3/claude-tap
- License: 见上游 LICENSE(产品形态 / UX 启发,无代码层复用,本项目全自写实现)
- 借鉴形式: 产品形态启发 / 思路 · 模式借鉴(诊断流量查看器整体形态 + copy-as-curl / 请求结构化 diff 的 UX 概念;代码自写)
- 首次借鉴 PR / 时间: 形态启发 #392(MOC-169 诊断 viewer 初版)/ 2026-06-04(初版漏记,本 entry 于 MOC-184 补);UX 增强 MOC-184(copy-curl + INBOUND↔OUTBOUND diff)/ 2026-06-05
- 借鉴清单:
- 本地抓包 + 单 HTML trace viewer 整体形态(默认本地、不外传、网页实时看 LLM 全流量)→
src-tauri/src/trace_viewer.rs+src-tauri/resources/trace_viewer.html(独立127.0.0.1:18090SSE viewer) - copy-as-cURL(从一条 trace 一键复刻请求)→
trace_viewer.html::buildCurl(从 OUTBOUND 生成 curl) - structural diff 思路 →
trace_viewer.html::diffLines(行级 LCS,本项目改成看 INBOUND↔OUTBOUND adapter 转换结果)
- 本地抓包 + 单 HTML trace viewer 整体形态(默认本地、不外传、网页实时看 LLM 全流量)→
- 本项目差异 / 扩展:
- 上游是通用旁路代理(Python,拦 Claude/Codex/Gemini 等多 client);本项目是 Codex 专用代理自身内嵌诊断(流量本就经过,不拦别人),Rust + 单 HTML。
- diff 方向不同:claude-tap 比相邻同格式请求(turn-over-turn);本项目比 INBOUND↔OUTBOUND(跨协议,看 adapter 把请求改成了啥);同会话 turn 间 diff 留作后续。
- 不借鉴:多 client 拦截 / 正反向代理切换 / i18n / dark-toggle / 易分享 HTML 导出(本项目数据含完整 prompt/代码/回复,定位仅本地勿外传)。
- 同步策略: monitor only(UX 概念借鉴,无代码同步需求)。
- 关联: MOC-169 / MOC-184 / PR #392 / #400
- Link: https://github.com/guyinwonder168/opencode-glm-quota
- License: MIT
- 借鉴形式: 反向工程产物借鉴 + 算法借鉴
- 首次借鉴 PR / 时间: MOC-211 / 2026-06
- 借鉴清单:
- GLM Coding 用量 monitor 端口路径(上游对
bigmodel.cn/z.ai两域名的GET /api/monitor/usage/quota/limit反向工程结论)→src-tauri/src/glm_quota.rs:95fetch_glm_quota_summary - Authorization 不带 Bearer 前缀的鉴权约定(上游实测发现 GLM coding-plan API key 直接置 Authorization header,无 Bearer)→
src-tauri/src/glm_quota.rs:95请求构造处 - 响应字段语义:
data.limits[]中TOKENS_LIMIT类型的unit/number映射(unit=3,number=5 → 5 小时;unit=6,number=1 → 每周)+percentage为已用%(对比 antigravity remainingFraction 的剩余口径)+nextResetTime重置时刻(unix 毫秒)→src-tauri/src/glm_quota.rs:58parse_glm_quota
- GLM Coding 用量 monitor 端口路径(上游对
- 本项目差异 / 扩展:
- 未复制上游代码,按上游对该闭源 monitor API 的反向工程结论自行实现 Rust parser / fetcher(
glm_quota.rs) - 额外加 host gate:baseUrl 含
bigmodel.cn/z.ai且含coding才匹配(src-tauri/src/codex_quota_injector.rsactive_glm_provider),按量计费的zhipu(/api/paas/v4)不匹配 - 缓存 / 失效语义与 antigravity 完全对称(45s 缓存、401/403 清缓存、瞬时错留旧值)
src-tauri/src/codex_quota_injector.rsfetch_glm_quota - 中性类型
ProviderQuota(src-tauri/src/provider_quota.rs)统一 antigravity 与 GLM 两路数据 - 真机实测取证 2026-06-14(bigmodel.cn 域名 + 真实 coding key → HTTP 200)
- 未复制上游代码,按上游对该闭源 monitor API 的反向工程结论自行实现 Rust parser / fetcher(
- 同步策略: monitor only — GLM 若更改 monitor 端口路径 / 字段语义时,按 file:line 定位
parse_glm_quota/fetch_glm_quota_summary同步 - TOS / 法律注意: 使用的是 GLM Coding Plan 订阅用户自己的 API key 调官方 monitor 端点,属合规访问自有账号数据,无灰色风险
- 关联 PR / followup / issue: MOC-211
- Link: https://zcode.z.ai (闭源桌面 app,无公开源码仓库)
- License: 闭源商业产品(无开源 license);本项目不复制其代码,仅复用对其登录 wire 的反向工程结论
- 借鉴形式: 反向工程产物借鉴 + Wire-level 对齐
- 首次借鉴 PR / 时间: MOC-252 Stage 1 / 2026-06(#499)
- 借鉴清单(均为对 ZCode 3.1.0 解包
out/host/index.js的反向工程结论,Rust 自行实现):- z.ai / bigmodel 两套账号登录 provider 配置(authorize / token / biz / business-login endpoint + appId + authorize 参数样式)→
crates/gemini_oauth/src/zai/constants.rs - JSON 信封 token 交换(
POST zcode.z.ai/api/v1/oauth/tokenbody{provider,code,redirect_uri,state},响应{code,msg,data}业务信封,code != 0即业务错)→crates/gemini_oauth/src/zai/flow.rs - Coding Plan 换组织 API key 链路(
getCustomerInfo → pickOrgAndProject → api_keys find/create → copy → <apiKey>.<secretKey>,biz base:z.ai=api.z.ai+Bearer、bigmodel=bigmodel.cn+裸 token)+ z.ai 业务 token 中转(api/auth/z/login)→crates/gemini_oauth/src/zai/coding_plan.rs - ZCode 指纹头(
User-Agent: ZCode/<ver>、X-Platform、HTTP-Referer、X-Title、X-ZCode-Agent: glm、anthropic-version)→crates/gemini_oauth/src/zai/constants.rs
- z.ai / bigmodel 两套账号登录 provider 配置(authorize / token / biz / business-login endpoint + appId + authorize 参数样式)→
- 本项目差异 / 扩展:
- 未复制 ZCode 代码,按解包分析结论自行 Rust 重写
- 回调机制改 loopback:ZCode 用
zcode://deeplink,本项目改http://127.0.0.1:<port>/oauth-callback(RFC 8252 loopback,实测两套账号 authorize 回跳 + token 交换都接受) - 凭证存储改明文 0600 文件:ZCode 存
~/.zcode/v2/credentials.json(AES-256-GCM),本项目改~/.codex-app-transfer/{provider}-oauth.json(仿 antigravity 的 atomic + 0600,与项目其它 OAuth 凭证一致) - 加「OAuth 授权成功即预存 token + resume 续传」安全网(ZCode 无),保护浏览器授权不因换 key 失败而白费
- 同步策略: monitor only — ZCode 若更改登录 wire(endpoint / 信封 / 换 key 链路),按 file:line 定位
zai/{constants,flow,coding_plan}.rs同步 - TOS / 法律注意:
⚠️ 对闭源桌面客户端反向工程其登录 wire。用途是让用户用自己的 GLM Coding Plan 订阅账号经本项目登录(等价于 ZCode 自身的登录),访问的是用户自有账号资源;不复制 ZCode 专有代码、不重新分发其二进制。仅供个人使用自有账号,不应作为对外服务发布。 - 关联 PR / followup / issue: MOC-252(#499 Stage 1)
- 新增借鉴:1 个 PR 内 ① README 致谢段加一行概览 ② 本文档加完整 entry(必填字段全),缺一不可
- 概览长度硬约束:README 致谢每行 " — " 之后的描述只写极简标签 ——
README.md≤ 20 字、README.en.md≤ 40 字(均按 Unicode 码点计,中英文 / 标点 / 反引号 / 空格各算 1)。完整借鉴形式 / license / file:line / 路径一律放本文档,不塞进 README 概览。由scripts/check_acknowledgements.py在 CI(docs-acknowledgementsjob)强制,超标即 fail —— 写规则没用过(历史上新增条目反复超标),这条改成机器门禁
- 概览长度硬约束:README 致谢每行 " — " 之后的描述只写极简标签 ——
- 修改已有借鉴:本项目代码 file:line 变了 → 同步 entry 的"借鉴清单";本项目差异扩展了 → 加到"本项目差异 / 扩展"
- 删除借鉴(代码被重写不再依赖):entry 移到末尾
## 已不再依赖的历史借鉴section 保留追溯,不直接删 — 历史归属信息必须可回溯 - License 合规:任何"算法 1:1 复刻 / 整体借鉴 / 数据模式参照 / Wire-level 对齐" 必须保留 license + 作者署名(代码注释 + 本文档双重记录)
- 上游主线大改 / 失效跟踪:走 Linear workspace
Mochance(team Mochance)开 followup issue(本文档只放当前状态 catalog,长跨度跟踪走 Linear)