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
106 lines
3.4 KiB
JavaScript
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);
|