feat/AGC codex的工具调用 持久化处理 #282

Merged
kdletters merged 37 commits from feat/agc-codex-native-tool-call-info into master 2026-09-08 22:04:38 +08:00
Member

重构directproject的thread持久化, 保存response items用来恢复thread

修改了DirectProject的对话jsonl格式, 不兼容不迁移. (测试需要手动清理旧对话jsonl文件)

AGC显式写入user msg, 对codex 返回的user msg忽略
清理原来的上下文滑动窗口, 因为codex内部会自动compact

工具调用后重启,继续对话:
shotmd-1788579616.jpg

close #249
close #277

重构directproject的thread持久化, 保存response items用来恢复thread 修改了DirectProject的对话jsonl格式, 不兼容不迁移. (测试需要手动清理旧对话jsonl文件) AGC显式写入user msg, 对codex 返回的user msg忽略 清理原来的上下文滑动窗口, 因为codex内部会自动compact 工具调用后重启,继续对话: ![shotmd-1788579616.jpg](/attachments/8350c924-9498-47cd-b3da-8be6b79696f9) close #249 close #277
k88936 self-assigned this 2026-09-04 14:12:10 +08:00
k88936 added this to the 陶泥儿gameAgent project 2026-09-04 14:12:10 +08:00
k88936 added the due date 2026-09-05 2026-09-04 15:25:23 +08:00
k88936 added 1 commit 2026-09-04 17:13:17 +08:00
补充 DirectProject Codex 原始历史恢复方案
Project CI / Repository checks (pull_request) Failing after 13s
Project CI / Backend tests (pull_request) Failing after 13s
Project CI / Frontend tests (pull_request) Successful in 3m47s
Project CI / Native shell tests (pull_request) Successful in 17m30s
9ce0e89e43
新增 DirectProject 原始 Responses item 历史格式与异常收尾规则

明确 thread/inject_items 恢复流程及半成品处理边界

不涉及旧格式迁移、DirectHome 或审计账本
k88936 modified the due date from 2026-09-05 to 2026-09-04 2026-09-04 17:15:30 +08:00
k88936 modified the due date from 2026-09-04 to 2026-09-05 2026-09-04 19:31:35 +08:00
k88936 added 14 commits 2026-09-05 11:39:44 +08:00
新增 Codex Responses item JSONL 读写模块并启用 raw 事件

DirectProject 新线程使用 thread/inject_items 恢复历史

异常终态收尾累计 assistant 文本并移除旧文本 replay 写入
DirectProject 聊天命令写入 Responses message item

聊天读取从原始 item 投影 user/assistant 内容

保留 Agent session 旧会话读写路径
将测试用用户与助手消息写入原始 Responses item

不恢复生产环境旧聊天持久化逻辑
删除旧的文本拼接、预算裁剪和遗漏标记逻辑

DirectProject 仅通过原始 item 注入恢复上下文

保留非 DirectProject 路径的既有会话实现
DirectProject 历史累计逻辑拆到独立回合模块

浏览器仅显示项目对话,Rust 负责原始 item 持久化

拒绝空 rawResponseItem 并更新测试适配
记录线程注入与用户消息写入顺序

明确空 rawResponseItem 错误及浏览器只读边界

补充历史模块职责位置
在文档入口增加原始 item 持久化与异常恢复方案

同步 DirectProject 专题文档地图
将本地历史持久化失败映射为 InvalidRequest
保留缺失 itemId 事件的现有丢弃行为并输出诊断日志
新增 DirectProject 专用读写命令

恢复 legacy 对话命令的单一职责

更新工作台 DirectProject 读取调用
按文件尾部反向分块查找带 id 的历史 item

避免每次追加都完整读取并扫描历史文件
取消 Rust 预写用户消息,改为只保存 Codex 原始回传

过滤技能、权限和环境上下文内部 item

增加内部上下文过滤回归测试
记录用户消息只由 Codex 原始 item 产生

记录内部启动上下文不进入项目历史
修复 DirectProject 首次历史写入
Project CI / Native shell tests (pull_request) Failing after 3m25s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Failing after 1m47s
61c33cd3c7
历史文件不存在时跳过幂等反向扫描

保留首条带 id item 的正常追加
k88936 added 7 commits 2026-09-05 13:42:28 +08:00
异常收尾时尝试写入全部未完成消息

保留首个落盘错误并避免后续部分历史被丢弃
仅在 DirectProject 模式记录增量文本

避免其他工作区为每个事件创建无用副本
将原始响应历史写入移到 spawn_blocking

保持事件顺序并避免阻塞异步收集循环
为协议异常的增量生成稳定回退 item 标识

避免丢失用户可见流文本和异常收尾历史
记录当前不预写用户消息的实现边界

补充缺失 itemId 的回退累积规则
标注 messages 仅是乐观界面投影

说明 Direct 历史由 Rust 原始响应负责写入
让 Direct 对话遵守项目写入确认
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
1a08df517f
Direct 回合启动前检查 conversation.write 策略

确认后复用同一 clientTurnId 重试,拒绝则不启动回合
k88936 added 1 commit 2026-09-05 13:42:51 +08:00
Merge branch 'master' into feat/agc-codex-native-tool-call-info
Project CI / Native shell tests (pull_request) Failing after 31m38s
Project CI / Repository checks (pull_request) Failing after 34m24s
Project CI / Frontend tests (pull_request) Failing after 34m25s
Project CI / Backend tests (pull_request) Successful in 54m13s
29ab89768c
k88936 marked the pull request as ready for review 2026-09-05 13:53:14 +08:00
k88936 requested review from kdletters 2026-09-05 13:54:52 +08:00
kdletters requested changes 2026-09-05 14:37:10 +08:00
Dismissed
kdletters left a comment
Member

请求修改:

  1. P1 用户消息未持久化。DirectProject 在 App.tsx 跳过浏览器写入,direct_runtime.rs 也删除了回合开始前的用户消息写入;当前仅在 rawResponseItem/completed 事件中保存 response item,该事件通常不包含本轮 user message。重启或新建 thread 后历史缺少用户提问,上下文会断裂。请在 turn/start 前显式追加 user item,并按 turn ID 做幂等。

  2. P1 新 thread 恢复时通过 thread/inject_items 全量注入 project.jsonl,没有 token/字节上限或裁剪策略。长期对话可能超过 app-server/model 上下文限制,导致恢复或新回合失败。请增加按模型预算保留最新连续历史的策略,或先使用受支持的 compact 机制。

另外,PR 混入 UI 编辑器和文档改动,建议拆分以降低回归范围。

请求修改: 1. P1 用户消息未持久化。DirectProject 在 App.tsx 跳过浏览器写入,direct_runtime.rs 也删除了回合开始前的用户消息写入;当前仅在 rawResponseItem/completed 事件中保存 response item,该事件通常不包含本轮 user message。重启或新建 thread 后历史缺少用户提问,上下文会断裂。请在 turn/start 前显式追加 user item,并按 turn ID 做幂等。 2. P1 新 thread 恢复时通过 thread/inject_items 全量注入 project.jsonl,没有 token/字节上限或裁剪策略。长期对话可能超过 app-server/model 上下文限制,导致恢复或新回合失败。请增加按模型预算保留最新连续历史的策略,或先使用受支持的 compact 机制。 另外,PR 混入 UI 编辑器和文档改动,建议拆分以降低回归范围。
Author
Member
  1. codex app-server 会把用户消息发送回来
  2. 我想倚靠codex 自动的compact机制, AGC这边不做处理

很遗憾没法直接获取压缩后的内容

要「取回压缩后的 summary 文本 / 替换历史」→ 没有任何公开 API。summary 只存在于 rollout 文件的 compacted 行里,app-server 的读取接口不暴露它。
1. codex app-server 会把用户消息发送回来 2. 我想倚靠codex 自动的compact机制, AGC这边不做处理 很遗憾没法直接获取压缩后的内容 ``` 要「取回压缩后的 summary 文本 / 替换历史」→ 没有任何公开 API。summary 只存在于 rollout 文件的 compacted 行里,app-server 的读取接口不暴露它。 ```
k88936 added 1 commit 2026-09-05 19:31:51 +08:00
修复 DirectProject 对话权限与原生命令门禁
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Successful in 2m46s
Project CI / Native shell tests (pull_request) Successful in 18m19s
d1f080478e
补充 DirectProject 原生对话读写命令的 native-only 白名单

复用项目级 DirectProject 写权限检查,避免连续回合重复读取策略

更新 AppSurface 测试以覆盖 Rust 负责历史持久化的直连语义
k88936 added 1 commit 2026-09-05 19:45:20 +08:00
Merge branch 'master' into feat/agc-codex-native-tool-call-info
Project CI / Repository checks (pull_request) Successful in 3m4s
Project CI / Frontend tests (pull_request) Successful in 4m11s
Project CI / Backend tests (pull_request) Successful in 7m18s
Project CI / Native shell tests (pull_request) Successful in 21m23s
86d74033c0
kdletters approved these changes 2026-09-05 19:51:21 +08:00
Dismissed
kdletters left a comment
Member

审查 head sha: 86d74033c0

已基于 base 524e2f0f4f 逐文件检查本次变更,并运行 cargo check 及相关 Rust 单元测试(codex_app_server 46 passed,direct_runtime 持久化测试 passed)。结合本次提交的原始 response item 持久化、用户消息由 app-server 回传、以及 Codex app-server 自动 compact 设计,未发现达到明确成立标准的问题。

结论:未发现明确问题。

审查 head sha: 86d74033c0fe39fa72bdb54b4b8b22421a5b3411 已基于 base 524e2f0f4fec78fc3b0e6051a431e4713dc23e39 逐文件检查本次变更,并运行 cargo check 及相关 Rust 单元测试(codex_app_server 46 passed,direct_runtime 持久化测试 passed)。结合本次提交的原始 response item 持久化、用户消息由 app-server 回传、以及 Codex app-server 自动 compact 设计,未发现达到明确成立标准的问题。 结论:未发现明确问题。
kdletters approved these changes 2026-09-05 19:52:50 +08:00
Dismissed
kdletters left a comment
Member

审查 head sha: 86d74033c0
结论:未发现明确问题。

审查 head sha: 86d74033c0fe39fa72bdb54b4b8b22421a5b3411 结论:未发现明确问题。
k88936 requested review from kdletters 2026-09-05 19:52:54 +08:00
kdletters requested changes 2026-09-06 16:34:45 +08:00
Dismissed
kdletters left a comment
Member

请求修改:当前 head 仍有 3 个 P1 持久化问题,分别会导致内部上下文污染项目历史、同一 clientTurnId 重试重复执行,以及损坏尾行阻塞后续写入。请修复行内评论并补对应回归测试。

请求修改:当前 head 仍有 3 个 P1 持久化问题,分别会导致内部上下文污染项目历史、同一 clientTurnId 重试重复执行,以及损坏尾行阻塞后续写入。请修复行内评论并补对应回归测试。
@@ -2115,3 +2122,3 @@
request: LlmRunRequest,
direct_history_root: Option<&std::path::Path>,
direct_client_turn_id: Option<&str>,
_direct_client_turn_id: Option<&str>,
Member

P1:clientTurnId 在生产路径已被改成未使用参数,且后续 turn/start 没有传 clientUserMessageId;生产调用也没有在发起 turn 前幂等追加 user item。连接/响应在 Codex 已接受请求后丢失时,使用同一个 clientTurnId 重试会再次执行 turn、重复修改项目并可能重复计费。请恢复 turn 级幂等(发起前持久化并复用 user item,或使用等价的服务端去重),并补断线后重试测试。

P1:`clientTurnId` 在生产路径已被改成未使用参数,且后续 `turn/start` 没有传 `clientUserMessageId`;生产调用也没有在发起 turn 前幂等追加 user item。连接/响应在 Codex 已接受请求后丢失时,使用同一个 clientTurnId 重试会再次执行 turn、重复修改项目并可能重复计费。请恢复 turn 级幂等(发起前持久化并复用 user item,或使用等价的服务端去重),并补断线后重试测试。
k88936 marked this conversation as resolved
@@ -0,0 +124,4 @@
.get("payload")
.cloned()
.ok_or_else(|| format!("DirectProject 历史记录缺少 payload{}", path.display()))?;
if is_direct_project_internal_context_item(&item) {
Member

P1:这里仍会把 Codex 0.147.0 产生的内部 contextual user item 当成项目用户消息。该版本的上下文构造使用 role: user,且 internal_chat_message_metadata_passthrough 为空;它不会命中前面的 role 或 content_item_kinds 过滤,随后会被追加、展示并在新 thread 中注入,污染对话历史。请按真实来源/元数据区分上下文 user item 与用户 turn,并补一个 0.147.0 形状的回归测试。

P1:这里仍会把 Codex 0.147.0 产生的内部 contextual user item 当成项目用户消息。该版本的上下文构造使用 `role: user`,且 `internal_chat_message_metadata_passthrough` 为空;它不会命中前面的 role 或 `content_item_kinds` 过滤,随后会被追加、展示并在新 thread 中注入,污染对话历史。请按真实来源/元数据区分上下文 user item 与用户 turn,并补一个 0.147.0 形状的回归测试。
k88936 marked this conversation as resolved
@@ -0,0 +146,4 @@
let _append_guard = lock.lock("DirectProject 历史追加写")?;
if history_exists {
if let Some(item_id) = item.get("id").and_then(Value::as_str) {
if let Some(existing) = find_direct_project_history_item_by_id_at(&path, item_id)? {
Member

P1:这里在调用 append_jsonl_line_unlocked 之前先扫描已有记录;如果文件末尾是无换行的半截 JSON 或损坏行,direct_project_history_item_from_line 会直接返回解析错误,后续 append 根本不会执行到底层已有的尾行修复逻辑。因此一次中断写入会永久阻塞之后所有带 id 的 raw item。请先执行尾行修复,或让重复检查明确跳过最后一条不完整尾行,并补测试。

P1:这里在调用 `append_jsonl_line_unlocked` 之前先扫描已有记录;如果文件末尾是无换行的半截 JSON 或损坏行,`direct_project_history_item_from_line` 会直接返回解析错误,后续 append 根本不会执行到底层已有的尾行修复逻辑。因此一次中断写入会永久阻塞之后所有带 id 的 raw item。请先执行尾行修复,或让重复检查明确跳过最后一条不完整尾行,并补测试。
k88936 marked this conversation as resolved
kdletters requested changes 2026-09-06 19:39:19 +08:00
Dismissed
kdletters left a comment
Member

审查结论:request changes。阻塞问题:apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server.rs:2138-2151 在 thread_for 创建并放入连接池后才读取/注入 DirectProject 历史;read_direct_project_history_items_at 或 thread/inject_items 失败时直接返回。CodexThreadLease 的 Drop 只递减 active_uses,不移除这个未完成初始化的 thread,下一次请求会以 thread_created=false 复用它并跳过历史注入,导致损坏/注入失败后的项目对话永久丢失(注入部分成功时还可能重复/错乱)。失败时应淘汰该 thread/连接并让重试重新创建并注入,补失败后重试回归测试。当前 PR 还与 master 存在冲突,请先 rebase/resolve。

审查结论:request changes。阻塞问题:apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server.rs:2138-2151 在 thread_for 创建并放入连接池后才读取/注入 DirectProject 历史;read_direct_project_history_items_at 或 thread/inject_items 失败时直接返回。CodexThreadLease 的 Drop 只递减 active_uses,不移除这个未完成初始化的 thread,下一次请求会以 thread_created=false 复用它并跳过历史注入,导致损坏/注入失败后的项目对话永久丢失(注入部分成功时还可能重复/错乱)。失败时应淘汰该 thread/连接并让重试重新创建并注入,补失败后重试回归测试。当前 PR 还与 master 存在冲突,请先 rebase/resolve。
k88936 added 8 commits 2026-09-07 16:05:09 +08:00
识别 Codex 环境与上下文标签形式的 user item

补充无 passthrough 元数据的回归测试
尾行损坏时先允许底层 JSONL 追加逻辑修复

历史注入失败时淘汰未完成初始化的 Codex thread

turn/start 传递稳定 clientUserMessageId
记录上下文用户消息过滤与坏线程淘汰规则

明确 clientUserMessageId 不提供回合级 exactly-once
覆盖幂等扫描遇到未完成 JSONL 尾行的追加路径
向 turn/start 发送稳定 clientUserMessageId

补充项目模式协议参数回归断言
覆盖 Codex 内部与外部上下文包裹格式

保持普通用户文本的完整标签引用可见
规定 AGC 在 turn/start 前幂等预写规范化 user item

规定 Codex user echo 只做观察与关联,不再追加历史

记录本地 user 写入入口与 Codex echo 过滤入口必须分离
实现 DirectProject 用户消息预写与回显过滤
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
928fc6ffbc
在 turn/start 前幂等写入 AGC 规范化 user item

过滤 Codex userMessage 与 raw role=user 回显,保留 assistant/tool/partial 落盘

补充用户消息来源隔离回归测试
Author
Member

更新: 改用AGC显式写入user msg, 对codex 返回的user msg忽略

更新: 改用AGC显式写入user msg, 对codex 返回的user msg忽略
k88936 added 1 commit 2026-09-07 17:24:42 +08:00
合并模型目录与DirectProject运行时变更
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
dee508c9c1
合并 AGC 模型目录、LLM 计费与平台会话链路。

保留 DirectProject 原始事件历史持久化、用户消息预写和增量 itemId 语义。

保留安全活动状态、中间进度文本和受控工具边界。
k88936 added 1 commit 2026-09-07 17:26:51 +08:00
Merge branch 'master' into feat/agc-codex-native-tool-call-info
Project CI / Repository checks (pull_request) Failing after 1m56s
Project CI / Frontend tests (pull_request) Failing after 1m40s
Project CI / Native shell tests (pull_request) Failing after 5m5s
Project CI / Backend tests (pull_request) Successful in 7m4s
bfd6bb76cb
k88936 requested review from kdletters 2026-09-07 17:27:20 +08:00
kdletters requested changes 2026-09-07 18:06:09 +08:00
Dismissed
kdletters left a comment
Member

This was generated by AI during triage.

请求修改(当前 head bfd6bb76cb0c2b4e4ed4f29f456fb829fd2fd920)。

DirectProject 新线程恢复时仍由 read_direct_project_history_items_at 读取完整 project.jsonl,再把全部 items 传给 thread/inject_items,没有按模型上下文预算裁剪或 compact 边界。对话增长后,恢复请求可能超过 app-server 或模型上下文限制,直接失败并再次触发上下文丢失;当前 CI 也仍在排队。

请增加按模型预算保留最新连续历史的策略,或使用受支持的 compact 机制,并补长历史恢复回归测试。失败清理和尾行修复已有覆盖,但不能替代注入总量上限。

> *This was generated by AI during triage.* 请求修改(当前 head bfd6bb76cb0c2b4e4ed4f29f456fb829fd2fd920)。 DirectProject 新线程恢复时仍由 read_direct_project_history_items_at 读取完整 project.jsonl,再把全部 items 传给 thread/inject_items,没有按模型上下文预算裁剪或 compact 边界。对话增长后,恢复请求可能超过 app-server 或模型上下文限制,直接失败并再次触发上下文丢失;当前 CI 也仍在排队。 请增加按模型预算保留最新连续历史的策略,或使用受支持的 compact 机制,并补长历史恢复回归测试。失败清理和尾行修复已有覆盖,但不能替代注入总量上限。
@@ -2575,1 +2606,3 @@
message.content = history_prompt;
if self.inner.workspace_mode == CodexAppServerWorkspaceMode::DirectProject {
if thread_created {
let items = match read_direct_project_history_items_at(history_root) {
Member

This was generated by AI during triage.

这里直接读取完整历史并在下一段把全部 items 注入新 thread;随着 project.jsonl 增长,恢复会越过模型/app-server 上下文上限。请在 read 或 inject 前按 token/字节预算裁剪为最新连续历史,或先调用受支持的 compact,并测试超预算项目仍可恢复。

> *This was generated by AI during triage.* 这里直接读取完整历史并在下一段把全部 items 注入新 thread;随着 project.jsonl 增长,恢复会越过模型/app-server 上下文上限。请在 read 或 inject 前按 token/字节预算裁剪为最新连续历史,或先调用受支持的 compact,并测试超预算项目仍可恢复。
Author
Member

compact is triggered automatically by codex

compact is triggered automatically by codex
k88936 marked this conversation as resolved
k88936 added 1 commit 2026-09-08 10:38:52 +08:00
修正直连鉴权失败对话测试文案
Project CI / Backend tests (pull_request) Successful in 8m0s
Project CI / Repository checks (pull_request) Successful in 2m34s
Project CI / Frontend tests (pull_request) Successful in 3m9s
Project CI / Native shell tests (pull_request) Successful in 21m3s
4508b6aaca
让 DirectProject 持久化鉴权失败消息与当前用户可见文案一致。
k88936 requested review from kdletters 2026-09-08 12:00:04 +08:00
kdletters requested changes 2026-09-08 15:00:16 +08:00
kdletters left a comment
Member

发现 3 项需修复问题:

  1. direct_project_history.rs 截断末行在查重阶段直接报错,完整历史+截断尾行会阻断后续追加。
  2. codex_app_server.rs 新线程注入全量历史后,turn/start 再发送同一当前用户消息,导致重复注入。
  3. App.tsx 权限检查 await 期间未锁定提交,连续提交会覆盖 active turn 并错误清除第一回合状态。
    请修复并补充覆盖测试。
发现 3 项需修复问题: 1. direct_project_history.rs 截断末行在查重阶段直接报错,完整历史+截断尾行会阻断后续追加。 2. codex_app_server.rs 新线程注入全量历史后,turn/start 再发送同一当前用户消息,导致重复注入。 3. App.tsx 权限检查 await 期间未锁定提交,连续提交会覆盖 active turn 并错误清除第一回合状态。 请修复并补充覆盖测试。
kdletters reviewed 2026-09-08 15:07:00 +08:00
@@ -2575,1 +2606,3 @@
message.content = history_prompt;
if self.inner.workspace_mode == CodexAppServerWorkspaceMode::DirectProject {
if thread_created {
let items = match read_direct_project_history_items_at(history_root) {
Member

[P1] This history includes the current user item already appended above, while turn/start sends the same input again. Exclude the current item from injection.

[P1] This history includes the current user item already appended above, while turn/start sends the same input again. Exclude the current item from injection.
@@ -0,0 +126,4 @@
let mut line_end = combined.len();
while let Some(newline) = combined[..line_end].iter().rposition(|byte| *byte == b'\n') {
let line = &combined[newline + 1..line_end];
if !line.is_empty() {
Member

[P1] Repairable unterminated final JSONL records must be ignored during reverse id scan; with a prior complete line this currently returns EOF before append repair.

[P1] Repairable unterminated final JSONL records must be ignored during reverse id scan; with a prior complete line this currently returns EOF before append repair.
@@ -5462,0 +5432,4 @@
projectConversationWriteConfirmedRef.current !== directProjectPath
) {
try {
const policyPaused = await queueProjectPolicyConfirmationIfNeeded(
Member

[P2] Claim busy/active-turn ownership before this await; a second submit during policy I/O can clear the first turn state in its finally block.

[P2] Claim busy/active-turn ownership before this await; a second submit during policy I/O can clear the first turn state in its finally block.
kdletters added 1 commit 2026-09-08 22:04:21 +08:00
Merge branch 'master' into feat/agc-codex-native-tool-call-info
Project CI / Repository checks (pull_request) Successful in 17m27s
Project CI / Backend tests (pull_request) Failing after 16m3s
Project CI / Frontend tests (pull_request) Successful in 16m13s
Project CI / Native shell tests (pull_request) Failing after 15m31s
e5fb787e94
kdletters merged commit d3f5d0a355 into master 2026-09-08 22:04:38 +08:00
kdletters deleted branch feat/agc-codex-native-tool-call-info 2026-09-08 22:04:38 +08:00
Sign in to join this conversation.