Files
elizaos--eliza/plugins/plugin-browser/scripts/capture-miniwob-chromium-recording.mjs
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

106 lines
3.4 KiB
JavaScript

#!/usr/bin/env node
/**
* Screen-recording evidence for the real-Chromium MiniWoB++ lane (#10333).
*
* Drives the multi-page `multistep-purchase` oracle (home -> catalog -> buy)
* through a real Chromium step by step, screenshots each step, and stitches the
* frames into an animated GIF (via ffmpeg) so a reviewer can watch the agent
* navigate a real browser end to end. Artifacts land under
* `test-results/evidence/10333-browser-real-chromium/`.
*
* Usage (from repo root): bun plugins/plugin-browser/scripts/capture-miniwob-chromium-recording.mjs
*/
import { spawnSync } from "node:child_process";
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
const here = dirname(fileURLToPath(import.meta.url));
const repoRoot = join(here, "..", "..", "..");
const OUT = join(
repoRoot,
"test-results",
"evidence",
"10333-browser-real-chromium",
);
mkdirSync(OUT, { recursive: true });
const framesDir = join(OUT, "_frames");
rmSync(framesDir, { recursive: true, force: true });
mkdirSync(framesDir, { recursive: true });
const { createChromiumBenchmarkEngine } = await import(
"../src/benchmark/chromium-executor.ts"
);
const { BrowserBenchmarkAdapter } = await import("../src/benchmark/adapter.ts");
const { getTaskById } = await import("../src/benchmark/tasks.ts");
const { OraclePolicy } = await import("../src/benchmark/policy.ts");
const SEED = 0;
const task = getTaskById("multistep-purchase");
const engine = await createChromiumBenchmarkEngine({ headless: true });
console.log(`[recording] engine: ${engine.executablePath}`);
const { executor, dispose } = await engine.makeExecutor();
const page = engine.currentPage();
const adapter = new BrowserBenchmarkAdapter(executor, {
maxTrajectoryLength: task.maxSteps,
timestampSource: () => 0,
});
const policy = new OraclePolicy();
let frame = 0;
async function snap(label) {
if (!page) return;
const f = String(frame).padStart(3, "0");
await page.screenshot({ path: join(framesDir, `frame-${f}.png`) });
// hold each meaningful frame for ~1s of GIF (3 duplicate frames @ ~3fps feel)
frame += 1;
console.log(`[recording] frame ${f}: ${label}`);
}
await adapter.loadTask(task, SEED);
await snap("start: shop home");
for (let s = 0; s < task.maxSteps && !adapter.isTerminated(); s++) {
const observation = await adapter.getObservation();
const action = await policy.act({
observation,
task,
seed: SEED,
history: adapter.getTrajectory(),
});
await adapter.step(action);
await snap(
`after: ${action.type} ${action.selector ?? ""} (${action.note ?? ""})`,
);
}
const reward = await task.reward(adapter.rewardContext(), SEED);
console.log(
`[recording] reward=${reward} (${reward >= 1 ? "SOLVED" : "FAILED"})`,
);
await dispose();
await engine.close();
// Stitch frames -> GIF (each frame held ~1.1s). Skip cleanly if ffmpeg absent.
const gifPath = join(OUT, "multistep-purchase-walkthrough.gif");
const ff = spawnSync(
"ffmpeg",
[
"-y",
"-framerate",
"0.9",
"-i",
join(framesDir, "frame-%03d.png"),
"-vf",
"scale=800:-1:flags=lanczos",
gifPath,
],
{ stdio: "inherit" },
);
if (ff.status === 0 && existsSync(gifPath)) {
console.log(`[recording] GIF -> ${gifPath}`);
rmSync(framesDir, { recursive: true, force: true });
} else {
console.log("[recording] ffmpeg unavailable — frames kept in _frames/");
}
process.exit(reward >= 1 ? 0 : 1);