mirror of
https://github.com/openai/codex.git
synced 2026-11-10 21:00:47 +00:00
codex: trim multi-agent version plumbing
This commit is contained in:
@@ -48,105 +48,6 @@ mod tests {
|
||||
use crate::ListTurnsParams;
|
||||
use crate::SortDirection;
|
||||
use crate::StoredTurnItemsView;
|
||||
use crate::ThreadEventPersistenceMode;
|
||||
use crate::ThreadPersistenceMetadata;
|
||||
use codex_protocol::models::BaseInstructions;
|
||||
use codex_protocol::protocol::SessionSource;
|
||||
use pretty_assertions::assert_eq;
|
||||
|
||||
#[tokio::test]
|
||||
async fn create_thread_records_multi_agent_version() {
|
||||
let store = InMemoryThreadStore::default();
|
||||
let thread_id = ThreadId::new();
|
||||
store
|
||||
.create_thread(CreateThreadParams {
|
||||
thread_id,
|
||||
forked_from_id: None,
|
||||
source: SessionSource::Exec,
|
||||
thread_source: None,
|
||||
base_instructions: BaseInstructions::default(),
|
||||
dynamic_tools: Vec::new(),
|
||||
multi_agent_version: Some(MultiAgentVersion::V2),
|
||||
metadata: ThreadPersistenceMetadata {
|
||||
cwd: None,
|
||||
model_provider: "test-provider".to_string(),
|
||||
memory_mode: ThreadMemoryMode::Enabled,
|
||||
},
|
||||
event_persistence_mode: ThreadEventPersistenceMode::Limited,
|
||||
})
|
||||
.await
|
||||
.expect("create thread should succeed");
|
||||
|
||||
let history = store
|
||||
.load_history(LoadThreadHistoryParams {
|
||||
thread_id,
|
||||
include_archived: true,
|
||||
})
|
||||
.await
|
||||
.expect("created history should load");
|
||||
let versions = history
|
||||
.items
|
||||
.into_iter()
|
||||
.filter_map(|item| match item {
|
||||
RolloutItem::SessionMeta(meta_line) => meta_line.meta.multi_agent_version,
|
||||
_ => None,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
assert_eq!(versions, vec![MultiAgentVersion::V2]);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn concurrent_multi_agent_version_seeds_return_the_first_winner() {
|
||||
let store = InMemoryThreadStore::default();
|
||||
let thread_id = ThreadId::new();
|
||||
store.state.lock().await.histories.insert(
|
||||
thread_id,
|
||||
vec![RolloutItem::SessionMeta(SessionMetaLine {
|
||||
meta: SessionMeta {
|
||||
id: thread_id,
|
||||
..SessionMeta::default()
|
||||
},
|
||||
git: None,
|
||||
})],
|
||||
);
|
||||
|
||||
let (left, right) = tokio::join!(
|
||||
store.set_multi_agent_version_if_unset(SetMultiAgentVersionIfUnsetParams {
|
||||
thread_id,
|
||||
multi_agent_version: MultiAgentVersion::V1,
|
||||
include_archived: true,
|
||||
}),
|
||||
store.set_multi_agent_version_if_unset(SetMultiAgentVersionIfUnsetParams {
|
||||
thread_id,
|
||||
multi_agent_version: MultiAgentVersion::V2,
|
||||
include_archived: true,
|
||||
}),
|
||||
);
|
||||
let left = left.expect("first seed should succeed");
|
||||
let right = right.expect("second seed should return the stored winner");
|
||||
assert_eq!(left, right);
|
||||
assert!(matches!(
|
||||
left,
|
||||
MultiAgentVersion::V1 | MultiAgentVersion::V2
|
||||
));
|
||||
|
||||
let history = store
|
||||
.load_history(LoadThreadHistoryParams {
|
||||
thread_id,
|
||||
include_archived: true,
|
||||
})
|
||||
.await
|
||||
.expect("seeded history should load");
|
||||
let versions = history
|
||||
.items
|
||||
.into_iter()
|
||||
.filter_map(|item| match item {
|
||||
RolloutItem::SessionMeta(meta_line) => meta_line.meta.multi_agent_version,
|
||||
_ => None,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
assert_eq!(versions, vec![left]);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn default_turn_pagination_methods_return_unsupported() {
|
||||
|
||||
@@ -21,7 +21,6 @@ use std::collections::hash_map::Entry;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::Mutex;
|
||||
use tokio::sync::Semaphore;
|
||||
|
||||
use crate::AppendThreadItemsParams;
|
||||
use crate::ArchiveThreadParams;
|
||||
@@ -60,7 +59,7 @@ use codex_protocol::protocol::MultiAgentVersion;
|
||||
pub struct LocalThreadStore {
|
||||
pub(super) config: LocalThreadStoreConfig,
|
||||
live_recorders: Arc<Mutex<HashMap<ThreadId, RolloutRecorder>>>,
|
||||
multi_agent_version_seed_lock: Arc<Semaphore>,
|
||||
multi_agent_version_seed_lock: Arc<Mutex<()>>,
|
||||
state_db: Option<StateDbHandle>,
|
||||
}
|
||||
|
||||
@@ -100,7 +99,7 @@ impl LocalThreadStore {
|
||||
Self {
|
||||
config,
|
||||
live_recorders: Arc::new(Mutex::new(HashMap::new())),
|
||||
multi_agent_version_seed_lock: Arc::new(Semaphore::new(/*permits*/ 1)),
|
||||
multi_agent_version_seed_lock: Arc::new(Mutex::new(())),
|
||||
state_db,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,13 +16,7 @@ pub(super) async fn set_multi_agent_version_if_unset(
|
||||
store: &LocalThreadStore,
|
||||
params: SetMultiAgentVersionIfUnsetParams,
|
||||
) -> ThreadStoreResult<MultiAgentVersion> {
|
||||
let _permit = store
|
||||
.multi_agent_version_seed_lock
|
||||
.acquire()
|
||||
.await
|
||||
.map_err(|err| ThreadStoreError::Internal {
|
||||
message: format!("failed to lock thread multi-agent version seed: {err}"),
|
||||
})?;
|
||||
let _guard = store.multi_agent_version_seed_lock.lock().await;
|
||||
let has_live_writer = live_writer::rollout_path(store, params.thread_id)
|
||||
.await
|
||||
.is_ok();
|
||||
@@ -63,14 +57,6 @@ pub(super) async fn set_multi_agent_version_if_unset(
|
||||
.map_err(|err| ThreadStoreError::Internal {
|
||||
message: format!("failed to set thread multi-agent version: {err}"),
|
||||
})?;
|
||||
if session_meta.meta.id != params.thread_id {
|
||||
return Err(ThreadStoreError::Internal {
|
||||
message: format!(
|
||||
"failed to set thread multi-agent version: rollout session metadata id mismatch: expected {}, found {}",
|
||||
params.thread_id, session_meta.meta.id
|
||||
),
|
||||
});
|
||||
}
|
||||
session_meta.git = None;
|
||||
session_meta.meta.multi_agent_version = Some(params.multi_agent_version);
|
||||
let item = RolloutItem::SessionMeta(session_meta);
|
||||
|
||||
Reference in New Issue
Block a user