diff --git a/bin/oh-my-opencode.js b/bin/oh-my-opencode.js old mode 100644 new mode 100755 diff --git a/src/agents/utils.test.ts b/src/agents/utils.test.ts index 98c740c35..689e4d314 100644 --- a/src/agents/utils.test.ts +++ b/src/agents/utils.test.ts @@ -740,6 +740,52 @@ describe("override.category expansion in createBuiltinAgents", () => { }) }) +describe("agent override tools migration", () => { + test("tools: { x: false } is migrated to permission: { x: deny }", async () => { + // #given + const overrides = { + explore: { tools: { "jetbrains_*": false } } as any, + } + + // #when + const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL) + + // #then + expect(agents.explore).toBeDefined() + const permission = agents.explore.permission as Record + expect(permission["jetbrains_*"]).toBe("deny") + }) + + test("tools: { x: true } is migrated to permission: { x: allow }", async () => { + // #given + const overrides = { + librarian: { tools: { "jetbrains_get_*": true } } as any, + } + + // #when + const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL) + + // #then + expect(agents.librarian).toBeDefined() + const permission = agents.librarian.permission as Record + expect(permission["jetbrains_get_*"]).toBe("allow") + }) + + test("tools config is removed after migration", async () => { + // #given + const overrides = { + explore: { tools: { "some_tool": false } } as any, + } + + // #when + const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL) + + // #then + expect(agents.explore).toBeDefined() + expect((agents.explore as any).tools).toBeUndefined() + }) +}) + describe("Deadlock prevention - fetchAvailableModels must not receive client", () => { test("createBuiltinAgents should call fetchAvailableModels with undefined client to prevent deadlock", async () => { // #given - This test ensures we don't regress on issue #1301 diff --git a/src/agents/utils.ts b/src/agents/utils.ts index 7c1a236d5..426a8bd08 100644 --- a/src/agents/utils.ts +++ b/src/agents/utils.ts @@ -11,7 +11,7 @@ import { createAtlasAgent, atlasPromptMetadata } from "./atlas" import { createMomusAgent, momusPromptMetadata } from "./momus" import { createHephaestusAgent } from "./hephaestus" import type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-builder" -import { deepMerge, fetchAvailableModels, resolveModelPipeline, AGENT_MODEL_REQUIREMENTS, readConnectedProvidersCache, isModelAvailable, isAnyFallbackModelAvailable } from "../shared" +import { deepMerge, fetchAvailableModels, resolveModelPipeline, AGENT_MODEL_REQUIREMENTS, readConnectedProvidersCache, isModelAvailable, isAnyFallbackModelAvailable, migrateAgentConfig } from "../shared" import { DEFAULT_CATEGORIES, CATEGORY_DESCRIPTIONS } from "../tools/delegate-task/constants" import { resolveMultipleSkills } from "../features/opencode-skill-loader/skill-content" import { createBuiltinSkills } from "../features/builtin-skills" @@ -207,7 +207,8 @@ function mergeAgentConfig( base: AgentConfig, override: AgentOverrideConfig ): AgentConfig { - const { prompt_append, ...rest } = override + const migratedOverride = migrateAgentConfig(override as Record) as AgentOverrideConfig + const { prompt_append, ...rest } = migratedOverride const merged = deepMerge(base, rest as Partial) if (prompt_append && merged.prompt) {