From 4a68660476bd31a2c9e880b3de156f75803f8e0c Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sat, 20 Jun 2026 11:47:35 -0700 Subject: [PATCH] build world state in session --- codex-rs/core/src/context_manager/updates.rs | 29 +++++++------------- codex-rs/core/src/session/mod.rs | 3 ++ codex-rs/core/src/session/world_state.rs | 20 ++++++++++++++ 3 files changed, 33 insertions(+), 19 deletions(-) create mode 100644 codex-rs/core/src/session/world_state.rs diff --git a/codex-rs/core/src/context_manager/updates.rs b/codex-rs/core/src/context_manager/updates.rs index 5b719fb14f..f90c1f346f 100644 --- a/codex-rs/core/src/context_manager/updates.rs +++ b/codex-rs/core/src/context_manager/updates.rs @@ -1,6 +1,5 @@ use crate::context::CollaborationModeInstructions; use crate::context::ContextualUserFragment; -use crate::context::EnvironmentsState; use crate::context::ModelSwitchInstructions; use crate::context::MultiAgentModeInstructions; use crate::context::PermissionsInstructions; @@ -9,6 +8,8 @@ use crate::context::RealtimeEndInstructions; use crate::context::RealtimeStartInstructions; use crate::context::RealtimeStartWithInstructions; use crate::session::PreviousTurnSettings; +use crate::session::build_world_state_from_turn_context; +use crate::session::build_world_state_from_turn_context_item; use crate::session::turn_context::TurnContext; use codex_execpolicy::Policy; use codex_features::Feature; @@ -19,19 +20,6 @@ use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelInfo; use codex_protocol::protocol::TurnContextItem; -fn build_environment_update_item( - previous: Option<&TurnContextItem>, - next: &TurnContext, -) -> Option { - if !next.config.include_environment_context { - return None; - } - - let prev = previous?; - let previous = EnvironmentsState::from_turn_context_item(prev); - EnvironmentsState::from_turn_context(next).render_diff(&previous) -} - fn build_permissions_update_item( previous: Option<&TurnContextItem>, next: &TurnContext, @@ -240,7 +228,12 @@ pub(crate) fn build_settings_update_items( // model-visible item emitted by build_initial_context. Persist the remaining // inputs or add explicit replay events so fork/resume can diff everything // deterministically. - let contextual_user_message = build_environment_update_item(previous, next); + let world_state_updates = previous + .map(|previous| { + let previous = build_world_state_from_turn_context_item(previous); + build_world_state_from_turn_context(next).render_diff(&previous) + }) + .unwrap_or_default(); let developer_update_sections = [ // Keep model-switch instructions first so model-specific guidance is read before // any other context diffs on this turn. @@ -255,12 +248,10 @@ pub(crate) fn build_settings_update_items( .flatten() .collect(); - let mut items = Vec::with_capacity(2); + let mut items = Vec::with_capacity(1 + world_state_updates.len()); if let Some(developer_message) = build_developer_update_item(developer_update_sections) { items.push(developer_message); } - if let Some(contextual_user_message) = contextual_user_message { - items.push(contextual_user_message); - } + items.extend(world_state_updates); items } diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index aab6d30512..119c27778a 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -222,6 +222,7 @@ pub(crate) mod time_reminder; mod token_budget; pub(crate) mod turn; pub(crate) mod turn_context; +mod world_state; use self::config_lock::export_config_lock_if_configured; use self::config_lock::validate_config_lock_if_configured; #[cfg(test)] @@ -242,6 +243,8 @@ use self::turn::collect_explicit_app_ids_from_skill_items; use self::turn::realtime_text_for_event; use self::turn_context::TurnContext; use self::turn_context::TurnSkillsContext; +pub(crate) use self::world_state::build_world_state_from_turn_context; +pub(crate) use self::world_state::build_world_state_from_turn_context_item; #[cfg(test)] mod rollout_reconstruction_tests; diff --git a/codex-rs/core/src/session/world_state.rs b/codex-rs/core/src/session/world_state.rs new file mode 100644 index 0000000000..4dfb9d0aca --- /dev/null +++ b/codex-rs/core/src/session/world_state.rs @@ -0,0 +1,20 @@ +use super::turn_context::TurnContext; +use crate::context::EnvironmentsState; +use crate::context::world_state::WorldState; +use codex_protocol::protocol::TurnContextItem; + +pub(crate) fn build_world_state_from_turn_context(turn_context: &TurnContext) -> WorldState { + let mut world_state = WorldState::default(); + if turn_context.config.include_environment_context { + world_state.add_section(EnvironmentsState::from_turn_context(turn_context)); + } + world_state +} + +pub(crate) fn build_world_state_from_turn_context_item( + turn_context_item: &TurnContextItem, +) -> WorldState { + let mut world_state = WorldState::default(); + world_state.add_section(EnvironmentsState::from_turn_context_item(turn_context_item)); + world_state +}