diff --git a/src/create-runtime-tmux-config.ts b/src/create-runtime-tmux-config.ts index 83bc25c83..579cb297e 100644 --- a/src/create-runtime-tmux-config.ts +++ b/src/create-runtime-tmux-config.ts @@ -1,6 +1,12 @@ import type { OhMyOpenCodeConfig, TmuxConfig } from "./config" import { TmuxConfigSchema } from "./config/schema/tmux" +export function isTmuxIntegrationEnabled( + pluginConfig: { tmux?: { enabled?: boolean } | undefined }, +): boolean { + return pluginConfig.tmux?.enabled ?? false +} + export function createRuntimeTmuxConfig(pluginConfig: { tmux?: OhMyOpenCodeConfig["tmux"] }): TmuxConfig { return TmuxConfigSchema.parse(pluginConfig.tmux ?? {}) } diff --git a/src/plugin/hooks/create-session-hooks.test.ts b/src/plugin/hooks/create-session-hooks.test.ts index a1098fd43..ab6b5ad3b 100644 --- a/src/plugin/hooks/create-session-hooks.test.ts +++ b/src/plugin/hooks/create-session-hooks.test.ts @@ -53,4 +53,30 @@ describe("createSessionHooks", () => { // then expect(result.modelFallback).not.toBeNull() }) + + it("skips interactive bash session hook when tmux integration is disabled", () => { + // given + const pluginConfig = { + tmux: { + enabled: false, + layout: "main-vertical", + main_pane_size: 60, + main_pane_min_width: 120, + agent_pane_min_width: 40, + isolation: "inline", + }, + } as OhMyOpenCodeConfig + + // when + const result = createSessionHooks({ + ctx: mockContext, + pluginConfig, + modelCacheState: mockModelCacheState, + isHookEnabled: (hookName) => hookName === "interactive-bash-session", + safeHookEnabled: true, + }) + + // then + expect(result.interactiveBashSession).toBeNull() + }) }) diff --git a/src/plugin/hooks/create-session-hooks.ts b/src/plugin/hooks/create-session-hooks.ts index 7dd1c3298..af87bd366 100644 --- a/src/plugin/hooks/create-session-hooks.ts +++ b/src/plugin/hooks/create-session-hooks.ts @@ -36,6 +36,7 @@ import { } from "../../shared" import { safeCreateHook } from "../../shared/safe-create-hook" import { sessionExists } from "../../tools" +import { isTmuxIntegrationEnabled } from "../../create-runtime-tmux-config" export type SessionHooks = { contextWindowMonitor: ReturnType | null @@ -196,7 +197,9 @@ export function createSessionHooks(args: { ? safeHook("non-interactive-env", () => createNonInteractiveEnvHook(ctx)) : null - const interactiveBashSession = isHookEnabled("interactive-bash-session") + const interactiveBashSession = + isHookEnabled("interactive-bash-session") && + isTmuxIntegrationEnabled(pluginConfig) ? safeHook("interactive-bash-session", () => createInteractiveBashSessionHook(ctx)) : null diff --git a/src/plugin/tool-registry.test.ts b/src/plugin/tool-registry.test.ts index 7cf6d2374..b2c7752b1 100644 --- a/src/plugin/tool-registry.test.ts +++ b/src/plugin/tool-registry.test.ts @@ -81,3 +81,35 @@ describe("#given task_system configuration", () => { expect(result.filteredTools).toHaveProperty("task_update") }) }) + +describe("#given tmux integration is disabled", () => { + test("#when tool registry is created #then interactive_bash is not registered", () => { + const result = createToolRegistry({ + ctx: { directory: "/tmp" } as Parameters[0]["ctx"], + pluginConfig: { + tmux: { + enabled: false, + layout: "main-vertical", + main_pane_size: 60, + main_pane_min_width: 120, + agent_pane_min_width: 40, + isolation: "inline", + }, + }, + managers: { + backgroundManager: {}, + tmuxSessionManager: {}, + skillMcpManager: {}, + } as Parameters[0]["managers"], + skillContext: { + mergedSkills: [], + availableSkills: [], + browserProvider: "playwright", + disabledSkills: new Set(), + }, + availableCategories: [], + }) + + expect(result.filteredTools).not.toHaveProperty("interactive_bash") + }) +}) diff --git a/src/plugin/tool-registry.ts b/src/plugin/tool-registry.ts index 81d4c9ba0..3026acfac 100644 --- a/src/plugin/tool-registry.ts +++ b/src/plugin/tool-registry.ts @@ -5,6 +5,7 @@ import type { AvailableCategory, } from "../agents/dynamic-agent-prompt-builder" import type { OhMyOpenCodeConfig } from "../config" +import { isTmuxIntegrationEnabled } from "../create-runtime-tmux-config" import type { PluginContext, ToolsRecord } from "./types" import { @@ -105,6 +106,7 @@ export function createToolRegistry(args: { availableCategories: AvailableCategory[] }): ToolRegistryResult { const { ctx, pluginConfig, managers, skillContext, availableCategories } = args + const tmuxIntegrationEnabled = isTmuxIntegrationEnabled(pluginConfig) const backgroundTools = createBackgroundTools(managers.backgroundManager, ctx.client) const callOmoAgent = createCallOmoAgent( @@ -202,7 +204,7 @@ export function createToolRegistry(args: { task: delegateTask, skill_mcp: skillMcpTool, skill: skillTool, - interactive_bash, + ...(tmuxIntegrationEnabled ? { interactive_bash } : {}), ...taskToolsRecord, ...hashlineToolsRecord, }