feat: complete Codex App capabilities and rebuild release

This commit is contained in:
shiyue
2026-08-20 13:37:23 +08:00
parent d7dc32e924
commit 19c1601351
8 changed files with 756 additions and 54 deletions

View File

@@ -0,0 +1,53 @@
# Codex App Web Search 接入发现
## 已确认
- 用户观察正确Codex App/app-server 本身会做原生自动上下文压缩。
- 旧的“检测上下文超限 → `/compact` → 重放”属于 detached Claude/旧 Codex CLI 的客户端兜底,不等于 Codex App 没有自动压缩。
- `lib/codex-app-runtime.js` 已识别 `webSearch` item并映射为 `web_search` / `WebSearch` 展示事件。
- 当前 Codex 配置把 `enableSearch``supportsSearch` 硬编码为 `false`,保存开启请求时也会忽略;该限制来自旧 `codex exec` 路径,需要收敛到 Codex App 原生能力。
- OpenAI 官方页面在当前网络环境不可访问developers 域返回 Forbiddenplatform 域被 Cloudflare 拦截。
- 按用户提示补用 `proxyd.picpi.top/{原始 URL}` 后,官方搜索页与 app-server 文档页仍返回上游 `Forbidden`;代理链路可达,但无法绕过官方站点的访问限制。
- TODO CSV 计划审查已通过;审查员建议在确认 schema 后记录字段名、关闭语义与证据来源。
## 待确认
- hapi 是否使用相同字段;主线程全文检索暂未命中,等待只读研究子代理复核。
## Codex 0.147.0 协议证据
- 本机 `codex app-server generate-json-schema --experimental` 生成的 v2 schema 中,`Config.web_search` 引用 `WebSearchMode`
- `WebSearchMode` 的枚举值为 `disabled``cached``indexed``live`
- `ThreadStartParams.config``ThreadResumeParams.config` 都允许线程级 config`TurnStartParams` 没有 Web Search 专用字段。
- cc-web 的 `codexAppThreadParams()` 已把 `codexAppThreadConfig()` 同时用于 `thread/start``thread/resume`,因此正确接入点是 `codexAppThreadConfig()` 写入 `web_search`
- 生成的 resolved `Config` 同时存在两层:顶层 `web_search: WebSearchMode`,以及 `tools.web_search: WebSearchToolConfig`。前者选择 `disabled/cached/indexed/live` 模式,后者承载 `context_size/allowed_domains/location` 等工具配置;不能把二者混成同一字段。
- CLI 解析实测:`web_search="live"``tools.web_search=true``tools.web_search=false` 都能加载;`tools.web_search="live"``"disabled"` 不合法。
- app-server `config/read` 实测:顶层配置会解析为 `web_search: "live"``tools.web_search=true/false` 都归一到 `tools.web_search: null`,仅凭读取结果无法证明布尔输入的最终启停语义。
- `codex --help` 明确 `--search` 是“Enable live web search”但该开关只属于 Codex CLI 根命令,`codex app-server --search` 会被拒绝app-server 应使用线程 config。
- 官方 OpenAI 文档通过 `proxyd-accelerator` 成功获取:`web-search.md` 明确 live 用 `web_search = "live"`、关闭用 `web_search = "disabled"``config-reference.md` 明确 `tools.web_search` 只是可选的上下文大小、域名和位置配置。
- 最终协议决策cc-web 开关只传顶层 `web_search: enableSearch ? 'live' : 'disabled'`;当前产品没有域名/位置细节 UI因此不传 `tools.web_search`
- app-server 的 `webSearch` thread item 已由 `lib/codex-app-runtime.js` 映射为前端 `web_search` 工具事件,展示链路已有基础。
## 实现与回归落点
- 服务端配置需把 `load/save/masked/handleSave``enableSearch` 改为真实布尔值,并将 `supportsSearch` 对 Codex App 暴露为 `true`;旧 Codex CLI 路径仍不读取该开关。
- `codexAppThreadConfig()` 应无条件写入 `web_search: enableSearch ? 'live' : 'disabled'`,让 `thread/start``thread/resume` 都明确覆盖用户全局搜索默认值。
- 设置面板已有 `.settings-toggle-row` / `.settings-switch` 组件可新增“Web Search”开关无需新增 CSS。
- mock app-server 当前可在 `thread/start` / `thread/resume` 捕获 `params.config.web_search`;回归应分别覆盖开启后的 `live` 与保存关闭后的 `disabled`
- 现有配置回归仍断言“unsupported/ignore”必须改为 `supportsSearch === true``enableSearch === true`,并在后续关闭保存中断言 `enableSearch === false`
- Web Search 事件映射已有实现,但目前回归未直接断言 `webSearch` item → `web_search` 工具事件,需要补 mock 事件或静态契约断言。
## 最终实现结果
- `server.js` 的 Codex 配置现在真实保存/读取 `enableSearch`,对 Codex App 暴露 `supportsSearch: true`保存提示不再声称“Codex exec 暂未接入”。
- `codexAppThreadConfig()` 每次组装线程参数时写入 `web_search: 'live' | 'disabled'`;同一配置同时覆盖 `thread/start``thread/resume`
- `public/app.js` 设置面板新增可读写的 Web Search switch说明文案限定为当前 Codex App 会话。
- mock app-server 暴露首次线程搜索模式与当前线程搜索模式,回归分别证明开启态 `live`、关闭后的 resume `disabled`,并证明未使用 `tools.web_search` 代替模式开关。
- `scripts/regression.js` 新增 `webSearch` item 的 `WebSearch/web_search` tool_start/tool_end/persistence 断言。
- 两次回归均通过:`timeout 60s node scripts/regression.js``timeout 60s npm run regression`
## 旧 Codex 模式盘点结论
- 普通 UI 已默认 Codex AppCodex App 的 `/compact``/goal`、协作模式、MCP、附件、标题、自动容量重试已有实现。
- 仍需后续单独处理的遗留:后端可新建 `agent='codex'`,旧 `codex exec` 运行链路完整存在rollout 导入与 regression 仍覆盖旧 CLI。它们属于迁移/封口任务,不在本轮 Web Search 范围内。
- 未知 app-server request 的“不支持”兜底应保留;运行中已知 slash 的策略需要产品决定,不应与本轮 Web Search 混改。

View File

@@ -0,0 +1,18 @@
# Codex App Web Search 接入进度
- 2026-08-20T10:15:00+08:00读取 `openai-docs``planning-with-files``todo-list-csv` 技能。
- 2026-08-20T10:15:00+08:00官方页面访问失败记录降级原因。
- 2026-08-20T10:15:00+08:00确认 codebase-memory 项目 `home-cc-web` 索引状态为 ready。
- 2026-08-20T10:15:00+08:00确认工作区存在 Goal 生命周期并行改动,本轮必须增量编辑。
- 2026-08-20T10:15:00+08:00建立独立 scoped plan未覆盖根目录 hooks 验证计划。
- 2026-08-20T10:20:00+08:00计划审查子代理通过无阻塞问题。
- 2026-08-20T10:20:00+08:00使用用户点名的 `proxyd-accelerator` 重试官方页面,仍收到上游 Forbidden继续以安装版 app-server schema 为直接证据。
- 2026-08-20T10:25:00+08:00由 Codex CLI 0.147.0 生成 experimental v2 schema确认线程 config 字段为 `web_search`,枚举包含 `disabled/cached/indexed/live``thread/start``thread/resume` 均支持 config。
- 2026-08-20T10:30:00+08:00完成配置、设置 UI、mock 和 regression 落点梳理;确认可复用现有 settings switch 样式,且 Goal 生命周期改动与目标区域可增量合并。
- 2026-08-20T10:40:00+08:00发现 `Config.web_search``Config.tools.web_search` 双层语义,暂停实现代理锁定字段;已启动追加复核,避免把合法配置误当成实际可用搜索。
- 2026-08-20T10:45:00+08:00通过 `proxyd-accelerator` 成功读取 OpenAI 官方 Markdown 文档,确认 live/disabled 应使用顶层 `web_search`;通知实现代理继续。
- 2026-08-20T10:45:00+08:00只读旧模式盘点完成除本轮 Web Search 外,主要遗留是后端仍可新建旧 `agent=codex`、完整 `codex exec` 路径和测试夹具保护Codex App 原生 compact/Goal/协作/MCP/附件/重试已完成。
- 2026-08-20T11:00:00+08:00完成 Web Search 配置持久化、Codex App 线程级 `web_search` 注入、设置开关、mock 观测字段和回归断言;保留旧 exec 路径不启用搜索。
- 2026-08-20T11:00:00+08:00修正一次回归断言时机live 断言放在开启态disabled 断言放在配置关闭后的 thread/resume。
- 2026-08-20T11:00:00+08:00`timeout 60s node scripts/regression.js``timeout 60s npm run regression` 均通过;四个 JS 文件语法检查、`git diff --check` 均通过。
- 2026-08-20T11:00:00+08:00确认 Codex App 原生自动 compact 已存在,本轮未新增客户端“最终超限后 compact+重放”逻辑。

View File

@@ -0,0 +1,37 @@
# Codex App Web Search 接入计划
## 目标
让设置中的 `enableSearch` 驱动 Codex App/app-server 原生 Web Search保持旧 `codex exec` 路径禁用搜索,并用协议回归证明参数形状、关闭语义和事件展示均正确。
## 验收标准
- 开启 Web Search 后Codex App 的官方协议字段收到明确启用值。
- 关闭 Web Search 后,协议字段为禁用值或按官方语义省略,不影响普通 turn。
- 设置保存与读取不再把 Codex App 搜索能力硬编码为不可用。
- `webSearch` item 继续按 `web_search` 工具事件展示。
- 不新增“上下文超限后客户端 compact + 重放”逻辑;文档结论明确区分上游原生自动压缩与 cc-web 额外失败兜底。
- 回归、语法检查和差异检查通过,且不覆盖 Goal 生命周期的并行改动。
## 阶段
1. [完成] 确认 Codex App Web Search 官方协议与现有链路
2. [完成] 编写 Web Search 配置与协议回归断言
3. [完成] 接入 Codex App 原生 Web Search 参数
4. [完成] 更新设置界面与配置保存语义
5. [完成] 验证 Web Search 事件展示与自动 compact 现状
6. [完成] 运行回归、语法与差异检查
7. [完成] 汇总兼容性结论并清理跟踪文件
## 决策
- 以本机 Codex app-server 生成 schema 为参数形状的直接证据,并用 hapi 实现交叉核对。
- Web Search 只接 Codex App 原生协议,不重新启用旧 `codex exec --search` 路径。
- 原生自动 compact 已存在;客户端“最终超限后 compact 并重放”不是本轮实现目标。
## 错误记录
| 错误 | 尝试 | 处理 |
|---|---:|---|
| `developers.openai.com` 返回 Forbidden | 1 | 改查同为官方域名的 `platform.openai.com` |
| `platform.openai.com` 被 Cloudflare 拦截 | 2 | 按 `openai-docs` 降级,读取官方文档参考并转用本机协议 schema 交叉验证 |