From eb3674866a55f5713fd8289a8bc2b5357c97457a Mon Sep 17 00:00:00 2001 From: Frank Yang Date: Mon, 16 Mar 2026 22:42:17 +0800 Subject: [PATCH 1/3] fix: harden browser mode stability --- bin/oracle-cli.ts | 8 +- docs/browser-mode.md | 2 +- docs/debug/remote-chrome.md | 4 +- docs/manual-tests.md | 42 +- docs/testing.md | 2 +- scripts/browser-smoke-upload-only.sh | 31 +- scripts/browser-smoke.sh | 92 +++- src/browser/actions/assistantResponse.ts | 104 ++++- src/browser/actions/attachments.ts | 67 ++- src/browser/actions/modelSelection.ts | 20 +- src/browser/actions/promptComposer.ts | 463 +++++++++++++++---- src/browser/index.ts | 352 +++++++++++--- src/browser/pageActions.ts | 1 + src/cli/browserConfig.ts | 44 +- src/cli/stdin.ts | 29 ++ tests/browser/attachmentsCompletion.test.ts | 87 ++++ tests/browser/pageActionsExpressions.test.ts | 8 + tests/browser/promptComposer.test.ts | 128 +++++ tests/cli/browserConfig.test.ts | 27 +- tests/cli/stdin.test.ts | 34 ++ tests/mcp/consult.test.ts | 2 +- 21 files changed, 1323 insertions(+), 224 deletions(-) create mode 100644 src/cli/stdin.ts create mode 100644 tests/cli/stdin.test.ts diff --git a/bin/oracle-cli.ts b/bin/oracle-cli.ts index f8768328c..a81413c81 100755 --- a/bin/oracle-cli.ts +++ b/bin/oracle-cli.ts @@ -13,6 +13,7 @@ if (process.argv[2] === "oracle-mcp") { } import { resolveEngine, type EngineMode, defaultWaitPreference } from "../src/cli/engine.js"; import { shouldRequirePrompt } from "../src/cli/promptRequirement.js"; +import { resolveDashPrompt } from "../src/cli/stdin.js"; import chalk from "chalk"; import type { SessionMetadata, SessionMode, BrowserSessionConfig } from "../src/sessionStore.js"; import { sessionStore, pruneOldSessions } from "../src/sessionStore.js"; @@ -216,7 +217,7 @@ program.hook("preAction", () => { introPrinted = true; }); applyHelpStyling(program, VERSION, isTty); -program.hook("preAction", (thisCommand) => { +program.hook("preAction", async (thisCommand) => { if (thisCommand !== program) { return; } @@ -234,6 +235,11 @@ program.hook("preAction", (thisCommand) => { opts.prompt = positional; thisCommand.setOptionValue("prompt", positional); } + const resolvedPrompt = await resolveDashPrompt(opts.prompt); + if (resolvedPrompt !== opts.prompt) { + opts.prompt = resolvedPrompt; + thisCommand.setOptionValue("prompt", resolvedPrompt); + } if (shouldRequirePrompt(userCliArgs, opts)) { console.log( chalk.yellow('Prompt is required. Provide it via --prompt "" or positional [prompt].'), diff --git a/docs/browser-mode.md b/docs/browser-mode.md index c45c15e21..f092da682 100644 --- a/docs/browser-mode.md +++ b/docs/browser-mode.md @@ -75,7 +75,7 @@ You can pass the same payload inline (`--browser-inline-cookies '