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
@@ -2491,7 +2491,7 @@ async fn list_agent_subtree_thread_ids_includes_anonymous_and_closed_descendants
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn list_agent_subtree_thread_ids_includes_live_descendants_without_state_db() {
|
||||
async fn list_agent_subtree_thread_ids_finds_live_descendants_of_unloaded_root() {
|
||||
let (_home, config) = test_config().await;
|
||||
let manager = ThreadManager::with_models_provider_home_and_state_for_tests(
|
||||
CodexAuth::from_api_key("dummy"),
|
||||
@@ -2536,6 +2536,8 @@ async fn list_agent_subtree_thread_ids_includes_live_descendants_without_state_d
|
||||
.await
|
||||
.expect("grandchild spawn should succeed");
|
||||
|
||||
manager.remove_thread(&parent_thread_id).await;
|
||||
|
||||
let mut subtree_thread_ids = manager
|
||||
.list_agent_subtree_thread_ids(parent_thread_id)
|
||||
.await
|
||||
|
||||
@@ -515,14 +515,12 @@ impl ThreadManager {
|
||||
&self,
|
||||
thread_id: ThreadId,
|
||||
) -> CodexResult<Vec<ThreadId>> {
|
||||
let thread = self.state.get_thread(thread_id).await?;
|
||||
|
||||
let mut subtree_thread_ids = Vec::new();
|
||||
let mut seen_thread_ids = HashSet::new();
|
||||
subtree_thread_ids.push(thread_id);
|
||||
seen_thread_ids.insert(thread_id);
|
||||
|
||||
if let Some(state_db_ctx) = thread.state_db() {
|
||||
if let Some(state_db_ctx) = self.state.state_db() {
|
||||
for status in [
|
||||
DirectionalThreadSpawnEdgeStatus::Open,
|
||||
DirectionalThreadSpawnEdgeStatus::Closed,
|
||||
@@ -541,11 +539,8 @@ impl ThreadManager {
|
||||
}
|
||||
}
|
||||
|
||||
for descendant_id in thread
|
||||
.codex
|
||||
.session
|
||||
.services
|
||||
.agent_control
|
||||
for descendant_id in self
|
||||
.agent_control()
|
||||
.list_live_agent_subtree_thread_ids(thread_id)
|
||||
.await?
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user