diff --git a/src/agents/builtin-agents/hephaestus-agent.ts b/src/agents/builtin-agents/hephaestus-agent.ts index 38fc5a63e..c05b1fa71 100644 --- a/src/agents/builtin-agents/hephaestus-agent.ts +++ b/src/agents/builtin-agents/hephaestus-agent.ts @@ -93,7 +93,8 @@ export function maybeCreateHephaestusConfig(input: { hephaestusConfig.permission = applyFrontierToolSchemaPermission( hephaestusConfig.permission, resolvedModel, - hephaestusOverride?.permission + hephaestusOverride?.permission, + (hephaestusOverride as { tools?: Record } | undefined)?.tools ) const gptDeny = getGptApplyPatchPermission(resolvedModel) diff --git a/src/agents/builtin-agents/sisyphus-agent.test.ts b/src/agents/builtin-agents/sisyphus-agent.test.ts index 1a799f303..b32ede5af 100644 --- a/src/agents/builtin-agents/sisyphus-agent.test.ts +++ b/src/agents/builtin-agents/sisyphus-agent.test.ts @@ -212,6 +212,41 @@ describe("maybeCreateSisyphusConfig", () => { }); }); + describe("#given non-frontier model with legacy user tools denying grep and glob", () => { + test("#when config is created #then explicit legacy denies are preserved", () => { + // given + const legacyOverride = { + model: "openai/gpt-5.4", + tools: { + grep: false, + glob: false, + }, + }; + const agentOverrides: AgentOverrides = { + sisyphus: legacyOverride, + }; + const mergedCategories: Record = {}; + + // when + const config = maybeCreateSisyphusConfig({ + disabledAgents: [], + agentOverrides, + availableModels: new Set(["openai/gpt-5.4"]), + systemDefaultModel: "openai/gpt-5.4", + isFirstRunNoCache: false, + availableAgents: [], + availableSkills: [], + availableCategories: [], + mergedCategories, + useTaskSystem: false, + }); + + // then + expect(config?.permission).toHaveProperty("grep", "deny"); + expect(config?.permission).toHaveProperty("glob", "deny"); + }); + }); + describe("#given generic GPT model with user override allowing apply_patch", () => { test("#when config is created #then apply_patch is still denied", () => { // given diff --git a/src/agents/builtin-agents/sisyphus-agent.ts b/src/agents/builtin-agents/sisyphus-agent.ts index ea1b82bf1..6cb91370f 100644 --- a/src/agents/builtin-agents/sisyphus-agent.ts +++ b/src/agents/builtin-agents/sisyphus-agent.ts @@ -87,7 +87,8 @@ export function maybeCreateSisyphusConfig(input: { sisyphusConfig.permission = applyFrontierToolSchemaPermission( sisyphusConfig.permission, resolvedModel, - sisyphusOverride?.permission + sisyphusOverride?.permission, + (sisyphusOverride as { tools?: Record } | undefined)?.tools ) const gptDeny = getGptApplyPatchPermission(resolvedModel) diff --git a/src/agents/frontier-tool-schema-guard.ts b/src/agents/frontier-tool-schema-guard.ts index 4c6a0bd55..68158149a 100644 --- a/src/agents/frontier-tool-schema-guard.ts +++ b/src/agents/frontier-tool-schema-guard.ts @@ -19,7 +19,8 @@ export function getFrontierToolSchemaPermission(model: string): Record ): AgentConfig["permission"] | undefined { if (!permission) return permission @@ -33,6 +34,7 @@ export function applyFrontierToolSchemaPermission( for (const toolName of FRONTIER_TOOL_SCHEMA_NAMES) { if (explicitPermissionMap?.[toolName] === "deny") continue + if (explicitTools?.[toolName] === false) continue delete nextPermission[toolName] } return nextPermission as AgentConfig["permission"] diff --git a/src/agents/hephaestus/agent.test.ts b/src/agents/hephaestus/agent.test.ts index 165f1e095..ca1d65c01 100644 --- a/src/agents/hephaestus/agent.test.ts +++ b/src/agents/hephaestus/agent.test.ts @@ -553,4 +553,39 @@ describe("maybeCreateHephaestusConfig GPT apply_patch guard", () => { expect(config?.permission).toHaveProperty("glob", "deny"); }); }); + + describe("#given non-frontier model with legacy user tools denying grep and glob", () => { + test("#when config is created #then explicit legacy denies are preserved", () => { + // given + const legacyOverride = { + model: "openai/gpt-5.4", + tools: { + grep: false, + glob: false, + }, + }; + const agentOverrides: AgentOverrides = { + hephaestus: legacyOverride, + }; + const mergedCategories: Record = {}; + + // when + const config = maybeCreateHephaestusConfig({ + disabledAgents: [], + agentOverrides, + availableModels: new Set(["openai/gpt-5.4"]), + systemDefaultModel: "openai/gpt-5.4", + isFirstRunNoCache: false, + availableAgents: [], + availableSkills: [], + availableCategories: [], + mergedCategories, + useTaskSystem: false, + }); + + // then + expect(config?.permission).toHaveProperty("grep", "deny"); + expect(config?.permission).toHaveProperty("glob", "deny"); + }); + }); });