From 39d2d44e22b6cabde5789dbd23a1abcd5ed525f5 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Fri, 23 Jan 2026 16:25:17 +0900 Subject: [PATCH] fix(tools): conditionally register look_at when multimodal-looker enabled (#1016) Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: justsisyphus Co-authored-by: Sisyphus --- src/index.test.ts | 81 +++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 8 +++-- 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/index.test.ts diff --git a/src/index.test.ts b/src/index.test.ts new file mode 100644 index 00000000..282e5232 --- /dev/null +++ b/src/index.test.ts @@ -0,0 +1,81 @@ +import { describe, expect, it } from "bun:test" +import { includesCaseInsensitive } from "./shared" + +/** + * Tests for conditional tool registration logic in index.ts + * + * The actual plugin initialization is complex to test directly, + * so we test the underlying logic that determines tool registration. + */ +describe("look_at tool conditional registration", () => { + describe("isMultimodalLookerEnabled logic", () => { + // #given multimodal-looker is in disabled_agents + // #when checking if agent is enabled + // #then should return false (disabled) + it("returns false when multimodal-looker is disabled (exact case)", () => { + const disabledAgents = ["multimodal-looker"] + const isEnabled = !includesCaseInsensitive(disabledAgents, "multimodal-looker") + expect(isEnabled).toBe(false) + }) + + // #given multimodal-looker is in disabled_agents with different case + // #when checking if agent is enabled + // #then should return false (case-insensitive match) + it("returns false when multimodal-looker is disabled (case-insensitive)", () => { + const disabledAgents = ["Multimodal-Looker"] + const isEnabled = !includesCaseInsensitive(disabledAgents, "multimodal-looker") + expect(isEnabled).toBe(false) + }) + + // #given multimodal-looker is NOT in disabled_agents + // #when checking if agent is enabled + // #then should return true (enabled) + it("returns true when multimodal-looker is not disabled", () => { + const disabledAgents = ["oracle", "librarian"] + const isEnabled = !includesCaseInsensitive(disabledAgents, "multimodal-looker") + expect(isEnabled).toBe(true) + }) + + // #given disabled_agents is empty + // #when checking if agent is enabled + // #then should return true (enabled by default) + it("returns true when disabled_agents is empty", () => { + const disabledAgents: string[] = [] + const isEnabled = !includesCaseInsensitive(disabledAgents, "multimodal-looker") + expect(isEnabled).toBe(true) + }) + + // #given disabled_agents is undefined (simulated as empty array) + // #when checking if agent is enabled + // #then should return true (enabled by default) + it("returns true when disabled_agents is undefined (fallback to empty)", () => { + const disabledAgents = undefined + const isEnabled = !includesCaseInsensitive(disabledAgents ?? [], "multimodal-looker") + expect(isEnabled).toBe(true) + }) + }) + + describe("conditional tool spread pattern", () => { + // #given lookAt is not null (agent enabled) + // #when spreading into tool object + // #then look_at should be included + it("includes look_at when lookAt is not null", () => { + const lookAt = { execute: () => {} } // mock tool + const tools = { + ...(lookAt ? { look_at: lookAt } : {}), + } + expect(tools).toHaveProperty("look_at") + }) + + // #given lookAt is null (agent disabled) + // #when spreading into tool object + // #then look_at should NOT be included + it("excludes look_at when lookAt is null", () => { + const lookAt = null + const tools = { + ...(lookAt ? { look_at: lookAt } : {}), + } + expect(tools).not.toHaveProperty("look_at") + }) + }) +}) diff --git a/src/index.ts b/src/index.ts index a09acb78..4942fc46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -230,7 +230,11 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { const backgroundTools = createBackgroundTools(backgroundManager, ctx.client); const callOmoAgent = createCallOmoAgent(ctx, backgroundManager); - const lookAt = createLookAt(ctx); + const isMultimodalLookerEnabled = !includesCaseInsensitive( + pluginConfig.disabled_agents ?? [], + "multimodal-looker" + ); + const lookAt = isMultimodalLookerEnabled ? createLookAt(ctx) : null; const delegateTask = createDelegateTask({ manager: backgroundManager, client: ctx.client, @@ -300,7 +304,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { ...builtinTools, ...backgroundTools, call_omo_agent: callOmoAgent, - look_at: lookAt, + ...(lookAt ? { look_at: lookAt } : {}), delegate_task: delegateTask, skill: skillTool, skill_mcp: skillMcpTool,