pi-agent-browser-native 0.5.0 → 0.6.6

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/README.md +75 -42
  3. package/dist/extensions/agent-browser/index.js +13 -83
  4. package/dist/extensions/agent-browser/lib/argv-grammar.js +8 -2
  5. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +1 -1
  6. package/dist/extensions/agent-browser/lib/command-policy.js +4 -7
  7. package/dist/extensions/agent-browser/lib/command-taxonomy.js +19 -11
  8. package/dist/extensions/agent-browser/lib/config-policy.js +25 -1
  9. package/dist/extensions/agent-browser/lib/config.js +1 -1
  10. package/dist/extensions/agent-browser/lib/input-modes/job.js +0 -9
  11. package/dist/extensions/agent-browser/lib/input-modes/params.js +1 -1
  12. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +18 -4
  13. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +3 -138
  14. package/dist/extensions/agent-browser/lib/managed-session-restore.js +1 -81
  15. package/dist/extensions/agent-browser/lib/managed-session-storage.js +4 -1
  16. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +31 -26
  17. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +60 -8
  18. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +1 -4
  19. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +119 -2
  20. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +7 -6
  21. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +31 -40
  22. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +76 -70
  23. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +6 -8
  24. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +5 -10
  25. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +41 -21
  26. package/dist/extensions/agent-browser/lib/page-target-validation.js +270 -0
  27. package/dist/extensions/agent-browser/lib/playbook.js +13 -12
  28. package/dist/extensions/agent-browser/lib/process-identity.js +11 -10
  29. package/dist/extensions/agent-browser/lib/process.js +18 -82
  30. package/dist/extensions/agent-browser/lib/recording-reservations.js +11 -78
  31. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +1 -1
  32. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +27 -14
  33. package/dist/extensions/agent-browser/lib/results/presentation/common.js +20 -2
  34. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +11 -16
  35. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +12 -9
  36. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +2 -2
  37. package/dist/extensions/agent-browser/lib/results/presentation.js +31 -4
  38. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +1 -1
  39. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +9 -0
  40. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +3 -3
  41. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +2 -1
  42. package/dist/extensions/agent-browser/lib/results/snapshot.js +4 -4
  43. package/dist/extensions/agent-browser/lib/runtime.js +73 -72
  44. package/dist/extensions/agent-browser/lib/session-page-state.js +12 -3
  45. package/dist/extensions/agent-browser/lib/temp.js +1 -2
  46. package/dist/extensions/agent-browser/lib/upstream-version.js +5 -5
  47. package/dist/extensions/agent-browser/lib/web-search.js +108 -24
  48. package/dist/scripts/agent-browser-target.mjs +19 -1
  49. package/docs/ARCHITECTURE.md +24 -20
  50. package/docs/COMMAND_REFERENCE.md +181 -49
  51. package/docs/ELECTRON.md +2 -2
  52. package/docs/RELEASE.md +10 -8
  53. package/docs/REQUIREMENTS.md +8 -7
  54. package/docs/SUPPORT_MATRIX.md +31 -26
  55. package/docs/TOOL_CONTRACT.md +89 -56
  56. package/package.json +1 -1
  57. package/scripts/agent-browser-capability-baseline.mjs +65 -5
  58. package/scripts/agent-browser-target.mjs +19 -1
  59. package/scripts/config.mjs +1 -0
  60. package/scripts/doctor.mjs +15 -9
  61. package/dist/extensions/agent-browser/lib/managed-session-capabilities.js +0 -20
  62. package/dist/extensions/agent-browser/lib/managed-session-state-policy.js +0 -601
  63. package/dist/extensions/agent-browser/lib/navigation-policy.js +0 -78
  64. package/dist/extensions/agent-browser/lib/results/presentation/managed-list-filter.js +0 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-agent-browser-native",
3
- "version": "0.5.0",
3
+ "version": "0.6.6",
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)",
@@ -3,7 +3,7 @@
3
3
  * Responsibilities: Combine the canonical target from agent-browser-target.mjs with sampled help commands and verifier/doc token expectations.
4
4
  * Scope: Versioned capability metadata only; it does not execute agent-browser or validate documentation by itself.
5
5
  * Usage: Imported by command-reference verifier, generated docs checker, and tests when upstream agent-browser is re-baselined; runtime imports only agent-browser-target.mjs.
6
- * Invariants/Assumptions: This package targets the current installed upstream agent-browser only and does not keep compatibility shims for older versions.
6
+ * Invariants/Assumptions: This package documents the current recommended upstream release, accepts stable runtimes at or above the configured floor, and does not add version-specific compatibility shims.
7
7
  * Related: `docs/SUPPORT_MATRIX.md` maps `CAPABILITY_BASELINE.inventorySections` to human docs, runtime behavior, tests, and verification gates; refresh that matrix whenever this baseline changes.
8
8
  */
9
9
 
@@ -16,8 +16,8 @@ export const COMMAND_REFERENCE_BASELINE_BLOCK_IDS = Object.freeze(["upstream-bas
16
16
 
17
17
  const sourceEvidence = Object.freeze({
18
18
  repository: "vercel-labs/agent-browser",
19
- upstreamHead: "548b159b30eef119ccf6846c8bc807d0eaa3f6f8",
20
- upstreamPackageVersion: "0.34.0",
19
+ upstreamHead: "eb05921bad874cd2a1b4fa5d1149f1ed26576cae",
20
+ upstreamPackageVersion: "0.36.0",
21
21
  inspectedSources: Object.freeze([
22
22
  "agent-browser --version",
23
23
  "agent-browser --help",
@@ -28,10 +28,14 @@ const sourceEvidence = Object.freeze({
28
28
  "agent-browser skills list",
29
29
  "agent-browser skills get core --full",
30
30
  "agent-browser skills get derive-client --full",
31
+ "agent-browser skills get webmcp-gen --full",
31
32
  "README.md",
32
33
  "CHANGELOG.md",
33
34
  "agent-browser.schema.json",
35
+ "bin/agent-browser.js",
36
+ "cli/src/ca_bundle.rs",
34
37
  "cli/src/commands.rs",
38
+ "cli/src/mcp.rs",
35
39
  "cli/src/flags.rs",
36
40
  "cli/src/read.rs",
37
41
  "cli/src/doctor/webgpu.rs",
@@ -40,14 +44,25 @@ const sourceEvidence = Object.freeze({
40
44
  "cli/src/native/browser.rs",
41
45
  "cli/src/native/tab_binding.rs",
42
46
  "cli/src/native/daemon.rs",
47
+ "cli/src/native/element.rs",
48
+ "cli/src/native/stream/cdp_loop.rs",
49
+ "cli/src/native/stream/dashboard.rs",
50
+ "cli/src/native/test_fixtures/webmcp_frame_probe.html",
51
+ "cli/src/native/test_fixtures/webmcp_probe.html",
52
+ "cli/src/native/webmcp.rs",
43
53
  "cli/src/output.rs",
44
54
  "docs/src/app/webgpu/page.mdx",
55
+ "docs/src/app/webmcp/page.mdx",
45
56
  "docs/src/app/network/page.mdx",
57
+ "docs/src/app/proxy/page.mdx",
46
58
  "docs/src/app/selectors/page.mdx",
47
59
  "docs/src/app/skills/page.mdx",
48
60
  "docs/src/app/commands/page.mdx",
49
61
  "skill-data/derive-client/SKILL.md",
50
62
  "skill-data/core/SKILL.md",
63
+ "skill-data/protected-vercel-deployments/SKILL.md",
64
+ "skill-data/webmcp-gen/SKILL.md",
65
+ "test/launcher.test.mjs",
51
66
  "packages/@agent-browser/eve/README.md",
52
67
  "packages/@agent-browser/eve/package.json",
53
68
  "packages/@agent-browser/eve/test/extension.test.mjs",
@@ -75,6 +90,8 @@ const helpCommands = Object.freeze([
75
90
  helpCommand("skills list", ["skills", "list"]),
76
91
  helpCommand("core skill full", ["skills", "get", "core", "--full"]),
77
92
  helpCommand("vercel sandbox skill full", ["skills", "get", "vercel-sandbox", "--full"]),
93
+ helpCommand("protected Vercel deployments skill full", ["skills", "get", "protected-vercel-deployments", "--full"]),
94
+ helpCommand("WebMCP generation skill full", ["skills", "get", "webmcp-gen", "--full"]),
78
95
  helpCommand("open help", ["open", "--help"]),
79
96
  helpCommand("read help", ["read", "--help"]),
80
97
  helpCommand("click help", ["click", "--help"]),
@@ -143,8 +160,11 @@ const inventorySections = Object.freeze([
143
160
  "skills get slack",
144
161
  "skills get dogfood",
145
162
  "skills get vercel-sandbox",
163
+ "skills get protected-vercel-deployments",
146
164
  "skills get agentcore",
147
165
  "skills get derive-client",
166
+ "skills get webmcp-gen",
167
+ "webmcp.init.js",
148
168
  "@agent-browser/sandbox",
149
169
  "installSystemDependencies: false",
150
170
  "skills path [name]",
@@ -160,10 +180,16 @@ const inventorySections = Object.freeze([
160
180
  ["skills list", "slack"],
161
181
  ["skills list", "dogfood"],
162
182
  ["skills list", "vercel-sandbox"],
183
+ ["skills list", "protected-vercel-deployments"],
163
184
  ["skills list", "agentcore"],
164
185
  ["skills list", "derive-client"],
186
+ ["skills list", "webmcp-gen"],
187
+ ["WebMCP generation skill full", "webmcp.init.js"],
188
+ ["WebMCP generation skill full", "agent-browser webmcp invoke <tool> --params @fixture.json"],
165
189
  ["vercel sandbox skill full", "@agent-browser/sandbox"],
166
190
  ["vercel sandbox skill full", "installSystemDependencies: false"],
191
+ ["protected Vercel deployments skill full", "x-vercel-trusted-oidc-idp-token"],
192
+ ["protected Vercel deployments skill full", "vc project token"],
167
193
  ["core skill full", "agent-browser frame @e3"],
168
194
  ["core skill full", "agent-browser dialog accept"],
169
195
  ["core skill full", "agent-browser --session \"$SESSION\" --restore open https://app.example.com"],
@@ -424,6 +450,14 @@ const inventorySections = Object.freeze([
424
450
  "cookies set <name> <value> --url <url> --domain <domain> --path <path> --httpOnly --secure --sameSite <Strict|Lax|None> --expires <timestamp>",
425
451
  "cookies set --curl <file>",
426
452
  "storage <local|session>",
453
+ "webmcp list",
454
+ "webmcp invoke <tool>",
455
+ "webmcp invoke <tool> --params <json|@file>",
456
+ "webmcp invoke <tool> --frame <frame-id>",
457
+ "webmcp invoke <tool> --detach",
458
+ "webmcp invoke <tool> --timeout <ms>",
459
+ "webmcp result <id>",
460
+ "webmcp cancel <id>",
427
461
  "diff snapshot",
428
462
  "diff snapshot --baseline <file> --selector <sel> --compact --depth <n>",
429
463
  "diff screenshot --baseline",
@@ -471,6 +505,13 @@ const inventorySections = Object.freeze([
471
505
  root("cookies [get|set|clear]"),
472
506
  root("cookies set --curl <file>"),
473
507
  root("storage <local|session>"),
508
+ root("webmcp list"),
509
+ root("webmcp invoke <tool>"),
510
+ root("--params <json|@file>"),
511
+ root("--frame <frame-id>"),
512
+ root("--detach"),
513
+ root("webmcp result <id>"),
514
+ root("webmcp cancel <id>"),
474
515
  root("diff snapshot"),
475
516
  root("diff screenshot --baseline"),
476
517
  root("trace start"),
@@ -542,6 +583,8 @@ const inventorySections = Object.freeze([
542
583
  "chat <message>",
543
584
  "dashboard [start]",
544
585
  "dashboard start --port <n>",
586
+ "dashboard start --allowed-origins <origins>",
587
+ "AGENT_BROWSER_DASHBOARD_ALLOWED_ORIGINS",
545
588
  "dashboard stop",
546
589
  "device list",
547
590
  "install",
@@ -554,6 +597,7 @@ const inventorySections = Object.freeze([
554
597
  "doctor --webgpu --headed",
555
598
  "doctor --json",
556
599
  "mcp",
600
+ "mcp --tools core,webmcp",
557
601
  "plugin add <ref>",
558
602
  "plugin [list]",
559
603
  "plugin show <name>",
@@ -569,6 +613,9 @@ const inventorySections = Object.freeze([
569
613
  root("deny <id>"),
570
614
  root("chat <message>"),
571
615
  root("dashboard start --port <n>"),
616
+ root("dashboard start --allowed-origins <origins>"),
617
+ ["dashboard help", "--allowed-origins <origins>"],
618
+ ["dashboard help", "AGENT_BROWSER_DASHBOARD_ALLOWED_ORIGINS"],
572
619
  ["device help", "device list"],
573
620
  root("install --with-deps"),
574
621
  ["install help", "fails if deps fail"],
@@ -653,6 +700,10 @@ const inventorySections = Object.freeze([
653
700
  "NO_PROXY",
654
701
  "--ignore-https-errors",
655
702
  "AGENT_BROWSER_IGNORE_HTTPS_ERRORS",
703
+ "--ca-cert <path>",
704
+ "--no-ca-cert",
705
+ "AGENT_BROWSER_CA_CERT",
706
+ "AGENT_BROWSER_CLEAR_CA_CERT",
656
707
  "--allow-file-access",
657
708
  "AGENT_BROWSER_ALLOW_FILE_ACCESS",
658
709
  "--hide-scrollbars <bool>",
@@ -660,9 +711,12 @@ const inventorySections = Object.freeze([
660
711
  "AGENT_BROWSER_HEADED",
661
712
  "--webgpu",
662
713
  "AGENT_BROWSER_WEBGPU",
714
+ "--no-webmcp",
715
+ "AGENT_BROWSER_NO_WEBMCP",
716
+ "noWebmcp",
663
717
  "AGENT_BROWSER_NO_XVFB",
664
718
  "\"webgpu\": true",
665
- "--cdp <port>",
719
+ "--cdp <port|url>",
666
720
  "--color-scheme <scheme>",
667
721
  "AGENT_BROWSER_COLOR_SCHEME",
668
722
  "--download-path <path>",
@@ -799,6 +853,10 @@ const inventorySections = Object.freeze([
799
853
  root("NO_PROXY"),
800
854
  root("--ignore-https-errors"),
801
855
  root("AGENT_BROWSER_IGNORE_HTTPS_ERRORS"),
856
+ root("--ca-cert <path>"),
857
+ root("--no-ca-cert"),
858
+ root("AGENT_BROWSER_CA_CERT"),
859
+ root("AGENT_BROWSER_CLEAR_CA_CERT"),
802
860
  root("--allow-file-access"),
803
861
  root("AGENT_BROWSER_ALLOW_FILE_ACCESS"),
804
862
  root("--hide-scrollbars <bool>"),
@@ -806,7 +864,9 @@ const inventorySections = Object.freeze([
806
864
  root("AGENT_BROWSER_HEADED"),
807
865
  root("--webgpu"),
808
866
  root("AGENT_BROWSER_WEBGPU"),
809
- root("--cdp <port>"),
867
+ root("--no-webmcp"),
868
+ root("AGENT_BROWSER_NO_WEBMCP"),
869
+ root("--cdp <port|url>"),
810
870
  root("--color-scheme <scheme>"),
811
871
  root("AGENT_BROWSER_COLOR_SCHEME"),
812
872
  root("--download-path <path>"),
@@ -1,3 +1,21 @@
1
1
  export const TARGET_AGENT_BROWSER_SOURCE = "scripts/agent-browser-target.mjs";
2
- export const TARGET_AGENT_BROWSER_VERSION = "0.34.0";
2
+ export const TARGET_AGENT_BROWSER_VERSION = "0.36.0";
3
3
  export const TARGET_AGENT_BROWSER_VERSION_LABEL = `agent-browser ${TARGET_AGENT_BROWSER_VERSION}`;
4
+ export const MINIMUM_AGENT_BROWSER_VERSION = "0.35.0";
5
+ export const MINIMUM_AGENT_BROWSER_VERSION_LABEL = `agent-browser ${MINIMUM_AGENT_BROWSER_VERSION}`;
6
+ export const SUPPORTED_AGENT_BROWSER_VERSION_LABEL = `${MINIMUM_AGENT_BROWSER_VERSION_LABEL} or newer`;
7
+
8
+ function stableVersionParts(version) {
9
+ const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.exec(version);
10
+ return match?.slice(1).map(Number);
11
+ }
12
+
13
+ export function isSupportedAgentBrowserVersion(version) {
14
+ const actual = stableVersionParts(version);
15
+ const minimum = stableVersionParts(MINIMUM_AGENT_BROWSER_VERSION);
16
+ if (!actual || !minimum) return false;
17
+ for (let index = 0; index < minimum.length; index += 1) {
18
+ if (actual[index] !== minimum[index]) return actual[index] > minimum[index];
19
+ }
20
+ return true;
21
+ }
@@ -169,6 +169,7 @@ function printStatus() {
169
169
  console.log("Effective config:");
170
170
  console.log(` webSearch.enabled: ${state.webSearchEnabled ? "true" : "false"}`);
171
171
  console.log(` webSearch.preferredProvider: ${state.config.webSearch?.preferredProvider ?? `auto (default ${DEFAULT_WEB_SEARCH_PROVIDER})`}`);
172
+ console.log(` webSearch.defaultSearchType: ${state.config.webSearch?.defaultSearchType ?? "not configured (Exa auto)"}`);
172
173
  for (const provider of WEB_SEARCH_PROVIDERS) {
173
174
  const field = getWebSearchProviderConfigKey(provider);
174
175
  console.log(` webSearch.${field}: ${getCredentialSourceSummary(state.webSearchCredentialSources[provider], provider)}`);
@@ -4,7 +4,7 @@
4
4
  * Responsibilities: Check upstream agent-browser PATH/version, inspect Pi settings for duplicate package/checkout sources, and print actionable remediation.
5
5
  * Scope: Read-only package diagnostics only; upstream browser runtime health remains the responsibility of upstream `agent-browser doctor`.
6
6
  * Usage: Run via `pi-agent-browser-doctor`, `npm exec --package pi-agent-browser-native -- pi-agent-browser-doctor`, or `npm run doctor` from this repository.
7
- * Invariants/Assumptions: The wrapper targets TARGET_AGENT_BROWSER_VERSION, does not bundle agent-browser, and must not edit Pi settings or run fixing commands.
7
+ * Invariants/Assumptions: The wrapper recommends TARGET_AGENT_BROWSER_VERSION, enforces the configured stable version floor, does not bundle agent-browser, and must not edit Pi settings or run fixing commands.
8
8
  */
9
9
 
10
10
  import { execFile as execFileCallback } from "node:child_process";
@@ -16,7 +16,7 @@ import { fileURLToPath } from "node:url";
16
16
  import { promisify } from "node:util";
17
17
 
18
18
  import { CAPABILITY_BASELINE_SOURCE } from "./agent-browser-capability-baseline.mjs";
19
- import { TARGET_AGENT_BROWSER_SOURCE, TARGET_AGENT_BROWSER_VERSION } from "./agent-browser-target.mjs";
19
+ import { MINIMUM_AGENT_BROWSER_VERSION, TARGET_AGENT_BROWSER_SOURCE, TARGET_AGENT_BROWSER_VERSION, isSupportedAgentBrowserVersion } from "./agent-browser-target.mjs";
20
20
 
21
21
  const execFile = promisify(execFileCallback);
22
22
  const PACKAGE_NAME = "pi-agent-browser-native";
@@ -25,7 +25,7 @@ const EXTENSION_ENTRYPOINTS = Object.freeze([
25
25
  "extensions/agent-browser/index.ts",
26
26
  "dist/extensions/agent-browser/index.js",
27
27
  ]);
28
- const EXPECTED_VERSION = TARGET_AGENT_BROWSER_VERSION;
28
+ const RECOMMENDED_VERSION = TARGET_AGENT_BROWSER_VERSION;
29
29
  const MINIMUM_PI_VERSION = "0.84.0";
30
30
  const DEFAULT_AGENT_DIR = resolve(homedir(), ".pi/agent");
31
31
  const THIS_PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
@@ -70,7 +70,7 @@ Options:
70
70
 
71
71
  Checks:
72
72
  1. agent-browser is installed on PATH.
73
- 2. agent-browser --version matches the package target version.
73
+ 2. agent-browser --version is supported by this package.
74
74
  3. pi --version is at least the minimum Pi runtime version for this release.
75
75
  4. Pi settings and repo-local autoload locations do not point at multiple active pi-agent-browser-native sources.
76
76
 
@@ -341,17 +341,23 @@ async function checkAgentBrowserVersion({ runAgentBrowser }) {
341
341
  try {
342
342
  const rawOutput = await runAgentBrowser(["--version"]);
343
343
  const version = normalizeAgentBrowserVersion(rawOutput);
344
- if (version !== EXPECTED_VERSION) {
344
+ if (!isSupportedAgentBrowserVersion(version)) {
345
345
  return {
346
346
  status: "fail",
347
- title: `agent-browser version drift: expected ${EXPECTED_VERSION}, found ${version || "<empty>"}.`,
347
+ title: `agent-browser version drift: minimum supported ${MINIMUM_AGENT_BROWSER_VERSION}; found ${version || "<empty>"}.`,
348
348
  lines: [
349
- `This wrapper targets the current version from ${TARGET_AGENT_BROWSER_SOURCE} and does not provide backwards-compatibility shims.`,
350
- `Update upstream agent-browser to ${EXPECTED_VERSION}, or if you intentionally re-baselined upstream, update ${TARGET_AGENT_BROWSER_SOURCE} plus ${CAPABILITY_BASELINE_SOURCE}, run \`npm run docs -- command-reference write\`, refresh docs/COMMAND_REFERENCE.md, and rerun \`npm run verify -- command-reference\` plus \`npm run verify -- real-upstream\` with test/fixtures/agent-browser-real-output-shapes.json aligned to the new target version.`,
349
+ `This wrapper supports stable agent-browser versions at or above ${MINIMUM_AGENT_BROWSER_VERSION}; ${RECOMMENDED_VERSION} is the current recommendation from ${TARGET_AGENT_BROWSER_SOURCE}.`,
350
+ `Update upstream agent-browser to ${RECOMMENDED_VERSION}, or if you intentionally re-baselined upstream, update ${TARGET_AGENT_BROWSER_SOURCE} plus ${CAPABILITY_BASELINE_SOURCE}, run \`npm run docs -- command-reference write\`, refresh docs/COMMAND_REFERENCE.md, and rerun \`npm run verify -- command-reference\` plus \`npm run verify -- real-upstream\` with test/fixtures/agent-browser-real-output-shapes.json aligned to the new target version.`,
351
351
  ],
352
352
  };
353
353
  }
354
- return { status: "pass", title: `agent-browser version matches baseline: ${version}`, lines: [] };
354
+ return {
355
+ status: "pass",
356
+ title: version === RECOMMENDED_VERSION
357
+ ? `agent-browser version matches recommended baseline: ${version}`
358
+ : `agent-browser version meets supported floor: ${version} (recommended ${RECOMMENDED_VERSION})`,
359
+ lines: [],
360
+ };
355
361
  } catch (error) {
356
362
  const code = error && typeof error === "object" ? error.code : undefined;
357
363
  return {
@@ -1,20 +0,0 @@
1
- const MANAGED_SESSION_RESTORE_KEY_PATTERN = /piab-r(?:2)?-[a-f\d]{32}/gi;
2
- const MANAGED_SESSION_RESTORE_KEY_EXACT_PATTERN = /^piab-r2-[a-f\d]{32}$/i;
3
- const WRAPPER_MANAGED_SESSION_PREFIX = "piab-";
4
- export function isWrapperManagedSessionName(value) {
5
- return typeof value === "string" && value.toLowerCase().startsWith(WRAPPER_MANAGED_SESSION_PREFIX);
6
- }
7
- export function isManagedSessionRestoreKey(value) {
8
- return typeof value === "string" && MANAGED_SESSION_RESTORE_KEY_EXACT_PATTERN.test(value);
9
- }
10
- export function extractManagedSessionRestoreKeys(value) {
11
- return [...new Set(value.match(MANAGED_SESSION_RESTORE_KEY_PATTERN)?.map((key) => key.toLowerCase()) ?? [])];
12
- }
13
- export function containsManagedSessionRestoreKey(value) {
14
- MANAGED_SESSION_RESTORE_KEY_PATTERN.lastIndex = 0;
15
- return MANAGED_SESSION_RESTORE_KEY_PATTERN.test(value);
16
- }
17
- export function redactManagedSessionRestoreKeys(value) {
18
- MANAGED_SESSION_RESTORE_KEY_PATTERN.lastIndex = 0;
19
- return value.replace(MANAGED_SESSION_RESTORE_KEY_PATTERN, "[REDACTED MANAGED STATE]");
20
- }