mirror of
https://github.com/openai/codex.git
synced 2026-10-18 17:18:52 +00:00
Track inherited paginated rollout prefixes (#33930)
## What changed - Add `HistoryPosition` to identify a source thread and an exclusive rollout prefix by ordinal and JSONL byte offset. - Add optional `history_base` metadata to `SessionMeta` so a thread can record an inherited prefix of another paginated rollout. - Default missing `history_base` metadata to `None` and omit it when unset to preserve compatibility with existing rollout metadata. ## Testing - Verify that legacy session metadata without `history_base` deserializes with no inherited history position. GitOrigin-RevId: 3b2b07a2dfee793d3b37b0a60529f856f167dbc1
This commit is contained in:
@@ -242,6 +242,7 @@ fn create_fake_rollout_with_source_and_parent_thread_id(
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -333,6 +334,7 @@ pub fn create_fake_rollout_with_text_elements(
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -2588,6 +2588,7 @@ stream_max_retries = 0
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -375,6 +375,7 @@ async fn backfill_scans_existing_rollouts() -> Result<()> {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -3049,6 +3049,16 @@ impl SessionContextWindow {
|
||||
}
|
||||
}
|
||||
|
||||
/// Exclusive position in another thread's paginated rollout history.
|
||||
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS)]
|
||||
pub struct HistoryPosition {
|
||||
pub thread_id: ThreadId,
|
||||
/// First rollout ordinal not included from the prefix file.
|
||||
pub end_ordinal_exclusive: u64,
|
||||
/// Byte offset immediately after the last included JSONL record from the prefix file.
|
||||
pub end_byte_offset: u64,
|
||||
}
|
||||
|
||||
/// SessionMeta contains session-level data that doesn't correspond to a specific turn.
|
||||
///
|
||||
/// NOTE: There used to be an `instructions` field here, which stored user_instructions, but we
|
||||
@@ -3098,6 +3108,9 @@ pub struct SessionMeta {
|
||||
pub memory_mode: Option<String>,
|
||||
#[serde(default)]
|
||||
pub history_mode: ThreadHistoryMode,
|
||||
/// Exclusive prefix of another paginated rollout inherited by this thread.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub history_base: Option<HistoryPosition>,
|
||||
/// First rollout ordinal that belongs to this subagent's own projected history.
|
||||
///
|
||||
/// Earlier rollout records are inherited model context and stay out of child
|
||||
@@ -3134,6 +3147,7 @@ impl Default for SessionMeta {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: ThreadHistoryMode::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -5854,6 +5868,7 @@ mod tests {
|
||||
}))?;
|
||||
|
||||
assert_eq!(session_meta.history_mode, ThreadHistoryMode::Legacy);
|
||||
assert_eq!(session_meta.history_base, None);
|
||||
let serialized = serde_json::to_value(&session_meta)?;
|
||||
assert_eq!(serialized["history_mode"], json!("legacy"));
|
||||
let mut unknown = serialized;
|
||||
|
||||
@@ -606,6 +606,7 @@ fn write_rollout(path: &std::path::Path, thread_id: ThreadId, message: &str) ->
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -53,6 +53,7 @@ async fn extract_metadata_from_rollout_uses_session_meta() {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: ThreadHistoryMode::Paginated,
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -150,6 +151,7 @@ async fn extract_metadata_from_rollout_returns_latest_memory_mode() {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -424,6 +426,7 @@ fn write_rollout_in_sessions_with_cwd(
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -831,6 +831,7 @@ impl RolloutRecorder {
|
||||
selected_capability_roots,
|
||||
memory_mode: (!config.generate_memories()).then_some("disabled".to_string()),
|
||||
history_mode,
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal,
|
||||
multi_agent_version,
|
||||
context_window: initial_window_id.map(SessionContextWindow::new),
|
||||
|
||||
@@ -178,6 +178,7 @@ async fn state_db_init_backfills_before_returning() -> anyhow::Result<()> {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -45,6 +45,7 @@ fn write_rollout_with_metadata(path: &Path, thread_id: ThreadId) -> std::io::Res
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -178,6 +178,7 @@ fn write_rollout_with_user_message(
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -1336,6 +1336,7 @@ async fn test_updated_at_uses_file_mtime() -> Result<()> {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -381,6 +381,7 @@ mod tests {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -629,6 +630,7 @@ mod tests {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: ThreadHistoryMode::Legacy,
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -2183,6 +2183,7 @@ mod tests {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: Some("polluted".to_string()),
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
@@ -2249,6 +2250,7 @@ mod tests {
|
||||
selected_capability_roots: Vec::new(),
|
||||
memory_mode: None,
|
||||
history_mode: Default::default(),
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: None,
|
||||
multi_agent_version: None,
|
||||
context_window: None,
|
||||
|
||||
@@ -443,6 +443,7 @@ impl InMemoryThreadStore {
|
||||
memory_mode: matches!(params.metadata.memory_mode, ThreadMemoryMode::Disabled)
|
||||
.then_some("disabled".to_string()),
|
||||
history_mode: params.history_mode,
|
||||
history_base: None,
|
||||
subagent_history_start_ordinal: params.subagent_history_start_ordinal,
|
||||
multi_agent_version: params.multi_agent_version,
|
||||
context_window: Some(SessionContextWindow::new(params.initial_window_id.clone())),
|
||||
|
||||
Reference in New Issue
Block a user