From 3fb2d11ce5d8cebb1e04cb44dfddae36e7c882dd Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 23 Apr 2026 21:01:31 +0200 Subject: [PATCH] fix(coding-agent): honor no-tools in service sessions fixes #3592 --- .../src/core/agent-session-services.ts | 4 ++- packages/coding-agent/src/main.ts | 1 + ...uiltin-tools-keeps-extension-tools.test.ts | 26 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/src/core/agent-session-services.ts b/packages/coding-agent/src/core/agent-session-services.ts index 8a9fe0e11..a20386953 100644 --- a/packages/coding-agent/src/core/agent-session-services.ts +++ b/packages/coding-agent/src/core/agent-session-services.ts @@ -6,7 +6,7 @@ import { AuthStorage } from "./auth-storage.js"; import type { SessionStartEvent, ToolDefinition } from "./extensions/index.js"; import { ModelRegistry } from "./model-registry.js"; import { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from "./resource-loader.js"; -import { type CreateAgentSessionResult, createAgentSession } from "./sdk.js"; +import { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from "./sdk.js"; import type { SessionManager } from "./session-manager.js"; import { SettingsManager } from "./settings-manager.js"; @@ -53,6 +53,7 @@ export interface CreateAgentSessionFromServicesOptions { thinkingLevel?: ThinkingLevel; scopedModels?: Array<{ model: Model; thinkingLevel?: ThinkingLevel }>; tools?: string[]; + noTools?: CreateAgentSessionOptions["noTools"]; customTools?: ToolDefinition[]; } @@ -190,6 +191,7 @@ export async function createAgentSessionFromServices( thinkingLevel: options.thinkingLevel, scopedModels: options.scopedModels, tools: options.tools, + noTools: options.noTools, customTools: options.customTools, sessionStartEvent: options.sessionStartEvent, }); diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index bb0e5e630..67893774d 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -585,6 +585,7 @@ export async function main(args: string[], options?: MainOptions) { thinkingLevel: sessionOptions.thinkingLevel, scopedModels: sessionOptions.scopedModels, tools: sessionOptions.tools, + noTools: sessionOptions.noTools, customTools: sessionOptions.customTools, }); const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel; diff --git a/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts b/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts index 3dda3bc66..4ea6af29b 100644 --- a/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts +++ b/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts @@ -4,6 +4,10 @@ import { join } from "node:path"; import { getModel } from "@mariozechner/pi-ai"; import { Type } from "typebox"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { + createAgentSessionFromServices, + createAgentSessionServices, +} from "../../../src/core/agent-session-services.js"; import { DefaultResourceLoader } from "../../../src/core/resource-loader.js"; import { createAgentSession } from "../../../src/core/sdk.js"; import { SessionManager } from "../../../src/core/session-manager.js"; @@ -90,4 +94,26 @@ describe("regression #3592: no-builtin-tools keeps extension tools enabled", () expect(session.systemPrompt).toContain("Available tools:\n(none)"); session.dispose(); }); + + it("propagates noTools through service-based session creation", async () => { + const settingsManager = SettingsManager.create(tempDir, agentDir); + const sessionManager = SessionManager.inMemory(tempDir); + const services = await createAgentSessionServices({ + cwd: tempDir, + agentDir, + settingsManager, + }); + + const { session } = await createAgentSessionFromServices({ + services, + sessionManager, + model: getModel("anthropic", "claude-sonnet-4-5")!, + noTools: "builtin", + }); + + expect(session.getActiveToolNames()).toEqual([]); + expect(session.systemPrompt).toContain("Available tools:\n(none)"); + expect(session.systemPrompt).not.toContain("- read:"); + session.dispose(); + }); });