From 0e94c6b0251452eed6e268d09b45ede69e0acb3f Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 20 Dec 2025 01:27:22 +0000 Subject: [PATCH] fix(browser): restore tsc types --- src/browser/pw-tools-core.ts | 7 ++++++- src/browser/pw-tools-observe.ts | 2 +- src/browser/routes/actions-core.ts | 29 ++++++++++++++++++++++++---- src/browser/routes/actions-extra.ts | 10 +++++++++- src/cli/browser-cli-actions-input.ts | 2 +- src/cli/browser-cli-inspect.ts | 2 +- src/web/auto-reply.ts | 7 ++----- 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/browser/pw-tools-core.ts b/src/browser/pw-tools-core.ts index 78c968e0a..f24cc9293 100644 --- a/src/browser/pw-tools-core.ts +++ b/src/browser/pw-tools-core.ts @@ -232,7 +232,12 @@ export async function fileUploadViaPlaywright(opts: { const timeout = Math.max(500, Math.min(60_000, opts.timeoutMs ?? 10_000)); const fileChooser = await page.waitForEvent("filechooser", { timeout }); if (!opts.paths?.length) { - await fileChooser.cancel(); + // Playwright removed `FileChooser.cancel()`; best-effort close the chooser instead. + try { + await page.keyboard.press("Escape"); + } catch { + // Best-effort. + } return; } await fileChooser.setFiles(opts.paths); diff --git a/src/browser/pw-tools-observe.ts b/src/browser/pw-tools-observe.ts index 7d07abf53..a71208a28 100644 --- a/src/browser/pw-tools-observe.ts +++ b/src/browser/pw-tools-observe.ts @@ -13,7 +13,7 @@ import { const STATIC_RESOURCE_TYPES = new Set(["image", "font", "stylesheet", "media"]); -const tracingContexts = new WeakSet(); +const tracingContexts = new WeakSet(); function consolePriority(level: string) { switch (level) { diff --git a/src/browser/routes/actions-core.ts b/src/browser/routes/actions-core.ts index 0a3d84376..e975facde 100644 --- a/src/browser/routes/actions-core.ts +++ b/src/browser/routes/actions-core.ts @@ -27,6 +27,29 @@ import { toStringOrEmpty, } from "./utils.js"; +type MouseButton = "left" | "right" | "middle"; +type KeyboardModifier = "Alt" | "Control" | "ControlOrMeta" | "Meta" | "Shift"; + +function normalizeMouseButton(value: unknown): MouseButton | undefined { + const raw = toStringOrEmpty(value); + if (raw === "left" || raw === "right" || raw === "middle") return raw; + return undefined; +} + +function normalizeModifiers(value: unknown): KeyboardModifier[] | undefined { + const raw = toStringArray(value); + if (!raw?.length) return undefined; + const normalized = raw.filter( + (m): m is KeyboardModifier => + m === "Alt" || + m === "Control" || + m === "ControlOrMeta" || + m === "Meta" || + m === "Shift", + ); + return normalized.length ? normalized : undefined; +} + export type BrowserActionCore = | "back" | "click" @@ -228,10 +251,8 @@ export async function handleBrowserActionCore( return true; } const doubleClick = toBoolean(args.doubleClick) ?? false; - const button = toStringOrEmpty(args.button) || undefined; - const modifiers = Array.isArray(args.modifiers) - ? (args.modifiers as string[]) - : undefined; + const button = normalizeMouseButton(args.button); + const modifiers = normalizeModifiers(args.modifiers); const tab = await ctx.ensureTabAvailable(target); await clickViaPlaywright({ cdpPort, diff --git a/src/browser/routes/actions-extra.ts b/src/browser/routes/actions-extra.ts index ab8b1142e..32a3307cc 100644 --- a/src/browser/routes/actions-extra.ts +++ b/src/browser/routes/actions-extra.ts @@ -27,6 +27,14 @@ import { toStringOrEmpty, } from "./utils.js"; +type MouseButton = "left" | "right" | "middle"; + +function normalizeMouseButton(value: unknown): MouseButton | undefined { + const raw = toStringOrEmpty(value); + if (raw === "left" || raw === "right" || raw === "middle") return raw; + return undefined; +} + export type BrowserActionExtra = | "console" | "locator" @@ -223,7 +231,7 @@ export async function handleBrowserActionExtra( jsonError(res, 400, "x and y are required"); return true; } - const button = toStringOrEmpty(args.button) || undefined; + const button = normalizeMouseButton(args.button); const tab = await ctx.ensureTabAvailable(target); await mouseClickViaPlaywright({ cdpPort, diff --git a/src/cli/browser-cli-actions-input.ts b/src/cli/browser-cli-actions-input.ts index ce1051a11..58e5e9117 100644 --- a/src/cli/browser-cli-actions-input.ts +++ b/src/cli/browser-cli-actions-input.ts @@ -25,7 +25,7 @@ async function readStdin(): Promise { const chunks: string[] = []; return await new Promise((resolve, reject) => { process.stdin.setEncoding("utf8"); - process.stdin.on("data", (chunk) => chunks.push(chunk)); + process.stdin.on("data", (chunk) => chunks.push(String(chunk))); process.stdin.on("end", () => resolve(chunks.join(""))); process.stdin.on("error", reject); }); diff --git a/src/cli/browser-cli-inspect.ts b/src/cli/browser-cli-inspect.ts index e934853bc..be0363ae9 100644 --- a/src/cli/browser-cli-inspect.ts +++ b/src/cli/browser-cli-inspect.ts @@ -17,7 +17,7 @@ async function readStdin(): Promise { const chunks: string[] = []; return await new Promise((resolve, reject) => { process.stdin.setEncoding("utf8"); - process.stdin.on("data", (chunk) => chunks.push(chunk)); + process.stdin.on("data", (chunk) => chunks.push(String(chunk))); process.stdin.on("end", () => resolve(chunks.join(""))); process.stdin.on("error", reject); }); diff --git a/src/web/auto-reply.ts b/src/web/auto-reply.ts index b8d73ce1d..4415ea455 100644 --- a/src/web/auto-reply.ts +++ b/src/web/auto-reply.ts @@ -851,8 +851,7 @@ export async function monitorWebProvider( const tsDisplay = msg.timestamp ? new Date(msg.timestamp).toISOString() : new Date().toISOString(); - const fromDisplay = - msg.chatType === "group" ? conversationId : msg.from; + const fromDisplay = msg.chatType === "group" ? conversationId : msg.from; console.log( `\n[${tsDisplay}] ${fromDisplay} -> ${msg.to}: ${combinedBody}`, ); @@ -956,9 +955,7 @@ export async function monitorWebProvider( } const fromDisplay = - msg.chatType === "group" - ? conversationId - : (msg.from ?? "unknown"); + msg.chatType === "group" ? conversationId : (msg.from ?? "unknown"); if (isVerbose()) { console.log( success(