b9e7bead13
The async-delegation watcher drained the completion queue as a batch but then delivered each event as its own synthetic turn, flooding the session when a fan-out of background subagents finished together. Builds on the per-process completion batching salvaged from PR #71898 (thanks @yuzilongleif-collab) which coalesces concurrent _run_process_watcher completions behind a short per-route fan-in window. This commit adds the async-delegation half: group the drained batch by full routing key (session_key + parent_session_id + platform/chat/thread/ user) and inject ONE consolidated turn per group. Durable-ack handling stays honest: sibling rows are claimed up front via claim_event_delivery; rows another consumer owns are excluded from the consolidated text (no double-delivery); sibling claims are acknowledged only after adapter acceptance and released (still pending) on failure. Events for different sessions never coalesce, and a single-event group rides the existing per-event path unchanged (latency and text identical). Tests: 3 same-tick events -> exactly one adapter.handle_message carrying all 3 results with all 3 durable rows delivered; 2 sessions -> 2 turns; single-event path unchanged; failed batch releases claims and retries; foreign-claimed sibling excluded and left pending.
2 lines
20 B
Plaintext
2 lines
20 B
Plaintext
yuzilongleif-collab
|