Files
+16 9e0d3976e1 chore: merge dev into v2 (#35591)
Co-authored-by: Frank <[email protected]>
Co-authored-by: Aarav Sareen <[email protected]>
Co-authored-by: Brendan Allan <[email protected]>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Jack <[email protected]>
Co-authored-by: Brendan Allan <[email protected]>
Co-authored-by: Shoubhit Dash <[email protected]>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: James Long <[email protected]>
Co-authored-by: Dustin Deus <[email protected]>
Co-authored-by: starptech <[email protected]>
Co-authored-by: Luke Parker <[email protected]>
Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <[email protected]>
Co-authored-by: Dax <[email protected]>
Co-authored-by: usrnk1 <[email protected]>
Co-authored-by: Jay <[email protected]>
Co-authored-by: runvip <[email protected]>
Co-authored-by: opencode <[email protected]>
Co-authored-by: Julian Coy <[email protected]>
Co-authored-by: Vladimir Glafirov <[email protected]>
Co-authored-by: Adam <[email protected]>
Co-authored-by: Kit Langton <[email protected]>
Co-authored-by: Simon Klee <[email protected]>
Co-authored-by: Jay <[email protected]>
Co-authored-by: David Hill <[email protected]>
2026-07-06 16:05:29 -05:00

52 lines
1.4 KiB
TypeScript

import type { CDPSession, Page } from "@playwright/test"
import type { CapturedFrame } from "./model"
export type VisualCapture = {
session: CDPSession
frames: CapturedFrame[]
startedAtEpoch: number
running: boolean
capture: Promise<void>
}
export async function startVisualCapture(page: Page, startedAtEpoch: number) {
if (process.env.OPENCODE_STABILITY_CAPTURE !== "1") return
const session = await page.context().newCDPSession(page)
await session.send("Page.enable")
const recording: VisualCapture = {
session,
frames: [],
startedAtEpoch,
running: true,
capture: Promise.resolve(),
}
recording.capture = (async () => {
try {
while (recording.running && recording.frames.length < 900) {
const frame = await session.send("Page.captureScreenshot", {
format: "jpeg",
quality: 80,
captureBeyondViewport: false,
optimizeForSpeed: true,
})
recording.frames.push({ at: Date.now() - recording.startedAtEpoch, data: frame.data })
await new Promise((resolve) => setTimeout(resolve, 50))
}
} catch {
recording.running = false
}
})()
return recording
}
export async function stopVisualCapture(recording: VisualCapture | undefined) {
if (!recording) return []
recording.running = false
try {
await recording.capture
} finally {
await recording.session.detach().catch(() => undefined)
}
return recording.frames
}