fix(agent): keep detached/background sub-agents alive after parent turn ends#53
Merged
Conversation
…rn ends A sub-agent's context was a child of the parent turn context (r.ctx), so when an embedder cancelled its per-turn context right after ExecuteTools returned — the normal end-of-turn cleanup — a just-detached (or background) agent was cancelled too, defeating the whole point of detaching. Parent the sub-agent context off context.WithoutCancel(r.ctx): it keeps the context's values but no longer propagates the parent's cancellation. Foreground cancellation is unaffected because the foreground select already watches r.ctx.Done() and calls cancel() explicitly; detached and background agents now run to completion independently and remain cancellable via AgentState.Cancel. Add TestDetachedAgentSurvivesParentCancel, which fails on the old behavior (agent cancelled after parent cancel) and passes now. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Go 1.25's gofmt expands a single-line function body that earlier versions left inline, so the repo-wide `go fmt ./...` CI check failed on this file (inherited from #52). No behavior change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A sub-agent's context was a child of the parent turn context (r.ctx), so when an embedder cancelled its per-turn context right after ExecuteTools returned — the normal end-of-turn cleanup — a just-detached (or background) agent was cancelled too, defeating the whole point of detaching.
Parent the sub-agent context off context.WithoutCancel(r.ctx): it keeps the context's values but no longer propagates the parent's cancellation. Foreground cancellation is unaffected because the foreground select already watches r.ctx.Done() and calls cancel() explicitly; detached and background agents now run to completion independently and remain cancellable via AgentState.Cancel.
Add TestDetachedAgentSurvivesParentCancel, which fails on the old behavior (agent cancelled after parent cancel) and passes now.