mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Add app-server thread/delete API (#25018)
## Why Clients can archive and unarchive threads today, but there is no app-server API for permanently removing a thread. Deletion also needs to cover the full session tree: deleting a main thread should remove spawned subagent threads and the related local metadata instead of leaving orphaned rollout files, goals, or subagent state behind. ## What - Adds the v2 `thread/delete` request and `thread/deleted` notification, with the response shape kept consistent with `thread/archive`. - Implements local hard delete for active and archived rollout files. - Deletes the requested thread's state DB row as the commit point, then best-effort cleans associated state including spawned descendants, goals, spawn edges, logs, dynamic tools, and agent job assignments. - Updates app-server API docs and generated protocol schema/TypeScript fixtures.
This commit is contained in:
committed by
GitHub
Unverified
parent
a1a8807e9d
commit
a19d43a40a
@@ -18,6 +18,7 @@ use codex_protocol::protocol::ThreadMemoryMode;
|
||||
use crate::AppendThreadItemsParams;
|
||||
use crate::ArchiveThreadParams;
|
||||
use crate::CreateThreadParams;
|
||||
use crate::DeleteThreadParams;
|
||||
use crate::ListThreadsParams;
|
||||
use crate::LoadThreadHistoryParams;
|
||||
use crate::ReadThreadByRolloutPathParams;
|
||||
@@ -115,6 +116,7 @@ pub struct InMemoryThreadStoreCalls {
|
||||
pub update_thread_metadata: usize,
|
||||
pub archive_thread: usize,
|
||||
pub unarchive_thread: usize,
|
||||
pub delete_thread: usize,
|
||||
}
|
||||
|
||||
/// In-memory [`ThreadStore`] implementation for tests and debug configs.
|
||||
@@ -333,6 +335,25 @@ impl ThreadStore for InMemoryThreadStore {
|
||||
state.calls.unarchive_thread += 1;
|
||||
stored_thread_from_state(&state, params.thread_id, /*include_history*/ false)
|
||||
}
|
||||
|
||||
async fn delete_thread(&self, params: DeleteThreadParams) -> ThreadStoreResult<()> {
|
||||
let mut state = self.state.lock().await;
|
||||
state.calls.delete_thread += 1;
|
||||
let existed = state.histories.remove(¶ms.thread_id).is_some();
|
||||
state.created_threads.remove(¶ms.thread_id);
|
||||
state.names.remove(¶ms.thread_id);
|
||||
state.metadata_updates.remove(¶ms.thread_id);
|
||||
state
|
||||
.rollout_paths
|
||||
.retain(|_, thread_id| *thread_id != params.thread_id);
|
||||
if existed {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(ThreadStoreError::ThreadNotFound {
|
||||
thread_id: params.thread_id,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn stored_thread_from_state(
|
||||
|
||||
Reference in New Issue
Block a user