diff --git a/src/backends/catalog.ts b/src/backends/catalog.ts index 9d90e765..55b74b51 100644 --- a/src/backends/catalog.ts +++ b/src/backends/catalog.ts @@ -122,19 +122,8 @@ export const OPENCODE_ENGINE_DEFINITION: AgentEngineDefinition = { logLabel: 'OpenCode Log', settings: { title: 'OpenCode Settings', - description: 'Headless OpenCode agent selection and permission policy.', + description: 'Headless OpenCode permission policy.', fields: [ - { - key: 'agent', - label: 'Agent', - type: 'select', - description: 'Auto uses `plan` for read-only runs and `build` when file edits are allowed.', - options: [ - { value: 'auto', label: 'Auto' }, - { value: 'build', label: 'Build' }, - { value: 'plan', label: 'Plan' }, - ], - }, { key: 'webSearch', label: 'Web Search', diff --git a/src/backends/opencode/index.ts b/src/backends/opencode/index.ts index 185431fb..7a5b4cfc 100644 --- a/src/backends/opencode/index.ts +++ b/src/backends/opencode/index.ts @@ -55,14 +55,6 @@ export function resolveOpenCodeModel(cascadeModel: string): string { return DEFAULT_OPENCODE_MODEL; } -export function resolveOpenCodeAgent( - setting: 'auto' | 'build' | 'plan', - nativeToolCapabilities?: string[], -): 'build' | 'plan' { - if (setting !== 'auto') return setting; - return nativeToolCapabilities?.includes('fs:write') ? 'build' : 'plan'; -} - type PermissionDecision = 'allow' | 'deny'; type OpenCodePermissionConfig = NonNullable; @@ -832,7 +824,7 @@ export class OpenCodeEngine implements AgentEngine { async execute(input: AgentExecutionPlan): Promise { const settings = resolveOpenCodeSettings(input.project, input.config); - const agent = resolveOpenCodeAgent(settings.agent, input.nativeToolCapabilities); + const agent = 'build' as const; const model = resolveOpenCodeModel(input.model); const config = buildConfig(input, model, settings); const { prompt: taskPrompt, hasOffloadedContext } = await buildTaskPrompt( diff --git a/src/backends/opencode/settings.ts b/src/backends/opencode/settings.ts index 482bf88d..418201ef 100644 --- a/src/backends/opencode/settings.ts +++ b/src/backends/opencode/settings.ts @@ -6,8 +6,7 @@ import { import type { EngineSettings, OpenCodeSettings } from '../../config/engineSettings.js'; import type { CascadeConfig, ProjectConfig } from '../../types/index.js'; -export interface ResolvedOpenCodeSettings - extends Required> {} +export interface ResolvedOpenCodeSettings extends Required> {} export function resolveOpenCodeSettings( project: ProjectConfig, @@ -20,7 +19,6 @@ export function resolveOpenCodeSettings( const opencode = getEngineSettings(merged, 'opencode', OpenCodeSettingsSchema) ?? {}; return { - agent: opencode.agent ?? 'auto', webSearch: opencode.webSearch ?? false, }; } diff --git a/src/config/engineSettings.ts b/src/config/engineSettings.ts index e6797c88..5b592777 100644 --- a/src/config/engineSettings.ts +++ b/src/config/engineSettings.ts @@ -8,7 +8,6 @@ export const CodexSettingsSchema = z.object({ }); export const OpenCodeSettingsSchema = z.object({ - agent: z.enum(['auto', 'build', 'plan']).optional(), webSearch: z.boolean().optional(), }); diff --git a/tests/unit/backends/opencode.test.ts b/tests/unit/backends/opencode.test.ts index c8016b28..410a21be 100644 --- a/tests/unit/backends/opencode.test.ts +++ b/tests/unit/backends/opencode.test.ts @@ -38,7 +38,6 @@ vi.mock('../../../src/utils/logging.js', () => ({ import { OpenCodeEngine, buildPermissionConfig, - resolveOpenCodeAgent, resolveOpenCodeModel, } from '../../../src/backends/opencode/index.js'; import { DEFAULT_OPENCODE_MODEL } from '../../../src/backends/opencode/models.js'; @@ -156,16 +155,6 @@ describe('resolveOpenCodeModel', () => { }); }); -describe('resolveOpenCodeAgent', () => { - it('uses build for write-capable runs when auto', () => { - expect(resolveOpenCodeAgent('auto', ['fs:read', 'fs:write'])).toBe('build'); - }); - - it('uses plan for read-only runs when auto', () => { - expect(resolveOpenCodeAgent('auto', ['fs:read'])).toBe('plan'); - }); -}); - describe('buildPermissionConfig', () => { it('denies write, bash, and web by default', () => { expect(buildPermissionConfig(['fs:read'], false)).toEqual({ @@ -189,10 +178,9 @@ describe('buildPermissionConfig', () => { }); describe('resolveOpenCodeSettings', () => { - it('defaults to auto agent and webSearch=false', () => { + it('defaults to webSearch=false', () => { const input = makeInput(); expect(resolveOpenCodeSettings(input.project, input.config)).toEqual({ - agent: 'auto', webSearch: false, }); }); @@ -203,17 +191,16 @@ describe('resolveOpenCodeSettings', () => { ...makeInput().config, defaults: { ...makeInput().config.defaults, - engineSettings: { opencode: { agent: 'plan', webSearch: false } }, + engineSettings: { opencode: { webSearch: false } }, }, }, project: { ...makeInput().project, - engineSettings: { opencode: { agent: 'build', webSearch: true } }, + engineSettings: { opencode: { webSearch: true } }, }, }); expect(resolveOpenCodeSettings(input.project, input.config)).toEqual({ - agent: 'build', webSearch: true, }); }); diff --git a/tests/unit/config/schema.test.ts b/tests/unit/config/schema.test.ts index 433570df..75dd34b3 100644 --- a/tests/unit/config/schema.test.ts +++ b/tests/unit/config/schema.test.ts @@ -123,14 +123,12 @@ describe('ProjectConfigSchema', () => { trello: { boardId: 'b1', lists: {}, labels: {} }, engineSettings: { opencode: { - agent: 'plan', webSearch: true, }, }, }; const result = ProjectConfigSchema.parse(config); - expect(result.engineSettings?.opencode?.agent).toBe('plan'); expect(result.engineSettings?.opencode?.webSearch).toBe(true); }); @@ -334,14 +332,12 @@ describe('validateConfig', () => { defaults: { engineSettings: { opencode: { - agent: 'build', webSearch: true, }, }, }, }); - expect(result.defaults.engineSettings.opencode?.agent).toBe('build'); expect(result.defaults.engineSettings.opencode?.webSearch).toBe(true); });