From 007dfff3a9a7efc77a1c3c8d6f710df672d11e07 Mon Sep 17 00:00:00 2001 From: 2sumtech <2sumtech@gmail.com> Date: Mon, 26 Oct 2026 03:27:29 -0700 Subject: [PATCH] fix(browser): accept an empty --value in fill and select commands (#16030) `orca fill --value ""` and `orca select --value ""` were rejected client-side with "Missing required --value" even though the browser.fill/browser.select RPC schemas already accept an empty string. Read --value with the existing getRequiredStringFlagAllowingEmpty helper so an empty value clears a field or picks the blank option, while an absent --value is still rejected. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> --- src/cli/browser-empty-values.test.ts | 31 ++++++++++++++++++++++++++++ src/cli/handlers/browser-interact.ts | 7 ++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/cli/browser-empty-values.test.ts b/src/cli/browser-empty-values.test.ts index 5928f8c0200..53cc1badfdc 100644 --- a/src/cli/browser-empty-values.test.ts +++ b/src/cli/browser-empty-values.test.ts @@ -208,3 +208,34 @@ describe('orca cli cookie set and set credentials preserve an empty value', () = process.exitCode = priorExitCode }) }) + +describe('orca cli fill and select preserve an empty value', () => { + beforeEach(() => { + callMock.mockReset() + process.exitCode = undefined + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it.each([ + ['fill', 'browser.fill', { filled: 'ref_1' }], + ['select', 'browser.select', { selected: 'ref_1' }] + ])('passes an empty --value through %s to %s', async (command, method, result) => { + queueFixtures(callMock, okFixture(`req_${command}`, result)) + vi.spyOn(console, 'log').mockImplementation(() => {}) + + await main( + [command, '--element', 'ref_1', '--value', '', '--worktree', 'all', '--json'], + '/tmp/not-an-orca-worktree' + ) + + expect(callMock).toHaveBeenCalledTimes(1) + expect(callMock).toHaveBeenCalledWith(method, { + element: 'ref_1', + value: '', + worktree: undefined + }) + }) +}) diff --git a/src/cli/handlers/browser-interact.ts b/src/cli/handlers/browser-interact.ts index 0274f40286b..7331b59d14c 100644 --- a/src/cli/handlers/browser-interact.ts +++ b/src/cli/handlers/browser-interact.ts @@ -18,7 +18,8 @@ import { getOptionalNumberFlag, getOptionalStringFlag, getRequiredFiniteNumber, - getRequiredStringFlag + getRequiredStringFlag, + getRequiredStringFlagAllowingEmpty } from '../flags' import { getBrowserCommandTarget } from '../selectors' @@ -50,7 +51,7 @@ export const BROWSER_INTERACT_HANDLERS: Record = { }, fill: async ({ flags, client, cwd, json }) => { const element = getRequiredStringFlag(flags, 'element') - const value = getRequiredStringFlag(flags, 'value') + const value = getRequiredStringFlagAllowingEmpty(flags, 'value') const target = await getBrowserCommandTarget(flags, cwd, client) const result = await client.call('browser.fill', { element, @@ -67,7 +68,7 @@ export const BROWSER_INTERACT_HANDLERS: Record = { }, select: async ({ flags, client, cwd, json }) => { const element = getRequiredStringFlag(flags, 'element') - const value = getRequiredStringFlag(flags, 'value') + const value = getRequiredStringFlagAllowingEmpty(flags, 'value') const target = await getBrowserCommandTarget(flags, cwd, client) const result = await client.call('browser.select', { element,