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
This commit is contained in:
Brent Traut
2026-10-23 04:52:47 +00:00
committed by copyberry
parent 4610b573e5
commit 30587d7885
70 changed files with 1078 additions and 68 deletions
+2
View File
@@ -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),