diff --git a/packages/core/src/tools/agent/agent.test.ts b/packages/core/src/tools/agent/agent.test.ts index 3fdb9356ba7..65b1d9b00fe 100644 --- a/packages/core/src/tools/agent/agent.test.ts +++ b/packages/core/src/tools/agent/agent.test.ts @@ -635,22 +635,46 @@ describe('AgentTool', () => { ).toBeNull(); }); - it('rejects an empty working_dir', () => { - expect( - agentTool.validateToolParams({ - ...validParams, - working_dir: '', - }), - ).toMatch(/working_dir/i); + it('treats an empty working_dir as unset', () => { + const params = { + ...validParams, + working_dir: '', + }; + + expect(agentTool.validateToolParams(params)).toBeNull(); + expect(params.working_dir).toBeUndefined(); }); - it('rejects a whitespace-only working_dir', () => { - expect( - agentTool.validateToolParams({ - ...validParams, - working_dir: ' ', - }), - ).toMatch(/working_dir/i); + it('treats a whitespace-only working_dir as unset', () => { + const params = { + ...validParams, + working_dir: ' ', + }; + + expect(agentTool.validateToolParams(params)).toBeNull(); + expect(params.working_dir).toBeUndefined(); + }); + + it('treats an empty working_dir as unset when isolation is set', () => { + const params = { + ...validParams, + isolation: 'worktree' as const, + working_dir: '', + }; + + expect(agentTool.validateToolParams(params)).toBeNull(); + expect(params.working_dir).toBeUndefined(); + }); + + it('treats a whitespace-only working_dir as unset when isolation is set', () => { + const params = { + ...validParams, + isolation: 'worktree' as const, + working_dir: ' ', + }; + + expect(agentTool.validateToolParams(params)).toBeNull(); + expect(params.working_dir).toBeUndefined(); }); it('rejects working_dir combined with isolation', () => { diff --git a/packages/core/src/tools/agent/agent.ts b/packages/core/src/tools/agent/agent.ts index 685f547efb4..33e29ee0920 100644 --- a/packages/core/src/tools/agent/agent.ts +++ b/packages/core/src/tools/agent/agent.ts @@ -1028,6 +1028,15 @@ assistant: Uses the ${ToolNames.AGENT} tool to launch the test-runner agent } } } + // Some models emit an empty placeholder for the unused optional field. + // With isolation selected, normalize it away before downstream routing. + if ( + (typeof params.working_dir === 'string' && + params.working_dir.trim().length === 0) || + params.working_dir === null + ) { + params.working_dir = undefined; + } if (params.isolation !== undefined) { if (params.isolation !== 'worktree') {