diff --git a/src/resources/extensions/browser-tools/capture.ts b/src/resources/extensions/browser-tools/capture.ts index 0c980b871..508bada65 100644 --- a/src/resources/extensions/browser-tools/capture.ts +++ b/src/resources/extensions/browser-tools/capture.ts @@ -6,7 +6,22 @@ */ import type { Frame, Page } from "playwright"; -import sharp from "sharp"; + +// sharp is an optional native dependency. Load it lazily so that the extension +// can still be loaded on platforms where sharp is unavailable (e.g. bunx on +// Raspberry Pi). constrainScreenshot falls back to returning the raw buffer +// when sharp is not installed, which means screenshots won't be resized but +// the tool remains functional. +let _sharp: typeof import("sharp") | null | undefined; +async function getSharp(): Promise { + if (_sharp !== undefined) return _sharp; + try { + _sharp = (await import("sharp")).default; + } catch { + _sharp = null; + } + return _sharp; +} import type { CompactPageState, CompactSelectorState } from "./state.js"; import { formatCompactStateSummary } from "./utils.js"; @@ -168,6 +183,9 @@ export async function constrainScreenshot( mimeType: string, quality: number, ): Promise { + const sharp = await getSharp(); + if (!sharp) return buffer; + const meta = await sharp(buffer).metadata(); const width = meta.width; const height = meta.height;