From 83f25e88b6dfb7cb20e32aca0867d1cf642dc13b Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 7 Jul 2026 21:05:29 -0400 Subject: [PATCH] fix(core): continue after unavailable tool calls --- packages/core/src/session/runner/llm.ts | 9 +++++++++ packages/core/test/config/plugin.test.ts | 4 ++-- packages/core/test/session-runner.test.ts | 5 ++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/core/src/session/runner/llm.ts b/packages/core/src/session/runner/llm.ts index 9f799ef6a3..e2cc611930 100644 --- a/packages/core/src/session/runner/llm.ts +++ b/packages/core/src/session/runner/llm.ts @@ -365,6 +365,15 @@ const layer = Layer.effect( return } needsContinuation = true + if (!advertisedTools.has(event.name)) { + yield* serialized( + publisher.failUnsettledTools({ + type: "tool.execution", + message: `Tool is not available for this request: ${event.name}`, + }), + ) + return + } const assistantMessageID = yield* publisher.assistantMessageID(event.id) ownedToolFibers.push( yield* Effect.uninterruptibleMask((restore) => diff --git a/packages/core/test/config/plugin.test.ts b/packages/core/test/config/plugin.test.ts index dc1fbc72e7..2bfe1d6c74 100644 --- a/packages/core/test/config/plugin.test.ts +++ b/packages/core/test/config/plugin.test.ts @@ -273,9 +273,9 @@ function withLocation( function mutablePlugin(description: string) { const plugin = pathToFileURL(path.join(import.meta.dir, "../../../plugin/src/v2/promise/index.ts")).href return ` -import { define } from ${JSON.stringify(plugin)} +import { Plugin } from ${JSON.stringify(plugin)} -export default EffectPlugin.define({ +export default Plugin.define({ id: "mutable-plugin", setup: async (ctx) => { await ctx.agent.transform((agents) => { diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index 7705b1e486..282ed7cde0 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -2674,7 +2674,10 @@ describe("SessionRunnerLLM", () => { { type: "tool", id: "call-missing", - state: { status: "error", error: { message: "Unknown tool: missing" } }, + state: { + status: "error", + error: { type: "tool.execution", message: "Tool is not available for this request: missing" }, + }, }, ], },