fix(agent-core): honor abort signal in WebSearch and FetchURL tools#1108
fix(agent-core): honor abort signal in WebSearch and FetchURL tools#1108Caldalis wants to merge 3 commits into
Conversation
The web tools dropped the per-call AbortSignal: FetchURLTool and WebSearchTool forwarded only toolCallId, and the local/Moonshot providers called fetch() without a signal. Cancelling a turn left in-flight HTTP requests running in the background. Thread ctx.signal through the tools and providers down to the underlying fetch, matching how Bash, Grep, and Agent already honor cancellation.
🦋 Changeset detectedLatest commit: 120345b The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Clean threading of the abort signal through every layer — nice work. Tests covering both providers are solid. One small thing: |
Thanks addressed in a follow-up: MoonshotFetchURLProvider.fetch now rethrows when the caller's signal is aborted, so a cancelled request surfaces as a clean abort instead of kicking off a fallback fetch. Genuine Moonshot failures (network errors) still fall back to the local fetcher as before. Added a test covering the abort doesn't fall back path. |
Related Issue
Resolve #1106
Problem
WebSearchandFetchURLignored the per-callAbortSignal. Cancelling a turn(Ctrl-C / turn abort) did not cancel an in-flight network request — it kept
running in the background, holding a connection, and on a slow or hung server it
lingered until undici's default timeouts.
Every other I/O-bound builtin tool (Bash, Grep, Agent, AskUser) already threads
ctx.signalinto its work; the two web tools were the only exception, with nocomment explaining the omission, so this reads as an overs
intentional choice.
What changed
signalto theUrlFetcherandWebSearchProvideroption objects.FetchURLTool/WebSearchToolnow forwardctx.signal they destructured onlytoolCallId`).LocalFetchURLProvider,MoonshotFetchURLProvider, andMoonshotWebSearchProviderpass the signal to the underlyingfetch(), which aborts both the header wait and the body read. The Moonshot → loc options object, so the signal flows through automatically.fetch.This matches the existing cancellation pattern used by Bash/Grep/Agent and keeps the change focused. The touched interfaces (
UrlFetcher/WebSearchProvider) are internal toagent-coreand are rface.Checklist
gen-changesetsskill, or this PR needs no changeset.gen-docsskill, or this PR needs no doc update