Skip to content

feat(core): run subagents in the background by default - #62035

Closed
kitlangton wants to merge 3 commits into
pool-subagentsfrom
pool-subagents-background
Closed

kitlangton wants to merge 3 commits into
pool-subagentsfrom
pool-subagents-background

Conversation

@kitlangton

Copy link
Copy Markdown
Contributor

The subagent tool now runs subagents in the background by default.
The parent gets the child's session ID right away and keeps working; the child's answer arrives later as a message. Pass background: false to wait for the answer inline, as before.

Stacked on #61833, which makes those later reports reliable. Part 2 of 3.

💡 Why
Most subagent work is independent. Waiting by default blocks the parent for minutes, and models rarely ask for background on their own. With #61833, a background child always reports back once it and its own background work are done, so waiting is no longer the safe choice.

🆕 Now you can

  • Start several subagents in one turn and keep going while they run.
  • Still get the answer inline with background: false when the next step needs it.
  • Run one silently with notify: false and read its session yourself later.
- const background = input.background === true
+ const background = input.background !== false

The tool description and the tools docs page now say background is the default and when to use background: false.

background: false on a child that is already running in the background waits for that run and returns its answer inline, and an interrupted foreground prompt releases its claim so the child can report again.

📊 Proof: 38 tests pass in subagent-lifetime and tool-subagent. The tests that relied on the old default now pass background: false explicitly.

👀 Read: packages/core/src/tool/plugin/subagent.ts, the tool description. It's what tells the model to end its turn or keep working instead of waiting. The rest is routine.

From a team design discussion · no user reports · reviewed before push

Checks run
  • bun test test/subagent-lifetime.test.ts test/tool-subagent.test.ts (packages/core): 38 pass
  • bun typecheck (packages/core): no type errors

Foreground becomes background plus a wait: an explicit background=false
starts the same job and blocks on it, returning the child result inline.
The tool description and docs now lead with background.
…uation

A foreground follow-up that continues a child whose job is already
backgrounded joined it through jobs.block, which returns a running handle
immediately. Claim the backgrounded generation instead: silence the
subagent.notify preference before the prompt is admitted, wait on the
job's done with jobs.wait, and return the final answer inline. A prompt
that never reaches the child releases the claim so the original launch
still reports.

A joined backgrounded job holds no block registration, so the user's
move-to-background cannot detach this explicit foreground wait.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants