Skip to content

fix(agent): keep detached/background sub-agents alive after parent turn ends#53

Merged
mudler merged 2 commits into
mainfrom
fix/detach-decouple-ctx
Jun 2, 2026
Merged

fix(agent): keep detached/background sub-agents alive after parent turn ends#53
mudler merged 2 commits into
mainfrom
fix/detach-decouple-ctx

Conversation

@mudler

@mudler mudler commented Jun 2, 2026

Copy link
Copy Markdown
Owner

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.

mudler and others added 2 commits June 2, 2026 16:44
…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>
@mudler mudler merged commit a8b4503 into main Jun 2, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant