pi-agent-browser-native 0.2.71 → 0.2.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.72 - 2026-07-23
4
+
5
+ ### Changed
6
+
7
+ - Rebaselined the command/help inventory, source evidence, prompt guidance, and package docs to `agent-browser 0.33.0` / vercel-labs/agent-browser@1ed371f3af472cc0d6cd8fdaea75d1a085ff7534 (includes 0.32.3–0.32.4 HAR/`find`/`derive-client` surfaces).
8
+ - Documented HAR response-body capture modes (`network har start --content text|all|none`), `skills get derive-client`, and the new `a11y [url]` axe-core accessibility audit (`--tags`, `--selector`).
9
+ - Documented upstream 0.32.4 `find role` implicit ARIA / accessible-name matching, locator-detail miss text, and the aligned `find` action list (`click, fill, check, hover, text`).
10
+ - Added compact model-facing presentation for `a11y` violation/incomplete summaries.
11
+
12
+ ### Fixed
13
+
14
+ - Classified upstream 0.32.4+ locator-detail misses (`Names seen:`, `No element found: getByRole(...)`, `Element not found: … Verify the selector, role, or name`) as `failureCategory: "selector-not-found"` so snapshot-ref recovery still runs, without treating bare accessible-name text containing `timeout` or `Confirmation required` as unrelated categories.
15
+ - Treated command-scoped `--content` and `--tags` as value-taking flags during argv planning so `network har start --content all` and `a11y --tags wcag2a,wcag2aa` keep mode/tag tokens with their flags.
16
+
17
+ ### Validation
18
+
19
+ - Passed `npm run verify` (590 tests passed, 2 opt-in skips), live command-reference verification, and `npm run verify -- real-upstream` (2/2 tests) against installed `agent-browser 0.33.0`.
20
+ - Passed `npm run verify -- release`, including configured-source lifecycle, packaged Pi smoke, and macOS/Ubuntu/native-Windows Crabbox `platform-build` plus `browser-dogfood-smoke` on `agent-browser 0.33.0` (Windows snapshot `crabbox-ready-ab-0.33.0`, Ubuntu image `node24-agent-browser0.33.0`).
21
+
3
22
  ## 0.2.71 - 2026-07-18
4
23
 
5
24
  ### Fixed
@@ -45,6 +45,7 @@ export const COMMAND_VALUE_FLAGS = [
45
45
  "--baseline",
46
46
  "--body",
47
47
  "--categories",
48
+ "--content",
48
49
  "--curl",
49
50
  "--depth",
50
51
  "-d",
@@ -68,6 +69,7 @@ export const COMMAND_VALUE_FLAGS = [
68
69
  "--selector",
69
70
  "-s",
70
71
  "--status",
72
+ "--tags",
71
73
  "--text",
72
74
  "--threshold",
73
75
  "--timeout",
@@ -5,7 +5,7 @@
5
5
  * Scope: Static command capability taxonomy only; command-shape parsing, spawning, and formatting live elsewhere.
6
6
  */
7
7
  const ADDITIONAL_COMMAND_TOKENS = [
8
- "auth", "chat", "clipboard", "confirm", "connect", "dashboard", "deny", "device", "dialog", "diff", "doctor", "errors", "eval", "find", "frame", "get", "highlight", "inspect", "install", "is", "mcp", "plugin", "plugins", "profiles", "profiler", "react", "record", "removeinitscript", "session", "set", "skills", "snapshot", "state", "stream", "trace", "upgrade", "vitals", "wait", "web-vitals", "window",
8
+ "a11y", "auth", "chat", "clipboard", "confirm", "connect", "dashboard", "deny", "device", "dialog", "diff", "doctor", "errors", "eval", "find", "frame", "get", "highlight", "inspect", "install", "is", "mcp", "plugin", "plugins", "profiles", "profiler", "react", "record", "removeinitscript", "session", "set", "skills", "snapshot", "state", "stream", "trace", "upgrade", "vitals", "wait", "web-vitals", "window",
9
9
  ];
10
10
  const COMMAND_CAPABILITIES = [
11
11
  {
@@ -46,7 +46,7 @@ export const SHARED_BROWSER_PLAYBOOK_GUIDELINES = [
46
46
  "For batch chains that touch cookies, storage, auth, or other secret-bearing commands, use details.batchSteps for per-step artifacts, categories, spill paths, and full structured errors; top-level details.data on batch is only a compact redacted step matrix (success, argv-redacted command, redacted result or scrubbed error text) built from the same presentation rules as standalone calls.",
47
47
  "For non-core families, pass current upstream commands through the native tool directly: network requests, network route <url>, network har start/stop [path], diff snapshot, diff screenshot --baseline <file>, diff url <u1> <u2>, trace start, trace stop [path], profiler start, profiler stop [path], record start <path>, record stop, console/errors [--clear], highlight <selector>, inspect, clipboard read, clipboard write <text>, clipboard copy/paste, stream enable/disable/status, dashboard start/stop, device list for iOS simulator inventory, and chat <message>. For compact network requests output, prefer details.nextActions for request detail, route-mock diagnostics, actionable failed-request networkSourceLookup, filtering, clearing the aggregate buffer before repro, or HAR capture follow-ups instead of guessing request-id syntax. Artifact-producing commands report details.artifacts and verification state; long-running starts such as stream, dashboard, trace/profiler, and record should be paired with the matching stop/disable command when the task is done; stream enable already-enabled outcomes are treated as idempotent success with status/disable follow-ups.",
48
48
  "For Electron desktop apps, prefer top-level electron for wrapper-owned discovery, isolated launch, status, compact probe, and cleanup: list first, treat likely-sensitive annotations as hints rather than enforcement, launch with the default snapshot handoff unless handoff: \"tabs\" is the safer diagnostic starting point, use electron.probe or snapshot -i/qa.attached for current-session state, and always cleanup the returned launchId when done. electron.launch uses an isolated temporary profile; it does not reuse the app's normal signed-in profile or attach to an already-running authenticated app. For signed-in local app state, host-launch the normal app with --remote-debugging-port when appropriate, then use raw args connect <port|url>; after connect, inspect tab list, select the stable tab id such as tab t2, then run a condition wait or snapshot -i before using refs. close commands (`close`, `quit`, or `exit`) only close the browser/CDP session; leave manually launched app shutdown, profile cleanup, and explicit artifacts to the host owner.",
49
- "For provider or specialized app workflows, load version-matched upstream guidance with skills get agentcore|electron|slack|dogfood|vercel-sandbox through the native tool; add --full when you need references/templates, and use skills get --all only for broad skill audits. Hosted sandbox workflows should use upstream @agent-browser/sandbox helpers outside this wrapper. Provider launches such as -p ios, --provider browserbase/kernel/browseruse/browserless/agentcore, and iOS --device are upstream-owned setup paths; use sessionMode fresh when switching providers and expect external credentials or local Appium/Xcode setup to be required.",
49
+ "For provider or specialized app workflows, load version-matched upstream guidance with skills get agentcore|electron|slack|dogfood|vercel-sandbox|derive-client through the native tool; add --full when you need references/templates, and use skills get --all only for broad skill audits. Use derive-client when recording HAR traffic to generate a standalone API client; prefer network har start (text bodies by default) or network har start --content all|none before multi-step capture. For accessibility audits use a11y or a11y --tags wcag2a,wcag2aa (CDP browsers only). Hosted sandbox workflows should use upstream @agent-browser/sandbox helpers outside this wrapper. Provider launches such as -p ios, --provider browserbase/kernel/browseruse/browserless/agentcore, and iOS --device are upstream-owned setup paths; use sessionMode fresh when switching providers and expect external credentials or local Appium/Xcode setup to be required.",
50
50
  "For dialogs and frames, use dialog status/accept/dismiss and frame <selector|main> through native args; dialog commands and eval snippets that look like alert/confirm/prompt/dialog triggers are shorter-bounded than normal browser calls, and timed-out dialog-like interactions may add inspect-dialog-after-timeout, dismiss-dialog-after-timeout, or recover-fresh-session-after-dialog-timeout nextActions. When --confirm-actions produces a pending confirmation, use details.nextActions or exact confirm <id> / deny <id> calls instead of inventing ids.",
51
51
  "If a session lands on the wrong page or tab, an interaction changes origin unexpectedly, or an open call returns blocked, blank, or otherwise unexpected results, use tab list / tab <tab-id-or-label> / snapshot -i to recover state before retrying different URLs or fallback strategies. For headed demos, put --headed on the first launch with sessionMode=fresh and verify with screenshot/tab/get-url evidence because tool success cannot prove the OS window is visible to the user. For desktop readiness, prefer real conditions first: wait --text, wait --url, wait --fn, wait --load <state>, wait --download, or qa.attached; for disappearance checks, use wait --fn predicates instead of stale upstream-help examples like wait <selector> --state hidden. Use electron.probe/status for wrapper-owned launch health or target mismatch. Fixed waits are a last resort: use explicit --timeout or top-level timeoutMs for legitimately slow waits, and treat a successful payload like \"waited\":\"timeout\" as elapsed time only—verify completion with an observed condition, fresh snapshot, or screenshot.",
52
52
  "For feed, timeline, or inbox reading tasks, focus on the main timeline/list region and read the first item there rather than unrelated composer or sidebar content.",
@@ -22,10 +22,29 @@ export function classifyAgentBrowserFailureCategory(options) {
22
22
  const text = [options.errorText, options.validationError, options.parseError, options.spawnError, options.stderr].filter(Boolean).join("\n");
23
23
  const command = options.command ?? "";
24
24
  const usedRef = options.args?.some((arg) => /^@e\d+\b/.test(arg)) ?? false;
25
- if (options.confirmationRequired || /confirmation required|pending confirmation|requires confirmation/i.test(text))
25
+ // Explicit confirmation flag wins. Text-derived confirmation phrases come after locator-miss detection so a
26
+ // missed control named "Confirmation required" still gets selector recovery.
27
+ if (options.confirmationRequired)
26
28
  return "confirmation-required";
27
- if (options.timedOut || /timeout|timed out|watchdog|IPC read timeout|must stay under its 30s IPC read timeout/i.test(text))
29
+ // Upstream 0.32.4+ locator misses keep detail and may echo getByRole/getByText or Names seen lists.
30
+ // Evaluate before text-derived timeout/confirmation so accessible-name substrings cannot suppress recovery.
31
+ const isUpstreamLocatorMiss = /\bNo element found:\s*(?:getBy[A-Za-z]+|role=|text=|label=|placeholder=|alt=|title=|testid=)/i.test(text) ||
32
+ // No trailing \b after ":" — colon is non-word, so "Element not found: text=…" would not match.
33
+ (/\bElement not found:/i.test(text) && /\bVerify the selector, role, or name\b/i.test(text)) ||
34
+ /\bnone match name\b/i.test(text) ||
35
+ // Scope Names seen to role/name miss context (or find) so unrelated prose cannot trip selector-not-found.
36
+ (/\bNames seen:/i.test(text) && (command === "find" || /\belement has role\b|\bnone match name\b|\bgetByRole\b/i.test(text))) ||
37
+ /\belement has role\b[\s\S]*\bnone match\b/i.test(text);
38
+ if (isUpstreamLocatorMiss)
39
+ return "selector-not-found";
40
+ if (/confirmation required|pending confirmation|requires confirmation/i.test(text))
41
+ return "confirmation-required";
42
+ // Match real timeout phrasing only. Do not treat bare "timeout" as a hit — accessible names can include that word,
43
+ // and `timed?\s*out` would also match the substring "timeout" as time+out.
44
+ if (options.timedOut ||
45
+ /\b(?:timed\s+out|timeout exceeded|watchdog|IPC read timeout)\b|must stay under its 30s IPC read timeout|Operation timed out/i.test(text)) {
28
46
  return "timeout";
47
+ }
29
48
  if (/ENOENT|not found on PATH|could not find.*agent-browser|agent-browser is required but was not found/i.test(text))
30
49
  return "missing-binary";
31
50
  if (options.parseError || /invalid JSON|missing boolean success|success field must be boolean|returned no JSON output/i.test(text))
@@ -617,6 +617,49 @@ function formatConsoleText(data, commandInfo) {
617
617
  }
618
618
  return shown.join("\n");
619
619
  }
620
+ function formatA11yText(data) {
621
+ const counts = isRecord(data.counts) ? data.counts : undefined;
622
+ const violations = getArrayField(data, "violations") ?? [];
623
+ const incomplete = getArrayField(data, "incomplete") ?? [];
624
+ if (!counts && violations.length === 0 && incomplete.length === 0)
625
+ return undefined;
626
+ const lines = [];
627
+ const axeVersion = getStringField(data, "axeVersion");
628
+ if (axeVersion)
629
+ lines.push(`axe-core ${redactModelFacingText(axeVersion)}`);
630
+ const url = getStringField(data, "url");
631
+ if (url)
632
+ lines.push(`URL: ${redactModelFacingText(url)}`);
633
+ const violationCount = typeof counts?.violations === "number" ? counts.violations : violations.length;
634
+ const incompleteCount = typeof counts?.incomplete === "number" ? counts.incomplete : incomplete.length;
635
+ const passCount = typeof counts?.passes === "number" ? counts.passes : undefined;
636
+ const inapplicableCount = typeof counts?.inapplicable === "number" ? counts.inapplicable : undefined;
637
+ const countParts = [`${violationCount} violation${violationCount === 1 ? "" : "s"}`, `${incompleteCount} incomplete`];
638
+ if (passCount !== undefined)
639
+ countParts.push(`${passCount} passes`);
640
+ if (inapplicableCount !== undefined)
641
+ countParts.push(`${inapplicableCount} inapplicable`);
642
+ lines.push(`A11y audit: ${countParts.join(", ")}.`);
643
+ const previewLimit = Math.min(10, DIAGNOSTIC_LOG_PREVIEW_LIMIT);
644
+ const preview = violations.slice(0, previewLimit).map((item, index) => {
645
+ if (!isRecord(item))
646
+ return `${index + 1}. ${stringifyModelFacing(item)}`;
647
+ const id = redactModelFacingText(getStringField(item, "id") ?? "rule");
648
+ const impact = redactModelFacingText(getStringField(item, "impact") ?? "unknown");
649
+ const help = firstLine(redactModelFacingText(getStringField(item, "help") ?? "").replace(/\s+/g, " ").trim(), 160);
650
+ const nodeCount = typeof item.nodeCount === "number" ? item.nodeCount : getArrayField(item, "nodes")?.length;
651
+ const nodePart = typeof nodeCount === "number" ? `, ${nodeCount} node${nodeCount === 1 ? "" : "s"}` : "";
652
+ return `${index + 1}. [${impact}] ${id}${nodePart}${help ? ` — ${help}` : ""}`;
653
+ });
654
+ lines.push(...preview);
655
+ if (violations.length > preview.length) {
656
+ lines.push(`... (${violations.length - preview.length} additional violations omitted from preview)`);
657
+ }
658
+ if (incompleteCount > 0) {
659
+ lines.push(`${incompleteCount} incomplete check${incompleteCount === 1 ? "" : "s"} need manual review (see details.data.incomplete).`);
660
+ }
661
+ return lines.join("\n");
662
+ }
620
663
  function formatErrorsText(data, commandInfo) {
621
664
  const errors = getArrayField(data, "errors");
622
665
  if (!errors)
@@ -966,6 +1009,8 @@ export function formatDiagnosticText(commandInfo, data) {
966
1009
  return formatConsoleText(data, commandInfo);
967
1010
  if (commandInfo.command === "errors")
968
1011
  return formatErrorsText(data, commandInfo);
1012
+ if (commandInfo.command === "a11y")
1013
+ return formatA11yText(data);
969
1014
  if (commandInfo.command === "dashboard")
970
1015
  return formatDashboardText(data);
971
1016
  if (commandInfo.command === "doctor")
@@ -18,13 +18,23 @@ This project intentionally blocks normal `agent-browser` bash usage in most agen
18
18
 
19
19
  <!-- agent-browser-capability-baseline:start upstream-baseline -->
20
20
  <!-- Generated from scripts/agent-browser-capability-baseline.mjs. Run `npm run docs -- command-reference write` to update. Do not edit manually. -->
21
- This reference is baselined to the locally installed `agent-browser 0.32.2` command/help surface, audited against vercel-labs/agent-browser@6ede7a9470ac4b681cabf838af8668b9aa99e957. Upstream `agent-browser` remains the source of truth for command semantics; this file is the local fallback for Pi agent sessions where direct binary help is blocked or discouraged.
21
+ This reference is baselined to the locally installed `agent-browser 0.33.0` command/help surface, audited against vercel-labs/agent-browser@1ed371f3af472cc0d6cd8fdaea75d1a085ff7534. Upstream `agent-browser` remains the source of truth for command semantics; this file is the local fallback for Pi agent sessions where direct binary help is blocked or discouraged.
22
22
 
23
23
  The lightweight drift check is `npm run verify -- command-reference`. Run it whenever the installed upstream `agent-browser` version changes or this reference is edited.
24
24
 
25
25
  Use `npm run benchmark:agent-browser` or `npm run verify -- benchmark` before and after agent-facing workflow abstractions to measure task success, tool calls, model-visible output size, stale-ref behavior, artifact success, failure-category coverage, and elapsed-time estimates.
26
26
  <!-- agent-browser-capability-baseline:end upstream-baseline -->
27
27
 
28
+ ### Upstream 0.33.0 rebaseline
29
+
30
+ The 0.32.3–0.33.0 releases add HAR body capture, fix semantic locators, and ship accessibility audits:
31
+
32
+ - 0.32.3 embeds text response bodies in HAR captures by default and adds `network har start --content <mode>` with `text` (default), `all`, and `none`. It also ships the `derive-client` skill for recording traffic and generating a standalone API client from HAR data.
33
+ - 0.32.4 makes `find role` match implicit ARIA roles and browser-computed accessible names (for example `find role heading text --name` against `<h2>`, lists, and banners), keeps case-insensitive substring name matching by default, preserves locator detail in element-not-found errors (`Names seen: …`), and aligns advertised `find` actions to `click, fill, check, hover, text`.
34
+ - 0.33.0 adds `a11y [url]` axe-core accessibility audits (`--tags`, `--selector`, structured JSON) with an embedded offline engine, plus a native fix that revives discarded tabs on tab switch instead of hanging the daemon.
35
+
36
+ This wrapper classifies 0.32.4+ locator-detail misses as `selector-not-found`, treats HAR `--content` and a11y `--tags` as command-scoped value flags, renders compact `a11y` summaries, and documents the skill/HAR/a11y surfaces. No Eve-specific Pi runtime is added.
37
+
28
38
  ### Upstream 0.32.2 rebaseline
29
39
 
30
40
  The 0.32.1 and 0.32.2 releases only update the separate `@agent-browser/eve` integration; the CLI/help/schema surface is unchanged:
@@ -62,7 +72,7 @@ The 0.31.1 rebaseline is a React bugfix release: `react tree`, `react inspect <i
62
72
 
63
73
  The 0.31.0 rebaseline adds restore workflow and namespace/session lifecycle surfaces: `--restore [name]`, `--restore-save <policy>`, restore check flags, `--namespace <name>`, `session id`, and `session info`. The wrapper parses those globals, keeps `--namespace` before `--session`, carries namespace context through managed-session probes and state, and keeps `session id` / `session info` sessionless. Use `agent_browser` with `args: ["session", "id", "--scope", "worktree", "--prefix", "my-skill"]` to derive reusable session ids from inside Pi; use `--restore=<key>` when passing an explicit key that could be confused with a command word.
64
74
 
65
- Runtime probes retain the 0.30.1 `wait --url` fix: `wait --url "**/dashboard"` succeeds after a `pushstate /dashboard`, so `job.assertUrl` delegates exact and glob patterns to upstream `wait --url`. Two old caveats still stand: `find ... uncheck` and `wait <selector> --state hidden|detached` remain advertised by help but fail at runtime. Keep the wrapper's direct `uncheck` passthrough and `wait --fn` disappearance guidance.
75
+ Runtime probes retain the 0.30.1 `wait --url` fix: `wait --url "**/dashboard"` succeeds after a `pushstate /dashboard`, so `job.assertUrl` delegates exact and glob patterns to upstream `wait --url`. Upstream 0.32.4 aligns advertised `find` actions with the dispatcher: `click, fill, check, hover, text` only—use top-level `uncheck <selector-or-ref>` (and `type` / `focus`) instead of `find ... uncheck|type|focus`. One older caveat still stands: `wait <selector> --state hidden|detached` remains advertised by some help paths but fails at runtime, so keep `wait --fn` disappearance guidance.
66
76
 
67
77
  ### Upstream 0.29.1 rebaseline
68
78
 
@@ -148,7 +158,7 @@ Tool parameters (use exactly one of `args`, `semanticAction`, `job`, `qa`, `sour
148
158
 
149
159
  ### Debug, diff, stream, dashboard, and chat families
150
160
 
151
- Upstream also exposes non-core families (`network`, `diff`, `trace` / `profiler` / `record`, `console` / `errors` / `highlight` / `inspect` / `clipboard`, `stream`, `dashboard`, `chat`, and related subcommands). The wrapper still owns argv planning, `--json`, managed sessions where applicable, artifact metadata, and model-facing presentation: structured results are compacted and scrubbed in `extensions/agent-browser/lib/results/presentation.ts`, and echoed argv uses the same `redactInvocationArgs` rules as core commands (see [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#details) for the field contract). Deterministic fake-upstream coverage for representative JSON shapes and redaction lives in `test/agent-browser.extension-validation.test.ts` under `agentBrowserExtension passes through non-core network debug diff stream dashboard and chat families`.
161
+ Upstream also exposes non-core families (`network`, `diff`, `trace` / `profiler` / `record`, `console` / `errors` / `a11y` / `highlight` / `inspect` / `clipboard`, `stream`, `dashboard`, `chat`, and related subcommands). The wrapper still owns argv planning, `--json`, managed sessions where applicable, artifact metadata, and model-facing presentation: structured results are compacted and scrubbed in `extensions/agent-browser/lib/results/presentation.ts`, and echoed argv uses the same `redactInvocationArgs` rules as core commands (see [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#details) for the field contract). Deterministic fake-upstream coverage for representative JSON shapes and redaction lives in `test/agent-browser.extension-validation.test.ts` under `agentBrowserExtension passes through non-core network debug diff stream dashboard and chat families`.
152
162
 
153
163
  ## Recommended workflow
154
164
 
@@ -242,7 +252,7 @@ Examples:
242
252
  { "args": ["snapshot", "-i"] }
243
253
  ```
244
254
 
245
- The optional native `semanticAction` object is only a thin schema for common locator-based actions, direct selector/ref click/check/fill, and native dropdown selection; it compiles locator actions to existing upstream `find` commands, direct selector/ref actions to `click` / `check` / `fill`, compiles `action: "select"` to upstream `select <selector> <value...>`, and reports the compiled argv in `details.compiledSemanticAction` (see [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#semanticaction) for the full field rules). For `locator: "role"`, pass either `value: "button"` or `role: "button"`; if both are present they must match. It is a top-level alternative to `args`, `job`, `qa`, `sourceLookup`, `networkSourceLookup`, and `electron`, not a nested shape inside `batch` stdin arrays. Add `session` inside `semanticAction` when the shorthand should target a named upstream browser session; the compiled argv prepends `--session <name>` before `find`, direct selector/ref commands, or `select`, and fallback candidate actions preserve that prefix. For active sessions, role/name click/check/fill shorthands may resolve through the current `snapshot -i` refs before execution so hidden duplicate matches do not steal the action; fill only resolves when there is one exact editable current ref match. Inspect `details.effectiveArgs` when you need the exact executed argv. `semanticAction` does not expose `uncheck` while upstream `find ... uncheck` is not runtime-supported; use raw `uncheck <selector-or-ref>` after choosing a stable selector or current snapshot ref. `select` shorthand intentionally requires a stable selector or current `@ref` plus `value`/`values`; upstream `find` does not expose a verified `select` action, so role/name/label dropdown resolution stays a snapshot/selector decision instead of hidden wrapper magic. If a raw `find` or semantic action misses with `selector-not-found`, the wrapper may take one fresh snapshot and append `Current snapshot ref fallback` when that snapshot has exact visible role/name matches for the failed target. Non-fill matches can include direct `try-current-visible-ref*` next actions. Semantic click misses may also include `Agent-browser candidate fallbacks`; `details.nextActions` first recommends a fresh `snapshot -i` and may include bounded role/name retries such as `button`/`link` for a missed `text` click, each as a `try-*-candidate` entry carrying redacted `find role …` argv.
255
+ The optional native `semanticAction` object is only a thin schema for common locator-based actions, direct selector/ref click/check/fill, and native dropdown selection; it compiles locator actions to existing upstream `find` commands, direct selector/ref actions to `click` / `check` / `fill`, compiles `action: "select"` to upstream `select <selector> <value...>`, and reports the compiled argv in `details.compiledSemanticAction` (see [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#semanticaction) for the full field rules). For `locator: "role"`, pass either `value: "button"` or `role: "button"`; if both are present they must match. It is a top-level alternative to `args`, `job`, `qa`, `sourceLookup`, `networkSourceLookup`, and `electron`, not a nested shape inside `batch` stdin arrays. Add `session` inside `semanticAction` when the shorthand should target a named upstream browser session; the compiled argv prepends `--session <name>` before `find`, direct selector/ref commands, or `select`, and fallback candidate actions preserve that prefix. For active sessions, role/name click/check/fill shorthands may resolve through the current `snapshot -i` refs before execution so hidden duplicate matches do not steal the action; fill only resolves when there is one exact editable current ref match. Inspect `details.effectiveArgs` when you need the exact executed argv. `semanticAction` does not expose `uncheck` because upstream `find` actions are only `click, fill, check, hover, text`; use raw `uncheck <selector-or-ref>` after choosing a stable selector or current snapshot ref. `select` shorthand intentionally requires a stable selector or current `@ref` plus `value`/`values`; upstream `find` does not expose a verified `select` action, so role/name/label dropdown resolution stays a snapshot/selector decision instead of hidden wrapper magic. If a raw `find` or semantic action misses with `selector-not-found`, the wrapper may take one fresh snapshot and append `Current snapshot ref fallback` when that snapshot has exact visible role/name matches for the failed target. Non-fill matches can include direct `try-current-visible-ref*` next actions. Semantic click misses may also include `Agent-browser candidate fallbacks`; `details.nextActions` first recommends a fresh `snapshot -i` and may include bounded role/name retries such as `button`/`link` for a missed `text` click, each as a `try-*-candidate` entry carrying redacted `find role …` argv.
246
256
 
247
257
  For desktop, contenteditable, or host-controlled rich inputs, treat a semantic `fill` miss or mismatch differently. Active-session role/name fills can execute through one exact current editable `combobox`, `searchbox`, or `textbox` ref before upstream `find` runs. If a later selector miss still finds an exact current editable ref (`searchbox` or `textbox`), `details.richInputRecovery` and visible `Rich input recovery` describe the candidate and append `focus-current-editable-ref*` / `click-current-editable-ref*` next actions. Those actions deliberately do **not** copy the fill text and never press `Enter` or submit. Direct `fill @ref <text>` on contenteditable refs may also append/prepend instead of replacing; when the latest snapshot proves the target is contenteditable, the wrapper verifies `get text` after a successful fill and appends `details.fillVerification` plus `inspect-after-fill-verification` / `verify-filled-value` if the visible text does not match. Use the safe ladder instead: refresh refs, choose the current editable `@ref`, focus or click it, then send the intended text with `keyboard inserttext` or `keyboard type` in a separate call. Do not auto-submit unless the user flow explicitly calls for it.
248
258
 
@@ -562,7 +572,7 @@ Session note: `skills list`, `skills get …`, and `skills path …` are **state
562
572
  | `skills list` | List available CLI-bundled skills. |
563
573
  | `skills get core` | Print the core usage guide. |
564
574
  | `skills get core --full` | Print the full version-matched core command reference and templates. |
565
- | `skills get <name>` | Load a specialized skill such as `electron` or `slack`. Common specialized calls include `skills get electron`, `skills get slack`, `skills get dogfood`, `skills get vercel-sandbox`, and `skills get agentcore`. |
575
+ | `skills get <name>` | Load a specialized skill such as `electron` or `slack`. Common specialized calls include `skills get electron`, `skills get slack`, `skills get dogfood`, `skills get vercel-sandbox`, `skills get agentcore`, and `skills get derive-client` (HAR-to-API-client workflow). |
566
576
  | `skills get <name> --full` | Include a skill's supplementary references/templates when present. |
567
577
  | `skills get --all` | Print all visible bundled skills for broad audit/debug work. |
568
578
  | `skills path [name]` | Print a skill directory path. |
@@ -663,10 +673,10 @@ These calls return plain text and stay stateless: the extension does not inject
663
673
  | `get text/html/value/count <selector>` | Read matched elements; use `get text body` for whole-page text. |
664
674
  | `get attr <selector> <name>`, `get box <selector>`, `get styles <selector>` | Read an attribute, bounding box, or computed styles from matched elements. |
665
675
  | `is <what> <selector>` | Check `visible`, `enabled`, or `checked`. |
666
- | `find <locator> <value> <action> [text]` | Locator types include `role`, `text`, `label`, `placeholder`, `alt`, `title`, and `testid`; selector helpers include `find first <sel>`, `find last <sel>`, and `find nth <n> <sel>`. Role/text filters include `find role <role> --name <name>` and `find ... --exact`. |
676
+ | `find <locator> <value> <action> [text]` | Locator types include `role`, `text`, `label`, `placeholder`, `alt`, `title`, and `testid`; selector helpers include `find first <sel>`, `find last <sel>`, and `find nth <n> <sel>`. Role/text filters include `find role <role> --name <name>` and `find ... --exact`. Actions are `click, fill, check, hover, text` only. Prefer `find role` for semantic elements: implicit roles work (`find role heading text --name` for `<h2>`, list/banner landmarks, and similar). Default name matching is a case-insensitive substring; `--exact` makes the accessible name case-sensitive. On misses, upstream 0.32.4+ keeps locator detail such as `Names seen: …` or `No element found: getByRole(...)` instead of a generic flatten. |
667
677
  | `mouse <action> [args]` | `move <x> <y>`, `down [btn]`, `up [btn]`, `wheel <dy> [dx]`. |
668
678
  | `set <setting> [value]` | `viewport <w> <h>`, `device <name>`, `geo <lat> <lng>`, `offline [on|off]`, `headers <json>`, `credentials <user> <pass>`, and `set media <features>` (`dark`, `light`, and/or `reduced-motion`). |
669
- | `network <action>` | `network route <url> [--abort|--body <json>] [--resource-type <csv>]`, `network unroute [url]`, `network requests [--clear] [--filter <pattern>] [--type <csv>] [--method <method>] [--status <code|range>]`, `network request <requestId>`, `network har start`, and `network har stop [path]`. `--resource-type` filters intercepted requests by CDP resource type, such as `script`, `image`, `font`, `xhr`, or `fetch`; request listing filters accept resource types (`xhr,fetch`), methods (`POST`), and statuses (`2xx`, `400-499`). |
679
+ | `network <action>` | `network route <url> [--abort|--body <json>] [--resource-type <csv>]`, `network unroute [url]`, `network requests [--clear] [--filter <pattern>] [--type <csv>] [--method <method>] [--status <code|range>]`, `network request <requestId>`, `network har start`, `network har start --content text` (default; embeds text bodies), `network har start --content all`, `network har start --content none`, and `network har stop [path]`. `--resource-type` filters intercepted requests by CDP resource type, such as `script`, `image`, `font`, `xhr`, or `fetch`; request listing filters accept resource types (`xhr,fetch`), methods (`POST`), and statuses (`2xx`, `400-499`). HAR files can include auth headers and bodies—do not share them unredacted. For turning a recording into a reusable API client, load `skills get derive-client`. |
670
680
  | `cookies [get|set|clear]` | Manage cookies. Full set form: `cookies set <name> <value> --url <url> --domain <domain> --path <path> --httpOnly --secure --sameSite <Strict|Lax|None> --expires <timestamp>`; also supports `cookies set --curl <file>` for JSON, cURL, or bare Cookie-header bulk imports. |
671
681
  | `storage <local|session>` | Manage web storage. |
672
682
 
@@ -742,6 +752,7 @@ Current upstream still does not parse `wait <selector> --state hidden` / `wait <
742
752
  | `react renders start` | Start recording React render activity. |
743
753
  | `react renders stop [--json]` | Stop render recording and print mount/re-render counts and changed details. |
744
754
  | `react suspense [--only-dynamic] [--json]` | Classify Suspense boundaries with grouped root-cause recommendations. |
755
+ | `a11y [url]` | Run an embedded axe-core accessibility audit on the current page, or navigate to `url` first. Options: `a11y --tags wcag2a,wcag2aa`, `a11y --selector "#main"`. CDP browsers only (not Safari/iOS WebDriver). Model-facing text summarizes violation/incomplete counts and top rules; full node targets stay in `details.data`. |
745
756
  | `vitals [url] [--json]` | Report Core Web Vitals: LCP, CLS, TTFB, FCP, INP, plus React hydration timing when available. `web-vitals [url] [--json]` is the upstream alias. |
746
757
  | `pushstate <url>` | Perform SPA client-side navigation; detects Next.js router pushes and falls back to history navigation events. |
747
758
  | `removeinitscript <id>` | Remove an init script registered through upstream init-script mechanisms. |
@@ -949,19 +960,23 @@ Other useful environment variables include `AGENT_BROWSER_DEFAULT_TIMEOUT`, `AGE
949
960
  <!-- agent-browser-capability-baseline:start capability-token-baseline -->
950
961
  <!-- Generated from scripts/agent-browser-capability-baseline.mjs. Run `npm run docs -- command-reference write` to update. Do not edit manually. -->
951
962
  <details>
952
- <summary>Generated verifier capability baseline for agent-browser 0.32.2</summary>
963
+ <summary>Generated verifier capability baseline for agent-browser 0.33.0</summary>
953
964
 
954
965
  This generated block is review data for maintainers. The human-authored reference sections above remain the readable command guide.
955
966
 
956
967
  #### Source evidence
957
968
  - repository: `vercel-labs/agent-browser`
958
- - upstream HEAD: `6ede7a9470ac4b681cabf838af8668b9aa99e957`
959
- - upstream package version: `0.32.2`
969
+ - upstream HEAD: `1ed371f3af472cc0d6cd8fdaea75d1a085ff7534`
970
+ - upstream package version: `0.33.0`
960
971
  - inspected: `agent-browser --version`
961
972
  - inspected: `agent-browser --help`
962
973
  - inspected: `selected agent-browser <command> --help output`
974
+ - inspected: `agent-browser a11y --help`
963
975
  - inspected: `agent-browser mcp --help`
964
976
  - inspected: `agent-browser plugin --help`
977
+ - inspected: `agent-browser skills list`
978
+ - inspected: `agent-browser skills get core --full`
979
+ - inspected: `agent-browser skills get derive-client --full`
965
980
  - inspected: `README.md`
966
981
  - inspected: `CHANGELOG.md`
967
982
  - inspected: `agent-browser.schema.json`
@@ -970,8 +985,17 @@ This generated block is review data for maintainers. The human-authored referenc
970
985
  - inspected: `cli/src/read.rs`
971
986
  - inspected: `cli/src/doctor/webgpu.rs`
972
987
  - inspected: `cli/src/native/actions.rs`
988
+ - inspected: `cli/src/native/a11y/mod.rs`
989
+ - inspected: `cli/src/native/browser.rs`
973
990
  - inspected: `cli/src/native/daemon.rs`
991
+ - inspected: `cli/src/output.rs`
974
992
  - inspected: `docs/src/app/webgpu/page.mdx`
993
+ - inspected: `docs/src/app/network/page.mdx`
994
+ - inspected: `docs/src/app/selectors/page.mdx`
995
+ - inspected: `docs/src/app/skills/page.mdx`
996
+ - inspected: `docs/src/app/commands/page.mdx`
997
+ - inspected: `skill-data/derive-client/SKILL.md`
998
+ - inspected: `skill-data/core/SKILL.md`
975
999
  - inspected: `packages/@agent-browser/eve/README.md`
976
1000
  - inspected: `packages/@agent-browser/eve/package.json`
977
1001
  - inspected: `packages/@agent-browser/eve/test/extension.test.mjs`
@@ -1027,6 +1051,7 @@ This generated block is review data for maintainers. The human-authored referenc
1027
1051
  - record help: `agent-browser record --help`
1028
1052
  - console help: `agent-browser console --help`
1029
1053
  - errors help: `agent-browser errors --help`
1054
+ - a11y help: `agent-browser a11y --help`
1030
1055
  - clipboard help: `agent-browser clipboard --help`
1031
1056
  - tap help: `agent-browser tap --help`
1032
1057
  - swipe help: `agent-browser swipe --help`
@@ -1038,10 +1063,10 @@ This generated block is review data for maintainers. The human-authored referenc
1038
1063
  - plugin help: `agent-browser plugin --help`
1039
1064
 
1040
1065
  #### Inventory sections
1041
- - Built-in skills: 15 human-doc token(s), 15 upstream token(s)
1042
- - Core page, element, navigation, and extraction commands: 81 human-doc token(s), 82 upstream token(s)
1066
+ - Built-in skills: 16 human-doc token(s), 18 upstream token(s)
1067
+ - Core page, element, navigation, and extraction commands: 82 human-doc token(s), 84 upstream token(s)
1043
1068
  - Sessions, state, tabs, frames, dialogs, and windows: 24 human-doc token(s), 20 upstream token(s)
1044
- - Network, storage, artifacts, diagnostics, and performance: 43 human-doc token(s), 53 upstream token(s)
1069
+ - Network, storage, artifacts, diagnostics, and performance: 49 human-doc token(s), 60 upstream token(s)
1045
1070
  - Batch, auth, confirmations, setup, dashboard, devices, and AI commands: 33 human-doc token(s), 37 upstream token(s)
1046
1071
  - Global flags, config, providers, policy, and environment: 138 human-doc token(s), 106 upstream token(s)
1047
1072
 
@@ -1058,6 +1083,7 @@ This generated block is review data for maintainers. The human-authored referenc
1058
1083
  - `skills get dogfood`
1059
1084
  - `skills get vercel-sandbox`
1060
1085
  - `skills get agentcore`
1086
+ - `skills get derive-client`
1061
1087
  - `@agent-browser/sandbox`
1062
1088
  - `installSystemDependencies: false`
1063
1089
  - `skills path [name]`
@@ -1139,6 +1165,7 @@ This generated block is review data for maintainers. The human-authored referenc
1139
1165
  - `find last <sel>`
1140
1166
  - `find nth <n> <sel>`
1141
1167
  - `find role <role> --name <name>`
1168
+ - `find role heading text --name`
1142
1169
  - `find ... --exact`
1143
1170
  - `mouse <action> [args]`
1144
1171
  - `set <setting> [value]`
@@ -1179,6 +1206,9 @@ This generated block is review data for maintainers. The human-authored referenc
1179
1206
  - `network requests [--clear] [--filter <pattern>] [--type <csv>] [--method <method>] [--status <code|range>]`
1180
1207
  - `network request <requestId>`
1181
1208
  - `network har start`
1209
+ - `network har start --content all`
1210
+ - `network har start --content none`
1211
+ - `network har start --content text`
1182
1212
  - `network har stop [path]`
1183
1213
  - `cookies [get|set|clear]`
1184
1214
  - `cookies set <name> <value> --url <url> --domain <domain> --path <path> --httpOnly --secure --sameSite <Strict|Lax|None> --expires <timestamp>`
@@ -1215,6 +1245,9 @@ This generated block is review data for maintainers. The human-authored referenc
1215
1245
  - `react suspense [--only-dynamic] [--json]`
1216
1246
  - `vitals [url] [--json]`
1217
1247
  - `web-vitals [url] [--json]`
1248
+ - `a11y [url]`
1249
+ - `a11y --tags wcag2a,wcag2aa`
1250
+ - `a11y --selector "#main"`
1218
1251
  - `removeinitscript <id>`
1219
1252
 
1220
1253
  ##### Batch, auth, confirmations, setup, dashboard, devices, and AI commands
@@ -1404,11 +1437,14 @@ This generated block is review data for maintainers. The human-authored referenc
1404
1437
  - skills list: `dogfood`
1405
1438
  - skills list: `vercel-sandbox`
1406
1439
  - skills list: `agentcore`
1440
+ - skills list: `derive-client`
1407
1441
  - vercel sandbox skill full: `@agent-browser/sandbox`
1408
1442
  - vercel sandbox skill full: `installSystemDependencies: false`
1409
1443
  - core skill full: `agent-browser frame @e3`
1410
1444
  - core skill full: `agent-browser dialog accept`
1411
1445
  - core skill full: `agent-browser --session "$SESSION" --restore open https://app.example.com`
1446
+ - core skill full: `network har start --content all`
1447
+ - core skill full: `implicit roles work`
1412
1448
 
1413
1449
  ##### Core page, element, navigation, and extraction commands
1414
1450
  - open help: `open [url]`
@@ -1482,6 +1518,8 @@ This generated block is review data for maintainers. The human-authored referenc
1482
1518
  - find help: `nth <index> <selector>`
1483
1519
  - find help: `--name <name>`
1484
1520
  - find help: `--exact`
1521
+ - find help: `case-insensitive`
1522
+ - find help: `click, fill, check, hover, text`
1485
1523
  - root help: `Mouse: agent-browser mouse <action> [args]`
1486
1524
  - root help: `Browser Settings: agent-browser set <setting> [value]`
1487
1525
  - set help: `media [dark|light]`
@@ -1521,6 +1559,8 @@ This generated block is review data for maintainers. The human-authored referenc
1521
1559
  - root help: `--resource-type <csv>`
1522
1560
  - network help: `unroute [url]`
1523
1561
  - network help: `network har start`
1562
+ - network help: `network har start --content all`
1563
+ - network help: `--content <mode>`
1524
1564
  - network help: `network har stop ./capture.har`
1525
1565
  - root help: `cookies [get|set|clear]`
1526
1566
  - root help: `cookies set --curl <file>`
@@ -1550,6 +1590,11 @@ This generated block is review data for maintainers. The human-authored referenc
1550
1590
  - root help: `react renders stop [--json]`
1551
1591
  - root help: `react suspense [--only-dynamic] [--json]`
1552
1592
  - root help: `vitals [url] [--json]`
1593
+ - root help: `a11y [url] [--tags <t1,t2>] [--selector <css>] [--json]`
1594
+ - a11y help: `a11y [url]`
1595
+ - a11y help: `--tags <tag1,tag2>`
1596
+ - a11y help: `-s, --selector <css>`
1597
+ - core skill full: `agent-browser a11y`
1553
1598
  - root help: `removeinitscript <id>`
1554
1599
  - network help: `requests [options]`
1555
1600
  - network help: `--type <types>`
@@ -26,10 +26,10 @@ When upstream ships a new `agent-browser` or the inventory changes:
26
26
 
27
27
  ## Audit result
28
28
 
29
- - Target upstream: `agent-browser 0.32.2` (must match `CAPABILITY_BASELINE.targetVersion` in [`scripts/agent-browser-capability-baseline.mjs`](../scripts/agent-browser-capability-baseline.mjs)).
29
+ - Target upstream: `agent-browser 0.33.0` (must match `CAPABILITY_BASELINE.targetVersion` in [`scripts/agent-browser-capability-baseline.mjs`](../scripts/agent-browser-capability-baseline.mjs)).
30
30
  - Source of truth: `CAPABILITY_BASELINE.inventorySections` in the same file (stable `id` keys: `skills`, `core-commands`, `state-tabs-frames-dialogs`, `network-storage-artifacts-diagnostics`, `batch-auth-setup-ai`, `options-and-env`).
31
- - Status: source and wrapper adaptation are complete for the 2026-07-18 0.32.2 audit; the 0.32.1–0.32.2 changes stay isolated to the separate `@agent-browser/eve` package, while the wrapper now also keeps hidden helper subprocesses on the same idle-timeout launch configuration, refreshes the remaining active target after `tab close`, and performs deterministic document-direction scrolls before wheel fallback.
32
- - High-priority support gaps: 2026-05-26 audit found sessionless local commands and command-scoped value flags needed sharper wrapper handling; runtime/tests/docs now cover those paths. The 0.28.0 rebaseline added local `mcp` and `plugin` surfaces plus plugin-backed credential login; wrapper docs/tests mark `mcp` and known `plugin` commands sessionless, with no compatibility shim for older upstream releases. The 0.29.1 rebaseline added upstream `@agent-browser/sandbox` helper-package guidance and stricter `install --with-deps` failure semantics; no new wrapper runtime mode or bundled dependency was required. The 0.30.1 rebaseline fixed upstream `wait --url` glob matching, so constrained `job.assertUrl` delegates glob and exact patterns directly to `wait --url`. The 0.31.0 rebaseline adds restore workflow and namespace/session lifecycle surfaces (`--restore`, restore checks, `--namespace`, `session id`, and `session info`) without adding a wrapper compatibility layer. The 0.31.1 rebaseline fixes upstream React renderer selection for `react tree`, `react inspect`, and `react suspense`; no wrapper runtime change was required. The 0.31.2 rebaseline adds the local-launch-only `--webgpu` preset and `doctor --webgpu`, plus periodic restore-state autosaves controlled by `AGENT_BROWSER_AUTOSAVE_INTERVAL_MS`; the wrapper treats WebGPU as launch-scoped and leaves autosave ownership upstream. The 0.32.0 rebaseline hardens request/worker/popup/WebRTC containment behind `--allowed-domains`, fixes waits against already-complete documents, and adds a separate `@agent-browser/eve` package; the wrapper makes containment launch-scoped, retains its final-URL check as defense in depth, and adds no Eve-specific mode. The 0.32.1–0.32.2 rebaseline updates only eve compatibility/packaging, but the full current-surface audit also found the local reference had omitted upstream `read [url]` since 0.30.0; baseline/help sampling, content-first presentation, tab-target preservation, timeout budgeting, docs, and tests now cover it. Remaining upstream-owned caveat: current help still mentions `wait <selector> --state hidden` / `detached` and `find ... uncheck`, but runtime probes show those advertised shapes still fail, so wrapper docs keep `wait --fn` predicates and direct `uncheck` passthrough guidance.
31
+ - Status: source and wrapper adaptation target the 2026-07-23 0.33.0 audit. The wrapper classifies 0.32.4+ locator-detail find misses as `selector-not-found`, treats HAR `--content` and a11y `--tags` as command-scoped value flags, documents `derive-client` / HAR body modes / `a11y`, and renders compact a11y summaries; prior helper idle-timeout, post-`tab close` target refresh, and document-direction scroll behavior remain. Upstream 0.33.0 also revives discarded tabs on tab switch.
32
+ - High-priority support gaps: 2026-05-26 audit found sessionless local commands and command-scoped value flags needed sharper wrapper handling; runtime/tests/docs now cover those paths. The 0.28.0 rebaseline added local `mcp` and `plugin` surfaces plus plugin-backed credential login; wrapper docs/tests mark `mcp` and known `plugin` commands sessionless, with no compatibility shim for older upstream releases. The 0.29.1 rebaseline added upstream `@agent-browser/sandbox` helper-package guidance and stricter `install --with-deps` failure semantics; no new wrapper runtime mode or bundled dependency was required. The 0.30.1 rebaseline fixed upstream `wait --url` glob matching, so constrained `job.assertUrl` delegates glob and exact patterns directly to `wait --url`. The 0.31.0 rebaseline adds restore workflow and namespace/session lifecycle surfaces (`--restore`, restore checks, `--namespace`, `session id`, and `session info`) without adding a wrapper compatibility layer. The 0.31.1 rebaseline fixes upstream React renderer selection for `react tree`, `react inspect`, and `react suspense`; no wrapper runtime change was required. The 0.31.2 rebaseline adds the local-launch-only `--webgpu` preset and `doctor --webgpu`, plus periodic restore-state autosaves controlled by `AGENT_BROWSER_AUTOSAVE_INTERVAL_MS`; the wrapper treats WebGPU as launch-scoped and leaves autosave ownership upstream. The 0.32.0 rebaseline hardens request/worker/popup/WebRTC containment behind `--allowed-domains`, fixes waits against already-complete documents, and adds a separate `@agent-browser/eve` package; the wrapper makes containment launch-scoped, retains its final-URL check as defense in depth, and adds no Eve-specific mode. The 0.32.1–0.32.2 rebaseline updates only eve compatibility/packaging, but the full current-surface audit also found the local reference had omitted upstream `read [url]` since 0.30.0; baseline/help sampling, content-first presentation, tab-target preservation, timeout budgeting, docs, and tests now cover it. The 0.32.3–0.32.4 rebaseline adds HAR response-body capture modes, the `derive-client` skill, fixed `find role` implicit-ARIA / accessible-name matching with locator-detail misses, and an advertised `find` action list of `click, fill, check, hover, text` only; the wrapper documents and classifies those surfaces without adding a new input mode. Remaining upstream-owned caveat: some help paths still mention `wait <selector> --state hidden` / `detached`, but runtime probes show those shapes still fail, so wrapper docs keep `wait --fn` disappearance predicates and top-level `uncheck` / `type` / `focus` passthrough instead of `find` for those actions. `wait --download <path>` still reports the requested path without guaranteed on-disk persistence ([#1300](https://github.com/vercel-labs/agent-browser/issues/1300)).
33
33
  - Post-`v0.2.29` review state: commits `eb55320` through `86abbfb` add browser guidance/smoke coverage plus `RQ-0086` click-probe reduction, `RQ-0087` same-snapshot form fill batching, `RQ-0088` current-ref fallback on locator misses, `RQ-0089` direct-upstream click mutation investigation, and `RQ-0090` stop-boundary/artifact-path guidance. Verification gates below were rerun on 2026-05-18 after those tasks landed. Constrained `job` (`RQ-0064`), the lightweight `qa` preset (`RQ-0065`), the experimental `sourceLookup` helper (`RQ-0066`), the experimental `networkSourceLookup` helper (`RQ-0067`), optional Exa/Brave-backed `agent_browser_web_search` with Pi-scoped package config (`RQ-0121`), and agent recovery for search/profile configuration failures (`RQ-0122`) are implemented; see [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#job), [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#qa), [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#sourcelookup), [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#networksourcelookup), and [`TOOL_CONTRACT.md`](TOOL_CONTRACT.md#optional-companion-web-search). Reusable browser recipes (`RQ-0068`) are intentionally not adopted as a runtime surface; see [`ARCHITECTURE.md`](ARCHITECTURE.md#no-reusable-recipe-layer-yet).
34
34
 
35
35
  ## UX/reliability decisions from 2026-05-29 agent feedback
@@ -52,24 +52,26 @@ Current summary:
52
52
  | RQ-0134 | Upstream `agent-browser 0.32.0` rebaseline hardens domain containment, fixes completed-page waits, and adds a separate eve extension package; wrapper launch policy and docs cover the relevant behavior. | [`docs/COMMAND_REFERENCE.md`](COMMAND_REFERENCE.md#upstream-0320-rebaseline) |
53
53
  | RQ-0135 | Upstream `agent-browser 0.32.2` rebaseline updates eve packaging only and closes the wrapper's prior missing `read [url]` inventory/presentation contract. | [`docs/COMMAND_REFERENCE.md`](COMMAND_REFERENCE.md#upstream-0322-rebaseline) |
54
54
  | RQ-0136 | Wrapper regression fix keeps helper subprocess launch environments stable, refreshes active tab state after `tab close`, and makes ordinary document-direction scrolling deterministic before upstream fallback. | [`docs/ARCHITECTURE.md`](ARCHITECTURE.md), [`docs/TOOL_CONTRACT.md`](TOOL_CONTRACT.md#details) |
55
+ | RQ-0137 | Upstream `agent-browser 0.32.4` rebaseline adds HAR `--content` body modes, the `derive-client` skill, and fixed `find role` implicit-ARIA/name matching with locator-detail misses; wrapper classifier/argv/docs cover those surfaces. | [`docs/COMMAND_REFERENCE.md`](COMMAND_REFERENCE.md#upstream-0330-rebaseline) |
56
+ | RQ-0138 | Upstream `agent-browser 0.33.0` rebaseline adds `a11y` axe-core audits and discarded-tab revival on tab switch; wrapper documents/presents `a11y` and samples the new help surface. | [`docs/COMMAND_REFERENCE.md`](COMMAND_REFERENCE.md#upstream-0330-rebaseline) |
55
57
 
56
58
  ## Verification evidence
57
59
 
58
- Re-run the gates below before each release; this table records what the closure audit exercised. The 0.32.2 / Pi 0.80.10 local rebaseline gates passed on 2026-07-18; the prior 0.32.0 / Pi 0.80.9 release-composition and platform rows remain explicitly historical evidence.
60
+ Re-run the gates below before each release; this table records what the closure audit exercised. The 0.33.0 / package 0.2.72 local rebaseline gates passed on 2026-07-23.
59
61
 
60
62
  | Gate | Evidence | Status |
61
63
  | --- | --- | --- |
62
- | Default local gate | `npm run verify` checks generated playbook drift, clean-builds generated `dist/`, runs `tsc --noEmit`, unit/fake tests, generated command-reference blocks, and live command-reference sampling. | **Current for 0.32.2 / Pi 0.80.10:** pass on 2026-07-18 (590 passed, 2 opt-in skips; live command-reference verification passed). |
63
- | Pre-PR local gate | `npm run verify -- pre-pr` composes the default gate with package-content verification. Use before larger local handoffs or PR-ready claims when lifecycle/platform/live dogfood cost is not warranted. | **Current for 0.32.0:** covered by the stronger passing release composition on 2026-07-16; orchestration remains locked by `test/project-verify.test.ts`. |
64
- | Real upstream contract | `npm run verify -- real-upstream` runs the localhost fixture matrix against the real installed `agent-browser` matching the baseline. | **Current for 0.32.2:** pass on 2026-07-18 (2/2 real-upstream tests), including snapshot-ref native select, stable-id/label tab switching, active-target refresh after `tab close`, and visible `read` content against the localhost contract fixture. |
65
- | Packaged Pi smoke | `npm run verify -- package-pi` validates package contents, loads the packaged `agent_browser` tool without requiring optional Brave config, and executes fake-upstream `--version`. | **Current for package 0.2.71 / Pi 0.80.10:** pass on 2026-07-18 (116 packed entries; exactly one packaged `agent_browser`; invocation passed). |
64
+ | Default local gate | `npm run verify` checks generated playbook drift, clean-builds generated `dist/`, runs `tsc --noEmit`, unit/fake tests, generated command-reference blocks, and live command-reference sampling. | **Current for 0.33.0:** pass on 2026-07-23 (590 passed, 2 opt-in skips; live command-reference verification passed). |
65
+ | Pre-PR local gate | `npm run verify -- pre-pr` composes the default gate with package-content verification. Use before larger local handoffs or PR-ready claims when lifecycle/platform/live dogfood cost is not warranted. | **Current for 0.33.0:** covered by the stronger passing release composition on 2026-07-23; orchestration remains locked by `test/project-verify.test.ts`. |
66
+ | Real upstream contract | `npm run verify -- real-upstream` runs the localhost fixture matrix against the real installed `agent-browser` matching the baseline. | **Current for 0.33.0:** pass on 2026-07-23 (2/2 real-upstream tests). |
67
+ | Packaged Pi smoke | `npm run verify -- package-pi` validates package contents, loads the packaged `agent_browser` tool without requiring optional Brave config, and executes fake-upstream `--version`. | **Current for package 0.2.72:** pass on 2026-07-23 inside `npm run verify -- release`. |
66
68
  | Startup profile | `npm run verify -- startup-profile --samples <n>` clean-builds generated `dist/`, records direct package entrypoint import/factory timing in fresh Node processes, and writes `.artifacts/startup-profile/latest.json`. It must not launch Pi, tmux, mise, npm, browsers, or `agent-browser`; full Pi TUI ready-prompt profiling is intentionally excluded after it proved too invasive for routine verification. Run this opt-in evidence when package layout, the compiled entrypoint, top-level imports, schema registration, or prompt/config startup logic changes. | **Current for compiled entrypoint:** pass on 2026-07-18 (`npm run verify -- startup-profile --samples 3`; median 49.1 ms, maximum 50.1 ms, below the 250 ms budget). Full-Pi startup numbers from the unsafe tmux profiler are not accepted as ongoing release evidence. |
67
- | Deterministic dogfood smoke | `npm run verify -- dogfood` (`scripts/verify-agent-browser-dogfood.ts`) drives the native wrapper against a local file fixture through top-level `qa`, `semanticAction`, constrained `job`, screenshot artifact verification, and session close with the real `agent-browser` on `PATH`. | **Current for 0.32.2:** pass on 2026-07-18; checkout-loaded Artificial Analysis/React/GitHub dogfood also passed snapshot-ref interactions, document scroll, and multi-tab close/reuse without background restarts or tab resets. |
69
+ | Deterministic dogfood smoke | `npm run verify -- dogfood` (`scripts/verify-agent-browser-dogfood.ts`) drives the native wrapper against a local file fixture through top-level `qa`, `semanticAction`, constrained `job`, screenshot artifact verification, and session close with the real `agent-browser` on `PATH`. | **Current for 0.33.0:** covered by Crabbox `browser-dogfood-smoke` on macOS/Ubuntu/Windows inside `npm run verify -- release` on 2026-07-23. |
68
70
  | WebGPU and restore autosave | Live 0.31.2 feature probes validate the new upstream paths independently from ordinary browser dogfood. | **macOS:** `doctor --webgpu` passed Apple Metal render/readback and headless red-pixel screenshot checks; the official Hello Triangle sample exposed the Metal adapter and produced a verified non-black screenshot. **Ubuntu image:** `doctor --webgpu --headed --json` passed SwiftShader render/readback and red-pixel screenshot checks with the baked Vulkan/Mesa/Xvfb dependencies. **Restore autosave:** an idle page timer changed localStorage and the namespaced restore file contained the new value before close; test state was removed. **Windows interactive desktop:** post-release validation on 2026-07-15 used a disposable clone of snapshot `57cc3c0d-7d7c-4a4c-9c57-8270d4174679`, a logged-in console session, `agent-browser 0.31.2`, and Edge 150. The headed doctor WebGPU render/readback subcheck passed in 0.99s and its decoded screenshot subcheck passed with `rgb(255,0,0)`; a separate `--webgpu --headed` launch opened the proof page and the Parallels console capture visibly recorded the red triangle (553,500 bright-red pixels; SHA-256 `f5a28f5336cbdfeb0ff557af9425458bddc6b266d3cc6b946de7b101a0b43288`). The full doctor remained nonzero only for the unrelated absence of a separately installed Chrome binary; the explicit Edge executable completed the launch and both WebGPU probes. Local evidence is under `.artifacts/windows-webgpu-interactive/20260715T150903Z/summary.json`; the disposable clone and temporary account were deleted afterward. |
69
71
  | Efficiency benchmark | `npm run verify -- benchmark` runs deterministic browser workflow accounting plus focused benchmark tests, including JSONL sampling fixtures and job/qa/sourceLookup/networkSourceLookup/Electron scenario coverage. | **Current:** pass on 2026-07-18 (`npm run verify -- benchmark`; 13/13 deterministic scenarios passed). |
70
- | Crabbox platform smoke | `npm run check:platform-smoke` syntax-checks the harness and cheap invariants. `npm run smoke:platform:ubuntu-image` builds the project-owned Linux image, `npm run smoke:platform:doctor` checks Crabbox 0.26.0+ and local target readiness, and `npm run smoke:platform:all` runs doctor first, then fast target-local `platform-build` (`npm run verify -- platform-target`, pack, clean Pi install) plus `browser-dogfood-smoke` on Crabbox `macos`, `ubuntu`, and `windows-native`; see [`platform-smoke.md`](platform-smoke.md). Target artifacts include Crabbox/provider/work-root metadata, and release review also checks provider-specific `crabbox list` commands for leftover leases/clones. | **Current for 0.32.2 / Pi 0.80.10:** pass on 2026-07-18 inside `npm run verify -- release`; evidence roots are `run-1784406200583-yaojql` (macOS), `run-1784406200585-fyulk0` (Ubuntu), and `run-1784406200586-w1nkt1` (native Windows). All platform-build, browser-dogfood, and lease-cleanup summaries passed; no release-owned leases/clones remained. |
71
- | `verify -- release` / `prepublishOnly` | `npm run verify -- release` chains the default gate with the configured-source lifecycle harness, packaged Pi smoke, and the release-blocking Crabbox platform matrix (`verifySteps` `release` in [`scripts/project.mjs`](https://github.com/fitchmultz/pi-agent-browser-native/blob/main/scripts/project.mjs)). `package.json` `prepublishOnly` runs that compose before `npm pack --dry-run` during `npm publish`. It intentionally omits standalone real-upstream, host-only dogfood, and benchmark modes—see [`RELEASE.md`](RELEASE.md#pre-release-checks). | **Current for 0.32.2 / package 0.2.71 / Pi 0.80.10:** pass on 2026-07-18, including 590 passing default tests, live command-reference sampling, lifecycle, packaged Pi smoke, and the required macOS/Ubuntu/native-Windows matrix. |
72
- | Configured-source lifecycle | `npm run verify -- lifecycle` (`scripts/verify-lifecycle.mjs`) drives `/reload`, closes and relaunches Pi with the same exact `--session-id`, checks the JSONL session header id, session continuity, slash-command sentinel tokens (`v1` before reload and `v2` after full relaunch because compiled JS package modules are process-cached), persisted spill reachability, and real Pi `tool_result` failure-patch semantics for a QA reclassification with a fake upstream on `PATH`. Default Pi model is `zai/glm-5.2`; default per-step wait is **180000 ms** (`DEFAULT_TIMEOUT_MS`); override model with `--model <id>` and waits with `--timeout-ms <ms>`. Passthrough flags in [`scripts/project.mjs`](https://github.com/fitchmultz/pi-agent-browser-native/blob/main/scripts/project.mjs): `--keep-artifacts`, `--model`, `--verbose`, and `--timeout-ms` plus a value (for example `npm run verify -- lifecycle --model openai-codex/gpt-5.5:minimal --keep-artifacts --verbose --timeout-ms 600000`). | **Current for 0.32.2 / Pi 0.80.10:** pass on 2026-07-18 inside `npm run verify -- release`; reload/relaunch continuity, persisted spill reachability, and failure-patch assertions passed. |
72
+ | Crabbox platform smoke | `npm run check:platform-smoke` syntax-checks the harness and cheap invariants. `npm run smoke:platform:ubuntu-image` builds the project-owned Linux image, `npm run smoke:platform:doctor` checks Crabbox 0.26.0+ and local target readiness, and `npm run smoke:platform:all` runs doctor first, then fast target-local `platform-build` (`npm run verify -- platform-target`, pack, clean Pi install) plus `browser-dogfood-smoke` on Crabbox `macos`, `ubuntu`, and `windows-native`; see [`platform-smoke.md`](platform-smoke.md). Target artifacts include Crabbox/provider/work-root metadata, and release review also checks provider-specific `crabbox list` commands for leftover leases/clones. | **Current for 0.33.0 / package 0.2.72:** pass on 2026-07-23 inside `npm run verify -- release`; evidence roots are `run-1784844609963-t3gs7f` (macOS), `run-1784844609966-jcdyhb` (Ubuntu), and `run-1784844609967-epvk68` (native Windows). Windows snapshot `crabbox-ready-ab-0.33.0`; Ubuntu image `node24-agent-browser0.33.0`. |
73
+ | `verify -- release` / `prepublishOnly` | `npm run verify -- release` chains the default gate with the configured-source lifecycle harness, packaged Pi smoke, and the release-blocking Crabbox platform matrix (`verifySteps` `release` in [`scripts/project.mjs`](https://github.com/fitchmultz/pi-agent-browser-native/blob/main/scripts/project.mjs)). `package.json` `prepublishOnly` runs that compose before `npm pack --dry-run` during `npm publish`. It intentionally omits standalone real-upstream, host-only dogfood, and benchmark modes—see [`RELEASE.md`](RELEASE.md#pre-release-checks). | **Current for 0.33.0 / package 0.2.72:** pass on 2026-07-23, including 590 passing default tests, live command-reference sampling, lifecycle, packaged Pi smoke, and the required macOS/Ubuntu/native-Windows matrix. |
74
+ | Configured-source lifecycle | `npm run verify -- lifecycle` (`scripts/verify-lifecycle.mjs`) drives `/reload`, closes and relaunches Pi with the same exact `--session-id`, checks the JSONL session header id, session continuity, slash-command sentinel tokens (`v1` before reload and `v2` after full relaunch because compiled JS package modules are process-cached), persisted spill reachability, and real Pi `tool_result` failure-patch semantics for a QA reclassification with a fake upstream on `PATH`. Default Pi model is `zai/glm-5.2`; default per-step wait is **180000 ms** (`DEFAULT_TIMEOUT_MS`); override model with `--model <id>` and waits with `--timeout-ms <ms>`. Passthrough flags in [`scripts/project.mjs`](https://github.com/fitchmultz/pi-agent-browser-native/blob/main/scripts/project.mjs): `--keep-artifacts`, `--model`, `--verbose`, and `--timeout-ms` plus a value (for example `npm run verify -- lifecycle --model openai-codex/gpt-5.5:minimal --keep-artifacts --verbose --timeout-ms 600000`). | **Current for 0.33.0:** pass on 2026-07-23 inside `npm run verify -- release`. |
73
75
  | Quick isolated Pi smoke | `pi --approve --no-extensions --no-skills -e . --tools agent_browser` from trusted repo root; native `agent_browser` only. | **Current for 0.32.2 / Pi 0.80.10:** pass on 2026-07-18 across isolated tmux runs using Artificial Analysis, React, GitHub, and a deterministic select/tab fixture. Snapshot-ref select/click, document scroll (0→700), stable-id/label tab switching, `tab close` target refresh, and post-close interaction passed with zero background restarts, `about:blank` resets, or spurious stale-ref failures; all disposable sessions/tmux/temp files were removed. |
74
76
 
75
77
  Runtime floor note: package metadata keeps Pi core package peer ranges wildcard per installed Pi package docs, but `pi-agent-browser-doctor` / `npm run doctor` treats `pi --version` below 0.80.6 as a setup failure. `npm run doctor` passed against Pi 0.80.6 on 2026-07-11. This keeps package dependency shape aligned with Pi package loading while still making unsupported host Pi versions a release and first-run blocker.
@@ -161,7 +161,7 @@ The extension always plans normal browser commands with `--json` prepended in `e
161
161
  - For batch chains that touch cookies, storage, auth, or other secret-bearing commands, use details.batchSteps for per-step artifacts, categories, spill paths, and full structured errors; top-level details.data on batch is only a compact redacted step matrix (success, argv-redacted command, redacted result or scrubbed error text) built from the same presentation rules as standalone calls.
162
162
  - For non-core families, pass current upstream commands through the native tool directly: network requests, network route <url>, network har start/stop [path], diff snapshot, diff screenshot --baseline <file>, diff url <u1> <u2>, trace start, trace stop [path], profiler start, profiler stop [path], record start <path>, record stop, console/errors [--clear], highlight <selector>, inspect, clipboard read, clipboard write <text>, clipboard copy/paste, stream enable/disable/status, dashboard start/stop, device list for iOS simulator inventory, and chat <message>. For compact network requests output, prefer details.nextActions for request detail, route-mock diagnostics, actionable failed-request networkSourceLookup, filtering, clearing the aggregate buffer before repro, or HAR capture follow-ups instead of guessing request-id syntax. Artifact-producing commands report details.artifacts and verification state; long-running starts such as stream, dashboard, trace/profiler, and record should be paired with the matching stop/disable command when the task is done; stream enable already-enabled outcomes are treated as idempotent success with status/disable follow-ups.
163
163
  - For Electron desktop apps, prefer top-level electron for wrapper-owned discovery, isolated launch, status, compact probe, and cleanup: list first, treat likely-sensitive annotations as hints rather than enforcement, launch with the default snapshot handoff unless handoff: "tabs" is the safer diagnostic starting point, use electron.probe or snapshot -i/qa.attached for current-session state, and always cleanup the returned launchId when done. electron.launch uses an isolated temporary profile; it does not reuse the app's normal signed-in profile or attach to an already-running authenticated app. For signed-in local app state, host-launch the normal app with --remote-debugging-port when appropriate, then use raw args connect <port|url>; after connect, inspect tab list, select the stable tab id such as tab t2, then run a condition wait or snapshot -i before using refs. close commands (`close`, `quit`, or `exit`) only close the browser/CDP session; leave manually launched app shutdown, profile cleanup, and explicit artifacts to the host owner.
164
- - For provider or specialized app workflows, load version-matched upstream guidance with skills get agentcore|electron|slack|dogfood|vercel-sandbox through the native tool; add --full when you need references/templates, and use skills get --all only for broad skill audits. Hosted sandbox workflows should use upstream @agent-browser/sandbox helpers outside this wrapper. Provider launches such as -p ios, --provider browserbase/kernel/browseruse/browserless/agentcore, and iOS --device are upstream-owned setup paths; use sessionMode fresh when switching providers and expect external credentials or local Appium/Xcode setup to be required.
164
+ - For provider or specialized app workflows, load version-matched upstream guidance with skills get agentcore|electron|slack|dogfood|vercel-sandbox|derive-client through the native tool; add --full when you need references/templates, and use skills get --all only for broad skill audits. Use derive-client when recording HAR traffic to generate a standalone API client; prefer network har start (text bodies by default) or network har start --content all|none before multi-step capture. For accessibility audits use a11y or a11y --tags wcag2a,wcag2aa (CDP browsers only). Hosted sandbox workflows should use upstream @agent-browser/sandbox helpers outside this wrapper. Provider launches such as -p ios, --provider browserbase/kernel/browseruse/browserless/agentcore, and iOS --device are upstream-owned setup paths; use sessionMode fresh when switching providers and expect external credentials or local Appium/Xcode setup to be required.
165
165
  - For dialogs and frames, use dialog status/accept/dismiss and frame <selector|main> through native args; dialog commands and eval snippets that look like alert/confirm/prompt/dialog triggers are shorter-bounded than normal browser calls, and timed-out dialog-like interactions may add inspect-dialog-after-timeout, dismiss-dialog-after-timeout, or recover-fresh-session-after-dialog-timeout nextActions. When --confirm-actions produces a pending confirmation, use details.nextActions or exact confirm <id> / deny <id> calls instead of inventing ids.
166
166
  - If a session lands on the wrong page or tab, an interaction changes origin unexpectedly, or an open call returns blocked, blank, or otherwise unexpected results, use tab list / tab <tab-id-or-label> / snapshot -i to recover state before retrying different URLs or fallback strategies. For headed demos, put --headed on the first launch with sessionMode=fresh and verify with screenshot/tab/get-url evidence because tool success cannot prove the OS window is visible to the user. For desktop readiness, prefer real conditions first: wait --text, wait --url, wait --fn, wait --load <state>, wait --download, or qa.attached; for disappearance checks, use wait --fn predicates instead of stale upstream-help examples like wait <selector> --state hidden. Use electron.probe/status for wrapper-owned launch health or target mismatch. Fixed waits are a last resort: use explicit --timeout or top-level timeoutMs for legitimately slow waits, and treat a successful payload like "waited":"timeout" as elapsed time only—verify completion with an observed condition, fresh snapshot, or screenshot.
167
167
  - For feed, timeline, or inbox reading tasks, focus on the main timeline/list region and read the first item there rather than unrelated composer or sidebar content.
@@ -227,7 +227,7 @@ Examples:
227
227
  - supported actions: `click`, `fill`, `check`, `select`
228
228
  - supported locators for `click` / `fill` / `check`: `role`, `text`, `label`, `placeholder`, `alt`, `title`, `testid`
229
229
  - optional `selector` is accepted for direct `click`, `check`, and `fill` targets (including current `@refs`); do not combine it with `locator`, `value`, `role`, or `name`. For `fill`, `text` is still required.
230
- - `semanticAction` does not expose `uncheck` while upstream `find ... uncheck` is not runtime-supported; use raw `args: ["uncheck", <selector-or-ref>]` after a stable selector or current snapshot ref
230
+ - `semanticAction` does not expose `uncheck` because upstream `find` actions are only `click, fill, check, hover, text`; use raw `args: ["uncheck", <selector-or-ref>]` after a stable selector or current snapshot ref
231
231
  - for locator actions, `value` is the locator argument (for example ARIA role token `"button"`, label text, or visible substring), must be a non-empty string after trim; for `locator: "role"`, callers may provide `role` instead of redundant `value`
232
232
  - `fill` requires non-empty `text` (compiled as the trailing value argument to `find`)
233
233
  - `select` requires non-empty `selector` plus either `value` (single option value) or `values` (non-empty array of option values). `select` does not accept `locator`, `role`, `name`, or `text`; upstream `find` does not expose a verified `select` action, so role/name/label dropdown targeting must first be resolved to a stable selector or current `@ref`.
@@ -780,7 +780,7 @@ Implementation and precedence:
780
780
  - Shared machine-readable types are centralized in `extensions/agent-browser/lib/results/contracts.ts` (including re-exports such as `AgentBrowserNextAction` from `next-actions.ts`). Classifiers live in `categories.ts` (`classifyAgentBrowserSuccessCategory`, `classifyAgentBrowserFailureCategory`, `buildAgentBrowserResultCategoryDetails`—the last prefers an explicit `failureCategory` when the caller already knows the bucket, otherwise it runs the classifier). Generic follow-up assembly lives in `action-recommendations.ts` (`buildAgentBrowserNextActions`). Tab/session recovery ids live in `recovery-actions.ts` (`AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS`, `AGENT_BROWSER_RICH_INPUT_RECOVERY_NEXT_ACTION_IDS`, `getAgentBrowserRichInputRecoveryNextActionId`, `getAgentBrowserRichInputRecoveryNextActionIds`, `buildRecoveryNextActions`) and session-aware wrappers live in `recovery-next-actions.ts`. Selector miss and rich-input diagnostic shapes/actions live in `selector-recovery.ts`. Failed upstream `network requests` rows flow through `classifyNetworkRequestFailure` / `summarizeNetworkFailures` in `network.ts` for QA analysis (`analyzeQaPresetResults` in `extensions/agent-browser/index.ts`) and for actionable-vs-benign lines plus request-specific nextActions in `network requests` presentation (`extensions/agent-browser/lib/results/presentation/diagnostics.ts`).
781
781
  - Artifact verification: `ArtifactVerificationSummary` / `ArtifactVerificationEntry` types live in `contracts.ts`. `buildArtifactVerificationSummary`, `getArtifactVerificationEntry`, and `getManifestVerificationEntry` in `presentation/artifacts.ts` merge each resolved file artifact with manifest rows whose `storageScope` is not `explicit-path` (those rows duplicate file artifacts) and whose `path` is in the current result’s spill path set. Presentation then fails closed with `failureCategory: "artifact-missing"` when any resolved non-pending file artifact has `exists: false`; pending recording-start artifacts and non-explicit spill rows do not trigger this failure. If no hard-missing file artifact exists, successful presentation merges run `classifyPresentationSuccessCategory`, which can still force `successCategory: "artifact-unverified"` for unverified counts before delegating to `classifyAgentBrowserSuccessCategory`.
782
782
  - Inner success categories (`classifyAgentBrowserSuccessCategory` in `categories.ts`, after verification counts are clear): if `inspection` is true → `"inspection"`; else if any non-pending artifact lacks confirmed on-disk presence (`exists !== true`) and was not upgraded to an `artifact-missing` failure → `"artifact-unverified"`; else if there is a `savedFile` or any `artifacts` → `"artifact-saved"`; else → `"completed"`.
783
- - Failure: the classifier walks a single ordered chain (first match wins): `confirmation-required` → `timeout` → `missing-binary` → `parse-failure` → `aborted` → `policy-blocked` → `cleanup-failed` → `tab-drift` → `stale-ref` (including “unknown ref” text and a narrow `@eN` plus “element not found” heuristic) → `selector-unsupported` → `selector-not-found` → `download-not-verified` (download / wait-download style failures) → `validation-error` when a wrapper `validationError` is present default `upstream-error`. Wrapper-known missing artifact checks pass an explicit `artifact-missing` category rather than relying on this text classifier.
783
+ - Failure: the classifier walks a single ordered chain (first match wins): explicit `options.confirmationRequired` → upstream locator-detail misses (`selector-not-found`, including 0.32.4+ `Names seen:` / `No element found: getByRole(...)` / `Element not found: … Verify the selector, role, or name`) → text-derived `confirmation-required` → `timeout` → `missing-binary` → `parse-failure` → `aborted` → `policy-blocked` → `cleanup-failed` → explicit `options.validationError` → `tab-drift` → `stale-ref` (including “unknown ref” text and a narrow `@eN` plus “element not found” heuristic) → `selector-unsupported` → other `selector-not-found` shapes → `download-not-verified` (download / wait-download style failures) → default `upstream-error`. Locator-detail misses are classified before text-derived confirmation/timeout so an accessible name containing those phrases cannot suppress selector recovery. Wrapper-known missing artifact checks pass an explicit `artifact-missing` category rather than relying on this text classifier.
784
784
  - The main tool implementation merges these fields into Pi-facing `details` from `extensions/agent-browser/index.ts` and from `extensions/agent-browser/lib/results/presentation.ts` for presentation-time failures.
785
785
 
786
786
  Additional structured fields can appear when relevant:
@@ -62,7 +62,7 @@ PLATFORM_SMOKE_MAC_PORT=22
62
62
  PLATFORM_SMOKE_UBUNTU_IMAGE="pi-agent-browser-native-platform:node24-agent-browser<baseline-version>"
63
63
 
64
64
  PLATFORM_SMOKE_WINDOWS_VM="pi-extension-windows-template"
65
- PLATFORM_SMOKE_WINDOWS_SNAPSHOT="crabbox-ready"
65
+ PLATFORM_SMOKE_WINDOWS_SNAPSHOT="crabbox-ready-ab-0.33.0"
66
66
  PLATFORM_SMOKE_WINDOWS_USER="<windows-ssh-user>"
67
67
  PLATFORM_SMOKE_WINDOWS_WORK_ROOT="C:\\crabbox\\pi-agent-browser-native"
68
68
 
@@ -80,11 +80,11 @@ Crabbox does not install project runtime tools. The macOS host, Ubuntu image, an
80
80
 
81
81
  - Node/npm at or above the configured Node major baseline in [`platform-smoke.config.mjs`](../platform-smoke.config.mjs).
82
82
  - Git and `tar`.
83
- - Upstream `agent-browser` matching this wrapper’s capability baseline. The Ubuntu target gets it from [`scripts/platform-smoke/linux-image/Dockerfile`](../scripts/platform-smoke/linux-image/Dockerfile); the Windows template gets it from the shared `pi-extension-windows-template` / `crabbox-ready` snapshot.
83
+ - Upstream `agent-browser` matching this wrapper’s capability baseline. The Ubuntu target gets it from [`scripts/platform-smoke/linux-image/Dockerfile`](../scripts/platform-smoke/linux-image/Dockerfile); the Windows template gets it from the shared `pi-extension-windows-template` snapshot named in [`platform-smoke.config.mjs`](../platform-smoke.config.mjs) (currently `crabbox-ready-ab-0.33.0`, a child of the shared `crabbox-ready` base used by other projects' linked clones).
84
84
  - Browser/runtime dependencies needed by upstream `agent-browser`.
85
85
  - Native PowerShell and OpenSSH Server on Windows.
86
86
 
87
- For Windows, reuse `pi-extension-windows-template` with the shared canonical `crabbox-ready` power-off snapshot configured in [`platform-smoke.config.mjs`](../platform-smoke.config.mjs). Do not create one-off project VMs or run tests directly on the source VM. If a reusable tool is missing, update the shared template, verify from a fresh SSH session, remove caches/secrets/checkouts, shut down cleanly, and promote a known-good power-off snapshot.
87
+ For Windows, reuse `pi-extension-windows-template` with the power-off snapshot configured in [`platform-smoke.config.mjs`](../platform-smoke.config.mjs). Do not create one-off project VMs or run tests directly on the source VM. If a reusable tool is missing, update the shared template from the current base snapshot, verify from a fresh SSH session, remove caches/secrets/checkouts, shut down cleanly, and promote a known-good power-off snapshot (a child snapshot is fine when other projects still hold linked clones of an older base).
88
88
 
89
89
  ## What the suites prove
90
90
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-agent-browser-native",
3
- "version": "0.2.71",
3
+ "version": "0.2.72",
4
4
  "description": "pi extension that exposes agent-browser as a native tool for browser automation",
5
5
  "type": "module",
6
6
  "author": "Mitch Fultz (https://github.com/fitchmultz)",
@@ -22,7 +22,9 @@ export default {
22
22
  ubuntuContainerImage: PLATFORM_SMOKE_UBUNTU_IMAGE,
23
23
  windowsParallels: {
24
24
  sourceVm: "pi-extension-windows-template",
25
- snapshot: "crabbox-ready",
25
+ // Shared template snapshot with agent-browser 0.33.0 (+ Chrome 151 for the SSH user).
26
+ // Parent crabbox-ready remains for other projects' linked clones.
27
+ snapshot: "crabbox-ready-ab-0.33.0",
26
28
  },
27
29
  nodeValidationMajor: 22,
28
30
  agentBrowserVersion: PLATFORM_SMOKE_AGENT_BROWSER_VERSION,
@@ -14,14 +14,18 @@ export const COMMAND_REFERENCE_BASELINE_BLOCK_IDS = Object.freeze(["upstream-bas
14
14
 
15
15
  const sourceEvidence = Object.freeze({
16
16
  repository: "vercel-labs/agent-browser",
17
- upstreamHead: "6ede7a9470ac4b681cabf838af8668b9aa99e957",
18
- upstreamPackageVersion: "0.32.2",
17
+ upstreamHead: "1ed371f3af472cc0d6cd8fdaea75d1a085ff7534",
18
+ upstreamPackageVersion: "0.33.0",
19
19
  inspectedSources: Object.freeze([
20
20
  "agent-browser --version",
21
21
  "agent-browser --help",
22
22
  "selected agent-browser <command> --help output",
23
+ "agent-browser a11y --help",
23
24
  "agent-browser mcp --help",
24
25
  "agent-browser plugin --help",
26
+ "agent-browser skills list",
27
+ "agent-browser skills get core --full",
28
+ "agent-browser skills get derive-client --full",
25
29
  "README.md",
26
30
  "CHANGELOG.md",
27
31
  "agent-browser.schema.json",
@@ -30,8 +34,17 @@ const sourceEvidence = Object.freeze({
30
34
  "cli/src/read.rs",
31
35
  "cli/src/doctor/webgpu.rs",
32
36
  "cli/src/native/actions.rs",
37
+ "cli/src/native/a11y/mod.rs",
38
+ "cli/src/native/browser.rs",
33
39
  "cli/src/native/daemon.rs",
40
+ "cli/src/output.rs",
34
41
  "docs/src/app/webgpu/page.mdx",
42
+ "docs/src/app/network/page.mdx",
43
+ "docs/src/app/selectors/page.mdx",
44
+ "docs/src/app/skills/page.mdx",
45
+ "docs/src/app/commands/page.mdx",
46
+ "skill-data/derive-client/SKILL.md",
47
+ "skill-data/core/SKILL.md",
35
48
  "packages/@agent-browser/eve/README.md",
36
49
  "packages/@agent-browser/eve/package.json",
37
50
  "packages/@agent-browser/eve/test/extension.test.mjs",
@@ -100,6 +113,7 @@ const helpCommands = Object.freeze([
100
113
  helpCommand("record help", ["record", "--help"]),
101
114
  helpCommand("console help", ["console", "--help"]),
102
115
  helpCommand("errors help", ["errors", "--help"]),
116
+ helpCommand("a11y help", ["a11y", "--help"]),
103
117
  helpCommand("clipboard help", ["clipboard", "--help"]),
104
118
  helpCommand("tap help", ["tap", "--help"]),
105
119
  helpCommand("swipe help", ["swipe", "--help"]),
@@ -127,6 +141,7 @@ const inventorySections = Object.freeze([
127
141
  "skills get dogfood",
128
142
  "skills get vercel-sandbox",
129
143
  "skills get agentcore",
144
+ "skills get derive-client",
130
145
  "@agent-browser/sandbox",
131
146
  "installSystemDependencies: false",
132
147
  "skills path [name]",
@@ -143,11 +158,14 @@ const inventorySections = Object.freeze([
143
158
  ["skills list", "dogfood"],
144
159
  ["skills list", "vercel-sandbox"],
145
160
  ["skills list", "agentcore"],
161
+ ["skills list", "derive-client"],
146
162
  ["vercel sandbox skill full", "@agent-browser/sandbox"],
147
163
  ["vercel sandbox skill full", "installSystemDependencies: false"],
148
164
  ["core skill full", "agent-browser frame @e3"],
149
165
  ["core skill full", "agent-browser dialog accept"],
150
166
  ["core skill full", "agent-browser --session \"$SESSION\" --restore open https://app.example.com"],
167
+ ["core skill full", "network har start --content all"],
168
+ ["core skill full", "implicit roles work"],
151
169
  ],
152
170
  ),
153
171
  section(
@@ -229,6 +247,7 @@ const inventorySections = Object.freeze([
229
247
  "find last <sel>",
230
248
  "find nth <n> <sel>",
231
249
  "find role <role> --name <name>",
250
+ "find role heading text --name",
232
251
  "find ... --exact",
233
252
  "mouse <action> [args]",
234
253
  "set <setting> [value]",
@@ -308,6 +327,8 @@ const inventorySections = Object.freeze([
308
327
  ["find help", "nth <index> <selector>"],
309
328
  ["find help", "--name <name>"],
310
329
  ["find help", "--exact"],
330
+ ["find help", "case-insensitive"],
331
+ ["find help", "click, fill, check, hover, text"],
311
332
  root("Mouse: agent-browser mouse <action> [args]"),
312
333
  root("Browser Settings: agent-browser set <setting> [value]"),
313
334
  ["set help", "media [dark|light]"],
@@ -383,6 +404,9 @@ const inventorySections = Object.freeze([
383
404
  "network requests [--clear] [--filter <pattern>] [--type <csv>] [--method <method>] [--status <code|range>]",
384
405
  "network request <requestId>",
385
406
  "network har start",
407
+ "network har start --content all",
408
+ "network har start --content none",
409
+ "network har start --content text",
386
410
  "network har stop [path]",
387
411
  "cookies [get|set|clear]",
388
412
  "cookies set <name> <value> --url <url> --domain <domain> --path <path> --httpOnly --secure --sameSite <Strict|Lax|None> --expires <timestamp>",
@@ -419,6 +443,9 @@ const inventorySections = Object.freeze([
419
443
  "react suspense [--only-dynamic] [--json]",
420
444
  "vitals [url] [--json]",
421
445
  "web-vitals [url] [--json]",
446
+ "a11y [url]",
447
+ "a11y --tags wcag2a,wcag2aa",
448
+ "a11y --selector \"#main\"",
422
449
  "removeinitscript <id>",
423
450
  ],
424
451
  [
@@ -426,6 +453,8 @@ const inventorySections = Object.freeze([
426
453
  root("--resource-type <csv>"),
427
454
  ["network help", "unroute [url]"],
428
455
  ["network help", "network har start"],
456
+ ["network help", "network har start --content all"],
457
+ ["network help", "--content <mode>"],
429
458
  ["network help", "network har stop ./capture.har"],
430
459
  root("cookies [get|set|clear]"),
431
460
  root("cookies set --curl <file>"),
@@ -455,6 +484,11 @@ const inventorySections = Object.freeze([
455
484
  root("react renders stop [--json]"),
456
485
  root("react suspense [--only-dynamic] [--json]"),
457
486
  root("vitals [url] [--json]"),
487
+ root("a11y [url] [--tags <t1,t2>] [--selector <css>] [--json]"),
488
+ ["a11y help", "a11y [url]"],
489
+ ["a11y help", "--tags <tag1,tag2>"],
490
+ ["a11y help", "-s, --selector <css>"],
491
+ ["core skill full", "agent-browser a11y"],
458
492
  root("removeinitscript <id>"),
459
493
  ["network help", "requests [options]"],
460
494
  ["network help", "--type <types>"],
@@ -810,7 +844,7 @@ const inventorySections = Object.freeze([
810
844
  ]);
811
845
 
812
846
  export const CAPABILITY_BASELINE = Object.freeze({
813
- targetVersion: "0.32.2",
847
+ targetVersion: "0.33.0",
814
848
  sourceEvidence,
815
849
  helpCommands,
816
850
  inventorySections,