mirror of
https://github.com/Heretek-AI/opencode.git
synced 2026-11-10 10:21:31 -10:00
+16
![opencode-agent[bot]](/assets/img/avatar_default.png)



![opencode-agent[bot]](/assets/img/avatar_default.png)



9e0d3976e1
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]>
52 lines
1.4 KiB
TypeScript
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
|
|
}
|