Source Bundle

codex 证据页

来自 docs/codex 的原始分析文档与行号。

证据页
怎么用这页
  • 左上角是文档名,下面是带行号的原始内容。
  • 学习页里的源码锚点会跳到这里的具体行号。
Docs

原始文档与行号

这些内容直接来自当前仓库的 docs/。

codex.md
`codex`
1
# `codex`
2
3
## 仓库定位
4
5
`codex` 里的 `context / memory` 相关实现主要分成三层:`core` 负责每个 turn 的可见上下文组装,`state` 负责 thread / memory 的 SQLite 持久状态,`core/memories` 负责 stage1 / phase2 memory 启动管线与文件系统同步。
6
7
## 源码架构树
8
9
```text
10
codex
11
├─ codex-rs/core/src/codex.rs
12
│ ├─ build_initial_context()
13
│ ├─ record_context_updates_and_set_reference_context_item()
14
│ └─ run_turn()
15
├─ codex-rs/core/src/context_manager/
16
│ ├─ history.rs
17
│ ├─ normalize.rs
18
│ └─ updates.rs
19
├─ codex-rs/core/src/memories/
20
│ ├─ start.rs
21
│ ├─ phase1.rs
22
│ ├─ phase2.rs
23
│ ├─ storage.rs
24
│ └─ prompts.rs
25
├─ codex-rs/state/src/runtime/
26
│ ├─ threads.rs
27
│ └─ memories.rs
28
└─ codex-rs/core/src/message_history.rs
29
```
30
31
## 关键结论摘要
32
33
- `ContextManager` 保存的不是原始聊天记录,而是一个会规范化、截断、回滚修剪的 turn 历史容器。
34
- turn 级 context 是“首次全量注入,之后按基线做增量更新”,基线由 `reference_context_item` 决定。
35
- `memory` 不是单一长期库,而是 startup 时跑起来的 phase1 / phase2 管线:先抽取 stage1 输出,再做全局 consolidation,并同步到 `codex_home/memories/`。
36
- `state` 与 `history` 是分层的:SQLite 负责 thread / job / stage1 outputs 等结构化状态,`history.jsonl` 则是全局 append-only 消息历史。
37
38
## 专题文档
39
40
- [01-架构与范围](./codex/01-%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%8C%83%E5%9B%B4.md)
41
- [02-context管理](./codex/02-context%E7%AE%A1%E7%90%86.md)
42
- [03-memory实现](./codex/03-memory%E5%AE%9E%E7%8E%B0.md)
43
- [04-存储与状态](./codex/04-%E5%AD%98%E5%82%A8%E4%B8%8E%E7%8A%B6%E6%80%81.md)
44
- [05-调用链、压缩与边界](./codex/05-%E8%B0%83%E7%94%A8%E9%93%BE%E3%80%81%E5%8E%8B%E7%BC%A9%E4%B8%8E%E8%BE%B9%E7%95%8C.md)
45
46
## 关键源码索引
47
48
- `codex-rs/core/src/codex.rs:1654-2091`
49
- `codex-rs/core/src/codex.rs:3744-3991`
50
- `codex-rs/core/src/codex.rs:6146-6795`
51
- `codex-rs/core/src/context_manager/history.rs:34-452`
52
- `codex-rs/core/src/context_manager/updates.rs:14-224`
53
- `codex-rs/core/src/memories/mod.rs:3-120`
54
- `codex-rs/core/src/memories/phase1.rs:81-211`
55
- `codex-rs/core/src/memories/phase2.rs:41-160`
56
- `codex-rs/state/src/runtime.rs:91-216`
57
- `codex-rs/state/src/runtime/memories.rs:32-544`
58
59
## 阅读提示
60
61
先读 `02-context管理`,再读 `03-memory实现`。`codex` 最容易混淆的不是“有没有 memory”,而是 turn context、thread history、memory pipeline 和 SQLite state 其实是四个不同层次。
62
codex/01-架构与范围.md
`codex`:架构与范围
1
# `codex`:架构与范围
2
3
## 1. 三层主干
4
5
`codex` 的相关实现可以按三层理解:
6
7
- `core`:组装 turn 级可见 context,驱动采样、compact、memory startup。
8
- `state`:把 thread、memory jobs、stage1 outputs、spawn edges 等元数据落到 SQLite。
9
- `core/memories`:定义 phase1 / phase2 memory 管线,并把结果同步到文件系统 memory root。
10
11
### 源码锚点
12
13
- `codex-rs/core/src/codex.rs:3744-3991`
14
- `codex-rs/state/src/runtime.rs:91-216`
15
- `codex-rs/core/src/memories/mod.rs:3-120`
16
17
## 2. 范围边界
18
19
本组文档重点覆盖:
20
21
- `codex-rs/core`
22
- `codex-rs/state`
23
- `codex-rs/cli`
24
25
`sdk` 只有在改变 thread/context 语义时才会顺带说明,不把外围示例、项目说明、营销文档当成实现依据。
26
27
### 源码锚点
28
29
- `codex-rs/cli/src/main.rs:1252-1294`
30
- `codex-rs/cli/tests/debug_clear_memories.rs:1-135`
31
32
## 3. 关键边界
33
34
- `ContextManager` 不是“历史文件”,而是 turn 级历史容器。
35
- `history.jsonl` 不是 SQLite state。
36
- `memories/` 目录不是唯一真相,SQLite `stage1_outputs` 与 `jobs` 也保存 memory 生命周期。
37
- `memory tool` 的读路径只看 `memory_summary.md`,不会直接扫整个 `memories/` 目录。
38
39
### 源码锚点
40
41
- `codex-rs/core/src/context_manager/history.rs:34-120`
42
- `codex-rs/core/src/message_history.rs:48-100`
43
- `codex-rs/state/src/runtime/memories.rs:32-544`
44
- `codex-rs/core/src/memories/prompts.rs:233-249`
45
codex/02-context管理.md
`codex`:context 管理
1
# `codex`:context 管理
2
3
## 1. `ContextManager` 是 turn 历史容器
4
5
`ContextManager` 保存 `ResponseItem` 历史、`reference_context_item` 基线和 token 信息。写入时只接受 API message 类 item,过滤掉非 API message 与 `GhostSnapshot`;用于 prompt 时再统一做 normalize,保证 tool call / output 成对,删除 orphan output,并在不支持图片的模型上剥离 image 内容。
6
7
### 源码锚点
8
9
- `codex-rs/core/src/context_manager/history.rs:34-120`
10
- `codex-rs/core/src/context_manager/history.rs:360-452`
11
- `codex-rs/core/src/context_manager/normalize.rs:14-197`
12
13
## 2. 全量与增量 context 的分界
14
15
turn 级 context 的关键分界是 `reference_context_item`:
16
17
- 没有基线时,`record_context_updates_and_set_reference_context_item()` 走 `build_initial_context()`,做全量注入。
18
- 有基线时,只走 `build_settings_update_items()`,发送环境、权限、协作模式、personality、model 指令等差异项。
19
20
### 源码锚点
21
22
- `codex-rs/core/src/codex.rs:3961-3991`
23
- `codex-rs/core/src/codex.rs:3744-3917`
24
- `codex-rs/core/src/context_manager/updates.rs:196-224`
25
26
## 3. `build_initial_context()` 注入什么
27
28
源码里明确列出了全量上下文的组成:
29
30
- 模型切换说明
31
- 权限说明
32
- session 级 developer instructions
33
- memory tool developer prompt
34
- collaboration mode
35
- realtime 说明
36
- personality
37
- apps / skills / plugins
38
- git commit trailer
39
- user instructions
40
- environment context
41
42
这套注入结构说明 `codex` 的 context 是可枚举的 runtime 产物,不是单个静态 system prompt。
43
44
### 源码锚点
45
46
- `codex-rs/core/src/codex.rs:3744-3917`
47
- `codex-rs/core/src/context_manager/updates.rs:14-224`
48
49
## 4. compact 与 window generation
50
51
历史被 compact 或 rollback 后,`ContextManager` 会被重写,必要时连 `reference_context_item` 一起清空。`ModelClient` 还维护 `window_generation`,并把 `conversation_id:window_generation` 作为 `x-codex-window-id` 发给模型侧。
52
53
这意味着 compact 不是单纯删消息,而是重建“上下文窗口的身份”。
54
55
### 源码锚点
56
57
- `codex-rs/core/src/codex.rs:3685-3709`
58
- `codex-rs/core/src/context_manager/history.rs:428-452`
59
- `codex-rs/core/src/client.rs:148-165`
60
- `codex-rs/core/src/client.rs:350-365`
61
62
## 5. realtime 启动上下文是另一条路径
63
64
`realtime_context.rs` 会从当前 thread 历史、最近 threads 和 workspace tree 生成 startup context,并明确排除 memory summaries 与 AGENTS 聚合内容。这条路径与普通 turn context 相关,但不等同。
65
66
### 源码锚点
67
68
- `codex-rs/core/src/realtime_context.rs:25-107`
69
codex/03-memory实现.md
`codex`:memory 实现
1
# `codex`:memory 实现
2
3
## 1. memory 子系统是 phase1 / phase2 管线
4
5
`codex-rs/core/src/memories/mod.rs` 明确把 memory 拆成两阶段:
6
7
- `phase1`:从 rollout 里抽取 raw memory / rollout summary,写入 state DB。
8
- `phase2`:从 state DB 选择输入,做全局 consolidation,并同步到 `codex_home/memories/`。
9
10
### 源码锚点
11
12
- `codex-rs/core/src/memories/mod.rs:3-120`
13
- `codex-rs/core/src/memories/start.rs:14-39`
14
15
## 2. phase1:候选选择与抽取
16
17
phase1 的顺序是源码写死的:claim startup jobs -> build request context -> 并行 extraction -> 记录指标。输出 schema 包含 `rollout_summary`、`rollout_slug` 和 `raw_memory`,并会过滤掉某些不应进入 memory 的 contextual user fragment。
18
19
### 源码锚点
20
21
- `codex-rs/core/src/memories/phase1.rs:81-158`
22
- `codex-rs/core/src/memories/phase1.rs:196-211`
23
- `codex-rs/core/src/contextual_user_message.rs:50-58`
24
25
## 3. phase2:全局 consolidation 与文件同步
26
27
phase2 会 claim 全局 consolidation job,读取 `get_phase2_input_selection()` 的结果,更新 `rollout_summaries/` 与 `raw_memories.md`,再启动 `MemoryConsolidation` 子 agent 做 consolidation。
28
29
代码还明确禁止 consolidation 线程再递归回馈 phase1 或继续 delegate。
30
31
### 源码锚点
32
33
- `codex-rs/core/src/memories/phase2.rs:41-160`
34
- `codex-rs/core/src/memories/phase2.rs:287-298`
35
- `codex-rs/core/src/memories/storage.rs:23-42`
36
- `codex-rs/core/src/memories/storage.rs:98-171`
37
38
## 4. memory tool 的读取入口
39
40
`build_memory_tool_developer_instructions()` 只会读取 `codex_home/memories/memory_summary.md`,并截断到固定 token 上限。也就是说,memory tool 的读取入口不是整个 memory 目录,而是摘要文件。
41
42
### 源码锚点
43
44
- `codex-rs/core/src/memories/prompts.rs:233-249`
45
46
## 5. 另一条 memory 输入链:trace -> raw memory
47
48
`memory_trace.rs` 支持把 JSON array 或 JSONL trace 文件转成 `RawMemory` 输入,再调用 `summarize_memories()` 生成 `BuiltMemory`。这是独立于 startup 管线的 memory 输入路径。
49
50
### 源码锚点
51
52
- `codex-rs/core/src/memory_trace.rs:29-79`
53
- `codex-rs/core/src/memory_trace.rs:100-225`
54
- `codex-rs/core/src/client.rs:504-547`
55
codex/04-存储与状态.md
`codex`:存储与状态
1
# `codex`:存储与状态
2
3
## 1. 运行时目录
4
5
运行时状态至少分成三块:
6
7
- `CODEX_SQLITE_HOME` 下的 `state_5.sqlite`
8
- `CODEX_SQLITE_HOME` 下的 `logs_2.sqlite`
9
- `codex_home/history.jsonl`
10
- `codex_home/memories/`
11
12
### 源码锚点
13
14
- `codex-rs/state/src/lib.rs:20-61`
15
- `codex-rs/state/src/runtime.rs:91-216`
16
- `codex-rs/core/src/message_history.rs:48-100`
17
- `codex-rs/core/src/memories/storage.rs:12-42`
18
19
## 2. SQLite state 的重点表
20
21
源码和 migration 表明,和本任务最相关的结构包括:
22
23
- `threads`
24
- `stage1_outputs`
25
- `jobs`
26
- `thread_spawn_edges`
27
28
其中 `threads.memory_mode` 决定某个 thread 是否参与 memory 生成,`stage1_outputs` 保存 rollout 对应的 raw memory / summary,`jobs` 维护 memory stage1 / global consolidation 的租约和 watermark。
29
30
### 源码锚点
31
32
- `codex-rs/state/migrations/0001_threads.sql:1-18`
33
- `codex-rs/state/migrations/0006_memories.sql:1-22`
34
- `codex-rs/state/migrations/0016_memory_usage.sql:1-2`
35
- `codex-rs/state/migrations/0021_thread_spawn_edges.sql:1-8`
36
- `codex-rs/state/src/runtime/memories.rs:32-544`
37
38
## 3. `history.jsonl` 的角色
39
40
`message_history.rs` 维护的是全局 append-only 历史文件,带并发锁和尺寸控制。它和 SQLite state 是分开的:前者更像全局历史审计流,后者更像结构化 runtime 状态。
41
42
### 源码锚点
43
44
- `codex-rs/core/src/message_history.rs:48-100`
45
- `codex-rs/core/src/message_history.rs:169-276`
46
47
## 4. 清理与 fresh start
48
49
`debug clear-memories` 会同时清 state DB 里的 memory 数据并删除 `memories/` 目录。`reset_memory_data_for_fresh_start()` 则更进一步,会把已有 thread 的 `memory_mode='enabled'` 改成 `disabled`,避免旧 rollout 立刻重新进入 memory pipeline。
50
51
### 源码锚点
52
53
- `codex-rs/cli/src/main.rs:1252-1294`
54
- `codex-rs/cli/tests/debug_clear_memories.rs:1-135`
55
- `codex-rs/state/src/runtime/memories.rs:32-74`
56
codex/05-调用链、压缩与边界.md
`codex`:调用链、压缩与边界
1
# `codex`:调用链、压缩与边界
2
3
## 1. turn 级主调用链
4
5
主链路可以概括为:
6
7
`run_turn()` -> `record_context_updates_and_set_reference_context_item()` -> `clone_history().for_prompt()` -> 模型采样。
8
9
其中 `clone_history().for_prompt()` 才是实际送给模型的 prompt 历史。
10
11
### 源码锚点
12
13
- `codex-rs/core/src/codex.rs:6146-6795`
14
- `codex-rs/core/src/codex.rs:3961-3991`
15
- `codex-rs/core/src/context_manager/history.rs:360-452`
16
17
## 2. compact 如何改写历史
18
19
当模型切换导致窗口变化,或历史超窗时,compact 会重建压缩历史,并重新注入 initial context。`replace_compacted_history()` 后,`window_generation` 会推进,后续 turn 会基于新的上下文窗口身份继续。
20
21
### 源码锚点
22
23
- `codex-rs/core/src/compact.rs:45-291`
24
- `codex-rs/core/src/compact_remote.rs:34-203`
25
- `codex-rs/core/src/codex.rs:3685-3709`
26
- `codex-rs/core/src/client.rs:338-365`
27
28
## 3. memory startup 的调用链
29
30
memory startup 的主链路是:
31
32
`start_memories_startup_task()` -> `phase1::run()` -> `phase2::run()` -> 文件系统同步 / consolidation agent。
33
34
它只会在非 ephemeral、启用 MemoryTool、且不是 subagent 的 root session 上启动。
35
36
### 源码锚点
37
38
- `codex-rs/core/src/memories/start.rs:14-39`
39
- `codex-rs/core/src/memories/phase1.rs:81-136`
40
- `codex-rs/core/src/memories/phase2.rs:41-160`
41
42
## 4. 关键边界
43
44
- turn context 不等于 memory pipeline。
45
- SQLite state 不等于 `history.jsonl`。
46
- `memory_summary.md` 是 memory tool 读入口,不等于完整 memory root。
47
- realtime startup context 与普通 turn context 相关,但不是同一条构造路径。
48
49
### 源码锚点
50
51
- `codex-rs/core/src/context_manager/updates.rs:196-224`
52
- `codex-rs/state/src/runtime/memories.rs:370-544`
53
- `codex-rs/core/src/memories/prompts.rs:233-249`
54
- `codex-rs/core/src/realtime_context.rs:25-107`
55