From 30587d78850abf2bfc484ffb0ab0f71497cc9c05 Mon Sep 17 00:00:00 2001 From: Brent Traut Date: Fri, 23 Oct 2026 04:45:24 +0000 Subject: [PATCH] Add experimental attached thread forks (#56351) ## What changed - Add `attachToSource` to `thread/fork` to persist a fork attached to its source without emitting `thread/started`. Attached forks require local storage and cannot use `ephemeral` or `deferGoalContinuation`. - Hide attached threads from ordinary listings and add `attachedToThreadId` to `thread/list` for explicit discovery, including empty threads. Keep this relationship separate from spawned-agent parent and ancestor filters. - Persist attachment metadata in rollouts and SQLite so it survives restarts and database recovery. Reject source deletion until its attached threads are deleted. ## Testing Add coverage for legacy and paginated history, restart and missing or corrupt database recovery, filtered listings and pagination, resume, conflicting options, and deletion safeguards across store instances. GitOrigin-RevId: 589f3174fc36f6054e75d65818360695645a5913 --- .../app-server-exports-experimental.json.zst | Bin 167535 -> 167713 bytes .../app-server-exports-stable.json.zst | Bin 160756 -> 160790 bytes .../src/protocol/v2/thread.rs | 12 + codex-rs/app-server-test-client/src/lib.rs | 1 + .../session_importer.rs | 1 + .../src/request_processors/thread_delete.rs | 10 + .../request_processors/thread_processor.rs | 64 +++- codex-rs/app-server/tests/common/rollout.rs | 2 + .../tests/suite/conversation_summary.rs | 1 + .../tests/suite/v2/attached_thread_tests.rs | 339 ++++++++++++++++++ .../tests/suite/v2/external_agent_config.rs | 7 + codex-rs/app-server/tests/suite/v2/mod.rs | 2 + .../app-server/tests/suite/v2/projects.rs | 8 + .../tests/suite/v2/remote_thread_store.rs | 74 +++- .../tests/suite/v2/sqlite_recovery.rs | 1 + .../app-server/tests/suite/v2/thread_fork.rs | 1 + .../app-server/tests/suite/v2/thread_list.rs | 13 + .../tests/suite/v2/thread_metadata_update.rs | 3 + .../app-server/tests/suite/v2/thread_read.rs | 6 + .../tests/suite/v2/thread_resume.rs | 1 + .../tests/suite/v2/thread_timeline.rs | 1 + .../tests/suite/v2/thread_unarchive.rs | 1 + .../app-server/tests/suite/v2/turn_start.rs | 1 + codex-rs/cli/tests/queue.rs | 1 + codex-rs/core/src/codex_delegate.rs | 1 + codex-rs/core/src/session/mod.rs | 3 + codex-rs/core/src/session/session.rs | 2 + codex-rs/core/src/session/tests.rs | 6 + .../core/src/session/tests/guardian_tests.rs | 1 + codex-rs/core/src/thread_manager.rs | 5 + codex-rs/core/tests/suite/sqlite_state.rs | 1 + codex-rs/exec/src/lib.rs | 2 + codex-rs/protocol/src/protocol.rs | 4 + codex-rs/rollout/src/compression_tests.rs | 1 + codex-rs/rollout/src/list.rs | 11 + codex-rs/rollout/src/metadata_tests.rs | 3 + codex-rs/rollout/src/recorder.rs | 15 + codex-rs/rollout/src/recorder_tests.rs | 48 ++- .../rollout/src/rollout_reference_index.rs | 24 +- codex-rs/rollout/src/session_index.rs | 1 + codex-rs/rollout/src/session_index_tests.rs | 1 + codex-rs/rollout/src/state_db_tests.rs | 1 + codex-rs/rollout/src/tests.rs | 1 + .../0062_threads_attached_parent.sql | 4 + codex-rs/state/src/extract.rs | 7 + codex-rs/state/src/model/thread_metadata.rs | 15 +- codex-rs/state/src/runtime/memories.rs | 3 + codex-rs/state/src/runtime/test_support.rs | 1 + codex-rs/state/src/runtime/threads.rs | 111 +++++- codex-rs/thread-store/src/in_memory.rs | 8 + .../thread-store/src/local/create_thread.rs | 1 + .../thread-store/src/local/delete_thread.rs | 41 ++- .../thread-store/src/local/list_threads.rs | 45 +-- .../thread-store/src/local/live_writer.rs | 68 ++++ codex-rs/thread-store/src/local/mod.rs | 115 ++++++ .../local/pending_thread_metadata_tests.rs | 1 + .../thread-store/src/local/revert_thread.rs | 1 + .../src/local/revert_thread_tests.rs | 1 + .../thread_history_materialization_tests.rs | 2 + .../src/local/update_thread_metadata.rs | 24 +- .../thread-store/src/thread_metadata_sync.rs | 1 + codex-rs/thread-store/src/types.rs | 7 +- codex-rs/tui/src/analytics/chats.rs | 1 + codex-rs/tui/src/app/agent_picker.rs | 1 + .../tui/src/app/agents_overview_discovery.rs | 2 + codex-rs/tui/src/dynamic_tools.rs | 1 + codex-rs/tui/src/lib.rs | 1 + codex-rs/tui/src/named_session_lookup.rs | 1 + codex-rs/tui/src/resume_picker.rs | 1 + codex-rs/tui/src/task_mentions.rs | 1 + 70 files changed, 1078 insertions(+), 68 deletions(-) create mode 100644 codex-rs/app-server/tests/suite/v2/attached_thread_tests.rs create mode 100644 codex-rs/state/migrations/0062_threads_attached_parent.sql diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst index c4b50dc236cd51b884144b5e8cee36e9df4fdaa7..c52bd5525b41821099fc9088b89dc75595314faf 100644 GIT binary patch delta 123175 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� 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 delta 122998 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 ?vh2_&Rs-cHX38f|Bi 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 z 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 L@E^)-30hSJ*pcmb 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 0592a2f3ad7a685e3656d9a3163852d642032f41..4d62ef4b2dcbff5072309284b909444a5dc2ad57 100644 GIT binary patch delta 5828 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 OPx+JE(4ojcClM8=Y#B-b delta 5794 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 diff --git a/codex-rs/app-server-protocol/src/protocol/v2/thread.rs b/codex-rs/app-server-protocol/src/protocol/v2/thread.rs index a7a76234f3..79422eba09 100644 --- a/codex-rs/app-server-protocol/src/protocol/v2/thread.rs +++ b/codex-rs/app-server-protocol/src/protocol/v2/thread.rs @@ -623,6 +623,12 @@ pub struct ThreadForkParams { pub developer_instructions: Option, #[serde(default, skip_serializing_if = "std::ops::Not::not")] pub ephemeral: bool, + /// Persist the fork as an attached thread of its resolved source, hidden from ordinary + /// lists. The source cannot be deleted while attached threads exist. Requires local storage; + /// incompatible with ephemeral and deferGoalContinuation. Omitted or false creates an ordinary fork. + #[experimental("thread/fork.attachToSource")] + #[serde(default, skip_serializing_if = "std::ops::Not::not")] + pub attach_to_source: bool, /// Optional client-supplied analytics source classification for this forked thread. #[ts(optional = nullable)] pub thread_source: Option, @@ -1483,6 +1489,12 @@ pub struct ThreadListParams { #[experimental("thread/list.ancestorThreadId")] #[ts(optional = nullable)] pub ancestor_thread_id: Option, + /// Return only persistent threads attached to this thread, including empty threads. + /// Mutually exclusive with parentThreadId and ancestorThreadId. + /// Omitting this filter keeps attached threads hidden from ordinary listings. + #[experimental("thread/list.attachedToThreadId")] + #[ts(optional = nullable)] + pub attached_to_thread_id: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)] diff --git a/codex-rs/app-server-test-client/src/lib.rs b/codex-rs/app-server-test-client/src/lib.rs index 26aeed921f..5db6d881ae 100644 --- a/codex-rs/app-server-test-client/src/lib.rs +++ b/codex-rs/app-server-test-client/src/lib.rs @@ -1168,6 +1168,7 @@ async fn thread_list(endpoint: &Endpoint, config_overrides: &[String], limit: u3 let response = client.thread_list(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(limit), 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 13fbb93627..4a05a1d078 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 @@ -455,6 +455,7 @@ impl ExternalAgentSessionImporter { }; let now = Utc::now(); let create_params = CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/app-server/src/request_processors/thread_delete.rs b/codex-rs/app-server/src/request_processors/thread_delete.rs index 7b014daa21..7fd33e0997 100644 --- a/codex-rs/app-server/src/request_processors/thread_delete.rs +++ b/codex-rs/app-server/src/request_processors/thread_delete.rs @@ -40,6 +40,16 @@ impl ThreadRequestProcessor { self.validate_root_thread_delete(thread_id, thread_ids.len() > 1) .await?; + if let Some(store) = self + .thread_store + .as_any() + .downcast_ref::() + { + store + .ensure_no_attached_threads(&thread_ids) + .await + .map_err(thread_store_delete_error)?; + } for thread_id_to_delete in thread_ids.iter().copied() { self.prepare_thread_for_delete(thread_id_to_delete).await?; } diff --git a/codex-rs/app-server/src/request_processors/thread_processor.rs b/codex-rs/app-server/src/request_processors/thread_processor.rs index 925feda55c..ffade96e3c 100644 --- a/codex-rs/app-server/src/request_processors/thread_processor.rs +++ b/codex-rs/app-server/src/request_processors/thread_processor.rs @@ -2697,6 +2697,7 @@ impl ThreadRequestProcessor { search_term, parent_thread_id, ancestor_thread_id, + attached_to_thread_id, } = params; let excluded_thread_ids = excluded_thread_ids.unwrap_or_default(); if excluded_thread_ids.len() > THREAD_LIST_MAX_EXCLUDED_IDS { @@ -2740,21 +2741,42 @@ impl ThreadRequestProcessor { } } let cwd_filters = normalize_thread_list_cwd_filters(cwd)?; - let relation_filter = match (parent_thread_id, ancestor_thread_id) { - (Some(_), Some(_)) => { + let relation_filter = match (parent_thread_id, ancestor_thread_id, attached_to_thread_id) { + (Some(_), Some(_), None) => { return Err(invalid_request( "parentThreadId and ancestorThreadId are mutually exclusive", )); } - (Some(parent_thread_id), None) => Some(StoreThreadRelationFilter::DirectChildrenOf( - ThreadId::from_string(&parent_thread_id) - .map_err(|err| invalid_request(format!("invalid parent thread id: {err}")))?, - )), - (None, Some(ancestor_thread_id)) => Some(StoreThreadRelationFilter::DescendantsOf( - ThreadId::from_string(&ancestor_thread_id) - .map_err(|err| invalid_request(format!("invalid ancestor thread id: {err}")))?, - )), - (None, None) => None, + (Some(parent_thread_id), None, None) => { + Some(StoreThreadRelationFilter::DirectChildrenOf( + ThreadId::from_string(&parent_thread_id).map_err(|err| { + invalid_request(format!("invalid parent thread id: {err}")) + })?, + )) + } + (None, Some(ancestor_thread_id), None) => { + Some(StoreThreadRelationFilter::DescendantsOf( + ThreadId::from_string(&ancestor_thread_id).map_err(|err| { + invalid_request(format!("invalid ancestor thread id: {err}")) + })?, + )) + } + (None, None, Some(parent)) => { + if self.state_db.is_none() || !self.thread_store.as_any().is::() { + return Err(unsupported_thread_store_operation("attached threads")); + } + Some(StoreThreadRelationFilter::AttachedThreadsOf( + ThreadId::from_string(&parent).map_err(|err| { + invalid_request(format!("invalid attached thread parent id: {err}")) + })?, + )) + } + (_, _, Some(_)) => { + return Err(invalid_request( + "attachedToThreadId cannot be combined with parentThreadId or ancestorThreadId", + )); + } + (None, None, None) => None, }; let requested_page_size = limit @@ -5269,11 +5291,22 @@ impl ThreadRequestProcessor { base_instructions, developer_instructions, ephemeral, + attach_to_source, thread_source, exclude_turns, defer_goal_continuation, } = params; let include_turns = !exclude_turns; + if attach_to_source { + if ephemeral || defer_goal_continuation { + return Err(invalid_request( + "attachToSource cannot be combined with ephemeral or deferGoalContinuation", + )); + } + if self.state_db.is_none() || !self.thread_store.as_any().is::() { + return Err(unsupported_thread_store_operation("attached threads")); + } + } if sandbox.is_some() && permissions.is_some() { return Err(invalid_request( "`permissions` cannot be combined with `sandbox`", @@ -5645,6 +5678,7 @@ impl ThreadRequestProcessor { }; let fork_options = StartThreadOptions { + attached_thread: attach_to_source, thread_source, parent_trace, reserved_thread_id, @@ -5877,9 +5911,11 @@ impl ThreadRequestProcessor { .await; } - self.outgoing - .send_server_notification(ServerNotification::ThreadStarted(notif)) - .await; + if !attach_to_source { + self.outgoing + .send_server_notification(ServerNotification::ThreadStarted(notif)) + .await; + } if inherited_goal { self.thread_goal_processor .emit_thread_goal_snapshot(thread_id) diff --git a/codex-rs/app-server/tests/common/rollout.rs b/codex-rs/app-server/tests/common/rollout.rs index 75a48b5987..a7c3222929 100644 --- a/codex-rs/app-server/tests/common/rollout.rs +++ b/codex-rs/app-server/tests/common/rollout.rs @@ -253,6 +253,7 @@ fn create_fake_rollout_with_source_and_parent_thread_id( // Build JSONL lines let meta = SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id, @@ -349,6 +350,7 @@ pub fn create_fake_rollout_with_text_elements( // Build JSONL lines let meta = SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: conversation_id.into(), diff --git a/codex-rs/app-server/tests/suite/conversation_summary.rs b/codex-rs/app-server/tests/suite/conversation_summary.rs index 5c55734842..aaeed4ec19 100644 --- a/codex-rs/app-server/tests/suite/conversation_summary.rs +++ b/codex-rs/app-server/tests/suite/conversation_summary.rs @@ -122,6 +122,7 @@ async fn get_conversation_summary_by_thread_id_reads_pathless_store_thread() -> let thread_id = ThreadId::from_string("00000000-0000-4000-8000-000000000125")?; store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/app-server/tests/suite/v2/attached_thread_tests.rs b/codex-rs/app-server/tests/suite/v2/attached_thread_tests.rs new file mode 100644 index 0000000000..5f1b053276 --- /dev/null +++ b/codex-rs/app-server/tests/suite/v2/attached_thread_tests.rs @@ -0,0 +1,339 @@ +//! Attached-thread fork and discovery after restart and SQLite recovery, including pre-database parents. +use anyhow::Result; +use app_test_support::MockResponsesConfig; +use app_test_support::TestAppServer; +use app_test_support::create_fake_paginated_rollout; +use app_test_support::create_fake_rollout; +use app_test_support::create_mock_responses_server_repeating_assistant; +use codex_app_server_protocol::RequestId; +use codex_app_server_protocol::ThreadDeleteParams; +use codex_app_server_protocol::ThreadDeleteResponse; +use codex_app_server_protocol::ThreadForkParams; +use codex_app_server_protocol::ThreadForkResponse; +use codex_app_server_protocol::ThreadHistoryMode; +use codex_app_server_protocol::ThreadListResponse; +use codex_app_server_protocol::ThreadLoadedListParams; +use codex_app_server_protocol::ThreadLoadedListResponse; +use codex_app_server_protocol::ThreadResumeResponse; +use codex_app_server_protocol::TurnStartParams; +use codex_app_server_protocol::TurnStartResponse; +use codex_app_server_protocol::UserInput; +use codex_state::SqliteConfig; +use codex_utils_absolute_path::test_support::PathExt; +use pretty_assertions::assert_eq; +use serde_json::json; +use tempfile::TempDir; +use test_case::test_case; + +#[derive(Clone, Copy)] +enum Recovery { + Restart, + Missing, + Corrupt, +} + +#[test_case(ThreadHistoryMode::Legacy, Recovery::Restart; "legacy restart")] +#[test_case(ThreadHistoryMode::Paginated, Recovery::Restart; "paginated restart")] +#[test_case(ThreadHistoryMode::Legacy, Recovery::Missing; "legacy missing database")] +#[test_case(ThreadHistoryMode::Paginated, Recovery::Corrupt; "paginated corrupt database")] +#[tokio::test] +async fn saved_attached_thread_upgrade_restart_and_delete( + mode: ThreadHistoryMode, + recovery: Recovery, +) -> Result<()> { + let server = create_mock_responses_server_repeating_assistant("Done").await; + let home = TempDir::new()?; + MockResponsesConfig::new(&server.uri()).write(home.path())?; + // Both parents were persisted before this app-server (and its SQLite migration) starts. + let create_rollout = match mode { + ThreadHistoryMode::Legacy => create_fake_rollout, + ThreadHistoryMode::Paginated => create_fake_paginated_rollout, + }; + let parent = create_rollout( + home.path(), + "2025-01-05T12-00-00", + "2025-01-05T12:00:00Z", + "BLUE HERON 72", + Some("mock_provider"), + /*git_info*/ None, + )?; + let other = create_rollout( + home.path(), + "2025-01-06T12-00-00", + "2025-01-06T12:00:00Z", + "unrelated", + Some("mock_provider"), + /*git_info*/ None, + )?; + let mut mcp = TestAppServer::builder() + .with_codex_home(home.path()) + .without_auto_env() + .build_initialized() + .await?; + let mut children = Vec::new(); + for _ in 0..2 { + let id = mcp + .send_thread_fork_request(ThreadForkParams { + thread_id: parent.clone(), + attach_to_source: true, + exclude_turns: true, + ..Default::default() + }) + .await?; + let fork: ThreadForkResponse = mcp.read_response(id).await?; + assert!(!fork.thread.ephemeral); + assert_eq!(fork.thread.forked_from_id, Some(parent.clone())); + children.push(fork.thread.id); + } + // Newer attached threads fill the raw scan page. Listing must refill across hidden + // results, with and without title filters and in both scan directions. + for (params, expected) in [ + ( + json!({"limit": 1, "searchTerm": "BLUE HERON"}), + vec![&parent], + ), + ( + json!({"limit": 1, "searchTerm": "BLUE HERON", "useStateDbOnly": true}), + vec![&parent], + ), + ( + json!({"limit": 2, "modelProviders": ["mock_provider"]}), + vec![&other, &parent], + ), + ( + json!({"limit": 2, "modelProviders": ["mock_provider"], "sortDirection": "asc"}), + vec![&parent, &other], + ), + ( + json!({"limit": 2, "useStateDbOnly": true}), + vec![&other, &parent], + ), + // The existing parent filter continues to mean spawned children. + (json!({"parentThreadId": parent}), vec![]), + ] { + let id = mcp.send_raw_request("thread/list", Some(params)).await?; + let ordinary: ThreadListResponse = mcp.read_response(id).await?; + assert_eq!( + ordinary.data.iter().map(|t| &t.id).collect::>(), + expected + ); + } + let sqlite = SqliteConfig::new_for_testing(home.path().canonicalize()?.as_path().abs()); + assert!(mcp.shutdown_gracefully().await?.success()); + // No child has taken a turn yet; its attachment must still survive a restart. + match recovery { + Recovery::Restart => {} + Recovery::Missing => tokio::fs::remove_file(sqlite.state_db_path()).await?, + Recovery::Corrupt => { + tokio::fs::write(sqlite.state_db_path(), b"damaged state database").await? + } + } + let mut mcp = TestAppServer::builder() + .with_codex_home(home.path()) + .without_auto_env() + .build_initialized() + .await?; + let id = mcp + .send_raw_request( + "thread/list", + Some(json!({"useStateDbOnly": true, "limit": 2})), + ) + .await?; + let ordinary: ThreadListResponse = mcp.read_response(id).await?; + assert_eq!( + ordinary.data.iter().map(|t| &t.id).collect::>(), + vec![&other, &parent] + ); + let mut cursor = None; + let mut found = Vec::new(); + loop { + let id = mcp + .send_raw_request( + "thread/list", + Some(json!({ + "attachedToThreadId": parent, "limit": 1, "cursor": cursor + })), + ) + .await?; + let page: ThreadListResponse = mcp.read_response(id).await?; + assert_eq!(page.data.len(), 1); + found.push(page.data[0].id.clone()); + cursor = page.next_cursor; + if cursor.is_none() { + break; + } + assert!( + found.len() <= children.len(), + "attached thread cursor must advance" + ); + } + found.sort(); + children.sort(); + assert_eq!(found, children); + let id = mcp + .send_raw_request("thread/list", Some(json!({"attachedToThreadId": other}))) + .await?; + let other_list: ThreadListResponse = mcp.read_response(id).await?; + assert!(other_list.data.is_empty()); + let id = mcp + .send_raw_request( + "thread/resume", + Some(json!({ + "threadId": children[0], "excludeTurns": true, + "developerInstructions": "Follow BIRCH-849." + })), + ) + .await?; + let resumed: ThreadResumeResponse = mcp.read_response(id).await?; + assert_eq!(resumed.thread.id, children[0]); + // Ordinary forks do not inherit attachment. + let id = mcp + .send_thread_fork_request(ThreadForkParams { + thread_id: children[0].clone(), + ..Default::default() + }) + .await?; + let independent: ThreadForkResponse = mcp.read_response(id).await?; + let id = mcp + .send_raw_request( + "thread/list", + Some(json!({"attachedToThreadId": children[0]})), + ) + .await?; + let attached: ThreadListResponse = mcp.read_response(id).await?; + assert!(attached.data.is_empty()); + let id = mcp + .send_thread_delete_request(ThreadDeleteParams { + thread_id: independent.thread.id, + }) + .await?; + let _: ThreadDeleteResponse = mcp.read_response(id).await?; + let id = mcp + .send_turn_start_request(TurnStartParams { + thread_id: children[0].clone(), + input: vec![UserInput::Text { + text: "continue".into(), + text_elements: vec![], + }], + ..Default::default() + }) + .await?; + let _: TurnStartResponse = mcp.read_response(id).await?; + mcp.read_stream_until_notification_message("turn/completed") + .await?; + let requests = server.received_requests().await.expect("response requests"); + let input = requests + .iter() + .find(|r| r.url.path().ends_with("/responses")) + .expect("resumed attached thread sends a model request") + .body_json::()?["input"] + .to_string(); + assert!( + input.contains("BIRCH-849"), + "resume applies client instructions" + ); + let id = mcp + .send_raw_request("thread/resume", Some(json!({"threadId": parent}))) + .await?; + let _: ThreadResumeResponse = mcp.read_response(id).await?; + let id = mcp + .send_thread_delete_request(ThreadDeleteParams { + thread_id: parent.clone(), + }) + .await?; + let error = mcp + .read_stream_until_error_message(RequestId::Integer(id)) + .await?; + assert!( + error + .error + .message + .contains("delete the attached thread first") + ); + let id = mcp + .send_thread_loaded_list_request(ThreadLoadedListParams::default()) + .await?; + let loaded: ThreadLoadedListResponse = mcp.read_response(id).await?; + assert!( + loaded.data.contains(&parent), + "rejection must leave the parent loaded" + ); + for child in children { + let id = mcp + .send_thread_delete_request(ThreadDeleteParams { thread_id: child }) + .await?; + let _: ThreadDeleteResponse = mcp.read_response(id).await?; + } + let id = mcp + .send_thread_delete_request(ThreadDeleteParams { thread_id: parent }) + .await?; + let _: ThreadDeleteResponse = mcp.read_response(id).await?; + let id = mcp.send_raw_request("thread/list", Some(json!({}))).await?; + let ordinary: ThreadListResponse = mcp.read_response(id).await?; + assert_eq!( + ordinary.data.iter().map(|t| &t.id).collect::>(), + vec![&other] + ); + Ok(()) +} + +#[tokio::test] +async fn saved_attached_thread_rejects_conflicting_fork_and_discovery_filters() -> Result<()> { + let server = create_mock_responses_server_repeating_assistant("Done").await; + let home = TempDir::new()?; + MockResponsesConfig::new(&server.uri()).write(home.path())?; + let parent = create_fake_rollout( + home.path(), + "2025-01-05T12-00-00", + "2025-01-05T12:00:00Z", + "parent", + Some("mock_provider"), + /*git_info*/ None, + )?; + let mut mcp = TestAppServer::builder() + .with_codex_home(home.path()) + .without_auto_env() + .build_initialized() + .await?; + for (method, params, message) in [ + ( + "thread/fork", + json!({"threadId": parent, "attachToSource": true, "ephemeral": true}), + "attachToSource cannot be combined", + ), + ( + "thread/list", + json!({"attachedToThreadId": parent, "parentThreadId": parent}), + "attachedToThreadId cannot be combined", + ), + ( + "thread/list", + json!({"attachedToThreadId": parent, "ancestorThreadId": parent}), + "attachedToThreadId cannot be combined", + ), + ( + "thread/fork", + json!({"threadId": parent, "attachToSource": true, "deferGoalContinuation": true}), + "attachToSource cannot be combined", + ), + ] { + let id = mcp.send_raw_request(method, Some(params)).await?; + let error = mcp + .read_stream_until_error_message(RequestId::Integer(id)) + .await?; + assert!( + error.error.message.starts_with(message), + "{:?}", + error.error + ); + } + let id = mcp + .send_raw_request("thread/list", Some(json!({"attachedToThreadId": parent}))) + .await?; + let page: ThreadListResponse = mcp.read_response(id).await?; + assert!( + page.data.is_empty(), + "failed forks must leave no discoverable attached thread" + ); + Ok(()) +} diff --git a/codex-rs/app-server/tests/suite/v2/external_agent_config.rs b/codex-rs/app-server/tests/suite/v2/external_agent_config.rs index fe05440a40..08621c0d7b 100644 --- a/codex-rs/app-server/tests/suite/v2/external_agent_config.rs +++ b/codex-rs/app-server/tests/suite/v2/external_agent_config.rs @@ -610,6 +610,7 @@ source = {:?} let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -1976,6 +1977,7 @@ async fn external_agent_config_import_creates_session_rollouts() -> Result<()> { let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -2168,6 +2170,7 @@ required = true let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -2255,6 +2258,7 @@ async fn external_agent_config_import_accepts_detected_session_payload_after_res let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -2339,6 +2343,7 @@ async fn external_agent_config_import_skips_already_imported_session_versions() let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -2469,6 +2474,7 @@ async fn external_agent_config_import_returns_before_background_session_import_f let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, @@ -2587,6 +2593,7 @@ async fn external_agent_config_import_compacts_huge_session_before_first_follow_ let request_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, diff --git a/codex-rs/app-server/tests/suite/v2/mod.rs b/codex-rs/app-server/tests/suite/v2/mod.rs index 21df247cf3..6d1e77143f 100644 --- a/codex-rs/app-server/tests/suite/v2/mod.rs +++ b/codex-rs/app-server/tests/suite/v2/mod.rs @@ -10,6 +10,8 @@ mod app_installed; mod app_list; mod app_read; mod application_network; +#[path = "attached_thread_tests.rs"] +mod attached_thread; mod attestation; #[path = "auth_storage_originator_tests.rs"] mod auth_storage_originator; diff --git a/codex-rs/app-server/tests/suite/v2/projects.rs b/codex-rs/app-server/tests/suite/v2/projects.rs index c8d2a4a989..56c4d6e9d8 100644 --- a/codex-rs/app-server/tests/suite/v2/projects.rs +++ b/codex-rs/app-server/tests/suite/v2/projects.rs @@ -101,6 +101,7 @@ async fn projects_list_by_recency_and_preserve_metadata_timestamps() -> Result<( request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -326,6 +327,7 @@ async fn projects_persist_and_assign_threads() -> Result<()> { request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -374,6 +376,7 @@ async fn projects_persist_and_assign_threads() -> Result<()> { request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -425,6 +428,7 @@ async fn projects_persist_and_assign_threads() -> Result<()> { request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -621,6 +625,7 @@ async fn projects_persist_and_assign_threads() -> Result<()> { request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -713,6 +718,7 @@ async fn deleted_project_is_dropped_before_first_durable_thread_persistence() -> request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -904,6 +910,7 @@ async fn projects_validate_filters_cursors_and_sqlite_less_assignment() -> Resul let request_id = server .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -991,6 +998,7 @@ async fn projects_validate_filters_cursors_and_sqlite_less_assignment() -> Resul let list_id = unsupported_projects .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), diff --git a/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs b/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs index c7b7545d6e..90a6e7fc61 100644 --- a/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs +++ b/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs @@ -27,6 +27,7 @@ use codex_app_server::in_process::InProcessServerEvent; use codex_app_server::in_process::InProcessStartArgs; use codex_app_server_protocol::ClientInfo; use codex_app_server_protocol::ClientRequest; +use codex_app_server_protocol::InitializeCapabilities; use codex_app_server_protocol::InitializeParams; use codex_app_server_protocol::JSONRPCError; use codex_app_server_protocol::RequestId; @@ -190,6 +191,53 @@ async fn thread_start_defaults_to_legacy_without_history_list_support() -> Resul Ok(()) } +#[tokio::test] +async fn attached_threads_require_store_owned_persistence() -> Result<()> { + let codex_home = TempDir::new()?; + let store_id = Uuid::new_v4().to_string(); + create_config_toml_with_thread_store(codex_home.path(), "http://127.0.0.1:1", &store_id)?; + let _in_memory_store = InMemoryThreadStoreId { store_id }; + let client = start_in_process_server_with_capabilities( + codex_home.path(), + Some(InitializeCapabilities { + experimental_api: true, + ..Default::default() + }), + ) + .await?; + // The store, not the experiment gate, must reject it without writing to local storage. + for request in [ + ClientRequest::ThreadFork { + request_id: RequestId::Integer(1), + params: codex_app_server_protocol::ThreadForkParams { + thread_id: Uuid::new_v4().to_string(), + attach_to_source: true, + ..Default::default() + }, + }, + ClientRequest::ThreadList { + request_id: RequestId::Integer(2), + params: serde_json::from_value(serde_json::json!({ + "attachedToThreadId": Uuid::new_v4().to_string() + }))?, + }, + ] { + let error = client + .request(request) + .await? + .expect_err("attached threads require local storage"); + assert_eq!(error.code, -32601); + assert!( + error.message.contains("attached threads"), + "{}", + error.message + ); + } + client.shutdown().await?; + assert_no_local_persistence_artifacts(codex_home.path())?; + Ok(()) +} + #[tokio::test] async fn thread_list_repeated_cursor_returns_internal_error() -> Result<()> { let codex_home = TempDir::new()?; @@ -207,6 +255,7 @@ async fn thread_list_repeated_cursor_returns_internal_error() -> Result<()> { request_id: RequestId::Integer(1), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(1), @@ -232,6 +281,7 @@ async fn thread_list_repeated_cursor_returns_internal_error() -> Result<()> { let thread_id = ThreadId::new(); thread_store .create_thread(StoreCreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -264,6 +314,7 @@ async fn thread_list_repeated_cursor_returns_internal_error() -> Result<()> { request_id: RequestId::Integer(2), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: Some("repeated-cursor".to_string()), limit: Some(1), @@ -446,6 +497,7 @@ async fn thread_delete_with_non_local_thread_store_does_not_create_local_persist request_id: RequestId::Integer(3), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -475,6 +527,7 @@ async fn thread_delete_with_non_local_thread_store_does_not_create_local_persist let unloaded_thread_id = ThreadId::from_string(&Uuid::new_v4().to_string())?; thread_store .create_thread(StoreCreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: unloaded_thread_id.into(), @@ -547,7 +600,12 @@ async fn cold_thread_resume_rechecks_non_local_history_after_config_load() -> Re let thread_store = InMemoryThreadStore::for_id(store_id.clone()); let _in_memory_store = InMemoryThreadStoreId { store_id }; - let mut client = start_in_process_client(config.clone(), loader_overrides.clone()).await?; + let mut client = start_in_process_client( + config.clone(), + loader_overrides.clone(), + /*capabilities*/ None, + ) + .await?; let response = client .request(ClientRequest::ThreadStart { request_id: RequestId::Integer(1), @@ -588,7 +646,7 @@ async fn cold_thread_resume_rechecks_non_local_history_after_config_load() -> Re .await??; client.shutdown().await?; - let client = start_in_process_client(config, loader_overrides).await?; + let client = start_in_process_client(config, loader_overrides, /*capabilities*/ None).await?; let reads_before_resume = thread_store.calls().await.read_thread_with_history; // The in-memory store is pathless, so resume currently fails later while // assembling the response. Reuse the probe within each attempt, but read it @@ -610,6 +668,13 @@ async fn cold_thread_resume_rechecks_non_local_history_after_config_load() -> Re } async fn start_in_process_server(codex_home: &Path) -> Result { + start_in_process_server_with_capabilities(codex_home, /*capabilities*/ None).await +} + +async fn start_in_process_server_with_capabilities( + codex_home: &Path, + capabilities: Option, +) -> Result { let loader_overrides = LoaderOverrides::without_managed_config_for_tests(); let config = Arc::new( ConfigBuilder::default() @@ -620,12 +685,13 @@ async fn start_in_process_server(codex_home: &Path) -> Result, loader_overrides: LoaderOverrides, + capabilities: Option, ) -> std::io::Result { in_process::start(InProcessStartArgs { arg0_paths: Arg0DispatchPaths::default(), @@ -649,7 +715,7 @@ async fn start_in_process_client( title: None, version: "0.1.0".to_string(), }, - capabilities: None, + capabilities, }, channel_capacity: in_process::DEFAULT_IN_PROCESS_CHANNEL_CAPACITY, }) diff --git a/codex-rs/app-server/tests/suite/v2/sqlite_recovery.rs b/codex-rs/app-server/tests/suite/v2/sqlite_recovery.rs index a3e94c74c2..1a812731d5 100644 --- a/codex-rs/app-server/tests/suite/v2/sqlite_recovery.rs +++ b/codex-rs/app-server/tests/suite/v2/sqlite_recovery.rs @@ -160,6 +160,7 @@ async fn state_recovery_restores_saved_threads() -> Result<()> { let request = server .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: None, 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 980e8d1f70..c7eabe111f 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_fork.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_fork.rs @@ -116,6 +116,7 @@ async fn list_threads(mcp: &mut TestAppServer) -> Result { let list_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(50), 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 0a4ad00dab..17afc38480 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_list.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_list.rs @@ -103,6 +103,7 @@ async fn list_threads_with_sort( request_id, params: codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit, @@ -144,6 +145,7 @@ async fn list_threads_for_relation( request_id, params: codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(limit), @@ -776,6 +778,7 @@ async fn thread_list_respects_cwd_filters() -> Result<()> { let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -891,6 +894,7 @@ sqlite = true let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1297,6 +1301,7 @@ sqlite = true let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1335,6 +1340,7 @@ sqlite = true let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1366,6 +1372,7 @@ sqlite = true let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1553,6 +1560,7 @@ async fn thread_list_relation_filters_reject_invalid_requests() -> Result<()> { let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1581,6 +1589,7 @@ async fn thread_list_relation_filters_reject_invalid_requests() -> Result<()> { let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1873,6 +1882,7 @@ async fn thread_list_reports_loaded_subagent_direct_input_capability() -> Result request_id, params: codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -2696,6 +2706,7 @@ async fn thread_list_backwards_cursor_can_seed_forward_delta_sync() -> Result<() let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(1), @@ -2739,6 +2750,7 @@ async fn thread_list_backwards_cursor_can_seed_forward_delta_sync() -> Result<() let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: Some(backwards_cursor), limit: Some(10), @@ -3172,6 +3184,7 @@ async fn thread_list_invalid_cursor_returns_error() -> Result<()> { let request_id = mcp .send_thread_list_request(codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: Some("not-a-cursor".to_string()), limit: Some(2), diff --git a/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs b/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs index 1a6437b63d..400dfa5ea6 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs @@ -89,6 +89,7 @@ async fn thread_section_move_pins_and_archives_before_first_turn() -> Result<()> let list_params = ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(100), @@ -294,6 +295,7 @@ async fn thread_section_move_pins_and_unpins_with_filtered_recency_pagination() let list_params = ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(1), @@ -487,6 +489,7 @@ async fn thread_sections_preserve_server_owned_manual_order_across_moves_and_res let list_params = ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), 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 aac4fc1151..c27ca5a0bd 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_read.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_read.rs @@ -407,6 +407,7 @@ async fn paginated_stored_thread_routes_projected_turns() -> Result<()> { let list_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(50), @@ -627,6 +628,7 @@ async fn thread_search_occurrences_reads_paginated_projection() -> Result<()> { ); store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -1138,6 +1140,7 @@ async fn thread_list_includes_store_thread_without_rollout_path() -> Result<()> request_id: RequestId::Integer(1), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), @@ -1520,6 +1523,7 @@ async fn paginated_thread_name_set_is_reflected_in_read_list_and_metadata_resume let list_id = mcp .send_thread_list_request(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(50), @@ -1726,6 +1730,7 @@ async fn paginated_history_lists_and_legacy_reads_use_projected_turns_and_items( ); store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -2631,6 +2636,7 @@ async fn seed_pathless_store_thread( ) -> Result<()> { store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), 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 09b16cf4e6..19cd962b1b 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -4642,6 +4642,7 @@ async fn thread_resume_prefers_persisted_git_metadata_for_local_threads() -> Res let rollout_dir = rollout_path.parent().expect("rollout parent directory"); std::fs::create_dir_all(rollout_dir)?; let session_meta = SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: conversation_id.into(), diff --git a/codex-rs/app-server/tests/suite/v2/thread_timeline.rs b/codex-rs/app-server/tests/suite/v2/thread_timeline.rs index 4dd2a6f77c..46a2a0b1bd 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_timeline.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_timeline.rs @@ -59,6 +59,7 @@ async fn timeline_pages_mix_items_and_resolve_the_opening_realtime_session() -> ); store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/app-server/tests/suite/v2/thread_unarchive.rs b/codex-rs/app-server/tests/suite/v2/thread_unarchive.rs index 50041ea975..2a18e911fd 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_unarchive.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_unarchive.rs @@ -247,6 +247,7 @@ async fn thread_unarchive_preserves_pathless_store_metadata() -> Result<()> { let parent_thread_id = ThreadId::from_string("00000000-0000-4000-8000-000000000127")?; store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/app-server/tests/suite/v2/turn_start.rs b/codex-rs/app-server/tests/suite/v2/turn_start.rs index a6e9595df2..822643bc7e 100644 --- a/codex-rs/app-server/tests/suite/v2/turn_start.rs +++ b/codex-rs/app-server/tests/suite/v2/turn_start.rs @@ -4599,6 +4599,7 @@ async fn direct_input_to_multi_agent_v2_subagent_is_rejected( request_id, params: codex_app_server_protocol::ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(10), diff --git a/codex-rs/cli/tests/queue.rs b/codex-rs/cli/tests/queue.rs index a10615d86c..25aafe2e82 100644 --- a/codex-rs/cli/tests/queue.rs +++ b/codex-rs/cli/tests/queue.rs @@ -406,6 +406,7 @@ async fn remote_session_commands_with_workload_identity_use_server_auth() -> Res request_id: RequestId::Integer(4), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, cursor: None, limit: None, sort_key: None, diff --git a/codex-rs/core/src/codex_delegate.rs b/codex-rs/core/src/codex_delegate.rs index d6742fc218..d4227af4b1 100644 --- a/codex-rs/core/src/codex_delegate.rs +++ b/codex-rs/core/src/codex_delegate.rs @@ -103,6 +103,7 @@ pub(crate) async fn run_codex_thread_interactive( let mut thread_extension_init = codex_extension_api::ExtensionDataInit::default(); thread_extension_init.insert(isolation); let spawn_result = Session::spawn(SessionSpawnArgs { + attached_thread: false, startup: Some(Arc::clone(&startup)), config, prompt_cache_key: parent_session diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index 1824f43aad..073e7a19ee 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -485,6 +485,7 @@ impl From for CompactedHistoryInstallation<'_> { } pub(crate) struct SessionSpawnArgs { + pub(crate) attached_thread: bool, pub(crate) startup: Option>, pub(crate) config: Config, pub(crate) prompt_cache_key: PromptCacheKey, @@ -605,6 +606,7 @@ impl Session { .ensure_config_server_applied()?; args.config.validate_windows_mxc_requirement()?; let SessionSpawnArgs { + attached_thread, startup, config, prompt_cache_key, @@ -972,6 +974,7 @@ impl Session { let session = Box::pin(Session::new( startup.clone(), session_configuration, + attached_thread, prompt_cache_key, &environment_selections, config.clone(), diff --git a/codex-rs/core/src/session/session.rs b/codex-rs/core/src/session/session.rs index 9d213c763d..9c415e6020 100644 --- a/codex-rs/core/src/session/session.rs +++ b/codex-rs/core/src/session/session.rs @@ -812,6 +812,7 @@ impl Session { pub(crate) async fn new( startup: Option>, mut session_configuration: SessionConfiguration, + attached_thread: bool, prompt_cache_key: PromptCacheKey, environment_selections: &[TurnEnvironmentSelection], config: Arc, @@ -1087,6 +1088,7 @@ impl Session { InitialHistory::New | InitialHistory::Cleared | InitialHistory::Forked(_) => { let auth = persistence_auth.await; let params = CreateThreadParams { + attached_thread, creator_user_id: auth.as_ref().and_then(CodexAuth::get_chatgpt_user_id), creator_account_id: auth.as_ref().and_then(CodexAuth::get_account_id), session_id, diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 7ebdd51de8..182e03e588 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -4933,6 +4933,7 @@ async fn open_thread_persistence(session: &mut Session) -> PathBuf { let live_thread = LiveThread::create( Arc::clone(&session.services.thread_store), CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: session.session_id(), @@ -7186,6 +7187,7 @@ async fn make_session_with_config_and_rx( let session = Session::new( /*startup*/ None, session_configuration, + /*attached_thread*/ false, PromptCacheKey::default(), &default_environments, Arc::clone(&config), @@ -7323,6 +7325,7 @@ async fn make_session_with_history_source_and_agent_control_and_rx( let session = Session::new( /*startup*/ None, session_configuration, + /*attached_thread*/ false, PromptCacheKey::default(), &default_environments, Arc::clone(&config), @@ -8682,6 +8685,7 @@ async fn shutdown_complete_does_not_append_to_thread_store_after_shutdown() { let live_thread = LiveThread::create( Arc::clone(&thread_store), CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: session.session_id(), @@ -8802,6 +8806,7 @@ async fn submission_loop_channel_close_runs_full_thread_teardown() { let live_thread = LiveThread::create( Arc::clone(&thread_store), CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: session.session_id(), @@ -11736,6 +11741,7 @@ async fn attach_in_memory_thread_store( let live_thread = LiveThread::create( Arc::clone(&thread_store), CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: session.session_id(), diff --git a/codex-rs/core/src/session/tests/guardian_tests.rs b/codex-rs/core/src/session/tests/guardian_tests.rs index 142402b345..669d529856 100644 --- a/codex-rs/core/src/session/tests/guardian_tests.rs +++ b/codex-rs/core/src/session/tests/guardian_tests.rs @@ -1293,6 +1293,7 @@ async fn guardian_subagent_does_not_inherit_parent_exec_policy_rules() { let mut thread_extension_init = codex_extension_api::ExtensionDataInit::default(); thread_extension_init.insert(codex_extension_api::SessionIsolation::Isolated); let (session, io) = Session::spawn(SessionSpawnArgs { + attached_thread: false, startup: None, config, prompt_cache_key: PromptCacheKey::default(), diff --git a/codex-rs/core/src/thread_manager.rs b/codex-rs/core/src/thread_manager.rs index 10ab88e044..76ffa26d79 100644 --- a/codex-rs/core/src/thread_manager.rs +++ b/codex-rs/core/src/thread_manager.rs @@ -306,6 +306,8 @@ pub struct StartThreadOptions { pub history_mode: Option, pub session_source: Option, pub thread_source: Option, + /// Creation metadata forwarded to storage; never inherited from a fork source. + pub attached_thread: bool, pub dynamic_tools: Vec, pub metrics_service_name: Option, pub parent_trace: Option, @@ -337,6 +339,7 @@ impl StartThreadOptions { history_mode: None, session_source: None, thread_source: None, + attached_thread: false, dynamic_tools: Vec::new(), metrics_service_name: None, parent_trace: None, @@ -2175,6 +2178,7 @@ impl ThreadManagerState { history_mode, session_source, thread_source, + attached_thread, dynamic_tools, metrics_service_name, parent_trace, @@ -2397,6 +2401,7 @@ impl ThreadManagerState { let attachment_source = forked_from_thread_id.filter(|_| matches!(&initial_history, InitialHistory::Forked(_))); let spawn_result = Session::spawn(SessionSpawnArgs { + attached_thread, startup, config, prompt_cache_key, diff --git a/codex-rs/core/tests/suite/sqlite_state.rs b/codex-rs/core/tests/suite/sqlite_state.rs index 25ebd9989a..db37580ee3 100644 --- a/codex-rs/core/tests/suite/sqlite_state.rs +++ b/codex-rs/core/tests/suite/sqlite_state.rs @@ -557,6 +557,7 @@ async fn backfill_scans_existing_rollouts() -> Result<()> { fs::create_dir_all(parent).expect("should create rollout directory"); let session_meta_line = SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index a5b9eb2e68..db35aaa6bb 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -1872,6 +1872,7 @@ async fn resolve_resume_thread_id( request_id: RequestId::Integer(0), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(100), @@ -1959,6 +1960,7 @@ async fn resolve_resume_thread_id( request_id: RequestId::Integer(0), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(100), diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 141b4a72f4..b2cd4a7cd8 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -3285,6 +3285,9 @@ pub struct SessionMeta { pub id: ThreadId, #[serde(skip_serializing_if = "Option::is_none")] pub forked_from_id: Option, + /// Marks a persisted fork as attached to `forked_from_id`. + #[serde(default, skip_serializing_if = "std::ops::Not::not")] + pub attached_thread: bool, /// Exclusive ordinal inherited from the logical fork parent, independent of `history_base`. /// Revert may replace the physical history base while retaining this fork boundary. #[serde(default, skip_serializing_if = "Option::is_none")] @@ -3359,6 +3362,7 @@ impl Default for SessionMeta { session_id: id.into(), id, forked_from_id: None, + attached_thread: false, forked_from_ordinal_exclusive: None, parent_thread_id: None, timestamp: String::new(), diff --git a/codex-rs/rollout/src/compression_tests.rs b/codex-rs/rollout/src/compression_tests.rs index 806039d624..59143ce39a 100644 --- a/codex-rs/rollout/src/compression_tests.rs +++ b/codex-rs/rollout/src/compression_tests.rs @@ -1121,6 +1121,7 @@ fn write_rollout(path: &std::path::Path, thread_id: ThreadId, message: &str) -> fs::create_dir_all(parent)?; let session_meta_line = SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/rollout/src/list.rs b/codex-rs/rollout/src/list.rs index 66607d92ba..4742dd864a 100644 --- a/codex-rs/rollout/src/list.rs +++ b/codex-rs/rollout/src/list.rs @@ -122,6 +122,7 @@ pub type ConversationsPage = ThreadsPage; struct HeadTailSummary { originator: Option, saw_session_meta: bool, + attached_to_parent: bool, thread_id: Option, first_user_message: Option, preview: Option, @@ -290,6 +291,7 @@ impl<'a> RolloutFileVisitor for FilesByCreatedAtVisitor<'a> { self.cwd_filters, updated_at, PreviewFilter::RequirePreview, + /*include_attached_threads*/ false, ) .await { @@ -584,6 +586,7 @@ async fn traverse_directories_for_paths_updated( cwd_filters, updated_at_fallback, PreviewFilter::RequirePreview, + /*include_attached_threads*/ false, ) .await { @@ -642,6 +645,7 @@ async fn traverse_flat_paths_created( cwd_filters, updated_at, PreviewFilter::IncludeEmpty, + /*include_attached_threads*/ false, ) .await { @@ -704,6 +708,7 @@ async fn traverse_flat_paths_updated( cwd_filters, updated_at_fallback, PreviewFilter::IncludeEmpty, + /*include_attached_threads*/ false, ) .await { @@ -785,12 +790,16 @@ async fn build_thread_item( cwd_filters: Option<&[PathBuf]>, updated_at: Option, preview_filter: PreviewFilter, + include_attached_threads: bool, ) -> Option { // Read head and detect preview-bearing events; goal previews can appear before // the first normal user message. let summary = read_head_summary(&path, HEAD_RECORD_LIMIT) .await .unwrap_or_default(); + if summary.attached_to_parent && !include_attached_threads { + return None; + } if !allowed_sources.is_empty() && !summary .source @@ -882,6 +891,7 @@ pub async fn read_thread_item_from_rollout(path: PathBuf) -> Option /*cwd_filters*/ None, /*updated_at*/ None, PreviewFilter::RequirePreview, + /*include_attached_threads*/ true, ) .await } @@ -1004,6 +1014,7 @@ async fn read_head_summary(path: &Path, head_limit: usize) -> io::Result, forked_from_id: Option, + attached_thread: bool, forked_from_ordinal_exclusive: Option, parent_thread_id: Option, source: Box, @@ -196,6 +197,17 @@ fn clone_io_error(err: &IoError) -> IoError { } impl RolloutRecorderParams { + pub fn with_attached_thread(mut self, attached_thread: bool) -> Self { + if let Self::Create { + attached_thread: value, + .. + } = &mut self + { + *value = attached_thread; + } + self + } + #[allow(clippy::too_many_arguments)] pub fn new( conversation_id: ThreadId, @@ -212,6 +224,7 @@ impl RolloutRecorderParams { conversation_id, rollout_id_override: None, forked_from_id, + attached_thread: false, forked_from_ordinal_exclusive: None, parent_thread_id, source: Box::new(source), @@ -918,6 +931,7 @@ impl RolloutRecorder { conversation_id, rollout_id_override, forked_from_id, + attached_thread, forked_from_ordinal_exclusive, parent_thread_id, source, @@ -952,6 +966,7 @@ impl RolloutRecorder { session_id, id: conversation_id, forked_from_id, + attached_thread, forked_from_ordinal_exclusive: forked_from_ordinal_exclusive .filter(|_| forked_from_id.is_some()), parent_thread_id, diff --git a/codex-rs/rollout/src/recorder_tests.rs b/codex-rs/rollout/src/recorder_tests.rs index d42a7c4ba7..a2843aada8 100644 --- a/codex-rs/rollout/src/recorder_tests.rs +++ b/codex-rs/rollout/src/recorder_tests.rs @@ -214,6 +214,7 @@ async fn state_db_init_backfills_before_returning() -> anyhow::Result<()> { let session_meta_line = SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -1272,13 +1273,58 @@ async fn append_rollout_item_to_path_assigns_next_paginated_ordinal() -> std::io } #[tokio::test] -async fn list_threads_db_disabled_does_not_skip_paginated_items() -> std::io::Result<()> { +async fn discovery_without_database_skips_attached_threads_before_pagination() -> std::io::Result<()> +{ let home = TempDir::new().expect("temp dir"); let config = test_config(home.path()); let newest = write_session_file(home.path(), "2025-01-03T12-00-00", Uuid::from_u128(9001))?; let middle = write_session_file(home.path(), "2025-01-02T12-00-00", Uuid::from_u128(9002))?; let _oldest = write_session_file(home.path(), "2025-01-01T12-00-00", Uuid::from_u128(9003))?; + let parent = ThreadId::from_string(&Uuid::from_u128(9001).to_string()).unwrap(); + crate::append_thread_name(home.path(), parent, "shared title").await?; + for (timestamp, uuid, mode) in [ + ( + "2025-01-04T12-00-00", + Uuid::from_u128(9004), + ThreadHistoryMode::Legacy, + ), + ( + "2025-01-03T06-00-00", + Uuid::from_u128(9005), + ThreadHistoryMode::Paginated, + ), + ] { + let path = write_session_file(home.path(), timestamp, uuid)?; + let mut lines = read_rollout_lines(&path)?; + let RolloutItem::SessionMeta(meta) = &mut lines[0].item else { + panic!("fixture must start with session metadata"); + }; + meta.meta.attached_thread = true; + meta.meta.forked_from_id = Some(parent); + meta.meta.history_mode = mode; + let mut file = File::create(&path)?; + for line in lines { + writeln!(file, "{}", serde_json::to_string(&line)?)?; + } + let child = ThreadId::from_string(&uuid.to_string()).unwrap(); + crate::append_thread_name(home.path(), child, "shared title").await?; + // Hiding discovery must not prevent opening an explicitly selected attached thread. + assert_eq!( + crate::read_thread_item_from_rollout(path) + .await + .unwrap() + .thread_id, + Some(child) + ); + } + let named = crate::session_index::find_thread_meta_by_name_str( + home.path(), + "shared title", + /*state_db_ctx*/ None, + ) + .await?; + assert_eq!(named.map(|(_, meta)| meta.meta.id), Some(parent)); let default_provider = config.model_provider_id.clone(); let page1 = RolloutRecorder::list_threads( diff --git a/codex-rs/rollout/src/rollout_reference_index.rs b/codex-rs/rollout/src/rollout_reference_index.rs index 2b21b82487..107dd62325 100644 --- a/codex-rs/rollout/src/rollout_reference_index.rs +++ b/codex-rs/rollout/src/rollout_reference_index.rs @@ -1,4 +1,4 @@ -//! Indexes direct fork references found in local rollout files. +//! Indexes direct fork references and attached children found in local rollout files. use std::collections::HashMap; use std::collections::HashSet; @@ -16,10 +16,10 @@ use crate::SESSIONS_SUBDIR; use crate::compression::RolloutFile; use crate::rollout_file_name::RolloutFileName; -/// Direct history-base edges discovered from local rollout metadata. +/// Fork relationships discovered from local rollout metadata. /// -/// This indexes immutable rollout IDs, not a thread's selected lineage. Callers use it to answer -/// cheap inverse-reference questions without each reimplementing rollout discovery. +/// Rollouts are indexed by immutable rollout IDs, not a thread's selected lineage. Attached +/// children refer to their parent's stable thread ID. #[derive(Debug, Default)] pub struct RolloutReferenceIndex { rollouts_by_id: HashMap, @@ -31,6 +31,7 @@ struct IndexedRollout { thread_id: ThreadId, path: PathBuf, history_base: Option, + attached_to_thread_id: Option, } impl RolloutReferenceIndex { @@ -129,6 +130,10 @@ impl RolloutReferenceIndex { thread_id: meta.meta.id, path: rollout_file.into_path(), history_base: meta.meta.history_base, + attached_to_thread_id: meta + .meta + .forked_from_id + .filter(|_| meta.meta.attached_thread), }); } } @@ -167,6 +172,17 @@ impl RolloutReferenceIndex { .and_then(|rollout| rollout.history_base.as_ref()) } + /// Find an indexed attached child of any candidate parent. + pub fn attached_child(&self, parent_thread_ids: &[ThreadId]) -> Option { + let parents: HashSet<_> = parent_thread_ids.iter().copied().collect(); + self.rollouts_by_id.values().find_map(|rollout| { + rollout + .attached_to_thread_id + .filter(|parent| parents.contains(parent)) + .map(|_| rollout.thread_id) + }) + } + /// Returns rollout IDs and paths whose session metadata belongs to `thread_id`. pub fn rollouts_for_thread( &self, diff --git a/codex-rs/rollout/src/session_index.rs b/codex-rs/rollout/src/session_index.rs index b69b388ed1..6d504c9eb3 100644 --- a/codex-rs/rollout/src/session_index.rs +++ b/codex-rs/rollout/src/session_index.rs @@ -224,6 +224,7 @@ pub async fn find_thread_meta_candidates_by_name_str( ) .await? && let Ok(session_meta) = super::list::read_session_meta_line(&path).await + && !session_meta.meta.attached_thread && (allowed_sources.is_empty() || allowed_sources.contains(&session_meta.meta.source)) && session_meta .meta diff --git a/codex-rs/rollout/src/session_index_tests.rs b/codex-rs/rollout/src/session_index_tests.rs index 32eb6c1a07..7f8dd4d527 100644 --- a/codex-rs/rollout/src/session_index_tests.rs +++ b/codex-rs/rollout/src/session_index_tests.rs @@ -35,6 +35,7 @@ fn write_rollout_with_source_and_provider( ordinal: None, item: RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/rollout/src/state_db_tests.rs b/codex-rs/rollout/src/state_db_tests.rs index ebf5881870..b2afea4407 100644 --- a/codex-rs/rollout/src/state_db_tests.rs +++ b/codex-rs/rollout/src/state_db_tests.rs @@ -325,6 +325,7 @@ fn write_rollout_with_user_message( ordinal: None, item: RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/rollout/src/tests.rs b/codex-rs/rollout/src/tests.rs index b1484f1694..4db5a849b9 100644 --- a/codex-rs/rollout/src/tests.rs +++ b/codex-rs/rollout/src/tests.rs @@ -1593,6 +1593,7 @@ async fn test_updated_at_uses_file_mtime() -> Result<()> { ordinal: None, item: RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: conversation_id.into(), diff --git a/codex-rs/state/migrations/0062_threads_attached_parent.sql b/codex-rs/state/migrations/0062_threads_attached_parent.sql new file mode 100644 index 0000000000..8cb4fe4c56 --- /dev/null +++ b/codex-rs/state/migrations/0062_threads_attached_parent.sql @@ -0,0 +1,4 @@ +ALTER TABLE threads ADD COLUMN attached_thread_parent_id TEXT; + +CREATE INDEX idx_threads_attached_parent ON threads(attached_thread_parent_id) + WHERE attached_thread_parent_id IS NOT NULL; diff --git a/codex-rs/state/src/extract.rs b/codex-rs/state/src/extract.rs index 18bcec64cd..a501301553 100644 --- a/codex-rs/state/src/extract.rs +++ b/codex-rs/state/src/extract.rs @@ -94,6 +94,10 @@ fn apply_session_meta_from_item(metadata: &mut ThreadMetadata, meta_line: &Sessi .take() .or_else(|| meta_line.meta.creator_account_id.clone()); metadata.id = meta_line.meta.id; + metadata.attached_thread_parent_id = meta_line + .meta + .forked_from_id + .filter(|_| meta_line.meta.attached_thread); metadata.source = enum_to_string(&meta_line.meta.source); if metadata.originator.is_none() && !meta_line.meta.originator.is_empty() { metadata.originator = Some(meta_line.meta.originator.clone()); @@ -528,6 +532,7 @@ mod tests { &RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { creator_user_id: None, + attached_thread: false, creator_account_id: None, session_id: thread_id.into(), id: thread_id, @@ -778,6 +783,7 @@ mod tests { &RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { creator_user_id: None, + attached_thread: false, creator_account_id: None, session_id: thread_id.into(), id: thread_id, @@ -820,6 +826,7 @@ mod tests { let created_at = DateTime::::from_timestamp(1_735_689_600, 0).expect("timestamp"); ThreadMetadata { creator_user_id: None, + attached_thread_parent_id: None, creator_account_id: None, originator: None, id, diff --git a/codex-rs/state/src/model/thread_metadata.rs b/codex-rs/state/src/model/thread_metadata.rs index 9237a57324..223519f50b 100644 --- a/codex-rs/state/src/model/thread_metadata.rs +++ b/codex-rs/state/src/model/thread_metadata.rs @@ -36,13 +36,15 @@ pub enum SortDirection { Desc, } -/// Spawn-graph relationship used to filter thread listings. +/// Thread relationship used to filter thread listings. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ThreadRelationFilter { /// Return only threads whose immediate parent is the given thread. DirectChildrenOf(ThreadId), /// Return every thread transitively descended from the given thread. DescendantsOf(ThreadId), + /// Return only saved threads attached to this parent. + AttachedThreadsOf(ThreadId), } /// A pagination anchor used for keyset pagination. @@ -123,6 +125,8 @@ pub struct ExtractionOutcome { /// Canonical persisted thread metadata. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ThreadMetadata { + /// The parent of an attached thread, derived from canonical rollout metadata. + pub attached_thread_parent_id: Option, /// Originator recorded at creation, if available. pub originator: Option, /// ChatGPT user that created the thread, if known. @@ -297,6 +301,7 @@ impl ThreadMetadataBuilder { .unwrap_or(updated_at); let guardian_review = crate::is_guardian_review_source(&self.source); ThreadMetadata { + attached_thread_parent_id: None, originator: self.originator.clone(), creator_user_id: self.creator_user_id.clone(), creator_account_id: self.creator_account_id.clone(), @@ -501,6 +506,7 @@ fn canonicalize_datetime(dt: DateTime) -> DateTime { #[derive(Debug)] pub(crate) struct ThreadRow { + attached_thread_parent_id: Option, originator: Option, creator_user_id: Option, creator_account_id: Option, @@ -543,6 +549,7 @@ pub(crate) struct ThreadRow { impl ThreadRow { pub(crate) fn try_from_row(row: &SqliteRow) -> Result { Ok(Self { + attached_thread_parent_id: row.try_get("attached_thread_parent_id")?, originator: row.try_get("originator")?, creator_user_id: row.try_get("creator_user_id")?, creator_account_id: row.try_get("creator_account_id")?, @@ -589,6 +596,7 @@ impl TryFrom for ThreadMetadata { fn try_from(row: ThreadRow) -> std::result::Result { let ThreadRow { + attached_thread_parent_id, originator, creator_user_id, creator_account_id, @@ -650,6 +658,9 @@ impl TryFrom for ThreadMetadata { }; Ok(Self { id: ThreadId::try_from(id)?, + attached_thread_parent_id: attached_thread_parent_id + .map(ThreadId::try_from) + .transpose()?, originator, creator_user_id, creator_account_id, @@ -766,6 +777,7 @@ mod tests { fn thread_row(reasoning_effort: Option<&str>) -> ThreadRow { ThreadRow { + attached_thread_parent_id: None, originator: None, creator_user_id: None, creator_account_id: None, @@ -808,6 +820,7 @@ mod tests { fn expected_thread_metadata(reasoning_effort: Option) -> ThreadMetadata { ThreadMetadata { + attached_thread_parent_id: None, originator: None, creator_user_id: None, creator_account_id: None, diff --git a/codex-rs/state/src/runtime/memories.rs b/codex-rs/state/src/runtime/memories.rs index f11a779fb6..18c32ea49b 100644 --- a/codex-rs/state/src/runtime/memories.rs +++ b/codex-rs/state/src/runtime/memories.rs @@ -177,6 +177,7 @@ WHERE kind = ? AND job_key = ? r#" SELECT threads.id, + threads.attached_thread_parent_id, threads.rollout_path, threads.created_at_ms AS created_at, threads.updated_at_ms AS updated_at, @@ -571,6 +572,7 @@ WHERE so.thread_id = ? AND so.source_updated_at = ? r#" SELECT threads.id, + threads.attached_thread_parent_id, threads.rollout_path, threads.created_at_ms AS created_at, threads.updated_at_ms AS updated_at, @@ -2089,6 +2091,7 @@ mod tests { ); eligible_idle.created_at = eligible_idle_at; eligible_idle.updated_at = eligible_idle_at; + eligible_idle.attached_thread_parent_id = Some(current_thread_id); runtime .upsert_thread(&eligible_idle) .await diff --git a/codex-rs/state/src/runtime/test_support.rs b/codex-rs/state/src/runtime/test_support.rs index a259dd93b8..5d2f7fe85b 100644 --- a/codex-rs/state/src/runtime/test_support.rs +++ b/codex-rs/state/src/runtime/test_support.rs @@ -46,6 +46,7 @@ pub(super) fn test_thread_metadata( let now = DateTime::::from_timestamp(1_700_000_000, 0).expect("timestamp"); ThreadMetadata { creator_user_id: None, + attached_thread_parent_id: None, creator_account_id: None, originator: None, id: thread_id, diff --git a/codex-rs/state/src/runtime/threads.rs b/codex-rs/state/src/runtime/threads.rs index 5a96d13c58..c72a9222f7 100644 --- a/codex-rs/state/src/runtime/threads.rs +++ b/codex-rs/state/src/runtime/threads.rs @@ -7,12 +7,15 @@ use codex_protocol::protocol::SessionSource; use std::sync::atomic::AtomicI64; use std::sync::atomic::Ordering; +const EXCLUDE_ATTACHED_THREADS: &str = " AND threads.attached_thread_parent_id IS NULL"; + impl StateRuntime { pub async fn get_thread(&self, id: ThreadId) -> anyhow::Result> { let row = sqlx::query( r#" SELECT threads.id, + threads.attached_thread_parent_id, threads.rollout_path, threads.created_at_ms AS created_at, threads.updated_at_ms AS updated_at, @@ -454,6 +457,7 @@ ON CONFLICT(child_thread_id) DO NOTHING }, /*include_thread_id_tiebreaker*/ false, ); + builder.push(EXCLUDE_ATTACHED_THREADS); builder.push(" AND threads.title = "); builder.push_bind(title); if let Some(cwd) = cwd { @@ -585,6 +589,7 @@ ON CONFLICT(child_thread_id) DO NOTHING | crate::SortKey::SectionPosition ), ); + builder.push(EXCLUDE_ATTACHED_THREADS); push_thread_order_and_limit( &mut builder, sort_key, @@ -663,8 +668,9 @@ INSERT INTO threads ( git_origin_url, memory_mode, project_id, - daybreak_enabled -) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + daybreak_enabled, + attached_thread_parent_id +) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO NOTHING "#, ) @@ -718,6 +724,7 @@ ON CONFLICT(id) DO NOTHING .bind("enabled") .bind(metadata.project_id.as_deref()) .bind(metadata.daybreak_enabled) + .bind(metadata.attached_thread_parent_id.map(|id| id.to_string())) .execute_with_busy_retry(self.pool.as_ref()) .await?; self.insert_thread_spawn_edge_from_source_if_absent(metadata.id, metadata.source.as_str()) @@ -963,9 +970,11 @@ INSERT INTO threads ( git_origin_url, memory_mode, project_id, - daybreak_enabled -) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + daybreak_enabled, + attached_thread_parent_id +) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET + attached_thread_parent_id = COALESCE(excluded.attached_thread_parent_id, threads.attached_thread_parent_id), rollout_path = excluded.rollout_path, created_at = excluded.created_at, updated_at = excluded.updated_at, @@ -1054,6 +1063,7 @@ ON CONFLICT(id) DO UPDATE SET .bind(creation_memory_mode.unwrap_or("enabled")) .bind(metadata.project_id.as_deref()) .bind(metadata.daybreak_enabled) + .bind(metadata.attached_thread_parent_id.map(|id| id.to_string())) .execute_with_busy_retry(self.pool.as_ref()) .await?; self.insert_thread_spawn_edge_from_source_if_absent(metadata.id, metadata.source.as_str()) @@ -1272,6 +1282,9 @@ WITH RECURSIVE subtree(child_thread_id, parent_thread_id) AS ( Some(crate::ThreadRelationFilter::DescendantsOf(_)) => builder.push( ", subtree.parent_thread_id AS parent_thread_id\nFROM subtree\nCROSS JOIN threads ON threads.id = subtree.child_thread_id", ), + Some(crate::ThreadRelationFilter::AttachedThreadsOf(_)) => { + builder.push(", NULL AS parent_thread_id\nFROM threads") + } None => builder.push(" FROM threads"), }; let include_thread_id_tiebreaker = relation_filter.is_some() @@ -1285,6 +1298,12 @@ WITH RECURSIVE subtree(child_thread_id, parent_thread_id) AS ( include_thread_id_tiebreaker, /*include_empty_preview*/ relation_filter.is_some(), ); + if !matches!( + relation_filter, + Some(crate::ThreadRelationFilter::AttachedThreadsOf(_)) + ) { + builder.push(EXCLUDE_ATTACHED_THREADS); + } match relation_filter { Some(crate::ThreadRelationFilter::DirectChildrenOf(parent_thread_id)) => { builder.push(" AND listed_edge.parent_thread_id = "); @@ -1294,11 +1313,15 @@ WITH RECURSIVE subtree(child_thread_id, parent_thread_id) AS ( builder.push(" AND subtree.child_thread_id != "); builder.push_bind(ancestor_thread_id.to_string()); } + Some(crate::ThreadRelationFilter::AttachedThreadsOf(parent)) => { + builder.push(" AND threads.attached_thread_parent_id = "); + builder.push_bind(parent.to_string()); + } None => {} } let order_by_index = match (relation_filter, filters.cwd_filters) { // Relationship listings are expected to be much smaller than the global thread table. - // Prefer the spawn-edge index and sort the matching subtree instead of scanning the + // Prefer the relationship index and sort the matches instead of scanning the // timestamp index until enough related threads happen to be found. (Some(_), _) => OrderByIndex::Disabled, // Multi-cwd listing is supported but at the time of writing has no current use in production. @@ -1321,6 +1344,7 @@ pub(super) fn push_thread_select_columns(builder: &mut QueryBuilder) { r#" SELECT threads.id, + threads.attached_thread_parent_id, threads.rollout_path, threads.created_at_ms AS created_at, threads.updated_at_ms AS updated_at, @@ -1708,6 +1732,81 @@ mod tests { ); } + #[tokio::test] + async fn attached_thread_discovery_preserves_parent_lifecycle_and_cwd() -> anyhow::Result<()> { + let home = unique_temp_dir(); + let config = crate::SqliteConfig::new_for_testing(home.as_path().abs()); + let runtime = StateRuntime::init(config, "test-provider".to_string()).await?; + let parent = ThreadId::new(); + let child = ThreadId::new(); + let mut parent_metadata = test_thread_metadata(&home, parent, home.clone()); + parent_metadata.preview = Some("parent".into()); + parent_metadata.title = "shared title".into(); + let mut child_metadata = test_thread_metadata(&home, child, home.join("original")); + child_metadata.attached_thread_parent_id = Some(parent); + child_metadata.preview = Some("saved child".into()); + child_metadata.created_at = Utc::now() + chrono::Duration::seconds(5); + child_metadata.updated_at = child_metadata.created_at; + child_metadata.title = parent_metadata.title.clone(); + runtime.upsert_thread(&parent_metadata).await?; + assert!(runtime.insert_thread_if_absent(&child_metadata).await?); + let filters = ThreadFilterOptions { + archived_only: false, + allowed_sources: &[], + model_providers: None, + cwd_filters: None, + section: None, + project_id: None, + anchor: None, + sort_key: SortKey::CreatedAt, + sort_direction: SortDirection::Desc, + search_term: None, + }; + let named = runtime + .find_thread_by_exact_title( + "shared title", + &[], + /*model_providers*/ None, + /*archived_only*/ false, + /*cwd*/ None, + ) + .await?; + assert_eq!(named.map(|thread| thread.id), Some(parent)); + let ids = runtime + .list_thread_ids( + /*limit*/ 1, + /*anchor*/ None, + SortKey::UpdatedAt, + &[], + /*model_providers*/ None, + /*archived_only*/ false, + ) + .await?; + assert_eq!(ids.len(), 1); + assert_ne!(ids[0], child); + parent_metadata.cwd = home.join("moved"); + runtime.upsert_thread(&parent_metadata).await?; + runtime + .mark_archived(parent, &parent_metadata.rollout_path, Utc::now()) + .await?; + let saved = runtime + .list_threads_by_relation( + /*page_size*/ 10, + crate::ThreadRelationFilter::AttachedThreadsOf(parent), + filters, + ) + .await?; + assert_eq!( + saved + .items + .iter() + .map(|t| (t.id, t.cwd.clone())) + .collect::>(), + vec![(child, child_metadata.cwd)] + ); + Ok(()) + } + #[tokio::test] async fn archived_threads_without_previews_remain_listed() { let codex_home = unique_temp_dir(); @@ -2808,6 +2907,7 @@ mod tests { ); let items = vec![RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -2882,6 +2982,7 @@ mod tests { ); let items = vec![RolloutItem::SessionMeta(Box::new(SessionMetaLine { meta: SessionMeta { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/thread-store/src/in_memory.rs b/codex-rs/thread-store/src/in_memory.rs index 14a967e6e4..2df41dc67e 100644 --- a/codex-rs/thread-store/src/in_memory.rs +++ b/codex-rs/thread-store/src/in_memory.rs @@ -166,6 +166,7 @@ mod tests { ] { store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -442,6 +443,7 @@ mod tests { history_mode: ThreadHistoryMode, ) -> CreateThreadParams { CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), @@ -583,6 +585,7 @@ impl InMemoryThreadStore { let mut state = self.state.lock().await; state.calls.create_thread += 1; let session_meta = SessionMeta { + attached_thread: params.attached_thread, session_id: params.session_id, id: params.thread_id, forked_from_id: params.forked_from_id, @@ -1002,6 +1005,11 @@ impl ThreadStore for InMemoryThreadStore { page.items .retain(|thread| thread.parent_thread_id == Some(parent_thread_id)); } + Some(ThreadRelationFilter::AttachedThreadsOf(_)) => { + return Err(ThreadStoreError::Unsupported { + operation: "attached threads", + }); + } Some(ThreadRelationFilter::DescendantsOf(ancestor_thread_id)) => { let mut subtree = HashSet::from([ancestor_thread_id]); loop { diff --git a/codex-rs/thread-store/src/local/create_thread.rs b/codex-rs/thread-store/src/local/create_thread.rs index e3b7fc8a89..8b9823eb4d 100644 --- a/codex-rs/thread-store/src/local/create_thread.rs +++ b/codex-rs/thread-store/src/local/create_thread.rs @@ -41,6 +41,7 @@ pub(super) async fn create_thread( ) .with_creator(params.creator_user_id, params.creator_account_id) .with_session_id(params.session_id) + .with_attached_thread(params.attached_thread) .with_selected_capability_roots(params.selected_capability_roots) .with_runtime_workspace_roots(params.runtime_workspace_roots.map(|roots| { roots diff --git a/codex-rs/thread-store/src/local/delete_thread.rs b/codex-rs/thread-store/src/local/delete_thread.rs index 75e55ef84f..ab13996c74 100644 --- a/codex-rs/thread-store/src/local/delete_thread.rs +++ b/codex-rs/thread-store/src/local/delete_thread.rs @@ -12,6 +12,7 @@ use std::io::ErrorKind; use std::path::Path; use std::path::PathBuf; +use codex_protocol::ThreadId; use codex_rollout::ARCHIVED_SESSIONS_SUBDIR; use codex_rollout::RolloutReferenceIndex; use codex_rollout::SESSIONS_SUBDIR; @@ -33,6 +34,32 @@ struct ThreadRollouts { paths: Vec, } +impl LocalThreadStore { + /// Reject deletion while any candidate has attached threads. Call before stopping live work; + /// deletion repeats this check under existing writer ownership to cover concurrent creation. + pub async fn ensure_no_attached_threads( + &self, + thread_ids: &[ThreadId], + ) -> ThreadStoreResult<()> { + let reference_index = scan_reference_index(self).await?; + check_attached_children(&reference_index, thread_ids) + } +} + +fn check_attached_children( + reference_index: &RolloutReferenceIndex, + thread_ids: &[ThreadId], +) -> ThreadStoreResult<()> { + let Some(child) = reference_index.attached_child(thread_ids) else { + return Ok(()); + }; + Err(ThreadStoreError::InvalidRequest { + message: format!( + "cannot delete thread while attached thread {child} exists; delete the attached thread first" + ), + }) +} + impl ThreadRollouts { fn from_index( reference_index: &RolloutReferenceIndex, @@ -70,10 +97,11 @@ pub(super) async fn delete_thread( let thread_id = params.thread_id; let _lifecycle_guard = store.live_writer_locks.lock_lifecycle(thread_id).await; let _live_writer_guard = store.live_writer_locks.lock(thread_id).await; + let mut writer_guards = store.acquire_writer_locks(&[thread_id]).await?; let reference_index = scan_reference_index(store).await?; let thread_rollouts = ThreadRollouts::from_index(&reference_index, thread_id); + check_attached_children(&reference_index, &[thread_id])?; ensure_no_external_references(&reference_index, std::slice::from_ref(&thread_rollouts))?; - let mut writer_guards = store.acquire_writer_locks(&[thread_id]).await?; if let Some(cleanup) = &store.thread_data_cleanup { cleanup(vec![thread_id]).await?; } @@ -113,14 +141,14 @@ pub(super) async fn delete_threads( _live_writer_guards.push(store.live_writer_locks.lock(thread_id).await); } + let mut writer_guards = store.acquire_writer_locks(&lock_thread_ids).await?; let reference_index = scan_reference_index(store).await?; let thread_rollouts = thread_ids .iter() .map(|thread_id| ThreadRollouts::from_index(&reference_index, *thread_id)) .collect::>(); + check_attached_children(&reference_index, &lock_thread_ids)?; ensure_no_external_references(&reference_index, thread_rollouts.as_slice())?; - - let mut writer_guards = store.acquire_writer_locks(&lock_thread_ids).await?; if let Some(cleanup) = &store.thread_data_cleanup { cleanup(thread_ids.clone()).await?; } @@ -136,7 +164,7 @@ pub(super) async fn delete_threads( Ok(()) } -async fn delete_state_rows( +pub(super) async fn delete_state_rows( store: &LocalThreadStore, thread_ids: &[codex_protocol::ThreadId], ) -> ThreadStoreResult { @@ -272,7 +300,10 @@ async fn delete_thread_after_reference_check( Ok(()) } -fn delete_rollout_file(store: &LocalThreadStore, rollout_path: &Path) -> ThreadStoreResult { +pub(super) fn delete_rollout_file( + store: &LocalThreadStore, + rollout_path: &Path, +) -> ThreadStoreResult { let plain_path = codex_rollout::plain_rollout_path(rollout_path); let compressed_path = plain_path.with_extension("jsonl.zst"); let deleted_plain = delete_rollout_path(store, plain_path.as_path())?; diff --git a/codex-rs/thread-store/src/local/list_threads.rs b/codex-rs/thread-store/src/local/list_threads.rs index dc53964f98..fea544636d 100644 --- a/codex-rs/thread-store/src/local/list_threads.rs +++ b/codex-rs/thread-store/src/local/list_threads.rs @@ -198,23 +198,10 @@ async fn list_section_threads( }, search_term: params.search_term.as_deref(), }; - let page = match params.relation_filter { - Some(ThreadRelationFilter::DirectChildrenOf(thread_id)) => { + let page = match params.relation_filter.map(state_relation_filter) { + Some(relation_filter) => { state_db - .list_threads_by_relation( - params.page_size, - codex_state::ThreadRelationFilter::DirectChildrenOf(thread_id), - filters, - ) - .await - } - Some(ThreadRelationFilter::DescendantsOf(thread_id)) => { - state_db - .list_threads_by_relation( - params.page_size, - codex_state::ThreadRelationFilter::DescendantsOf(thread_id), - filters, - ) + .list_threads_by_relation(params.page_size, relation_filter, filters) .await } None => state_db.list_threads(params.page_size, filters).await, @@ -255,16 +242,6 @@ pub(super) async fn list_rollout_threads( sort_direction: codex_rollout::SortDirection, ) -> ThreadStoreResult { if params.relation_filter.is_some() || params.section.is_some() || params.project_id.is_some() { - let relation_filter = params - .relation_filter - .map(|relation_filter| match relation_filter { - ThreadRelationFilter::DirectChildrenOf(parent_thread_id) => { - codex_state::ThreadRelationFilter::DirectChildrenOf(parent_thread_id) - } - ThreadRelationFilter::DescendantsOf(ancestor_thread_id) => { - codex_state::ThreadRelationFilter::DescendantsOf(ancestor_thread_id) - } - }); let page = codex_rollout::state_db::list_threads_db( state_db.as_deref(), &config.sqlite, @@ -275,7 +252,7 @@ pub(super) async fn list_rollout_threads( params.allowed_sources.as_slice(), params.model_providers.as_deref(), params.cwd_filters.as_deref(), - relation_filter, + params.relation_filter.map(state_relation_filter), params.archived, params.section.as_ref().map(Option::as_deref), params.project_id.as_ref().map(Option::as_deref), @@ -354,6 +331,20 @@ pub(super) async fn list_rollout_threads( }) } +fn state_relation_filter(filter: ThreadRelationFilter) -> codex_state::ThreadRelationFilter { + match filter { + ThreadRelationFilter::DirectChildrenOf(id) => { + codex_state::ThreadRelationFilter::DirectChildrenOf(id) + } + ThreadRelationFilter::DescendantsOf(id) => { + codex_state::ThreadRelationFilter::DescendantsOf(id) + } + ThreadRelationFilter::AttachedThreadsOf(id) => { + codex_state::ThreadRelationFilter::AttachedThreadsOf(id) + } + } +} + #[cfg(test)] mod tests { use chrono::Utc; diff --git a/codex-rs/thread-store/src/local/live_writer.rs b/codex-rs/thread-store/src/local/live_writer.rs index a8213b8845..0fba3f55f8 100644 --- a/codex-rs/thread-store/src/local/live_writer.rs +++ b/codex-rs/thread-store/src/local/live_writer.rs @@ -28,11 +28,45 @@ pub(super) async fn create_thread( params: CreateThreadParams, ) -> ThreadStoreResult<()> { let thread_id = params.thread_id; + let attachment = if params.attached_thread { + let parent = params + .forked_from_id + .filter(|parent| *parent != thread_id) + .ok_or_else(|| ThreadStoreError::InvalidRequest { + message: "attached threads require a distinct fork source".to_string(), + })?; + let state = store + .state_db + .as_ref() + .ok_or(ThreadStoreError::Unsupported { + operation: "attached_threads", + })?; + // Keep parent deletion out until the child's canonical metadata is durable. + let source_ownership = ( + store.live_writer_locks.lock(parent).await, + store.acquire_writer_locks(&[parent]).await?, + ); + super::thread_rollout_resolver::resolve_current_including_archived(store, parent) + .await? + .ok_or(ThreadStoreError::ThreadNotFound { thread_id: parent })?; + Some((state, source_ownership)) + } else { + None + }; let _live_writer_guard = store.live_writer_locks.lock(thread_id).await; let history_mode = params.history_mode; store.ensure_live_recorder_absent(thread_id).await?; let writer_lock = store.acquire_writer_lock(thread_id)?; let recorder = create_thread::create_thread(store, params, writer_lock.clone()).await?; + if let Some((state, _source_ownership)) = attachment { + recorder.persist().await.map_err(thread_store_io_error)?; + if let Err(error) = index_attached_thread(store, state, recorder.rollout_path()).await { + recorder.discard().await.map_err(thread_store_io_error)?; + super::delete_thread::delete_rollout_file(store, recorder.rollout_path())?; + super::delete_thread::delete_state_rows(store, &[thread_id]).await?; + return Err(error); + } + } store .insert_live_recorder(thread_id, recorder, thread_id, history_mode, writer_lock) .await @@ -235,6 +269,40 @@ pub(super) async fn discard_thread( .map_err(thread_store_io_error) } +async fn index_attached_thread( + store: &LocalThreadStore, + state: &codex_state::StateRuntime, + path: &std::path::Path, +) -> ThreadStoreResult<()> { + let meta = codex_rollout::read_session_meta_line(path) + .await + .map_err(thread_store_io_error)?; + let memory_mode = meta.meta.memory_mode.clone(); + let items = [RolloutItem::SessionMeta(Box::new(meta))]; + let mut builder = codex_rollout::builder_from_items(&items, path).ok_or_else(|| { + ThreadStoreError::Internal { + message: format!("invalid attached thread metadata at {}", path.display()), + } + })?; + if super::helpers::rollout_path_is_archived(&store.config.codex_home, path) { + builder.archived_at = Some(builder.updated_at.unwrap_or(builder.created_at)); + } + state + .apply_rollout_items( + &builder, + &items, + memory_mode.as_deref(), + /*updated_at_override*/ None, + ) + .await + .map_err(|err| ThreadStoreError::Internal { + message: format!( + "failed to index attached thread at {}: {err}", + path.display() + ), + }) +} + pub(super) async fn rollout_path( store: &LocalThreadStore, thread_id: ThreadId, diff --git a/codex-rs/thread-store/src/local/mod.rs b/codex-rs/thread-store/src/local/mod.rs index 98c6ff70c2..4a7467a0df 100644 --- a/codex-rs/thread-store/src/local/mod.rs +++ b/codex-rs/thread-store/src/local/mod.rs @@ -1602,6 +1602,120 @@ mod tests { } } + #[tokio::test] + async fn attached_creation_and_deletion_coordinate_across_stores() { + let home = TempDir::new().expect("temp dir"); + let config = test_config(home.path()); + let runtime = codex_state::StateRuntime::init( + config.sqlite.clone(), + config.default_model_provider_id.clone(), + ) + .await + .expect("initialize state db"); + let first = LocalThreadStore::new(config.clone(), Some(runtime.clone())); + let second = LocalThreadStore::new(config, Some(runtime.clone())); + let parent_uuid = uuid::Uuid::new_v4(); + let parent = ThreadId::from_u128(parent_uuid.as_u128()); + let parent_path = write_session_file(home.path(), "2025-01-03T00-00-00", parent_uuid) + .expect("write parent"); + let child = ThreadId::new(); + let mut params = create_thread_params(child); + params.attached_thread = true; + assert!(matches!( + second.create_thread(params.clone()).await, + Err(ThreadStoreError::InvalidRequest { .. }) + )); + params.forked_from_id = Some(parent); + let parent_guard = first.acquire_writer_lock(parent).expect("lock parent"); + assert!(matches!( + second.create_thread(params.clone()).await, + Err(ThreadStoreError::Conflict { .. }) + )); + drop(parent_guard); + let pool = runtime + .sqlite() + .open_read_write_pool(&runtime.sqlite().state_db_path()) + .await + .expect("open state db"); + sqlx::query( + "CREATE TRIGGER fail_attached_index BEFORE UPDATE OF memory_mode ON threads WHEN NEW.attached_thread_parent_id IS NOT NULL BEGIN SELECT RAISE(ABORT, 'index failed'); END", + ) + .execute(&pool) + .await + .expect("inject index failure"); + let mut failing_params = params.clone(); + failing_params.metadata.memory_mode = ThreadMemoryMode::Disabled; + second + .create_thread(failing_params) + .await + .expect_err("indexing must fail"); + first + .ensure_no_attached_threads(&[parent]) + .await + .expect("failed creation must not leave an attached rollout"); + assert!( + runtime + .get_thread(child) + .await + .expect("read index") + .is_none() + ); + sqlx::query("DROP TRIGGER fail_attached_index") + .execute(&pool) + .await + .expect("remove index failure"); + second + .create_thread(params.clone()) + .await + .expect("create child"); + assert_eq!( + runtime + .delete_thread(child) + .await + .expect("remove index row"), + 1 + ); + assert!(matches!( + first + .delete_threads(DeleteThreadsParams { + thread_ids: vec![parent] + }) + .await, + Err(ThreadStoreError::InvalidRequest { .. }) + )); + assert!( + parent_path.exists(), + "refused deletion must preserve parent" + ); + second + .discard_thread(child) + .await + .expect("release child writer"); + assert!(matches!( + first + .delete_threads(DeleteThreadsParams { + thread_ids: vec![parent] + }) + .await, + Err(ThreadStoreError::InvalidRequest { .. }) + )); + first + .delete_thread(DeleteThreadParams { thread_id: child }) + .await + .expect("delete child"); + first + .delete_threads(DeleteThreadsParams { + thread_ids: vec![parent], + }) + .await + .expect("parent can be deleted after its child"); + assert!(!parent_path.exists()); + assert!(matches!( + second.create_thread(params).await, + Err(ThreadStoreError::ThreadNotFound { thread_id }) if thread_id == parent + )); + } + #[tokio::test] async fn resume_thread_reopens_live_writer_and_appends_with_stale_sqlite_path() { let home = TempDir::new().expect("temp dir"); @@ -2246,6 +2360,7 @@ mod tests { fn create_thread_params(thread_id: ThreadId) -> CreateThreadParams { CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/thread-store/src/local/pending_thread_metadata_tests.rs b/codex-rs/thread-store/src/local/pending_thread_metadata_tests.rs index f9b4c63348..8c6856588c 100644 --- a/codex-rs/thread-store/src/local/pending_thread_metadata_tests.rs +++ b/codex-rs/thread-store/src/local/pending_thread_metadata_tests.rs @@ -457,6 +457,7 @@ fn staged_model_patch() -> ThreadMetadataPatch { fn create_thread_params(thread_id: ThreadId) -> CreateThreadParams { CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/thread-store/src/local/revert_thread.rs b/codex-rs/thread-store/src/local/revert_thread.rs index 424a0f54c1..8a9166365f 100644 --- a/codex-rs/thread-store/src/local/revert_thread.rs +++ b/codex-rs/thread-store/src/local/revert_thread.rs @@ -181,6 +181,7 @@ async fn create_replacement_recorder( ) .with_creator(source_meta.creator_user_id, source_meta.creator_account_id) .with_session_id(source_meta.session_id) + .with_attached_thread(source_meta.attached_thread) .with_rollout_id(rollout_id) .with_selected_capability_roots(source_meta.selected_capability_roots) .with_runtime_workspace_roots(source_meta.runtime_workspace_roots) diff --git a/codex-rs/thread-store/src/local/revert_thread_tests.rs b/codex-rs/thread-store/src/local/revert_thread_tests.rs index 974d58c93e..564c990ae2 100644 --- a/codex-rs/thread-store/src/local/revert_thread_tests.rs +++ b/codex-rs/thread-store/src/local/revert_thread_tests.rs @@ -272,6 +272,7 @@ async fn rollout_paths_for_thread( async fn create_paginated_thread(store: &LocalThreadStore, thread_id: ThreadId) { store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: Some("creator-user".to_string()), creator_account_id: Some("creator-account".to_string()), session_id: thread_id.into(), 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 213735805b..c9e2fe2859 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 @@ -754,6 +754,7 @@ async fn paginated_realtime_items_materialize_separately_in_rollout_order() { let legacy_thread_id = ThreadId::new(); store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: legacy_thread_id.into(), @@ -3068,6 +3069,7 @@ async fn create_paginated_subagent_thread( ) { store .create_thread(CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), 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 3e2729b021..33fd5473ae 100644 --- a/codex-rs/thread-store/src/local/update_thread_metadata.rs +++ b/codex-rs/thread-store/src/local/update_thread_metadata.rs @@ -676,7 +676,9 @@ async fn metadata_for_missing_sqlite_row( patch.source.clone().unwrap_or(SessionSource::Unknown), ); builder.model_provider = patch.model_provider.clone(); - builder.history_mode = canonical_history_mode(store, thread_id, rollout_path).await?; + let (history_mode, attached_thread_parent_id) = + canonical_history_mode_and_attachment(store, thread_id, rollout_path).await?; + builder.history_mode = history_mode; builder.thread_source = patch.thread_source.clone().flatten(); builder.agent_nickname = patch.agent_nickname.clone().flatten(); builder.agent_role = patch.agent_role.clone().flatten(); @@ -684,21 +686,25 @@ async fn metadata_for_missing_sqlite_row( builder.cwd = patch.cwd.clone().map(normalize_cwd).unwrap_or_default(); builder.cli_version = patch.cli_version.clone(); let mut metadata = builder.build(store.config.default_model_provider_id.as_str()); + metadata.attached_thread_parent_id = attached_thread_parent_id; if rollout_path_archived { metadata.archived_at = Some(metadata.updated_at); } Ok(metadata) } -async fn canonical_history_mode( +async fn canonical_history_mode_and_attachment( store: &LocalThreadStore, thread_id: ThreadId, rollout_path: &Path, -) -> ThreadStoreResult { +) -> ThreadStoreResult<(ThreadHistoryMode, Option)> { if let Some((path, meta)) = live_writer::unpersisted_session_meta(store, thread_id).await && path == rollout_path { - return Ok(meta.history_mode); + return Ok(( + meta.history_mode, + meta.forked_from_id.filter(|_| meta.attached_thread), + )); } let session_meta = match read_session_meta_line(rollout_path).await { Ok(session_meta) => session_meta, @@ -715,7 +721,7 @@ async fn canonical_history_mode( { // The live writer retains the canonical mode selected before its deferred // SessionMeta reaches JSONL. - return Ok(history_mode); + return Ok((history_mode, None)); } return Err(ThreadStoreError::Internal { message: format!( @@ -732,7 +738,13 @@ async fn canonical_history_mode( ), }); } - Ok(session_meta.meta.history_mode) + Ok(( + session_meta.meta.history_mode, + session_meta + .meta + .forked_from_id + .filter(|_| session_meta.meta.attached_thread), + )) } fn requires_rollout_compatibility_update(patch: &ThreadMetadataPatch) -> bool { diff --git a/codex-rs/thread-store/src/thread_metadata_sync.rs b/codex-rs/thread-store/src/thread_metadata_sync.rs index c58a3c49e4..7a75565a68 100644 --- a/codex-rs/thread-store/src/thread_metadata_sync.rs +++ b/codex-rs/thread-store/src/thread_metadata_sync.rs @@ -485,6 +485,7 @@ mod tests { async fn create_metadata_records_originator_without_project() { let thread_id = ThreadId::new(); let sync = ThreadMetadataSync::for_create(&CreateThreadParams { + attached_thread: false, creator_user_id: None, creator_account_id: None, session_id: thread_id.into(), diff --git a/codex-rs/thread-store/src/types.rs b/codex-rs/thread-store/src/types.rs index 163833a7cf..4a55334b10 100644 --- a/codex-rs/thread-store/src/types.rs +++ b/codex-rs/thread-store/src/types.rs @@ -86,6 +86,9 @@ pub struct CreateThreadParams { pub extra_config: Option, /// Source thread id when this thread is created as a fork. pub forked_from_id: Option, + /// Saved fork role, persisted independently of the thread index. + #[serde(default, skip_serializing_if = "std::ops::Not::not")] + pub attached_thread: bool, /// The ID of the parent thread. This will only be set if this thread is a subagent. pub parent_thread_id: Option, /// Runtime source for the thread. @@ -308,13 +311,15 @@ pub enum SortDirection { Desc, } -/// Spawn-graph relationship used to filter thread listings. +/// Parent relationship used to filter thread listings. #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ThreadRelationFilter { /// Return only threads whose immediate parent is the given thread. DirectChildrenOf(ThreadId), /// Return every thread transitively descended from the given thread. DescendantsOf(ThreadId), + /// Saved attached threads, independent of the spawned-agent graph. + AttachedThreadsOf(ThreadId), } /// Parameters for listing threads. diff --git a/codex-rs/tui/src/analytics/chats.rs b/codex-rs/tui/src/analytics/chats.rs index 50d7c8167a..ba875ecc05 100644 --- a/codex-rs/tui/src/analytics/chats.rs +++ b/codex-rs/tui/src/analytics/chats.rs @@ -145,6 +145,7 @@ pub(super) async fn roots( pub(super) fn list_params() -> ThreadListParams { ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, limit: Some(100), sort_key: Some(ThreadSortKey::UpdatedAt), sort_direction: Some(SortDirection::Desc), diff --git a/codex-rs/tui/src/app/agent_picker.rs b/codex-rs/tui/src/app/agent_picker.rs index 085fc26657..93c4b5391b 100644 --- a/codex-rs/tui/src/app/agent_picker.rs +++ b/codex-rs/tui/src/app/agent_picker.rs @@ -41,6 +41,7 @@ impl App { request_id: RequestId::String(Uuid::new_v4().to_string()), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(AGENT_PICKER_PAGE_SIZE), diff --git a/codex-rs/tui/src/app/agents_overview_discovery.rs b/codex-rs/tui/src/app/agents_overview_discovery.rs index af02a2197f..fb6aedf93b 100644 --- a/codex-rs/tui/src/app/agents_overview_discovery.rs +++ b/codex-rs/tui/src/app/agents_overview_discovery.rs @@ -36,6 +36,7 @@ pub(crate) async fn list_pinned_threads( originators: None, cursor: cursor.clone(), limit: Some(100), + attached_to_thread_id: None, sort_key: Some(ThreadSortKey::SectionPosition), sort_direction: None, model_providers: Some(Vec::new()), @@ -171,6 +172,7 @@ impl SourcePage { request_id: RequestId::String(Uuid::new_v4().to_string()), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: self.cursor.clone(), limit: Some(PAGE_SIZE), diff --git a/codex-rs/tui/src/dynamic_tools.rs b/codex-rs/tui/src/dynamic_tools.rs index 6015350a56..4b895da67b 100644 --- a/codex-rs/tui/src/dynamic_tools.rs +++ b/codex-rs/tui/src/dynamic_tools.rs @@ -351,6 +351,7 @@ async fn execute_inner( request_id, params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: arguments.cursor.clone(), limit: Some(limit), diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index dd93ea5169..c31c2d4da2 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -915,6 +915,7 @@ fn latest_session_lookup_params( ) -> ThreadListParams { ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(1), diff --git a/codex-rs/tui/src/named_session_lookup.rs b/codex-rs/tui/src/named_session_lookup.rs index d594fc58dd..c7a37cba48 100644 --- a/codex-rs/tui/src/named_session_lookup.rs +++ b/codex-rs/tui/src/named_session_lookup.rs @@ -65,6 +65,7 @@ pub(super) async fn lookup( let response = app_server .thread_list(ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(100), diff --git a/codex-rs/tui/src/resume_picker.rs b/codex-rs/tui/src/resume_picker.rs index 847954f723..bc7631c966 100644 --- a/codex-rs/tui/src/resume_picker.rs +++ b/codex-rs/tui/src/resume_picker.rs @@ -2161,6 +2161,7 @@ fn thread_list_params( ) -> ThreadListParams { ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor, limit: Some(PAGE_SIZE as u32), diff --git a/codex-rs/tui/src/task_mentions.rs b/codex-rs/tui/src/task_mentions.rs index 364e33abcd..dd8edc5a4d 100644 --- a/codex-rs/tui/src/task_mentions.rs +++ b/codex-rs/tui/src/task_mentions.rs @@ -91,6 +91,7 @@ pub(crate) fn spawn_search( )), params: ThreadListParams { excluded_thread_ids: None, + attached_to_thread_id: None, originators: None, cursor: None, limit: Some(MAX_SEARCH_RESULTS),