diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 0255bcf0bb..4d67f63830 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -2142,7 +2142,9 @@ dependencies = [ "codex-app-server-protocol-noop-macros", "codex-experimental-api-macros", "codex-extension-items", + "codex-history", "codex-protocol", + "codex-rollout", "codex-secrets", "codex-shell-command", "codex-utils-absolute-path", @@ -2387,6 +2389,7 @@ dependencies = [ "codex-features", "codex-git-attribution", "codex-git-utils", + "codex-history", "codex-home", "codex-http-client", "codex-install-context", @@ -2745,6 +2748,7 @@ dependencies = [ "codex-feedback", "codex-file-system", "codex-git-utils", + "codex-history", "codex-home", "codex-hooks", "codex-http-client", @@ -2852,6 +2856,7 @@ dependencies = [ "codex-exec-server", "codex-extension-api", "codex-features", + "codex-history", "codex-home", "codex-image-generation-extension", "codex-login", @@ -2939,6 +2944,7 @@ dependencies = [ "codex-core", "codex-feedback", "codex-git-utils", + "codex-history", "codex-login", "codex-model-provider-info", "codex-otel", @@ -3251,6 +3257,7 @@ dependencies = [ "codex-extension-api", "codex-otel", "codex-protocol", + "codex-rollout", "codex-state", "codex-tools", "codex-utils-absolute-path", @@ -3272,6 +3279,18 @@ dependencies = [ "codex-protocol", ] +[[package]] +name = "codex-history" +version = "0.0.0" +dependencies = [ + "anyhow", + "codex-protocol", + "pretty_assertions", + "schemars 0.8.22", + "serde", + "serde_json", +] + [[package]] name = "codex-home" version = "0.0.0" @@ -3977,6 +3996,7 @@ dependencies = [ "codex-extension-items", "codex-file-search", "codex-git-utils", + "codex-history", "codex-otel", "codex-protocol", "codex-state", @@ -4155,6 +4175,7 @@ dependencies = [ "anyhow", "chrono", "codex-git-utils", + "codex-history", "codex-protocol", "codex-utils-absolute-path", "libsqlite3-sys", @@ -4290,6 +4311,7 @@ dependencies = [ "codex-feedback", "codex-file-search", "codex-git-utils", + "codex-history", "codex-http-client", "codex-install-context", "codex-login", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index e776322fa1..f2b7192e77 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -43,6 +43,7 @@ members = [ "core-plugins", "diagnostics", "hooks", + "history", "http-client", "secrets", "exec", @@ -206,6 +207,7 @@ codex-file-search = { path = "file-search" } codex-file-watcher = { path = "file-watcher" } codex-git-utils = { path = "git-utils" } codex-hooks = { path = "hooks" } +codex-history = { path = "history" } codex-keyring-store = { path = "keyring-store" } codex-linux-sandbox = { path = "linux-sandbox" } codex-lmstudio = { path = "lmstudio" } diff --git a/codex-rs/app-server-protocol/Cargo.toml b/codex-rs/app-server-protocol/Cargo.toml index e33d4ed660..781aafa8d8 100644 --- a/codex-rs/app-server-protocol/Cargo.toml +++ b/codex-rs/app-server-protocol/Cargo.toml @@ -17,7 +17,9 @@ anyhow = { workspace = true } codex-experimental-api-macros = { workspace = true } codex-app-server-protocol-noop-macros = { workspace = true } codex-extension-items = { workspace = true } +codex-history = { workspace = true } codex-protocol = { workspace = true } +codex-rollout = { workspace = true } codex-secrets = { workspace = true } codex-shell-command = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst index e664e871fd..63d5c3269d 100644 Binary files a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst and b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst differ diff --git a/codex-rs/app-server-protocol/src/export.rs b/codex-rs/app-server-protocol/src/export.rs index ebd45a47c8..0889eb82b1 100644 --- a/codex-rs/app-server-protocol/src/export.rs +++ b/codex-rs/app-server-protocol/src/export.rs @@ -23,7 +23,7 @@ use crate::protocol::common::EXPERIMENTAL_SERVER_METHODS; use anyhow::Context; use anyhow::Result; use anyhow::anyhow; -use codex_protocol::protocol::RolloutLine; +use codex_history::RolloutLine; use schemars::schema_for; use serde::Serialize; use serde_json::Map; diff --git a/codex-rs/app-server-protocol/src/protocol/thread_history.rs b/codex-rs/app-server-protocol/src/protocol/thread_history.rs index 2e8b087f52..839427d6bf 100644 --- a/codex-rs/app-server-protocol/src/protocol/thread_history.rs +++ b/codex-rs/app-server-protocol/src/protocol/thread_history.rs @@ -33,7 +33,6 @@ use codex_protocol::protocol::AgentReasoningEvent; use codex_protocol::protocol::AgentReasoningRawContentEvent; use codex_protocol::protocol::AgentStatus; use codex_protocol::protocol::ApplyPatchApprovalRequestEvent; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ContextCompactedEvent; use codex_protocol::protocol::DynamicToolCallResponseEvent; use codex_protocol::protocol::ErrorEvent; @@ -50,7 +49,6 @@ use codex_protocol::protocol::McpToolCallBeginEvent; use codex_protocol::protocol::McpToolCallEndEvent; use codex_protocol::protocol::PatchApplyBeginEvent; use codex_protocol::protocol::PatchApplyEndEvent; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadRolledBackEvent; use codex_protocol::protocol::TurnAbortedEvent; use codex_protocol::protocol::TurnCompleteEvent; @@ -61,6 +59,8 @@ use codex_protocol::protocol::WebSearchBeginEvent; use codex_protocol::protocol::WebSearchEndEvent; #[cfg(test)] use codex_protocol::review_format::REVIEW_FALLBACK_MESSAGE; +use codex_rollout::CompactedItem; +use codex_rollout::RolloutItem; use std::collections::HashMap; use tracing::warn; use uuid::Uuid; @@ -1648,7 +1648,6 @@ mod tests { use codex_protocol::protocol::AgentReasoningRawContentEvent; use codex_protocol::protocol::ApplyPatchApprovalRequestEvent; use codex_protocol::protocol::CodexErrorInfo; - use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::DynamicToolCallResponseEvent; use codex_protocol::protocol::EnteredReviewModeEvent; use codex_protocol::protocol::ExecCommandBeginEvent; @@ -1668,6 +1667,7 @@ mod tests { use codex_protocol::protocol::UserMessageEvent; use codex_protocol::protocol::WebSearchBeginEvent; use codex_protocol::protocol::WebSearchEndEvent; + use codex_rollout::CompactedItem; use codex_utils_absolute_path::test_support::PathBufExt; use codex_utils_absolute_path::test_support::test_path_buf; use pretty_assertions::assert_eq; diff --git a/codex-rs/app-server-protocol/src/protocol/thread_history_projection.rs b/codex-rs/app-server-protocol/src/protocol/thread_history_projection.rs index 8b0e30a90d..27b1033cc0 100644 --- a/codex-rs/app-server-protocol/src/protocol/thread_history_projection.rs +++ b/codex-rs/app-server-protocol/src/protocol/thread_history_projection.rs @@ -4,8 +4,8 @@ //! `ItemCompleted(TurnItem)` records, not legacy event-only rollouts. use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use crate::protocol::thread_history::ThreadHistoryChangeSet; use crate::protocol::thread_history::ThreadHistoryItemChange; diff --git a/codex-rs/app-server-protocol/src/protocol/thread_history_projection_tests.rs b/codex-rs/app-server-protocol/src/protocol/thread_history_projection_tests.rs index 44ea7a1386..7dcbb26c01 100644 --- a/codex-rs/app-server-protocol/src/protocol/thread_history_projection_tests.rs +++ b/codex-rs/app-server-protocol/src/protocol/thread_history_projection_tests.rs @@ -3,17 +3,17 @@ use codex_protocol::items::AgentMessageContent; use codex_protocol::items::AgentMessageItem; use codex_protocol::items::TurnItem; use codex_protocol::items::UserMessageItem; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ErrorEvent; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnAbortReason; use codex_protocol::protocol::TurnAbortedEvent; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::user_input::UserInput; +use codex_rollout::CompactedItem; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use pretty_assertions::assert_eq; use super::*; diff --git a/codex-rs/app-server/src/bespoke_event_handling.rs b/codex-rs/app-server/src/bespoke_event_handling.rs index d4140102bd..32c2226686 100644 --- a/codex-rs/app-server/src/bespoke_event_handling.rs +++ b/codex-rs/app-server/src/bespoke_event_handling.rs @@ -2143,11 +2143,11 @@ mod tests { use codex_protocol::protocol::ItemStartedEvent; use codex_protocol::protocol::RateLimitSnapshot; use codex_protocol::protocol::RateLimitWindow; - use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::TokenUsage; use codex_protocol::protocol::TokenUsageInfo; use codex_protocol::protocol::UserMessageEvent; + use codex_rollout::RolloutItem; use codex_thread_store::StoredThread; use codex_thread_store::StoredThreadHistory; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/app-server/src/external_agent_migration/session_importer.rs b/codex-rs/app-server/src/external_agent_migration/session_importer.rs index 07ff5cf7c4..4cd0d1f166 100644 --- a/codex-rs/app-server/src/external_agent_migration/session_importer.rs +++ b/codex-rs/app-server/src/external_agent_migration/session_importer.rs @@ -30,9 +30,9 @@ use codex_protocol::models::BaseInstructions; use codex_protocol::models::BaseInstructionsProvenance; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; +use codex_rollout::RolloutItem; use codex_rollout::is_persisted_rollout_item; use codex_thread_store::AppendThreadItemsParams; use codex_thread_store::CreateThreadParams; diff --git a/codex-rs/app-server/src/request_processors.rs b/codex-rs/app-server/src/request_processors.rs index ebc0e89788..77eee3873b 100644 --- a/codex-rs/app-server/src/request_processors.rs +++ b/codex-rs/app-server/src/request_processors.rs @@ -440,15 +440,12 @@ use codex_protocol::protocol::ConversationTextParams; use codex_protocol::protocol::EventMsg; #[cfg(test)] use codex_protocol::protocol::GitInfo as CoreGitInfo; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::McpAuthStatus as CoreMcpAuthStatus; use codex_protocol::protocol::Op; use codex_protocol::protocol::RealtimeVoicesList; -use codex_protocol::protocol::ResumedHistory; use codex_protocol::protocol::ReviewDelivery as CoreReviewDelivery; use codex_protocol::protocol::ReviewRequest; use codex_protocol::protocol::ReviewTarget as CoreReviewTarget; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionConfiguredEvent; #[cfg(test)] use codex_protocol::protocol::SessionMetaLine; @@ -460,6 +457,9 @@ use codex_protocol::user_input::MAX_USER_INPUT_TEXT_CHARS; use codex_protocol::user_input::UserInput as CoreInputItem; use codex_rmcp_client::StreamableHttpRedirectMode; use codex_rmcp_client::perform_oauth_login_return_url; +use codex_rollout::InitialHistory; +use codex_rollout::ResumedHistory; +use codex_rollout::RolloutItem; use codex_rollout::is_persisted_rollout_item; use codex_rollout::state_db::StateDbHandle; use codex_rollout::state_db::reconcile_rollout; diff --git a/codex-rs/app-server/src/request_processors/feedback_processor.rs b/codex-rs/app-server/src/request_processors/feedback_processor.rs index f085fa51c6..09c4a8ba3b 100644 --- a/codex-rs/app-server/src/request_processors/feedback_processor.rs +++ b/codex-rs/app-server/src/request_processors/feedback_processor.rs @@ -432,8 +432,8 @@ fn windows_sandbox_log_attachment(_codex_home: &Path) -> Option Result<()> { - use codex_protocol::protocol::RolloutItem; - use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMetaLine; + use codex_rollout::RolloutItem; + use codex_rollout::RolloutLine; use std::fs; use std::fs::FileTimes; @@ -1187,9 +1187,9 @@ mod thread_processor_behavior_tests { #[tokio::test] async fn read_summary_from_rollout_preserves_agent_nickname() -> Result<()> { - use codex_protocol::protocol::RolloutItem; - use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMetaLine; + use codex_rollout::RolloutItem; + use codex_rollout::RolloutLine; use std::fs; let temp_dir = TempDir::new()?; @@ -1239,9 +1239,9 @@ mod thread_processor_behavior_tests { #[tokio::test] async fn read_summary_from_rollout_preserves_forked_from_id() -> Result<()> { - use codex_protocol::protocol::RolloutItem; - use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMetaLine; + use codex_rollout::RolloutItem; + use codex_rollout::RolloutLine; use std::fs; let temp_dir = TempDir::new()?; diff --git a/codex-rs/app-server/src/request_processors/token_usage_replay.rs b/codex-rs/app-server/src/request_processors/token_usage_replay.rs index 50a59aa659..13d7ca2609 100644 --- a/codex-rs/app-server/src/request_processors/token_usage_replay.rs +++ b/codex-rs/app-server/src/request_processors/token_usage_replay.rs @@ -20,7 +20,7 @@ use codex_app_server_protocol::TurnStatus; use codex_core::CodexThread; use codex_protocol::ThreadId; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::RolloutItem; use crate::outgoing_message::ConnectionId; use crate::outgoing_message::OutgoingMessageSender; diff --git a/codex-rs/app-server/src/thread_state.rs b/codex-rs/app-server/src/thread_state.rs index 72dc7e15b9..3cd45f29ce 100644 --- a/codex-rs/app-server/src/thread_state.rs +++ b/codex-rs/app-server/src/thread_state.rs @@ -17,7 +17,7 @@ use codex_protocol::items::AgentMessageContent as CoreAgentMessageContent; use codex_protocol::items::TurnItem as CoreTurnItem; use codex_protocol::models::MessagePhase; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::RolloutItem; use codex_rollout::state_db::StateDbHandle; use codex_utils_path_uri::LegacyAppPathString; use std::collections::HashMap; diff --git a/codex-rs/app-server/tests/suite/v2/git_attribution.rs b/codex-rs/app-server/tests/suite/v2/git_attribution.rs index dcfdd97163..fcd0f53d59 100644 --- a/codex-rs/app-server/tests/suite/v2/git_attribution.rs +++ b/codex-rs/app-server/tests/suite/v2/git_attribution.rs @@ -25,8 +25,8 @@ use codex_app_server_protocol::UserInput; use codex_config::types::AuthCredentialsStoreMode; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use core_test_support::responses; use core_test_support::skip_if_no_network; use pretty_assertions::assert_eq; diff --git a/codex-rs/app-server/tests/suite/v2/thread_fork.rs b/codex-rs/app-server/tests/suite/v2/thread_fork.rs index defe31c833..5491a4aa7a 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_fork.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_fork.rs @@ -54,11 +54,11 @@ use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_rollout::append_rollout_item_to_path; use codex_rollout::append_thread_name; use codex_rollout::read_session_meta_line; diff --git a/codex-rs/app-server/tests/suite/v2/thread_inject_items.rs b/codex-rs/app-server/tests/suite/v2/thread_inject_items.rs index 13ed15ed19..89afc6e537 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_inject_items.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_inject_items.rs @@ -12,8 +12,8 @@ use codex_app_server_protocol::UserInput as V2UserInput; use codex_core::RolloutRecorder; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; -use codex_protocol::protocol::InitialHistory; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::InitialHistory; +use codex_rollout::RolloutItem; use core_test_support::responses; use core_test_support::responses::strip_response_item_id; use core_test_support::responses::strip_response_item_ids_from_json; diff --git a/codex-rs/app-server/tests/suite/v2/thread_list.rs b/codex-rs/app-server/tests/suite/v2/thread_list.rs index ac91f1e117..2a56210dc9 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_list.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_list.rs @@ -39,10 +39,10 @@ use codex_git_utils::GitSha; use codex_protocol::ThreadId; use codex_protocol::protocol::GitInfo as CoreGitInfo; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource as CoreSessionSource; use codex_protocol::protocol::SubAgentSource; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_rollout::append_rollout_item_to_path; use codex_rollout::read_session_meta_line; use codex_state::DirectionalThreadSpawnEdgeStatus; diff --git a/codex-rs/app-server/tests/suite/v2/thread_read.rs b/codex-rs/app-server/tests/suite/v2/thread_read.rs index 226643eeea..0c888581f0 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_read.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_read.rs @@ -63,7 +63,6 @@ use codex_protocol::models::MessagePhase; use codex_protocol::protocol::AgentMessageEvent; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource as ProtocolSessionSource; use codex_protocol::protocol::ThreadMemoryMode; use codex_protocol::protocol::TurnCompleteEvent; @@ -71,6 +70,7 @@ use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; use codex_protocol::user_input::ByteRange; use codex_protocol::user_input::TextElement; +use codex_rollout::RolloutItem; use codex_thread_store::AppendThreadItemsParams; use codex_thread_store::CreateThreadParams; use codex_thread_store::InMemoryThreadStore; diff --git a/codex-rs/app-server/tests/suite/v2/thread_resume.rs b/codex-rs/app-server/tests/suite/v2/thread_resume.rs index e6a410fde0..cfc9e53bef 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -79,13 +79,11 @@ use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::AgentMessageEvent; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ImageGenerationEndEvent; use codex_protocol::protocol::McpInvocation; use codex_protocol::protocol::McpToolCallEndEvent; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource as RolloutSessionSource; @@ -97,6 +95,8 @@ use codex_protocol::protocol::TurnAbortedEvent; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::user_input::ByteRange; use codex_protocol::user_input::TextElement; +use codex_rollout::CompactedItem; +use codex_rollout::RolloutItem; use codex_rollout::append_rollout_item_to_path; use codex_rollout::read_session_meta_line; use codex_state::StateRuntime; diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index 0fe910d272..30e5a52a02 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -40,6 +40,7 @@ codex-utils-cli = { workspace = true } codex-config = { workspace = true } codex-core = { workspace = true } codex-core-plugins = { workspace = true } +codex-history = { workspace = true } codex-home = { workspace = true } codex-http-client = { workspace = true } codex-exec = { workspace = true } diff --git a/codex-rs/cli/src/doctor/thread_inventory.rs b/codex-rs/cli/src/doctor/thread_inventory.rs index 8b220c9c68..1ac5e89b5f 100644 --- a/codex-rs/cli/src/doctor/thread_inventory.rs +++ b/codex-rs/cli/src/doctor/thread_inventory.rs @@ -4,9 +4,9 @@ use super::CheckStatus; use super::Config; use super::DoctorCheck; use super::DoctorIssue; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::protocol::InternalSessionSource; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_state::ThreadStateAuditRow; diff --git a/codex-rs/core-api/Cargo.toml b/codex-rs/core-api/Cargo.toml index a6f061eadf..b82d5ee480 100644 --- a/codex-rs/core-api/Cargo.toml +++ b/codex-rs/core-api/Cargo.toml @@ -21,6 +21,7 @@ codex-config = { workspace = true } codex-core = { workspace = true } codex-extension-api = { workspace = true } codex-home = { workspace = true } +codex-history = { workspace = true } codex-image-generation-extension = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } diff --git a/codex-rs/core-api/src/lib.rs b/codex-rs/core-api/src/lib.rs index bc22a12c40..2bcb53d4ae 100644 --- a/codex-rs/core-api/src/lib.rs +++ b/codex-rs/core-api/src/lib.rs @@ -73,6 +73,7 @@ pub use codex_extension_api::UserInstructionsProvider; pub use codex_extension_api::empty_extension_registry; pub use codex_features::Feature; pub use codex_features::Features; +pub use codex_history::InitialHistory; pub use codex_home::CodexHomeUserInstructionsProvider; pub use codex_image_generation_extension::install as install_image_generation_extension; pub use codex_login::AuthHeaders; @@ -103,7 +104,6 @@ pub use codex_protocol::models::PermissionProfile; pub use codex_protocol::openai_models::ModelPreset; pub use codex_protocol::protocol::AskForApproval; pub use codex_protocol::protocol::EventMsg; -pub use codex_protocol::protocol::InitialHistory; pub use codex_protocol::protocol::Op; pub use codex_protocol::protocol::SessionConfiguredEvent; pub use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index 7e6e4576d0..78e6905ded 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -49,6 +49,7 @@ codex-models-manager = { workspace = true } codex-shell-command = { workspace = true } codex-execpolicy = { workspace = true } codex-git-utils = { workspace = true } +codex-history = { workspace = true } codex-hooks = { workspace = true } codex-http-client = { workspace = true } codex-install-context = { workspace = true } diff --git a/codex-rs/core/src/agent/control.rs b/codex-rs/core/src/agent/control.rs index 1ba0317294..36690f937b 100644 --- a/codex-rs/core/src/agent/control.rs +++ b/codex-rs/core/src/agent/control.rs @@ -20,6 +20,9 @@ use crate::thread_manager::ThreadIdGenerator; use crate::thread_manager::ThreadManagerState; use crate::thread_manager::default_thread_id_generator; use crate::thread_rollout_truncation::truncate_rollout_to_last_n_fork_turns; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; +use codex_history::RolloutItem; use codex_protocol::AgentPath; use codex_protocol::SessionId; use codex_protocol::ThreadId; @@ -30,12 +33,9 @@ use codex_protocol::models::ContentItem; use codex_protocol::models::MessagePhase; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::MultiAgentVersion; use codex_protocol::protocol::Op; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::ThreadHistoryMode; diff --git a/codex-rs/core/src/agent/control_tests.rs b/codex-rs/core/src/agent/control_tests.rs index db48f9bdce..c03e3a63cb 100644 --- a/codex-rs/core/src/agent/control_tests.rs +++ b/codex-rs/core/src/agent/control_tests.rs @@ -16,6 +16,9 @@ use assert_matches::assert_matches; use codex_extension_api::ExtensionDataInit; use codex_extension_api::empty_extension_registry; use codex_features::Feature; +use codex_history::CompactedItem; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::AuthManager; use codex_login::CodexAuth; use codex_protocol::AgentPath; @@ -34,13 +37,10 @@ use codex_protocol::models::MessagePhase; use codex_protocol::models::PermissionProfile; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ErrorEvent; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::ThreadHistoryMode; diff --git a/codex-rs/core/src/codex_delegate.rs b/codex-rs/core/src/codex_delegate.rs index 0f5061d5c4..6fb3c56c4b 100644 --- a/codex-rs/core/src/codex_delegate.rs +++ b/codex-rs/core/src/codex_delegate.rs @@ -58,10 +58,10 @@ use crate::session::SessionSpawnArgs; use crate::session::emit_subagent_session_started; use crate::session::session::Session; use crate::session::turn_context::TurnContext; +use codex_history::InitialHistory; use codex_login::AuthManager; use codex_models_manager::manager::SharedModelsManager; use codex_protocol::error::CodexErr; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::MultiAgentVersion; #[cfg(test)] diff --git a/codex-rs/core/src/codex_thread.rs b/codex-rs/core/src/codex_thread.rs index ba0bfcb741..469afeed0f 100644 --- a/codex-rs/core/src/codex_thread.rs +++ b/codex-rs/core/src/codex_thread.rs @@ -14,6 +14,7 @@ use codex_diagnostics::GaugeGuard; use codex_exec_server::SelectedCapabilityRootsStatus; use codex_extension_api::ThreadIdleCause; use codex_features::Feature; +use codex_history::RolloutItem; use codex_otel::SessionTelemetry; use codex_protocol::ThreadId; use codex_protocol::config_types::ApprovalsReviewer; @@ -34,7 +35,6 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::Event; use codex_protocol::protocol::MultiAgentVersion; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/core/src/guardian/review_session.rs b/codex-rs/core/src/guardian/review_session.rs index 2b3814fde0..7c6bff792d 100644 --- a/codex-rs/core/src/guardian/review_session.rs +++ b/codex-rs/core/src/guardian/review_session.rs @@ -9,6 +9,8 @@ use codex_analytics::GuardianReviewAnalyticsResult; use codex_analytics::GuardianReviewSessionAnalyticsParams; use codex_analytics::GuardianReviewSessionKind; use codex_extension_api::UserInstructions; +use codex_history::InitialHistory; +use codex_history::RolloutItem; use codex_protocol::ThreadId; use codex_protocol::config_types::AutoCompactTokenLimitScope; use codex_protocol::config_types::Personality; @@ -23,9 +25,7 @@ use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::ErrorEvent; use codex_protocol::protocol::Event; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::TokenUsage; diff --git a/codex-rs/core/src/guardian/tests.rs b/codex-rs/core/src/guardian/tests.rs index e09250eb47..8aedea8fce 100644 --- a/codex-rs/core/src/guardian/tests.rs +++ b/codex-rs/core/src/guardian/tests.rs @@ -28,6 +28,7 @@ use codex_config::config_toml::ConfigToml; use codex_config::types::McpServerConfig; use codex_exec_server::LOCAL_FS; use codex_features::Feature; +use codex_history::RolloutItem; use codex_model_provider::create_model_provider; use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_4_MODEL_ID; use codex_model_provider_info::AMAZON_BEDROCK_PROVIDER_ID; @@ -56,7 +57,6 @@ use codex_protocol::protocol::GuardianAssessmentStatus; use codex_protocol::protocol::GuardianRiskLevel; use codex_protocol::protocol::GuardianUserAuthorization; use codex_protocol::protocol::ReviewDecision; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TurnCompleteEvent; use codex_utils_path_uri::PathUri; use core_test_support::PathBufExt; diff --git a/codex-rs/core/src/session/handlers.rs b/codex-rs/core/src/session/handlers.rs index 09fedfb125..3308d2dd95 100644 --- a/codex-rs/core/src/session/handlers.rs +++ b/codex-rs/core/src/session/handlers.rs @@ -23,6 +23,7 @@ use crate::tasks::UserShellCommandMode; use crate::tasks::UserShellCommandTask; use crate::tasks::execute_user_shell_command; use crate::user_message_admission::UserMessageAdmission; +use codex_history::RolloutItem; use codex_protocol::error::CodexErr; use codex_protocol::error::Result as CodexResult; use codex_protocol::models::ContentItem; @@ -40,7 +41,6 @@ use codex_protocol::protocol::RealtimeConversationListVoicesResponseEvent; use codex_protocol::protocol::RealtimeVoicesList; use codex_protocol::protocol::ReviewDecision; use codex_protocol::protocol::ReviewRequest; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadMemoryMode; use codex_protocol::protocol::ThreadRolledBackEvent; use codex_protocol::protocol::ThreadSettingsAppliedEvent; diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index b2d121a39f..402179accf 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -65,6 +65,7 @@ use codex_extension_api::TurnContextContributionInput; use codex_features::FEATURES; use codex_features::Feature; use codex_features::unstable_features_warning_event; +use codex_history::RolloutItem; use codex_hooks::Hooks; use codex_hooks::HooksConfig; use codex_login::AuthManager; @@ -120,7 +121,6 @@ use codex_protocol::protocol::ItemStartedEvent; use codex_protocol::protocol::MULTI_AGENT_MODE_OPEN_TAG; use codex_protocol::protocol::MultiAgentVersion; use codex_protocol::protocol::RawResponseItemEvent; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::ThreadHistoryMode; @@ -336,6 +336,8 @@ use codex_core_plugins::PluginCommandAttribution; use codex_core_plugins::PluginsManager; use codex_core_plugins::RecommendedPluginCandidatesInput; use codex_git_utils::get_git_repo_root; +use codex_history::CompactedItem; +use codex_history::InitialHistory; use codex_mcp::McpConfig; use codex_mcp::effective_mcp_servers; use codex_otel::SessionTelemetry; @@ -354,13 +356,11 @@ use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; use codex_protocol::protocol::ApplyPatchApprovalRequestEvent; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::CodexErrorInfo; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::DeprecationNoticeEvent; use codex_protocol::protocol::ErrorEvent; use codex_protocol::protocol::Event; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExecApprovalRequestEvent; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::ModelRerouteEvent; use codex_protocol::protocol::ModelRerouteReason; use codex_protocol::protocol::ModelVerification; diff --git a/codex-rs/core/src/session/rollout_reconstruction_tests.rs b/codex-rs/core/src/session/rollout_reconstruction_tests.rs index 6fc6f449c9..da020ad61c 100644 --- a/codex-rs/core/src/session/rollout_reconstruction_tests.rs +++ b/codex-rs/core/src/session/rollout_reconstruction_tests.rs @@ -2,14 +2,14 @@ use super::*; use super::tests::build_world_state_from_turn_context; use super::tests::make_session_and_context; +use codex_history::CompactedItem; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; use codex_protocol::AgentPath; use codex_protocol::ThreadId; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; -use codex_protocol::protocol::CompactedItem; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; -use codex_protocol::protocol::ResumedHistory; use codex_protocol::protocol::SessionContextWindow; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 162d3a1e00..9aade4d1b2 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -105,6 +105,10 @@ use codex_config::permissions_toml::PermissionsToml; use codex_execpolicy::Decision; use codex_execpolicy::NetworkRuleProtocol; use codex_execpolicy::Policy; +use codex_history::CompactedItem; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; +use codex_history::RolloutItem; use codex_network_proxy::NetworkProxyConfig; use codex_otel::MetricsClient; use codex_otel::MetricsConfig; @@ -120,11 +124,9 @@ use codex_protocol::models::InternalChatMessageMetadataPassthrough; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::CodexErrorInfo; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ConversationAudioParams; use codex_protocol::protocol::CreditsSnapshot; use codex_protocol::protocol::GranularApprovalConfig; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::MultiAgentVersion; use codex_protocol::protocol::NetworkApprovalProtocol; @@ -134,8 +136,6 @@ use codex_protocol::protocol::RealtimeAudioFrame; use codex_protocol::protocol::RealtimeConversationListVoicesResponseEvent; use codex_protocol::protocol::RealtimeVoice; use codex_protocol::protocol::RealtimeVoicesList; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::Submission; diff --git a/codex-rs/core/src/thread_manager.rs b/codex-rs/core/src/thread_manager.rs index f35d293ecc..5a53c6fe39 100644 --- a/codex-rs/core/src/thread_manager.rs +++ b/codex-rs/core/src/thread_manager.rs @@ -35,6 +35,9 @@ use codex_extension_api::LoadedUserInstructions; use codex_extension_api::UserInstructionsProvider; use codex_extension_api::empty_extension_registry; use codex_features::Feature; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; +use codex_history::RolloutItem; use codex_login::AuthManager; use codex_login::CodexAuth; use codex_login::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR; @@ -53,11 +56,8 @@ use codex_protocol::mcp::OPENAI_STANDARD_FORM_INPUT_EXTENSION_ID; use codex_protocol::openai_models::ModelPreset; use codex_protocol::protocol::Event; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::MultiAgentVersion; use codex_protocol::protocol::Op; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; diff --git a/codex-rs/core/src/thread_manager_tests.rs b/codex-rs/core/src/thread_manager_tests.rs index 876a83d1c0..afcef58be9 100644 --- a/codex-rs/core/src/thread_manager_tests.rs +++ b/codex-rs/core/src/thread_manager_tests.rs @@ -11,6 +11,8 @@ use crate::session::tests::make_session_and_context; use crate::tasks::InterruptedTurnHistoryMarker; use crate::tasks::interrupted_turn_history_marker; use codex_extension_api::empty_extension_registry; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; use codex_models_manager::manager::RefreshStrategy; use codex_protocol::ResponseItemId; use codex_protocol::capabilities::CapabilityRootLocation; @@ -23,9 +25,7 @@ use codex_protocol::models::ReasoningItemReasoningSummary; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AgentMessageEvent; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InternalSessionSource; -use codex_protocol::protocol::ResumedHistory; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/core/src/thread_rollout_truncation.rs b/codex-rs/core/src/thread_rollout_truncation.rs index 795958f83c..93b1727583 100644 --- a/codex-rs/core/src/thread_rollout_truncation.rs +++ b/codex-rs/core/src/thread_rollout_truncation.rs @@ -7,14 +7,14 @@ use crate::context_manager::is_user_turn_boundary; use crate::event_mapping; use codex_app_server_protocol::TurnStatus; use codex_app_server_protocol::build_turns_from_rollout_items; +use codex_history::InitialHistory; +use codex_history::RolloutItem; use codex_protocol::error::CodexErr; use codex_protocol::error::Result as CodexResult; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; -use codex_protocol::protocol::RolloutItem; pub(crate) fn initial_history_has_prior_user_turns(conversation_history: &InitialHistory) -> bool { conversation_history.scan_rollout_items(rollout_item_is_user_turn_boundary) diff --git a/codex-rs/core/src/tools/handlers/multi_agents_tests.rs b/codex-rs/core/src/tools/handlers/multi_agents_tests.rs index 6e18dfe971..7a42cd4f3a 100644 --- a/codex-rs/core/src/tools/handlers/multi_agents_tests.rs +++ b/codex-rs/core/src/tools/handlers/multi_agents_tests.rs @@ -23,6 +23,8 @@ use crate::tools::handlers::multi_agents_v2::WaitAgentHandler as WaitAgentHandle use crate::turn_diff_tracker::TurnDiffTracker; use codex_extension_api::empty_extension_registry; use codex_features::Feature; +use codex_history::InitialHistory; +use codex_history::RolloutItem; use codex_login::AuthManager; use codex_login::CodexAuth; use codex_model_provider::create_model_provider; @@ -49,11 +51,9 @@ use codex_protocol::protocol::FileSystemAccessMode; use codex_protocol::protocol::FileSystemPath; use codex_protocol::protocol::FileSystemSandboxEntry; use codex_protocol::protocol::FileSystemSandboxPolicy; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::NetworkSandboxPolicy; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; diff --git a/codex-rs/core/tests/suite/agents_md.rs b/codex-rs/core/tests/suite/agents_md.rs index 62b78a249b..5e647c0e34 100644 --- a/codex-rs/core/tests/suite/agents_md.rs +++ b/codex-rs/core/tests/suite/agents_md.rs @@ -6,11 +6,11 @@ use codex_exec_server::CreateDirectoryOptions; use codex_exec_server::LOCAL_ENVIRONMENT_ID; use codex_exec_server::REMOTE_ENVIRONMENT_ID; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_home::CodexHomeUserInstructionsProvider; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnEnvironmentSelection; use codex_protocol::user_input::UserInput; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 75f14e1895..9cea9b884c 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -10,6 +10,8 @@ use codex_core::resolve_installation_id; use codex_core::thread_store_from_config; use codex_extension_api::empty_extension_registry; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::AuthKeyringBackendKind; use codex_login::AuthManager; use codex_login::CodexAuth; @@ -48,8 +50,6 @@ use codex_protocol::openai_models::InputModality; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index dc425387c7..12087f84f7 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -4,6 +4,8 @@ use codex_core::compact::SUMMARIZATION_PROMPT; use codex_core::compact::SUMMARY_PREFIX; use codex_core::config::Config; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_model_provider_info::ModelProviderInfo; use codex_model_provider_info::built_in_model_providers; @@ -20,8 +22,6 @@ use codex_protocol::protocol::HookRunStatus; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::ItemStartedEvent; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::WarningEvent; use codex_protocol::user_input::UserInput; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/core/tests/suite/compact_remote.rs b/codex-rs/core/tests/suite/compact_remote.rs index 8a86ef74a2..4384e8da4b 100644 --- a/codex-rs/core/tests/suite/compact_remote.rs +++ b/codex-rs/core/tests/suite/compact_remote.rs @@ -8,6 +8,9 @@ use codex_core::StartThreadOptions; use codex_core::X_CODEX_ROUTING_HINT_HEADER; use codex_core::compact::SUMMARY_PREFIX; use codex_features::Feature; +use codex_history::InitialHistory; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_login::auth::AgentIdentityAuth; use codex_login::auth::AgentIdentityAuthRecord; @@ -33,7 +36,6 @@ use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::InputModality; use codex_protocol::protocol::ConversationStartParams; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::ItemStartedEvent; @@ -41,8 +43,6 @@ use codex_protocol::protocol::Op; use codex_protocol::protocol::RealtimeConversationRealtimeEvent; use codex_protocol::protocol::RealtimeEvent; use codex_protocol::protocol::RealtimeOutputModality; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::user_input::UserInput; use core_test_support::PathBufExt; use core_test_support::apps_test_server::configure_search_capable_model; diff --git a/codex-rs/core/tests/suite/compact_remote_parity.rs b/codex-rs/core/tests/suite/compact_remote_parity.rs index fd06a0b433..ffc9762e57 100644 --- a/codex-rs/core/tests/suite/compact_remote_parity.rs +++ b/codex-rs/core/tests/suite/compact_remote_parity.rs @@ -4,12 +4,12 @@ use std::path::PathBuf; use anyhow::Result; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_protocol::config_types::ServiceTier; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::user_input::UserInput; use core_test_support::hooks::trust_discovered_hooks; use core_test_support::responses; diff --git a/codex-rs/core/tests/suite/fork_thread.rs b/codex-rs/core/tests/suite/fork_thread.rs index 140af23c3f..c93d03e40b 100644 --- a/codex-rs/core/tests/suite/fork_thread.rs +++ b/codex-rs/core/tests/suite/fork_thread.rs @@ -4,14 +4,14 @@ use codex_core::ForkSnapshot; use codex_core::NewThread; use codex_core::ThreadConfigSnapshot; use codex_core::parse_turn_item; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::items::TurnItem; use codex_protocol::mcp::ClientMcpExtensions; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::Op; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadSettingsAppliedEvent; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/guardian_review.rs b/codex-rs/core/tests/suite/guardian_review.rs index af465ec376..4f83ced602 100644 --- a/codex-rs/core/tests/suite/guardian_review.rs +++ b/codex-rs/core/tests/suite/guardian_review.rs @@ -13,6 +13,8 @@ use codex_core::config::CurrentTimeReminderConfig; use codex_core::sandboxing::SandboxPermissions; use codex_features::CurrentTimeSource; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::config_types::ApprovalsReviewer; @@ -21,8 +23,6 @@ use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::TurnAbortReason; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/hooks.rs b/codex-rs/core/tests/suite/hooks.rs index 5fe2cc882a..f12e9f38ed 100644 --- a/codex-rs/core/tests/suite/hooks.rs +++ b/codex-rs/core/tests/suite/hooks.rs @@ -8,6 +8,8 @@ use codex_core::config::Config; use codex_core::config::Constrained; use codex_core::config::ThreadStoreConfig; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_model_provider_info::ModelProviderInfo; use codex_model_provider_info::built_in_model_providers; use codex_plugin::PluginHookSource; @@ -21,8 +23,6 @@ use codex_protocol::permissions::NetworkSandboxPolicy; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::request_permissions::PermissionGrantScope; diff --git a/codex-rs/core/tests/suite/image_rollout.rs b/codex-rs/core/tests/suite/image_rollout.rs index 1f937fbdd7..6cdb1fac8e 100644 --- a/codex-rs/core/tests/suite/image_rollout.rs +++ b/codex-rs/core/tests/suite/image_rollout.rs @@ -2,6 +2,8 @@ use anyhow::Context; use base64::Engine; use base64::engine::general_purpose::STANDARD as BASE64_STANDARD; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::models::ContentItem; use codex_protocol::models::DEFAULT_IMAGE_DETAIL; use codex_protocol::models::ImageDetail; @@ -10,8 +12,6 @@ use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::user_input::UserInput; use codex_utils_image::data_url_from_bytes; use core_test_support::TempDirExt; diff --git a/codex-rs/core/tests/suite/items.rs b/codex-rs/core/tests/suite/items.rs index a0e9ca64fb..6bde20cc9f 100644 --- a/codex-rs/core/tests/suite/items.rs +++ b/codex-rs/core/tests/suite/items.rs @@ -2,6 +2,8 @@ use anyhow::Ok; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ModeKind; use codex_protocol::config_types::Settings; @@ -14,8 +16,6 @@ use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::ItemStartedEvent; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::user_input::ByteRange; use codex_protocol::user_input::TextElement; diff --git a/codex-rs/core/tests/suite/mcp_tool_exposure.rs b/codex-rs/core/tests/suite/mcp_tool_exposure.rs index 4235a39aa4..d3dfe3e0d7 100644 --- a/codex-rs/core/tests/suite/mcp_tool_exposure.rs +++ b/codex-rs/core/tests/suite/mcp_tool_exposure.rs @@ -9,14 +9,14 @@ use codex_extension_api::McpServerContributor; use codex_extension_api::ThreadLifecycleContributor; use codex_extension_api::ThreadStartInput; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_mcp::CODEX_APPS_MCP_SERVER_NAME; use codex_mcp::McpResourceClient; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::request_user_input::RequestUserInputAnswer; diff --git a/codex-rs/core/tests/suite/mcp_turn_metadata.rs b/codex-rs/core/tests/suite/mcp_turn_metadata.rs index 713113f2cf..d6c6474487 100644 --- a/codex-rs/core/tests/suite/mcp_turn_metadata.rs +++ b/codex-rs/core/tests/suite/mcp_turn_metadata.rs @@ -6,6 +6,8 @@ use codex_config::test_support::CloudConfigBundleFixture; use codex_config::types::AppToolApproval; use codex_core::config::Config; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ModeKind; @@ -17,8 +19,6 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::ElicitationAction; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::request_user_input::RequestUserInputAnswer; use codex_protocol::request_user_input::RequestUserInputResponse; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/model_switching.rs b/codex-rs/core/tests/suite/model_switching.rs index 941a2a04b2..bd4df3f6d3 100644 --- a/codex-rs/core/tests/suite/model_switching.rs +++ b/codex-rs/core/tests/suite/model_switching.rs @@ -3,6 +3,8 @@ use codex_config::types::Personality; use codex_core::CodexThread; use codex_core::ForkSnapshot; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_models_manager::bundled_models_response; use codex_models_manager::manager::RefreshStrategy; @@ -24,8 +26,6 @@ use codex_protocol::openai_models::default_input_modalities; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadSettingsOverrides; use codex_protocol::user_input::UserInput; use core_test_support::responses::ev_completed_with_tokens; diff --git a/codex-rs/core/tests/suite/pending_input.rs b/codex-rs/core/tests/suite/pending_input.rs index 136996723e..fff66362b9 100644 --- a/codex-rs/core/tests/suite/pending_input.rs +++ b/codex-rs/core/tests/suite/pending_input.rs @@ -7,6 +7,8 @@ use codex_core::config::CurrentTimeReminderConfig; use codex_extension_items::ExtensionItem; use codex_extension_items::sleep::SleepItem; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::AgentPath; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ModeKind; @@ -17,8 +19,6 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadSettingsOverrides; use codex_protocol::user_input::UserInput; use core_test_support::context_snapshot; diff --git a/codex-rs/core/tests/suite/realtime_conversation.rs b/codex-rs/core/tests/suite/realtime_conversation.rs index 19041c5acb..df654432c0 100644 --- a/codex-rs/core/tests/suite/realtime_conversation.rs +++ b/codex-rs/core/tests/suite/realtime_conversation.rs @@ -3,6 +3,8 @@ use anyhow::Result; use chrono::Utc; use codex_config::config_toml::RealtimeWsVersion; use codex_core::test_support::auth_manager_from_auth; +use codex_history::InitialHistory; +use codex_history::RolloutItem; use codex_login::CodexAuth; use codex_login::OPENAI_API_KEY_ENV_VAR; use codex_protocol::ThreadId; @@ -16,7 +18,6 @@ use codex_protocol::protocol::ConversationStartTransport; use codex_protocol::protocol::ConversationTextParams; use codex_protocol::protocol::ConversationTextRole; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::Op; use codex_protocol::protocol::RealtimeAudioFrame; use codex_protocol::protocol::RealtimeConversationRealtimeEvent; @@ -25,7 +26,6 @@ use codex_protocol::protocol::RealtimeEvent; use codex_protocol::protocol::RealtimeNoopRequested; use codex_protocol::protocol::RealtimeOutputModality; use codex_protocol::protocol::RealtimeVoice; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::user_input::UserInput; use core_test_support::responses; diff --git a/codex-rs/core/tests/suite/remote_env.rs b/codex-rs/core/tests/suite/remote_env.rs index d3f0f73a24..b8187490dc 100644 --- a/codex-rs/core/tests/suite/remote_env.rs +++ b/codex-rs/core/tests/suite/remote_env.rs @@ -30,6 +30,8 @@ use codex_extension_api::ThreadStartInput; use codex_extension_api::WorldStateContributionInput; use codex_extension_api::WorldStateSectionContribution; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_http_client::HttpClientFactory; use codex_http_client::OutboundProxyPolicy; use codex_protocol::capabilities::CapabilityRootLocation; @@ -49,8 +51,6 @@ use codex_protocol::protocol::ENVIRONMENTS_INSTRUCTIONS_OPEN_TAG; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; use codex_protocol::protocol::ReviewDecision; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::ThreadSettingsOverrides; use codex_protocol::protocol::TurnEnvironmentSelection; diff --git a/codex-rs/core/tests/suite/resume_warning.rs b/codex-rs/core/tests/suite/resume_warning.rs index 876b65c437..98333f1d8a 100644 --- a/codex-rs/core/tests/suite/resume_warning.rs +++ b/codex-rs/core/tests/suite/resume_warning.rs @@ -3,15 +3,15 @@ use std::sync::Arc; use codex_core::NewThread; +use codex_history::InitialHistory; +use codex_history::ResumedHistory; +use codex_history::RolloutItem; use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::config_types::ModeKind; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::mcp::ClientMcpExtensions; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnContextItem; use codex_protocol::protocol::TurnStartedEvent; diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs index 7264bea8da..98ed4018c7 100644 --- a/codex-rs/core/tests/suite/review.rs +++ b/codex-rs/core/tests/suite/review.rs @@ -5,6 +5,8 @@ use codex_core::config::Constrained; use codex_core::find_thread_path_by_id_str; use codex_exec_server::CreateDirectoryOptions; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::ServiceTier; use codex_protocol::items::TurnItem; @@ -26,8 +28,6 @@ use codex_protocol::protocol::ReviewLineRange; use codex_protocol::protocol::ReviewOutputEvent; use codex_protocol::protocol::ReviewRequest; use codex_protocol::protocol::ReviewTarget; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadSettingsOverrides; use codex_protocol::protocol::TurnEnvironmentSelections; use codex_protocol::review_format::render_review_output_text; diff --git a/codex-rs/core/tests/suite/rmcp_client.rs b/codex-rs/core/tests/suite/rmcp_client.rs index d23db10004..20574978b8 100644 --- a/codex-rs/core/tests/suite/rmcp_client.rs +++ b/codex-rs/core/tests/suite/rmcp_client.rs @@ -36,6 +36,7 @@ use codex_mcp::SandboxState; use codex_models_manager::manager::RefreshStrategy; use codex_utils_path_uri::LegacyAppPathString; +use codex_history::RolloutItem; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::models::ContentItem; use codex_protocol::models::PermissionProfile; @@ -54,7 +55,6 @@ use codex_protocol::protocol::McpStartupFailureReason; use codex_protocol::protocol::McpStartupStatus; use codex_protocol::protocol::McpToolCallBeginEvent; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; use codex_protocol::user_input::UserInput; use codex_utils_cargo_bin::cargo_bin; use codex_utils_path_uri::PathUri; diff --git a/codex-rs/core/tests/suite/spawn_agent_description.rs b/codex-rs/core/tests/suite/spawn_agent_description.rs index bebab31184..4d4dacf7ef 100644 --- a/codex-rs/core/tests/suite/spawn_agent_description.rs +++ b/codex-rs/core/tests/suite/spawn_agent_description.rs @@ -4,6 +4,8 @@ use anyhow::Result; use codex_core::config::AgentRoleConfig; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_models_manager::manager::RefreshStrategy; use codex_models_manager::manager::SharedModelsManager; @@ -18,8 +20,6 @@ use codex_protocol::openai_models::ReasoningEffortPreset; use codex_protocol::openai_models::TruncationPolicyConfig; use codex_protocol::openai_models::default_input_modalities; use codex_protocol::protocol::MULTI_AGENT_MODE_OPEN_TAG; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use core_test_support::responses::ev_completed; use core_test_support::responses::ev_response_created; use core_test_support::responses::mount_models_once; diff --git a/codex-rs/core/tests/suite/sqlite_state.rs b/codex-rs/core/tests/suite/sqlite_state.rs index fdc0dd8497..84ff379f31 100644 --- a/codex-rs/core/tests/suite/sqlite_state.rs +++ b/codex-rs/core/tests/suite/sqlite_state.rs @@ -5,6 +5,8 @@ use codex_core::StartThreadOptions; use codex_core::config::Config; use codex_extension_api::ExtensionRegistryBuilder; use codex_features::Feature; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::config_types::WebSearchMode; @@ -16,8 +18,6 @@ use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/core/tests/suite/subagent_notifications.rs b/codex-rs/core/tests/suite/subagent_notifications.rs index 55547c97d2..246681dbbd 100644 --- a/codex-rs/core/tests/suite/subagent_notifications.rs +++ b/codex-rs/core/tests/suite/subagent_notifications.rs @@ -3,6 +3,7 @@ use codex_core::StartThreadOptions; use codex_core::ThreadConfigSnapshot; use codex_core::config::AgentRoleConfig; use codex_features::Feature; +use codex_history::RolloutItem; use codex_models_manager::bundled_models_response; use codex_protocol::ThreadId; use codex_protocol::config_types::ReasoningSummary; @@ -12,7 +13,6 @@ use codex_protocol::protocol::AgentStatus; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::ThreadHistoryMode; diff --git a/codex-rs/core/tests/suite/unstable_features_warning.rs b/codex-rs/core/tests/suite/unstable_features_warning.rs index c57b503281..552c70b5d8 100644 --- a/codex-rs/core/tests/suite/unstable_features_warning.rs +++ b/codex-rs/core/tests/suite/unstable_features_warning.rs @@ -3,10 +3,10 @@ use codex_config::CONFIG_TOML_FILE; use codex_core::NewThread; use codex_features::Feature; +use codex_history::InitialHistory; use codex_login::CodexAuth; use codex_protocol::mcp::ClientMcpExtensions; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::WarningEvent; use codex_utils_absolute_path::AbsolutePathBuf; use core::time::Duration; diff --git a/codex-rs/core/tests/suite/user_message_admission.rs b/codex-rs/core/tests/suite/user_message_admission.rs index 60f84a0d11..2d1a4f7fe2 100644 --- a/codex-rs/core/tests/suite/user_message_admission.rs +++ b/codex-rs/core/tests/suite/user_message_admission.rs @@ -1,13 +1,13 @@ use codex_core::UserMessageAdmission; use codex_core::config::Constrained; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_protocol::error::CodexErrorDetails; use codex_protocol::items::TurnItem; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::user_input::UserInput; use core_test_support::responses; diff --git a/codex-rs/exec/Cargo.toml b/codex-rs/exec/Cargo.toml index cdfc569b68..9c3a236bf7 100644 --- a/codex-rs/exec/Cargo.toml +++ b/codex-rs/exec/Cargo.toml @@ -32,6 +32,7 @@ codex-config = { workspace = true } codex-core = { workspace = true } codex-feedback = { workspace = true } codex-git-utils = { workspace = true } +codex-history = { workspace = true } codex-login = { workspace = true } codex-model-provider-info = { workspace = true } codex-otel = { workspace = true } diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index 7d010d00f1..bee8ef7008 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -76,6 +76,8 @@ use codex_core::path_utils; use codex_core::read_session_meta_line; use codex_feedback::CodexFeedback; use codex_git_utils::get_git_repo_root; +use codex_history::RolloutItem; +use codex_history::RolloutLine; use codex_login::default_client::set_default_client_residency_requirement; use codex_login::default_client::set_default_originator; use codex_login::enforce_login_restrictions; @@ -92,8 +94,6 @@ use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::ReviewRequest; use codex_protocol::protocol::ReviewTarget; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/ext/goal/Cargo.toml b/codex-rs/ext/goal/Cargo.toml index f6ee92ce3a..22ee1794fd 100644 --- a/codex-rs/ext/goal/Cargo.toml +++ b/codex-rs/ext/goal/Cargo.toml @@ -19,6 +19,7 @@ codex-core = { workspace = true } codex-extension-api = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } +codex-rollout = { workspace = true } codex-state = { workspace = true } codex-tools = { workspace = true } codex-utils-template = { workspace = true } diff --git a/codex-rs/ext/goal/src/api.rs b/codex-rs/ext/goal/src/api.rs index fbd747b72e..83d58f7f01 100644 --- a/codex-rs/ext/goal/src/api.rs +++ b/codex-rs/ext/goal/src/api.rs @@ -7,11 +7,11 @@ use std::sync::Weak; use codex_protocol::ThreadId; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadGoal; use codex_protocol::protocol::ThreadGoalStatus; use codex_protocol::protocol::ThreadGoalUpdatedEvent; use codex_protocol::protocol::validate_thread_goal_objective; +use codex_rollout::RolloutItem; use crate::runtime::GoalRuntimeHandle; use crate::runtime::PreviousGoalSnapshot; diff --git a/codex-rs/external-agent-migration/src/sessions/append.rs b/codex-rs/external-agent-migration/src/sessions/append.rs index 4437dd29eb..7cc4dabeb5 100644 --- a/codex-rs/external-agent-migration/src/sessions/append.rs +++ b/codex-rs/external-agent-migration/src/sessions/append.rs @@ -6,8 +6,8 @@ use codex_core::ThreadManager; use codex_protocol::ThreadId; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadMemoryMode; +use codex_rollout::RolloutItem; use codex_thread_store::AppendThreadItemsParams; use codex_thread_store::ReadThreadParams; use codex_thread_store::ResumeThreadParams; diff --git a/codex-rs/external-agent-migration/src/sessions/export.rs b/codex-rs/external-agent-migration/src/sessions/export.rs index c993664783..9f3d9dcac5 100644 --- a/codex-rs/external-agent-migration/src/sessions/export.rs +++ b/codex-rs/external-agent-migration/src/sessions/export.rs @@ -12,13 +12,13 @@ use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AgentMessageEvent; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TokenCountEvent; use codex_protocol::protocol::TokenUsage; use codex_protocol::protocol::TokenUsageInfo; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; +use codex_rollout::RolloutItem; use codex_utils_output_truncation::approx_tokens_from_byte_count_i64; use std::collections::BTreeSet; use std::io; diff --git a/codex-rs/external-agent-migration/src/sessions/mod.rs b/codex-rs/external-agent-migration/src/sessions/mod.rs index a9a8220574..8b31556e8e 100644 --- a/codex-rs/external-agent-migration/src/sessions/mod.rs +++ b/codex-rs/external-agent-migration/src/sessions/mod.rs @@ -9,7 +9,7 @@ pub(crate) mod records_cur; mod title; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::RolloutItem; use std::collections::BTreeSet; use std::io; use std::path::Path; diff --git a/codex-rs/history/BUILD.bazel b/codex-rs/history/BUILD.bazel new file mode 100644 index 0000000000..e3c0ef9e85 --- /dev/null +++ b/codex-rs/history/BUILD.bazel @@ -0,0 +1,6 @@ +load("//:defs.bzl", "codex_rust_crate") + +codex_rust_crate( + name = "history", + crate_name = "codex_history", +) diff --git a/codex-rs/history/Cargo.toml b/codex-rs/history/Cargo.toml new file mode 100644 index 0000000000..6188303226 --- /dev/null +++ b/codex-rs/history/Cargo.toml @@ -0,0 +1,23 @@ +[package] +edition.workspace = true +license.workspace = true +name = "codex-history" +version.workspace = true + +[lib] +doctest = false +name = "codex_history" +path = "src/lib.rs" + +[lints] +workspace = true + +[dependencies] +codex-protocol = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true, features = ["derive"] } + +[dev-dependencies] +anyhow = { workspace = true } +pretty_assertions = { workspace = true } +serde_json = { workspace = true } diff --git a/codex-rs/history/src/lib.rs b/codex-rs/history/src/lib.rs new file mode 100644 index 0000000000..8f9aa0a166 --- /dev/null +++ b/codex-rs/history/src/lib.rs @@ -0,0 +1,344 @@ +//! Model-history and persisted-rollout domain types. + +use std::path::PathBuf; +use std::sync::Arc; + +use codex_protocol::ThreadId; +use codex_protocol::capabilities::SelectedCapabilityRoot; +use codex_protocol::dynamic_tools::DynamicToolSpec; +use codex_protocol::models::BaseInstructions; +use codex_protocol::models::ContentItem; +use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::InterAgentCommunication; +use codex_protocol::protocol::MultiAgentVersion; +use codex_protocol::protocol::SessionMeta; +use codex_protocol::protocol::SessionMetaLine; +use codex_protocol::protocol::SessionSource; +use codex_protocol::protocol::ThreadHistoryMode; +use codex_protocol::protocol::ThreadSource; +use codex_protocol::protocol::TurnContextItem; +use codex_protocol::protocol::WorldStateItem; +use schemars::JsonSchema; +use serde::Deserialize; +use serde::Deserializer; +use serde::Serialize; + +/// Persisted rollout item used by core history and rollout storage. +#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)] +#[serde(tag = "type", content = "payload", rename_all = "snake_case")] +pub enum RolloutItem { + SessionMeta(SessionMetaLine), + ResponseItem(ResponseItem), + InterAgentCommunication(InterAgentCommunication), + InterAgentCommunicationMetadata { trigger_turn: bool }, + Compacted(CompactedItem), + TurnContext(TurnContextItem), + WorldState(WorldStateItem), + EventMsg(EventMsg), +} + +#[derive(Serialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct CompactedItem { + pub message: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub replacement_history: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub window_number: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub first_window_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub previous_window_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub window_id: Option, +} + +impl From for ResponseItem { + fn from(value: CompactedItem) -> Self { + ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: value.message, + }], + phase: None, + internal_chat_message_metadata_passthrough: None, + } + } +} + +// Before window_number was introduced, the numeric window number was serialized as +// window_id. Accept that shape so existing rollouts remain resumable. +impl<'de> Deserialize<'de> for CompactedItem { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let serialized = SerializedCompactedItem::deserialize(deserializer)?; + let mut window_number = serialized.window_number; + let window_id = match serialized.window_id { + Some(SerializedWindowId::Id(window_id)) => Some(window_id), + Some(SerializedWindowId::LegacyWindowNumber(legacy_window_number)) => { + window_number.get_or_insert(legacy_window_number); + None + } + None => None, + }; + Ok(Self { + message: serialized.message, + replacement_history: serialized.replacement_history, + window_number, + first_window_id: serialized.first_window_id, + previous_window_id: serialized.previous_window_id, + window_id, + }) + } +} + +#[derive(Deserialize)] +struct SerializedCompactedItem { + message: String, + #[serde(default)] + replacement_history: Option>, + #[serde(default)] + window_number: Option, + #[serde(default)] + first_window_id: Option, + #[serde(default)] + previous_window_id: Option, + #[serde(default)] + window_id: Option, +} + +#[derive(Deserialize)] +#[serde(untagged)] +enum SerializedWindowId { + Id(String), + LegacyWindowNumber(u64), +} + +#[derive(Serialize, Deserialize, Clone, JsonSchema)] +pub struct RolloutLine { + pub timestamp: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ordinal: Option, + #[serde(flatten)] + pub item: RolloutItem, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct ResumedHistory { + pub conversation_id: ThreadId, + pub history: Arc>, + pub rollout_path: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub enum InitialHistory { + New, + Cleared, + Resumed(ResumedHistory), + Forked(Vec), +} + +impl InitialHistory { + pub fn scan_rollout_items(&self, mut predicate: impl FnMut(&RolloutItem) -> bool) -> bool { + match self { + Self::New | Self::Cleared => false, + Self::Resumed(resumed) => resumed.history.iter().any(&mut predicate), + Self::Forked(items) => items.iter().any(predicate), + } + } + + pub fn forked_from_id(&self) -> Option { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => resumed.history.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => meta_line.meta.forked_from_id, + _ => None, + }), + Self::Forked(items) => items.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => Some(meta_line.meta.id), + _ => None, + }), + } + } + + pub fn session_cwd(&self) -> Option { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => session_cwd_from_items(&resumed.history), + Self::Forked(items) => session_cwd_from_items(items), + } + } + + pub fn get_rollout_items(&self) -> &[RolloutItem] { + match self { + Self::New | Self::Cleared => &[], + Self::Resumed(resumed) => &resumed.history, + Self::Forked(items) => items, + } + } + + pub fn get_event_msgs(&self) -> Option> { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => Some( + resumed + .history + .iter() + .filter_map(|item| match item { + RolloutItem::EventMsg(event) => Some(event.clone()), + _ => None, + }) + .collect(), + ), + Self::Forked(items) => Some( + items + .iter() + .filter_map(|item| match item { + RolloutItem::EventMsg(event) => Some(event.clone()), + _ => None, + }) + .collect(), + ), + } + } + + pub fn get_base_instructions(&self) -> Option { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => resumed.history.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => meta_line.meta.base_instructions.clone(), + _ => None, + }), + Self::Forked(items) => items.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => meta_line.meta.base_instructions.clone(), + _ => None, + }), + } + } + + pub fn get_dynamic_tools(&self) -> Option> { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => resumed.history.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => meta_line.meta.dynamic_tools.clone(), + _ => None, + }), + Self::Forked(items) => items.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => meta_line.meta.dynamic_tools.clone(), + _ => None, + }), + } + } + + pub fn get_selected_capability_roots(&self) -> Vec { + self.get_session_meta() + .map(|meta| meta.selected_capability_roots.clone()) + .unwrap_or_default() + } + + pub fn get_multi_agent_version(&self) -> Option { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => { + multi_agent_version_from_items(&resumed.history, Some(resumed.conversation_id)) + } + Self::Forked(items) => multi_agent_version_from_items(items, /*thread_id*/ None), + } + } + + pub fn get_history_mode(&self, default_history_mode: ThreadHistoryMode) -> ThreadHistoryMode { + match self { + Self::New | Self::Cleared => default_history_mode, + Self::Resumed(_) | Self::Forked(_) => self + .get_session_meta() + .map(|meta| meta.history_mode) + .unwrap_or(default_history_mode), + } + } + + pub fn get_resumed_session_sources(&self) -> Option<(SessionSource, Option)> { + let meta = self.get_resumed_session_meta()?; + Some((meta.source.clone(), meta.thread_source.clone())) + } + + pub fn get_resumed_thread_source(&self) -> Option { + self.get_resumed_session_meta() + .and_then(|meta| meta.thread_source.clone()) + } + + pub fn get_session_originator(&self) -> Option { + self.get_session_meta() + .map(|meta| meta.originator.clone()) + .filter(|originator| !originator.is_empty()) + } + + pub fn get_resumed_parent_thread_id(&self) -> Option { + self.get_resumed_session_meta() + .and_then(|meta| meta.parent_thread_id) + } + + fn get_session_meta(&self) -> Option<&SessionMeta> { + match self { + Self::New | Self::Cleared => None, + Self::Resumed(resumed) => resumed.history.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), + _ => None, + }), + Self::Forked(items) => items.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), + _ => None, + }), + } + } + + fn get_resumed_session_meta(&self) -> Option<&SessionMeta> { + match self { + Self::New | Self::Cleared | Self::Forked(_) => None, + Self::Resumed(resumed) => resumed.history.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), + _ => None, + }), + } + } +} + +fn session_cwd_from_items(items: &[RolloutItem]) -> Option { + items.iter().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) => Some(meta_line.meta.cwd.clone()), + _ => None, + }) +} + +fn multi_agent_version_from_items( + items: &[RolloutItem], + thread_id: Option, +) -> Option { + let session_meta_version = items.iter().rev().find_map(|item| match item { + RolloutItem::SessionMeta(meta_line) + if thread_id.is_none_or(|thread_id| meta_line.meta.id == thread_id) => + { + meta_line.meta.multi_agent_version + } + _ => None, + }); + + session_meta_version.or_else(|| { + items.iter().rev().find_map(|item| match item { + RolloutItem::TurnContext(turn_context) => turn_context.multi_agent_version, + RolloutItem::SessionMeta(_) + | RolloutItem::ResponseItem(_) + | RolloutItem::InterAgentCommunication(_) + | RolloutItem::InterAgentCommunicationMetadata { .. } + | RolloutItem::Compacted(_) + | RolloutItem::WorldState(_) + | RolloutItem::EventMsg(_) => None, + }) + }) +} + +#[cfg(test)] +#[path = "tests.rs"] +mod tests; diff --git a/codex-rs/history/src/tests.rs b/codex-rs/history/src/tests.rs new file mode 100644 index 0000000000..079f644f6e --- /dev/null +++ b/codex-rs/history/src/tests.rs @@ -0,0 +1,179 @@ +use anyhow::Result; +use pretty_assertions::assert_eq; +use serde_json::json; + +use super::*; + +#[test] +fn response_item_rollout_line_preserves_shape() -> Result<()> { + let legacy_line = json!({ + "timestamp": "2025-01-03T12:00:00.000Z", + "ordinal": 7, + "type": "response_item", + "payload": { + "type": "message", + "role": "user", + "content": [{ + "type": "input_text", + "text": "hello", + }], + }, + }); + + let line = serde_json::from_value::(legacy_line.clone())?; + let RolloutItem::ResponseItem(item) = &line.item else { + panic!("expected response item"); + }; + assert!(matches!(item, ResponseItem::Message { .. })); + assert_eq!(serde_json::to_value(line)?, legacy_line); + Ok(()) +} + +#[test] +fn response_item_replacement_history_preserves_shape() -> Result<()> { + let legacy_item = json!({ + "message": "summary", + "replacement_history": [{ + "type": "message", + "role": "user", + "content": [{ + "type": "input_text", + "text": "hello", + }], + }], + }); + + let item = serde_json::from_value::(legacy_item.clone())?; + let replacement_history = item + .replacement_history + .as_ref() + .expect("replacement history"); + assert!(matches!( + &replacement_history[0], + ResponseItem::Message { .. } + )); + assert_eq!(serde_json::to_value(item)?, legacy_item); + Ok(()) +} + +#[test] +fn compacted_item_serializes_window_number_and_id() -> Result<()> { + let item = CompactedItem { + message: "summary".to_string(), + replacement_history: None, + window_number: Some(3), + first_window_id: Some("019b3f6e-0000-7000-8000-000000000001".to_string()), + previous_window_id: Some("019b3f6e-0000-7000-8000-000000000002".to_string()), + window_id: Some("019b3f6e-7a10-7cc3-8b6e-1d09e2f7a001".to_string()), + }; + + assert_eq!( + serde_json::to_value(item)?, + json!({ + "message": "summary", + "window_number": 3, + "first_window_id": "019b3f6e-0000-7000-8000-000000000001", + "previous_window_id": "019b3f6e-0000-7000-8000-000000000002", + "window_id": "019b3f6e-7a10-7cc3-8b6e-1d09e2f7a001", + }) + ); + Ok(()) +} + +#[test] +fn compacted_item_migrates_legacy_numeric_window_id() -> Result<()> { + let item = serde_json::from_value::(json!({ + "message": "summary", + "window_id": 3, + }))?; + + assert_eq!( + item, + CompactedItem { + message: "summary".to_string(), + replacement_history: None, + window_number: Some(3), + first_window_id: None, + previous_window_id: None, + window_id: None, + } + ); + Ok(()) +} + +#[test] +fn copied_history_uses_persisted_history_mode() -> Result<()> { + let thread_id = ThreadId::from_string("00000000-0000-0000-0000-000000000001")?; + let session_meta = RolloutItem::SessionMeta(SessionMetaLine { + meta: SessionMeta { + session_id: thread_id.into(), + id: thread_id, + history_mode: ThreadHistoryMode::Legacy, + ..SessionMeta::default() + }, + git: None, + }); + let history = InitialHistory::Resumed(ResumedHistory { + conversation_id: thread_id, + history: Arc::new(vec![session_meta.clone()]), + rollout_path: None, + }); + + assert_eq!( + history.get_history_mode(ThreadHistoryMode::Paginated), + ThreadHistoryMode::Legacy + ); + assert_eq!( + InitialHistory::Forked(vec![session_meta]).get_history_mode(ThreadHistoryMode::Paginated), + ThreadHistoryMode::Legacy + ); + assert_eq!( + InitialHistory::New.get_history_mode(ThreadHistoryMode::Paginated), + ThreadHistoryMode::Paginated + ); + assert_eq!( + InitialHistory::Resumed(ResumedHistory { + conversation_id: thread_id, + history: Arc::new(Vec::new()), + rollout_path: None, + }) + .get_history_mode(ThreadHistoryMode::Paginated), + ThreadHistoryMode::Paginated + ); + Ok(()) +} + +#[test] +fn multi_agent_version_uses_newest_present_session_meta_value() -> Result<()> { + let thread_id = ThreadId::from_string("67e55044-10b1-426f-9247-bb680e5fe0c8")?; + let older_meta = SessionMetaLine { + meta: SessionMeta { + session_id: thread_id.into(), + id: thread_id, + multi_agent_version: Some(MultiAgentVersion::V2), + ..Default::default() + }, + git: None, + }; + let newer_meta_without_version = SessionMetaLine { + meta: SessionMeta { + session_id: thread_id.into(), + id: thread_id, + multi_agent_version: None, + ..Default::default() + }, + git: None, + }; + + assert_eq!( + multi_agent_version_from_items( + &[ + RolloutItem::SessionMeta(older_meta), + RolloutItem::SessionMeta(newer_meta_without_version), + ], + Some(thread_id), + ), + Some(MultiAgentVersion::V2) + ); + Ok(()) +} diff --git a/codex-rs/memories/write/src/phase1.rs b/codex-rs/memories/write/src/phase1.rs index f54646dd11..ac0684a132 100644 --- a/codex-rs/memories/write/src/phase1.rs +++ b/codex-rs/memories/write/src/phase1.rs @@ -13,9 +13,9 @@ use codex_protocol::error::CodexErr; use codex_protocol::models::BaseInstructions; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TokenUsage; use codex_rollout::INTERACTIVE_SESSION_SOURCES; +use codex_rollout::RolloutItem; use codex_rollout::should_persist_response_item_for_memories; use codex_secrets::redact_secrets; use futures::StreamExt; diff --git a/codex-rs/memories/write/src/startup_tests.rs b/codex-rs/memories/write/src/startup_tests.rs index 853ba3a2c4..7cb3d4bc78 100644 --- a/codex-rs/memories/write/src/startup_tests.rs +++ b/codex-rs/memories/write/src/startup_tests.rs @@ -26,9 +26,9 @@ use codex_protocol::openai_models::ModelsResponse; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_state::Phase2JobClaimOutcome; use codex_utils_absolute_path::test_support::PathExt; use core_test_support::responses::ResponseMock; diff --git a/codex-rs/protocol/src/compacted_item.rs b/codex-rs/protocol/src/compacted_item.rs deleted file mode 100644 index 0f437e0bb6..0000000000 --- a/codex-rs/protocol/src/compacted_item.rs +++ /dev/null @@ -1,106 +0,0 @@ -use crate::models::ResponseItem; -use crate::protocol::CompactedItem; -use serde::Deserialize; - -// Before `window_number` was introduced, the numeric window number was serialized as -// `window_id`. Accept that shape so existing rollouts remain resumable. -impl<'de> Deserialize<'de> for CompactedItem { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let serialized = SerializedCompactedItem::deserialize(deserializer)?; - let mut window_number = serialized.window_number; - let window_id = match serialized.window_id { - Some(SerializedWindowId::Id(window_id)) => Some(window_id), - Some(SerializedWindowId::LegacyWindowNumber(legacy_window_number)) => { - window_number.get_or_insert(legacy_window_number); - None - } - None => None, - }; - Ok(Self { - message: serialized.message, - replacement_history: serialized.replacement_history, - window_number, - first_window_id: serialized.first_window_id, - previous_window_id: serialized.previous_window_id, - window_id, - }) - } -} - -#[derive(Deserialize)] -struct SerializedCompactedItem { - message: String, - #[serde(default)] - replacement_history: Option>, - #[serde(default)] - window_number: Option, - #[serde(default)] - first_window_id: Option, - #[serde(default)] - previous_window_id: Option, - #[serde(default)] - window_id: Option, -} - -#[derive(Deserialize)] -#[serde(untagged)] -enum SerializedWindowId { - Id(String), - LegacyWindowNumber(u64), -} - -#[cfg(test)] -mod tests { - use super::*; - use anyhow::Result; - use pretty_assertions::assert_eq; - use serde_json::json; - - #[test] - fn serializes_window_number_and_id() -> Result<()> { - let item = CompactedItem { - message: "summary".to_string(), - replacement_history: None, - window_number: Some(3), - first_window_id: Some("019b3f6e-0000-7000-8000-000000000001".to_string()), - previous_window_id: Some("019b3f6e-0000-7000-8000-000000000002".to_string()), - window_id: Some("019b3f6e-7a10-7cc3-8b6e-1d09e2f7a001".to_string()), - }; - - assert_eq!( - serde_json::to_value(item)?, - json!({ - "message": "summary", - "window_number": 3, - "first_window_id": "019b3f6e-0000-7000-8000-000000000001", - "previous_window_id": "019b3f6e-0000-7000-8000-000000000002", - "window_id": "019b3f6e-7a10-7cc3-8b6e-1d09e2f7a001", - }) - ); - Ok(()) - } - - #[test] - fn migrates_legacy_numeric_window_id() -> Result<()> { - let item = serde_json::from_value::(json!({ - "message": "summary", - "window_id": 3, - }))?; - - assert_eq!( - item, - CompactedItem { - message: "summary".to_string(), - replacement_history: None, - window_number: Some(3), - first_window_id: None, - previous_window_id: None, - window_id: None, - } - ); - Ok(()) - } -} diff --git a/codex-rs/protocol/src/lib.rs b/codex-rs/protocol/src/lib.rs index 28fff2120a..c34828c3f1 100644 --- a/codex-rs/protocol/src/lib.rs +++ b/codex-rs/protocol/src/lib.rs @@ -13,7 +13,6 @@ pub use tool_name::DEFAULT_FUNCTION_NAMESPACE; pub use tool_name::ToolName; pub mod approvals; pub mod capabilities; -mod compacted_item; pub mod config_types; pub mod dynamic_tools; pub mod error; diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 48f0d36567..4398896b3f 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -10,7 +10,6 @@ use std::ops::Mul; use std::path::Path; use std::path::PathBuf; use std::str::FromStr; -use std::sync::Arc; use std::time::Duration; use strum_macros::EnumIter; @@ -2564,207 +2563,6 @@ pub struct ConversationPathResponseEvent { pub path: PathBuf, } -#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, TS)] -pub struct ResumedHistory { - pub conversation_id: ThreadId, - pub history: Arc>, - pub rollout_path: Option, -} - -#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, TS)] -pub enum InitialHistory { - New, - Cleared, - Resumed(ResumedHistory), - Forked(Vec), -} - -impl InitialHistory { - pub fn scan_rollout_items(&self, mut predicate: impl FnMut(&RolloutItem) -> bool) -> bool { - match self { - InitialHistory::New | InitialHistory::Cleared => false, - InitialHistory::Resumed(resumed) => resumed.history.iter().any(&mut predicate), - InitialHistory::Forked(items) => items.iter().any(predicate), - } - } - - pub fn forked_from_id(&self) -> Option { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => { - resumed.history.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => meta_line.meta.forked_from_id, - _ => None, - }) - } - InitialHistory::Forked(items) => items.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => Some(meta_line.meta.id), - _ => None, - }), - } - } - - pub fn session_cwd(&self) -> Option { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => session_cwd_from_items(&resumed.history), - InitialHistory::Forked(items) => session_cwd_from_items(items), - } - } - - pub fn get_rollout_items(&self) -> &[RolloutItem] { - match self { - InitialHistory::New | InitialHistory::Cleared => &[], - InitialHistory::Resumed(resumed) => &resumed.history, - InitialHistory::Forked(items) => items, - } - } - - pub fn get_event_msgs(&self) -> Option> { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => Some( - resumed - .history - .iter() - .filter_map(|ri| match ri { - RolloutItem::EventMsg(ev) => Some(ev.clone()), - _ => None, - }) - .collect(), - ), - InitialHistory::Forked(items) => Some( - items - .iter() - .filter_map(|ri| match ri { - RolloutItem::EventMsg(ev) => Some(ev.clone()), - _ => None, - }) - .collect(), - ), - } - } - - pub fn get_base_instructions(&self) -> Option { - // TODO: SessionMeta should (in theory) always be first in the history, so we can probably only check the first item? - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => { - resumed.history.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => meta_line.meta.base_instructions.clone(), - _ => None, - }) - } - InitialHistory::Forked(items) => items.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => meta_line.meta.base_instructions.clone(), - _ => None, - }), - } - } - - pub fn get_dynamic_tools(&self) -> Option> { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => { - resumed.history.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => meta_line.meta.dynamic_tools.clone(), - _ => None, - }) - } - InitialHistory::Forked(items) => items.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => meta_line.meta.dynamic_tools.clone(), - _ => None, - }), - } - } - - pub fn get_selected_capability_roots(&self) -> Vec { - self.get_session_meta() - .map(|meta| meta.selected_capability_roots.clone()) - .unwrap_or_default() - } - - pub fn get_multi_agent_version(&self) -> Option { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => { - multi_agent_version_from_items(&resumed.history, Some(resumed.conversation_id)) - } - InitialHistory::Forked(items) => { - multi_agent_version_from_items(items, /*thread_id*/ None) - } - } - } - - pub fn get_history_mode(&self, default_history_mode: ThreadHistoryMode) -> ThreadHistoryMode { - match self { - InitialHistory::New | InitialHistory::Cleared => default_history_mode, - // Forks copy their source rollout items as-is, so they must keep - // the source format instead of converting to the destination default. - InitialHistory::Resumed(_) | InitialHistory::Forked(_) => self - .get_session_meta() - .map(|meta| meta.history_mode) - .unwrap_or(default_history_mode), - } - } - - pub fn get_resumed_session_sources(&self) -> Option<(SessionSource, Option)> { - let meta = self.get_resumed_session_meta()?; - Some((meta.source.clone(), meta.thread_source.clone())) - } - - pub fn get_resumed_thread_source(&self) -> Option { - self.get_resumed_session_meta() - .and_then(|meta| meta.thread_source.clone()) - } - - pub fn get_session_originator(&self) -> Option { - self.get_session_meta() - .map(|meta| meta.originator.clone()) - .filter(|originator| !originator.is_empty()) - } - - pub fn get_resumed_parent_thread_id(&self) -> Option { - self.get_resumed_session_meta() - .and_then(|meta| meta.parent_thread_id) - } - - fn get_session_meta(&self) -> Option<&SessionMeta> { - match self { - InitialHistory::New | InitialHistory::Cleared => None, - InitialHistory::Resumed(resumed) => { - resumed.history.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), - _ => None, - }) - } - InitialHistory::Forked(items) => items.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), - _ => None, - }), - } - } - - fn get_resumed_session_meta(&self) -> Option<&SessionMeta> { - match self { - InitialHistory::New | InitialHistory::Cleared | InitialHistory::Forked(_) => None, - InitialHistory::Resumed(resumed) => { - resumed.history.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => Some(&meta_line.meta), - _ => None, - }) - } - } - } -} - -fn session_cwd_from_items(items: &[RolloutItem]) -> Option { - items.iter().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) => Some(meta_line.meta.cwd.clone()), - _ => None, - }) -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] #[serde(rename_all = "lowercase")] #[ts(rename_all = "lowercase")] @@ -3017,33 +2815,6 @@ impl fmt::Display for InternalSessionSource { } } -fn multi_agent_version_from_items( - items: &[RolloutItem], - thread_id: Option, -) -> Option { - let session_meta_version = items.iter().rev().find_map(|item| match item { - RolloutItem::SessionMeta(meta_line) - if thread_id.is_none_or(|thread_id| meta_line.meta.id == thread_id) => - { - meta_line.meta.multi_agent_version - } - _ => None, - }); - - session_meta_version.or_else(|| { - items.iter().rev().find_map(|item| match item { - RolloutItem::TurnContext(turn_context) => turn_context.multi_agent_version, - RolloutItem::SessionMeta(_) - | RolloutItem::ResponseItem(_) - | RolloutItem::InterAgentCommunication(_) - | RolloutItem::InterAgentCommunicationMetadata { .. } - | RolloutItem::Compacted(_) - | RolloutItem::WorldState(_) - | RolloutItem::EventMsg(_) => None, - }) - }) -} - #[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS)] #[serde(rename_all = "snake_case")] #[ts(rename_all = "snake_case")] @@ -3208,23 +2979,6 @@ impl<'de> Deserialize<'de> for SessionMetaLine { } } -#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, TS)] -#[serde(tag = "type", content = "payload", rename_all = "snake_case")] -pub enum RolloutItem { - SessionMeta(SessionMetaLine), - ResponseItem(ResponseItem), - /// Legacy delivery item reconstructed as a model-visible `agent_message`. - InterAgentCommunication(InterAgentCommunication), - /// Local delivery metadata that is not part of the Responses API item. - InterAgentCommunicationMetadata { - trigger_turn: bool, - }, - Compacted(CompactedItem), - TurnContext(TurnContextItem), - WorldState(WorldStateItem), - EventMsg(EventMsg), -} - /// Persisted comparison state used to resume model-visible world-state diffing. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, TS)] pub struct WorldStateItem { @@ -3243,39 +2997,6 @@ impl WorldStateItem { } } -#[derive(Serialize, Clone, Debug, PartialEq, JsonSchema, TS)] -pub struct CompactedItem { - pub message: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub replacement_history: Option>, - /// Monotonic position of this context window within the thread. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub window_number: Option, - /// UUIDv7 identity of the first context window in this thread's window chain. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub first_window_id: Option, - /// UUIDv7 identity of the context window immediately before this one. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub previous_window_id: Option, - /// UUIDv7 identity of this context window. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub window_id: Option, -} - -impl From for ResponseItem { - fn from(value: CompactedItem) -> Self { - ResponseItem::Message { - id: None, - role: "assistant".to_string(), - content: vec![ContentItem::OutputText { - text: value.message, - }], - phase: None, - internal_chat_message_metadata_passthrough: None, - } - } -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS)] pub struct TurnContextNetworkItem { pub allowed_domains: Vec, @@ -3403,15 +3124,6 @@ impl Mul for TruncationPolicy { } } -#[derive(Serialize, Deserialize, Clone, JsonSchema)] -pub struct RolloutLine { - pub timestamp: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub ordinal: Option, - #[serde(flatten)] - pub item: RolloutItem, -} - #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, TS)] pub struct GitInfo { /// Current commit hash (SHA) @@ -6006,49 +5718,6 @@ mod tests { Ok(()) } - #[test] - fn copied_history_uses_persisted_history_mode() -> Result<()> { - let thread_id = ThreadId::from_string("00000000-0000-0000-0000-000000000001")?; - let session_meta = RolloutItem::SessionMeta(SessionMetaLine { - meta: SessionMeta { - session_id: thread_id.into(), - id: thread_id, - history_mode: ThreadHistoryMode::Legacy, - ..SessionMeta::default() - }, - git: None, - }); - let history = InitialHistory::Resumed(ResumedHistory { - conversation_id: thread_id, - history: Arc::new(vec![session_meta.clone()]), - rollout_path: None, - }); - - assert_eq!( - history.get_history_mode(ThreadHistoryMode::Paginated), - ThreadHistoryMode::Legacy - ); - assert_eq!( - InitialHistory::Forked(vec![session_meta]) - .get_history_mode(ThreadHistoryMode::Paginated), - ThreadHistoryMode::Legacy - ); - assert_eq!( - InitialHistory::New.get_history_mode(ThreadHistoryMode::Paginated), - ThreadHistoryMode::Paginated - ); - assert_eq!( - InitialHistory::Resumed(ResumedHistory { - conversation_id: thread_id, - history: Arc::new(Vec::new()), - rollout_path: None, - }) - .get_history_mode(ThreadHistoryMode::Paginated), - ThreadHistoryMode::Paginated - ); - Ok(()) - } - #[test] fn turn_context_item_deserializes_without_network() -> Result<()> { let item: TurnContextItem = serde_json::from_value(json!({ @@ -6079,41 +5748,6 @@ mod tests { Ok(()) } - #[test] - fn multi_agent_version_uses_newest_present_session_meta_value() -> Result<()> { - let thread_id = ThreadId::from_string("67e55044-10b1-426f-9247-bb680e5fe0c8")?; - let older_meta = SessionMetaLine { - meta: SessionMeta { - session_id: thread_id.into(), - id: thread_id, - multi_agent_version: Some(MultiAgentVersion::V2), - ..Default::default() - }, - git: None, - }; - let newer_meta_without_version = SessionMetaLine { - meta: SessionMeta { - session_id: thread_id.into(), - id: thread_id, - multi_agent_version: None, - ..Default::default() - }, - git: None, - }; - - assert_eq!( - multi_agent_version_from_items( - &[ - RolloutItem::SessionMeta(older_meta), - RolloutItem::SessionMeta(newer_meta_without_version), - ], - Some(thread_id), - ), - Some(MultiAgentVersion::V2) - ); - Ok(()) - } - #[test] fn turn_context_item_serializes_network_when_present() -> Result<()> { let item = TurnContextItem { diff --git a/codex-rs/rollout/Cargo.toml b/codex-rs/rollout/Cargo.toml index 13d379c117..1bb4b54f14 100644 --- a/codex-rs/rollout/Cargo.toml +++ b/codex-rs/rollout/Cargo.toml @@ -18,6 +18,7 @@ chrono = { workspace = true, features = ["serde"] } codex-extension-items = { workspace = true } codex-file-search = { workspace = true } codex-git-utils = { workspace = true } +codex-history = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-state = { workspace = true } diff --git a/codex-rs/rollout/src/compression_tests.rs b/codex-rs/rollout/src/compression_tests.rs index be0aa7895c..94ecebc12a 100644 --- a/codex-rs/rollout/src/compression_tests.rs +++ b/codex-rs/rollout/src/compression_tests.rs @@ -6,12 +6,12 @@ use std::os::unix::fs::PermissionsExt; use std::time::Duration; use std::time::SystemTime; +use crate::InitialHistory; +use crate::RolloutItem; +use crate::RolloutLine; use codex_protocol::ThreadId; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::InitialHistory; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/rollout/src/lib.rs b/codex-rs/rollout/src/lib.rs index 3618ecf8ac..b5713bfd80 100644 --- a/codex-rs/rollout/src/lib.rs +++ b/codex-rs/rollout/src/lib.rs @@ -21,6 +21,11 @@ pub(crate) mod session_index; mod sqlite_metrics; pub mod state_db; +pub use codex_history::CompactedItem; +pub use codex_history::InitialHistory; +pub use codex_history::ResumedHistory; +pub use codex_history::RolloutItem; +pub use codex_history::RolloutLine; pub(crate) use codex_protocol::protocol; pub const SESSIONS_SUBDIR: &str = "sessions"; diff --git a/codex-rs/rollout/src/list.rs b/codex-rs/rollout/src/list.rs index 376e54a24f..33b0560819 100644 --- a/codex-rs/rollout/src/list.rs +++ b/codex-rs/rollout/src/list.rs @@ -18,13 +18,13 @@ use uuid::Uuid; use super::ARCHIVED_SESSIONS_SUBDIR; use super::SESSIONS_SUBDIR; use super::compression; +use crate::RolloutItem; +use crate::RolloutLine; use crate::protocol::EventMsg; use crate::state_db; use codex_file_search as file_search; use codex_protocol::ThreadId; use codex_protocol::items::TurnItem; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; diff --git a/codex-rs/rollout/src/metadata.rs b/codex-rs/rollout/src/metadata.rs index b62e1e463d..99fd4d9d93 100644 --- a/codex-rs/rollout/src/metadata.rs +++ b/codex-rs/rollout/src/metadata.rs @@ -1,4 +1,5 @@ use crate::ARCHIVED_SESSIONS_SUBDIR; +use crate::RolloutItem; use crate::SESSIONS_SUBDIR; use crate::compression; use crate::list::parse_timestamp_uuid_from_filename; @@ -10,7 +11,6 @@ use chrono::Timelike; use chrono::Utc; use codex_protocol::ThreadId; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/rollout/src/metadata_tests.rs b/codex-rs/rollout/src/metadata_tests.rs index cce72a642d..58f8fbdeef 100644 --- a/codex-rs/rollout/src/metadata_tests.rs +++ b/codex-rs/rollout/src/metadata_tests.rs @@ -1,15 +1,15 @@ #![allow(warnings, clippy::all)] use super::*; +use crate::CompactedItem; +use crate::RolloutItem; +use crate::RolloutLine; use chrono::DateTime; use chrono::NaiveDateTime; use chrono::Timelike; use chrono::Utc; use codex_protocol::ThreadId; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::GitInfo; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/rollout/src/model_context.rs b/codex-rs/rollout/src/model_context.rs index 45fc5de6bf..f333689b35 100644 --- a/codex-rs/rollout/src/model_context.rs +++ b/codex-rs/rollout/src/model_context.rs @@ -1,8 +1,8 @@ +use crate::RolloutItem; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InterAgentCommunication; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMetaLine; /// Whether a reverse model-context scan needs more rollout items. diff --git a/codex-rs/rollout/src/ordinal.rs b/codex-rs/rollout/src/ordinal.rs index 2d2fea6a76..14483ce706 100644 --- a/codex-rs/rollout/src/ordinal.rs +++ b/codex-rs/rollout/src/ordinal.rs @@ -6,9 +6,9 @@ use std::io::Seek; use std::io::SeekFrom; use std::path::Path; +use crate::RolloutItem; +use crate::RolloutLine; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadHistoryMode; use crate::reverse_jsonl_scanner::ReverseJsonlScanner; diff --git a/codex-rs/rollout/src/persistence_metrics.rs b/codex-rs/rollout/src/persistence_metrics.rs index d2b4db188a..3f1bc15756 100644 --- a/codex-rs/rollout/src/persistence_metrics.rs +++ b/codex-rs/rollout/src/persistence_metrics.rs @@ -2,12 +2,12 @@ use std::io::Write; use std::sync::Arc; use std::sync::Mutex; +use crate::RolloutItem; use codex_otel::MetricsClient; use codex_protocol::ThreadId; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use crate::policy::is_persisted_rollout_item; diff --git a/codex-rs/rollout/src/persistence_metrics_tests.rs b/codex-rs/rollout/src/persistence_metrics_tests.rs index 46f70bdf84..f53c0bb1f1 100644 --- a/codex-rs/rollout/src/persistence_metrics_tests.rs +++ b/codex-rs/rollout/src/persistence_metrics_tests.rs @@ -1,3 +1,4 @@ +use crate::RolloutItem; use codex_protocol::ThreadId; use codex_protocol::items::EnteredReviewModeItem; use codex_protocol::items::ExitedReviewModeItem; @@ -10,7 +11,6 @@ use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExitedReviewModeEvent; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::ReviewTarget; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::TurnAbortReason; use codex_protocol::protocol::TurnAbortedEvent; diff --git a/codex-rs/rollout/src/policy.rs b/codex-rs/rollout/src/policy.rs index 22718f6c95..345da9e7f1 100644 --- a/codex-rs/rollout/src/policy.rs +++ b/codex-rs/rollout/src/policy.rs @@ -1,5 +1,5 @@ +use crate::RolloutItem; use crate::protocol::EventMsg; -use crate::protocol::RolloutItem; use codex_extension_items::ExtensionItem; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/rollout/src/recorder.rs b/codex-rs/rollout/src/recorder.rs index 8c1dd81c37..aa210c2ba9 100644 --- a/codex-rs/rollout/src/recorder.rs +++ b/codex-rs/rollout/src/recorder.rs @@ -52,6 +52,10 @@ use super::metadata; use super::ordinal::RolloutOrdinalState; use super::ordinal::ordinal_state_for_rollout; use super::session_index::find_thread_names_by_ids; +use crate::InitialHistory; +use crate::ResumedHistory; +use crate::RolloutItem; +use crate::RolloutLine; use crate::config::RolloutConfigView; use crate::state_db; use crate::state_db::StateDbHandle; @@ -59,11 +63,7 @@ use codex_git_utils::collect_git_info; use codex_git_utils::get_git_repo_root; use codex_protocol::protocol::GitInfo as ProtocolGitInfo; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::ResumedHistory; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionContextWindow; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; diff --git a/codex-rs/rollout/src/recorder_tests.rs b/codex-rs/rollout/src/recorder_tests.rs index f3394be5bf..7279a73e34 100644 --- a/codex-rs/rollout/src/recorder_tests.rs +++ b/codex-rs/rollout/src/recorder_tests.rs @@ -1,6 +1,8 @@ #![allow(warnings, clippy::all)] use super::*; +use crate::RolloutItem; +use crate::RolloutLine; use crate::config::RolloutConfig; use chrono::TimeZone; use codex_protocol::SessionId; @@ -10,8 +12,6 @@ use codex_protocol::protocol::AgentMessageEvent; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; diff --git a/codex-rs/rollout/src/search.rs b/codex-rs/rollout/src/search.rs index dc11ff0bc0..d292b24d33 100644 --- a/codex-rs/rollout/src/search.rs +++ b/codex-rs/rollout/src/search.rs @@ -5,11 +5,11 @@ use std::path::Path; use std::path::PathBuf; use std::process::Stdio; +use crate::RolloutItem; +use crate::RolloutLine; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::strip_user_message_prefix; use regex::Regex; use regex::RegexBuilder; diff --git a/codex-rs/rollout/src/session_index_tests.rs b/codex-rs/rollout/src/session_index_tests.rs index 0cc20e33b2..419701e537 100644 --- a/codex-rs/rollout/src/session_index_tests.rs +++ b/codex-rs/rollout/src/session_index_tests.rs @@ -1,8 +1,8 @@ #![allow(warnings, clippy::all)] use super::*; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; +use crate::RolloutItem; +use crate::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/rollout/src/state_db.rs b/codex-rs/rollout/src/state_db.rs index b0e8bb6427..f2ab6f20e3 100644 --- a/codex-rs/rollout/src/state_db.rs +++ b/codex-rs/rollout/src/state_db.rs @@ -1,3 +1,4 @@ +use crate::RolloutItem; use crate::config::RolloutConfig; use crate::config::RolloutConfigView; use crate::list::Cursor; @@ -9,7 +10,6 @@ use anyhow::Context; use chrono::DateTime; use chrono::Utc; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; pub use codex_state::LogEntry; diff --git a/codex-rs/rollout/src/state_db_tests.rs b/codex-rs/rollout/src/state_db_tests.rs index 36216ffa50..c9e8e28d92 100644 --- a/codex-rs/rollout/src/state_db_tests.rs +++ b/codex-rs/rollout/src/state_db_tests.rs @@ -1,13 +1,13 @@ #![allow(warnings, clippy::all)] use super::*; +use crate::RolloutLine; use crate::list::parse_cursor; use chrono::DateTime; use chrono::NaiveDateTime; use chrono::Timelike; use chrono::Utc; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::ThreadHistoryMode; diff --git a/codex-rs/rollout/src/tests.rs b/codex-rs/rollout/src/tests.rs index 5a7d0c1b9a..2918804e91 100644 --- a/codex-rs/rollout/src/tests.rs +++ b/codex-rs/rollout/src/tests.rs @@ -20,6 +20,8 @@ use time::macros::format_description; use uuid::Uuid; use crate::INTERACTIVE_SESSION_SOURCES; +use crate::RolloutItem; +use crate::RolloutLine; use crate::find_thread_path_by_id_str; use crate::list::Cursor; use crate::list::ThreadItem; @@ -33,8 +35,6 @@ use codex_protocol::ThreadId; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; diff --git a/codex-rs/state/Cargo.toml b/codex-rs/state/Cargo.toml index 560255a222..0d781fbff2 100644 --- a/codex-rs/state/Cargo.toml +++ b/codex-rs/state/Cargo.toml @@ -7,6 +7,7 @@ license.workspace = true [dependencies] anyhow = { workspace = true } chrono = { workspace = true } +codex-history = { workspace = true } codex-protocol = { workspace = true } codex-utils-absolute-path = { workspace = true } libsqlite3-sys = { workspace = true } diff --git a/codex-rs/state/src/extract.rs b/codex-rs/state/src/extract.rs index 9780ce3507..c60bdbdcb8 100644 --- a/codex-rs/state/src/extract.rs +++ b/codex-rs/state/src/extract.rs @@ -1,8 +1,8 @@ use crate::model::ThreadMetadata; +use codex_history::RolloutItem; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::TurnContextItem; use codex_protocol::protocol::UserMessageEvent; @@ -168,6 +168,7 @@ mod tests { use crate::model::ThreadMetadata; use chrono::DateTime; use chrono::Utc; + use codex_history::RolloutItem; use codex_protocol::ThreadId; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::CollaborationMode; @@ -183,7 +184,6 @@ mod tests { use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; - use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; diff --git a/codex-rs/state/src/runtime.rs b/codex-rs/state/src/runtime.rs index dd9c84a822..9029fdef6d 100644 --- a/codex-rs/state/src/runtime.rs +++ b/codex-rs/state/src/runtime.rs @@ -23,8 +23,8 @@ use crate::telemetry::DbKind; use crate::telemetry::DbTelemetry; use chrono::DateTime; use chrono::Utc; +use codex_history::RolloutItem; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; use serde_json::Value; use sqlx::QueryBuilder; use sqlx::Row; diff --git a/codex-rs/thread-store/src/in_memory.rs b/codex-rs/thread-store/src/in_memory.rs index bca9e07df9..c8235f0f7f 100644 --- a/codex-rs/thread-store/src/in_memory.rs +++ b/codex-rs/thread-store/src/in_memory.rs @@ -11,12 +11,12 @@ use chrono::Utc; use codex_protocol::ThreadId; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionContextWindow; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; +use codex_rollout::RolloutItem; use codex_rollout::persisted_rollout_items; use crate::AppendThreadItemsParams; diff --git a/codex-rs/thread-store/src/live_thread.rs b/codex-rs/thread-store/src/live_thread.rs index 509671d80d..0052c7fd0b 100644 --- a/codex-rs/thread-store/src/live_thread.rs +++ b/codex-rs/thread-store/src/live_thread.rs @@ -2,9 +2,9 @@ use std::path::PathBuf; use std::sync::Arc; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; +use codex_rollout::RolloutItem; use codex_rollout::RolloutPersistenceTelemetry; use codex_rollout::measure_and_filter_rollout_items; use codex_rollout::persisted_rollout_items; diff --git a/codex-rs/thread-store/src/local/live_writer.rs b/codex-rs/thread-store/src/local/live_writer.rs index fc54cea8c4..769a58ea03 100644 --- a/codex-rs/thread-store/src/local/live_writer.rs +++ b/codex-rs/thread-store/src/local/live_writer.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; use codex_rollout::RolloutConfig; +use codex_rollout::RolloutItem; use codex_rollout::RolloutRecorder; use codex_rollout::RolloutRecorderParams; use codex_rollout::persisted_rollout_items; diff --git a/codex-rs/thread-store/src/local/mod.rs b/codex-rs/thread-store/src/local/mod.rs index 9213acd5be..c58c16beee 100644 --- a/codex-rs/thread-store/src/local/mod.rs +++ b/codex-rs/thread-store/src/local/mod.rs @@ -573,7 +573,6 @@ mod tests { use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; - use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; @@ -582,6 +581,7 @@ mod tests { use codex_protocol::protocol::TurnContextItem; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; + use codex_rollout::RolloutItem; use tempfile::TempDir; use super::*; diff --git a/codex-rs/thread-store/src/local/model_context.rs b/codex-rs/thread-store/src/local/model_context.rs index 05d7bd6047..45fd1a9e76 100644 --- a/codex-rs/thread-store/src/local/model_context.rs +++ b/codex-rs/thread-store/src/local/model_context.rs @@ -2,13 +2,13 @@ use std::fs::File; use std::io; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_rollout::ModelContextScan; use codex_rollout::ModelContextScanProgress; use codex_rollout::ReverseJsonlScanner; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_rollout::ScanOutcome; use super::LocalThreadStore; diff --git a/codex-rs/thread-store/src/local/model_context_tests.rs b/codex-rs/thread-store/src/local/model_context_tests.rs index 26dca54cb7..882e3998f0 100644 --- a/codex-rs/thread-store/src/local/model_context_tests.rs +++ b/codex-rs/thread-store/src/local/model_context_tests.rs @@ -11,18 +11,18 @@ use codex_protocol::models::AgentMessageInputContent; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HistoryPosition; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnContextItem; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::user_input::UserInput; +use codex_rollout::CompactedItem; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use pretty_assertions::assert_eq; use tempfile::TempDir; use uuid::Uuid; diff --git a/codex-rs/thread-store/src/local/read_thread.rs b/codex-rs/thread-store/src/local/read_thread.rs index 2c2042281a..fa2a6621c7 100644 --- a/codex-rs/thread-store/src/local/read_thread.rs +++ b/codex-rs/thread-store/src/local/read_thread.rs @@ -327,7 +327,7 @@ async fn read_thread_from_rollout_path( pub(super) async fn load_history_items( path: &std::path::Path, -) -> ThreadStoreResult> { +) -> ThreadStoreResult> { let (items, _, _) = RolloutRecorder::load_rollout_items(path) .await .map_err(|err| ThreadStoreError::Internal { @@ -577,11 +577,11 @@ mod tests { use codex_protocol::items::UserMessageItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; - use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::user_input::UserInput; + use codex_rollout::RolloutItem; use codex_state::ThreadMetadataBuilder; use pretty_assertions::assert_eq; use tempfile::TempDir; diff --git a/codex-rs/thread-store/src/local/rollout_lineage_tests.rs b/codex-rs/thread-store/src/local/rollout_lineage_tests.rs index b44729e90f..c120d5a583 100644 --- a/codex-rs/thread-store/src/local/rollout_lineage_tests.rs +++ b/codex-rs/thread-store/src/local/rollout_lineage_tests.rs @@ -3,11 +3,11 @@ use std::path::Path; use codex_protocol::ThreadId; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::ThreadHistoryMode; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use pretty_assertions::assert_eq; use tempfile::TempDir; diff --git a/codex-rs/thread-store/src/local/rollout_migration.rs b/codex-rs/thread-store/src/local/rollout_migration.rs index 201c184607..aa70a0d6d8 100644 --- a/codex-rs/thread-store/src/local/rollout_migration.rs +++ b/codex-rs/thread-store/src/local/rollout_migration.rs @@ -16,12 +16,12 @@ use chrono::DateTime; use codex_app_server_protocol::project_rollout_line; use codex_protocol::ThreadId; use codex_protocol::protocol::InternalSessionSource; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadSource; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use serde::Serialize; use tokio::fs::File; use tokio::io::AsyncBufReadExt; diff --git a/codex-rs/thread-store/src/local/rollout_migration/canonicalizer.rs b/codex-rs/thread-store/src/local/rollout_migration/canonicalizer.rs index 87ce548d5d..5093ddef60 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/canonicalizer.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/canonicalizer.rs @@ -17,11 +17,11 @@ use codex_protocol::items::parse_hook_prompt_message; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnStartedEvent; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use std::collections::HashSet; use tokio::fs::File; use tokio::io::AsyncWriteExt; diff --git a/codex-rs/thread-store/src/local/rollout_migration/line_parser.rs b/codex-rs/thread-store/src/local/rollout_migration/line_parser.rs index dd71bcd8e5..4d004a533c 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/line_parser.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/line_parser.rs @@ -9,7 +9,7 @@ //! into paginated history. use chrono::DateTime; -use codex_protocol::protocol::RolloutLine; +use codex_rollout::RolloutLine; use codex_utils_path_uri::LegacyAppPathString; use codex_utils_path_uri::PathUri; use serde_json::Map; diff --git a/codex-rs/thread-store/src/local/rollout_migration/line_parser_tests.rs b/codex-rs/thread-store/src/local/rollout_migration/line_parser_tests.rs index ea1d31cbba..7992fba8f1 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/line_parser_tests.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/line_parser_tests.rs @@ -1,5 +1,5 @@ use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::RolloutItem; use pretty_assertions::assert_eq; use serde_json::json; diff --git a/codex-rs/thread-store/src/local/rollout_migration/publish.rs b/codex-rs/thread-store/src/local/rollout_migration/publish.rs index cd42249970..29d0390750 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/publish.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/publish.rs @@ -22,8 +22,8 @@ use std::os::unix::fs::OpenOptionsExt; use std::os::unix::fs::PermissionsExt; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use tokio::fs::File; use tokio::io::AsyncBufReadExt; use tokio::io::AsyncWriteExt; diff --git a/codex-rs/thread-store/src/local/rollout_migration/rollback_plan.rs b/codex-rs/thread-store/src/local/rollout_migration/rollback_plan.rs index d28c1c09a2..9f1b253a79 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/rollback_plan.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/rollback_plan.rs @@ -10,11 +10,11 @@ use std::collections::HashMap; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::UserMessageEvent; +use codex_rollout::CompactedItem; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use super::migration_error; use super::rollback; diff --git a/codex-rs/thread-store/src/local/rollout_migration/rollback_replay.rs b/codex-rs/thread-store/src/local/rollout_migration/rollback_replay.rs index 8d0cb30fd9..bdc3d3738c 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/rollback_replay.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/rollback_replay.rs @@ -6,7 +6,7 @@ //! the model. use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; +use codex_rollout::RolloutItem; use super::rollback; diff --git a/codex-rs/thread-store/src/local/rollout_migration/startup_tests.rs b/codex-rs/thread-store/src/local/rollout_migration/startup_tests.rs index e33c2f4133..041dd1df45 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/startup_tests.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/startup_tests.rs @@ -6,14 +6,14 @@ use std::time::Duration; use codex_protocol::ThreadId; use codex_protocol::protocol::EventMsg; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::UserMessageEvent; use codex_rollout::RolloutConfig; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_rollout::RolloutRecorder; use pretty_assertions::assert_eq; use tempfile::TempDir; diff --git a/codex-rs/thread-store/src/local/rollout_migration/subagent.rs b/codex-rs/thread-store/src/local/rollout_migration/subagent.rs index 54cfc75909..775b6f447d 100644 --- a/codex-rs/thread-store/src/local/rollout_migration/subagent.rs +++ b/codex-rs/thread-store/src/local/rollout_migration/subagent.rs @@ -12,11 +12,11 @@ use std::fs::File; use std::path::PathBuf; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMetaLine; use codex_rollout::ModelContextScan; use codex_rollout::ModelContextScanProgress; use codex_rollout::ReverseJsonlScanner; +use codex_rollout::RolloutItem; use codex_rollout::ScanOutcome; use serde_json::Value; diff --git a/codex-rs/thread-store/src/local/rollout_migration_tests.rs b/codex-rs/thread-store/src/local/rollout_migration_tests.rs index bdad98164f..f1c98f286f 100644 --- a/codex-rs/thread-store/src/local/rollout_migration_tests.rs +++ b/codex-rs/thread-store/src/local/rollout_migration_tests.rs @@ -16,12 +16,9 @@ use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AgentMessageEvent; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; @@ -33,7 +30,10 @@ use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnContextItem; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; +use codex_rollout::CompactedItem; use codex_rollout::RolloutConfig; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use pretty_assertions::assert_eq; use serde_json::json; use tempfile::TempDir; diff --git a/codex-rs/thread-store/src/local/thread_history/read_tests.rs b/codex-rs/thread-store/src/local/thread_history/read_tests.rs index ea771b68c7..aa5adae78f 100644 --- a/codex-rs/thread-store/src/local/thread_history/read_tests.rs +++ b/codex-rs/thread-store/src/local/thread_history/read_tests.rs @@ -6,12 +6,12 @@ use codex_app_server_protocol::CodexErrorInfo; use codex_protocol::ThreadId; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HistoryPosition; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use pretty_assertions::assert_eq; use tempfile::TempDir; diff --git a/codex-rs/thread-store/src/local/thread_history_materialization.rs b/codex-rs/thread-store/src/local/thread_history_materialization.rs index 9dced72551..2901d4a9b5 100644 --- a/codex-rs/thread-store/src/local/thread_history_materialization.rs +++ b/codex-rs/thread-store/src/local/thread_history_materialization.rs @@ -5,7 +5,7 @@ use chrono::DateTime; use codex_app_server_protocol::ThreadHistoryChangeSet; use codex_app_server_protocol::project_rollout_line; use codex_protocol::ThreadId; -use codex_protocol::protocol::RolloutLine; +use codex_rollout::RolloutLine; use tokio::io::AsyncReadExt; use tokio::io::AsyncSeekExt; use tracing::warn; diff --git a/codex-rs/thread-store/src/local/thread_history_materialization_tests.rs b/codex-rs/thread-store/src/local/thread_history_materialization_tests.rs index 465d401a74..516c80ecb3 100644 --- a/codex-rs/thread-store/src/local/thread_history_materialization_tests.rs +++ b/codex-rs/thread-store/src/local/thread_history_materialization_tests.rs @@ -19,8 +19,6 @@ use codex_protocol::protocol::HistoryPosition; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::RateLimitSnapshot; use codex_protocol::protocol::RateLimitWindow; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; @@ -29,6 +27,8 @@ use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; use codex_rollout::RolloutConfig; +use codex_rollout::RolloutItem; +use codex_rollout::RolloutLine; use codex_rollout::RolloutRecorder; use codex_rollout::RolloutRecorderParams; use codex_utils_absolute_path::test_support::PathExt; diff --git a/codex-rs/thread-store/src/local/update_thread_metadata.rs b/codex-rs/thread-store/src/local/update_thread_metadata.rs index 44952e3c7f..b4491f3cd4 100644 --- a/codex-rs/thread-store/src/local/update_thread_metadata.rs +++ b/codex-rs/thread-store/src/local/update_thread_metadata.rs @@ -4,11 +4,11 @@ use std::path::PathBuf; use chrono::Utc; use codex_protocol::ThreadId; use codex_protocol::protocol::GitInfo; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; use codex_rollout::ARCHIVED_SESSIONS_SUBDIR; +use codex_rollout::RolloutItem; use codex_rollout::append_rollout_item_to_path; use codex_rollout::append_thread_name; use codex_rollout::find_archived_thread_path_by_id_str; diff --git a/codex-rs/thread-store/src/thread_metadata_sync.rs b/codex-rs/thread-store/src/thread_metadata_sync.rs index d320ecb5bc..e5a2d34036 100644 --- a/codex-rs/thread-store/src/thread_metadata_sync.rs +++ b/codex-rs/thread-store/src/thread_metadata_sync.rs @@ -10,12 +10,12 @@ use codex_protocol::ThreadId; use codex_protocol::items::TurnItem; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::GitInfo; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode; use codex_protocol::protocol::UserMessageEvent; use codex_protocol::protocol::strip_user_message_prefix; use codex_protocol::protocol::user_message_preview; +use codex_rollout::RolloutItem; use codex_state::ThreadMetadata; use crate::CreateThreadParams; @@ -412,7 +412,6 @@ mod tests { use codex_protocol::models::PermissionProfile; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::AskForApproval; - use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ItemCompletedEvent; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionMetaLine; @@ -425,6 +424,7 @@ mod tests { use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::protocol::UserMessageEvent; use codex_protocol::user_input::UserInput; + use codex_rollout::CompactedItem; use pretty_assertions::assert_eq; use super::*; diff --git a/codex-rs/thread-store/src/types.rs b/codex-rs/thread-store/src/types.rs index d6a54a1146..39a8bc3075 100644 --- a/codex-rs/thread-store/src/types.rs +++ b/codex-rs/thread-store/src/types.rs @@ -15,12 +15,12 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::GitInfo; use codex_protocol::protocol::HistoryPosition; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::ThreadHistoryMode; use codex_protocol::protocol::ThreadMemoryMode as MemoryMode; use codex_protocol::protocol::ThreadSource; use codex_protocol::protocol::TokenUsage; +use codex_rollout::RolloutItem; use serde::Deserialize; use serde::Deserializer; use serde::Serialize; diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 8d79afc202..ca037f7b95 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -35,6 +35,7 @@ codex-cloud-config = { workspace = true } codex-config = { workspace = true } codex-connectors = { workspace = true } codex-core-plugins = { workspace = true } +codex-history = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } codex-feedback = { workspace = true } diff --git a/codex-rs/tui/src/app/tests.rs b/codex-rs/tui/src/app/tests.rs index 8507e97cc7..ca0bed69e8 100644 --- a/codex-rs/tui/src/app/tests.rs +++ b/codex-rs/tui/src/app/tests.rs @@ -94,6 +94,7 @@ use codex_app_server_protocol::TurnStatus; use codex_app_server_protocol::UserInput; use codex_app_server_protocol::UserInput as AppServerUserInput; use codex_app_server_protocol::WarningNotification; +use codex_history::RolloutItem; use codex_models_manager::test_support::construct_model_info_offline_for_tests; use codex_models_manager::test_support::get_model_offline_for_tests; use codex_otel::SessionTelemetry; @@ -113,7 +114,6 @@ use codex_protocol::openai_models::MODEL_SPECIALTY_CYBER; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::MAX_THREAD_GOAL_OBJECTIVE_CHARS; use codex_protocol::protocol::MultiAgentVersion; -use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionSource as RolloutSessionSource; use codex_protocol::protocol::SubAgentSource;