pi-agent-browser-native 0.3.0 → 0.5.0

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 (73) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +63 -20
  3. package/dist/extensions/agent-browser/index.js +787 -105
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +35 -3
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +44 -2
  6. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +71 -0
  7. package/dist/extensions/agent-browser/lib/command-policy.js +1 -1
  8. package/dist/extensions/agent-browser/lib/command-taxonomy.js +35 -2
  9. package/dist/extensions/agent-browser/lib/input-modes/job.js +61 -4
  10. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +2 -2
  11. package/dist/extensions/agent-browser/lib/input-modes/params.js +22 -23
  12. package/dist/extensions/agent-browser/lib/input-modes/script.js +462 -0
  13. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +51 -12
  14. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +8 -0
  15. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +3 -1
  16. package/dist/extensions/agent-browser/lib/managed-session-restore.js +26 -36
  17. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +2 -4
  18. package/dist/extensions/agent-browser/lib/managed-session-state-policy.js +47 -29
  19. package/dist/extensions/agent-browser/lib/managed-session-storage.js +50 -24
  20. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +26 -5
  21. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +110 -30
  22. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +2 -1
  23. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +26 -25
  24. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +17 -3
  25. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +2 -1
  26. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +6 -4
  27. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +129 -32
  28. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +191 -55
  29. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +57 -29
  30. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +15 -11
  31. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +36 -18
  32. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +299 -0
  33. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +32 -10
  34. package/dist/extensions/agent-browser/lib/playbook.js +18 -15
  35. package/dist/extensions/agent-browser/lib/process-environment.js +14 -0
  36. package/dist/extensions/agent-browser/lib/process-identity.js +4 -4
  37. package/dist/extensions/agent-browser/lib/process.js +131 -41
  38. package/dist/extensions/agent-browser/lib/recording-reservations.js +183 -0
  39. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +62 -5
  40. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +62 -4
  41. package/dist/extensions/agent-browser/lib/results/categories.js +6 -1
  42. package/dist/extensions/agent-browser/lib/results/next-actions.js +19 -5
  43. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +85 -38
  44. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +66 -11
  45. package/dist/extensions/agent-browser/lib/results/presentation/common.js +18 -0
  46. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +7 -1
  47. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +2 -1
  48. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +26 -11
  49. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +58 -13
  50. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +1 -10
  51. package/dist/extensions/agent-browser/lib/results/presentation.js +6 -3
  52. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +2 -0
  53. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +51 -8
  54. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +13 -7
  55. package/dist/extensions/agent-browser/lib/runtime.js +116 -39
  56. package/dist/extensions/agent-browser/lib/session-page-state.js +62 -10
  57. package/dist/extensions/agent-browser/lib/upstream-version.js +14 -0
  58. package/dist/extensions/agent-browser/script-worker.js +169 -0
  59. package/dist/scripts/agent-browser-target.mjs +3 -0
  60. package/docs/ARCHITECTURE.md +40 -21
  61. package/docs/COMMAND_REFERENCE.md +90 -35
  62. package/docs/RELEASE.md +3 -3
  63. package/docs/REQUIREMENTS.md +4 -2
  64. package/docs/SUPPORT_MATRIX.md +26 -19
  65. package/docs/TOOL_CONTRACT.md +93 -52
  66. package/package.json +3 -1
  67. package/platform-smoke.config.mjs +2 -2
  68. package/scripts/agent-browser-capability-baseline.mjs +24 -6
  69. package/scripts/agent-browser-target.mjs +3 -0
  70. package/scripts/build.mjs +41 -0
  71. package/scripts/doctor.mjs +7 -6
  72. package/scripts/platform-smoke/browser-dogfood-windows.ps1 +9 -3
  73. package/scripts/platform-smoke/targets.mjs +12 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-agent-browser-native",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
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)",
@@ -36,7 +36,9 @@
36
36
  "scripts/config.mjs",
37
37
  "scripts/doctor.mjs",
38
38
  "scripts/prepare.mjs",
39
+ "scripts/build.mjs",
39
40
  "scripts/agent-browser-capability-baseline.mjs",
41
+ "scripts/agent-browser-target.mjs",
40
42
  "scripts/platform-smoke.mjs",
41
43
  "scripts/platform-smoke",
42
44
  "README.md",
@@ -22,9 +22,9 @@ export default {
22
22
  ubuntuContainerImage: PLATFORM_SMOKE_UBUNTU_IMAGE,
23
23
  windowsParallels: {
24
24
  sourceVm: "pi-extension-windows-template",
25
- // Shared template snapshot; refresh when the Windows image moves past agent-browser 0.33.0.
25
+ // Shared template snapshot; refresh when the Windows image moves past agent-browser 0.34.0.
26
26
  // Parent crabbox-ready remains for other projects' linked clones.
27
- snapshot: "crabbox-ready-ab-0.33.0",
27
+ snapshot: "crabbox-ready-ab-0.34.0-d",
28
28
  },
29
29
  nodeValidationMajor: 22,
30
30
  agentBrowserVersion: PLATFORM_SMOKE_AGENT_BROWSER_VERSION,
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Purpose: Define the canonical upstream agent-browser capability baseline targeted by this package.
3
- * Responsibilities: Store the target upstream version, sampled help commands, and verifier/doc token expectations in one importable metadata object.
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
- * Usage: Imported by command-reference verifier, generated docs checker, and tests when upstream agent-browser is re-baselined.
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
6
  * Invariants/Assumptions: This package targets the current installed upstream agent-browser only and does not keep compatibility shims for older versions.
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
 
10
+ import { TARGET_AGENT_BROWSER_VERSION } from "./agent-browser-target.mjs";
11
+
10
12
  export const CAPABILITY_BASELINE_SOURCE = "scripts/agent-browser-capability-baseline.mjs";
11
13
  export const COMMAND_REFERENCE_DOC_PATH = "docs/COMMAND_REFERENCE.md";
12
14
  export const CAPABILITY_BASELINE_BLOCK_MARKER_PREFIX = "agent-browser-capability-baseline";
@@ -14,8 +16,8 @@ export const COMMAND_REFERENCE_BASELINE_BLOCK_IDS = Object.freeze(["upstream-bas
14
16
 
15
17
  const sourceEvidence = Object.freeze({
16
18
  repository: "vercel-labs/agent-browser",
17
- upstreamHead: "93cdda5709e8861c0c26b0b955d8d746e9fda0d7",
18
- upstreamPackageVersion: "0.33.2",
19
+ upstreamHead: "548b159b30eef119ccf6846c8bc807d0eaa3f6f8",
20
+ upstreamPackageVersion: "0.34.0",
19
21
  inspectedSources: Object.freeze([
20
22
  "agent-browser --version",
21
23
  "agent-browser --help",
@@ -36,6 +38,7 @@ const sourceEvidence = Object.freeze({
36
38
  "cli/src/native/actions.rs",
37
39
  "cli/src/native/a11y/mod.rs",
38
40
  "cli/src/native/browser.rs",
41
+ "cli/src/native/tab_binding.rs",
39
42
  "cli/src/native/daemon.rs",
40
43
  "cli/src/output.rs",
41
44
  "docs/src/app/webgpu/page.mdx",
@@ -365,6 +368,10 @@ const inventorySections = Object.freeze([
365
368
  "tab new --label <name> [url]",
366
369
  "tab close [target]",
367
370
  "tab <t<N>|label>",
371
+ "tab_gone",
372
+ "data.targetId",
373
+ "data.lastUrl",
374
+ "CDP target ids",
368
375
  "frame <selector|main>",
369
376
  "dialog accept [text]",
370
377
  "dialog dismiss",
@@ -387,8 +394,13 @@ const inventorySections = Object.freeze([
387
394
  ["state help", "clean --older-than <days>"],
388
395
  ["tab help", "new [url]"],
389
396
  ["tab help", "new --label <name> [url]"],
390
- ["tab help", "close [t<N>|label]"],
397
+ ["tab help", "close [t<N>|label|target]"],
391
398
  ["tab help", "Stable tab ids"],
399
+ ["tab help", "tab_gone"],
400
+ ["tab help", "data.targetId"],
401
+ ["tab help", "data.lastUrl"],
402
+ ["core skill full", "--pin-tab"],
403
+ ["core skill full", "tab_gone"],
392
404
  ["frame help", "frame <selector|main>"],
393
405
  ["dialog help", "dialog <accept|dismiss|status> [text]"],
394
406
  ["window help", "window <operation>"],
@@ -615,6 +627,9 @@ const inventorySections = Object.freeze([
615
627
  "AGENT_BROWSER_STATE",
616
628
  "--auto-connect",
617
629
  "AGENT_BROWSER_AUTO_CONNECT",
630
+ "--pin-tab",
631
+ "--no-pin-tab",
632
+ "AGENT_BROWSER_PIN_TAB",
618
633
  "--headers <json>",
619
634
  "--init-script <path>",
620
635
  "AGENT_BROWSER_INIT_SCRIPTS",
@@ -759,6 +774,9 @@ const inventorySections = Object.freeze([
759
774
  root("AGENT_BROWSER_STATE"),
760
775
  root("--auto-connect"),
761
776
  root("AGENT_BROWSER_AUTO_CONNECT"),
777
+ root("--pin-tab"),
778
+ root("--no-pin-tab"),
779
+ root("AGENT_BROWSER_PIN_TAB"),
762
780
  root("--headers <json>"),
763
781
  root("--init-script <path>"),
764
782
  root("AGENT_BROWSER_INIT_SCRIPTS"),
@@ -852,7 +870,7 @@ const inventorySections = Object.freeze([
852
870
  ]);
853
871
 
854
872
  export const CAPABILITY_BASELINE = Object.freeze({
855
- targetVersion: "0.33.2",
873
+ targetVersion: TARGET_AGENT_BROWSER_VERSION,
856
874
  sourceEvidence,
857
875
  helpCommands,
858
876
  inventorySections,
@@ -0,0 +1,3 @@
1
+ export const TARGET_AGENT_BROWSER_SOURCE = "scripts/agent-browser-target.mjs";
2
+ export const TARGET_AGENT_BROWSER_VERSION = "0.34.0";
3
+ export const TARGET_AGENT_BROWSER_VERSION_LABEL = `agent-browser ${TARGET_AGENT_BROWSER_VERSION}`;
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Purpose: Produce the compiled runtime files that the published Pi package loads.
4
+ * Responsibilities: Remove stale dist output, run TypeScript emit through the local compiler, and fail with clear build output.
5
+ * Scope: Maintainer/package build only; runtime behavior remains in extensions/agent-browser TypeScript sources.
6
+ * Usage: `npm run build` before package verification, lifecycle validation, and npm pack/publish.
7
+ * Invariants/Assumptions: `node_modules` is installed and provides `typescript`; deleting `dist/` is safe because it is generated output.
8
+ */
9
+
10
+ import { execFile as execFileCallback } from "node:child_process";
11
+ import { rm } from "node:fs/promises";
12
+ import { join } from "node:path";
13
+ import process from "node:process";
14
+ import { promisify } from "node:util";
15
+
16
+ const execFile = promisify(execFileCallback);
17
+ const binSuffix = process.platform === "win32" ? ".cmd" : "";
18
+ const tscPath = join(process.cwd(), "node_modules", ".bin", `tsc${binSuffix}`);
19
+
20
+ async function main() {
21
+ await rm(join(process.cwd(), "dist"), { force: true, maxRetries: 5, recursive: true, retryDelay: 100 });
22
+ const options = process.platform === "win32" ? { shell: true } : {};
23
+ try {
24
+ const { stderr, stdout } = await execFile(tscPath, ["-p", "tsconfig.build.json"], {
25
+ ...options,
26
+ cwd: process.cwd(),
27
+ maxBuffer: 10 * 1024 * 1024,
28
+ });
29
+ if (stdout) process.stdout.write(stdout);
30
+ if (stderr) process.stderr.write(stderr);
31
+ } catch (error) {
32
+ if (error?.stdout) process.stdout.write(error.stdout);
33
+ if (error?.stderr) process.stderr.write(error.stderr);
34
+ throw error;
35
+ }
36
+ }
37
+
38
+ main().catch((error) => {
39
+ console.error(error instanceof Error ? error.message : String(error));
40
+ process.exitCode = 1;
41
+ });
@@ -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 CAPABILITY_BASELINE.targetVersion, does not bundle agent-browser, and must not edit Pi settings or run fixing commands.
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.
8
8
  */
9
9
 
10
10
  import { execFile as execFileCallback } from "node:child_process";
@@ -15,7 +15,8 @@ import { dirname, resolve, sep } from "node:path";
15
15
  import { fileURLToPath } from "node:url";
16
16
  import { promisify } from "node:util";
17
17
 
18
- import { CAPABILITY_BASELINE, CAPABILITY_BASELINE_SOURCE } from "./agent-browser-capability-baseline.mjs";
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
20
 
20
21
  const execFile = promisify(execFileCallback);
21
22
  const PACKAGE_NAME = "pi-agent-browser-native";
@@ -24,7 +25,7 @@ const EXTENSION_ENTRYPOINTS = Object.freeze([
24
25
  "extensions/agent-browser/index.ts",
25
26
  "dist/extensions/agent-browser/index.js",
26
27
  ]);
27
- const EXPECTED_VERSION = CAPABILITY_BASELINE.targetVersion;
28
+ const EXPECTED_VERSION = TARGET_AGENT_BROWSER_VERSION;
28
29
  const MINIMUM_PI_VERSION = "0.84.0";
29
30
  const DEFAULT_AGENT_DIR = resolve(homedir(), ".pi/agent");
30
31
  const THIS_PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
@@ -69,7 +70,7 @@ Options:
69
70
 
70
71
  Checks:
71
72
  1. agent-browser is installed on PATH.
72
- 2. agent-browser --version matches the package capability baseline.
73
+ 2. agent-browser --version matches the package target version.
73
74
  3. pi --version is at least the minimum Pi runtime version for this release.
74
75
  4. Pi settings and repo-local autoload locations do not point at multiple active pi-agent-browser-native sources.
75
76
 
@@ -345,8 +346,8 @@ async function checkAgentBrowserVersion({ runAgentBrowser }) {
345
346
  status: "fail",
346
347
  title: `agent-browser version drift: expected ${EXPECTED_VERSION}, found ${version || "<empty>"}.`,
347
348
  lines: [
348
- `This wrapper targets the current baseline from ${CAPABILITY_BASELINE_SOURCE} and does not provide backwards-compatibility shims.`,
349
- `Update upstream agent-browser to ${EXPECTED_VERSION}, or if you intentionally re-baselined upstream, update ${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 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.`,
350
351
  ],
351
352
  };
352
353
  }
@@ -1,5 +1,6 @@
1
1
  param(
2
- [Parameter(Mandatory=$true)][string]$AgentBrowserVersion
2
+ [Parameter(Mandatory=$true)][string]$AgentBrowserVersion,
3
+ [switch]$SkipNpmCi
3
4
  )
4
5
 
5
6
  $ErrorActionPreference = "Continue"
@@ -90,8 +91,13 @@ Write-Output "PLATFORM_DOGFOOD_ARTIFACT_DIR=$DogfoodArtifactDir"
90
91
  $NodeVersion = (& node --version 2>$null)
91
92
  Write-Output "PLATFORM_NODE_VERSION=$NodeVersion"
92
93
 
93
- & npm ci 2>&1
94
- $NpmCiExit = $LASTEXITCODE
94
+ if ($SkipNpmCi -and (Test-Path (Join-Path $SourceRoot "node_modules"))) {
95
+ Write-Output "PLATFORM_NPM_CI_SKIPPED=1"
96
+ $NpmCiExit = 0
97
+ } else {
98
+ & npm ci 2>&1
99
+ $NpmCiExit = $LASTEXITCODE
100
+ }
95
101
  Write-Output "PLATFORM_NPM_CI_EXIT=$NpmCiExit"
96
102
 
97
103
  $AgentBrowserPath = Get-AgentBrowserCommandPath
@@ -305,9 +305,9 @@ export function buildPlatformBuildCommand(targetName, packageName = "pi-agent-br
305
305
  return lines.join("\n");
306
306
  }
307
307
 
308
- export function buildBrowserDogfoodCommand(targetName, agentBrowserVersion = CAPABILITY_BASELINE.targetVersion) {
308
+ export function buildBrowserDogfoodCommand(targetName, agentBrowserVersion = CAPABILITY_BASELINE.targetVersion, dependenciesReady = false) {
309
309
  if (platformFor(targetName) === "powershell") {
310
- return `powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\\scripts\\platform-smoke\\browser-dogfood-windows.ps1 -AgentBrowserVersion ${psSingleQuote(agentBrowserVersion)}`;
310
+ return `powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\\scripts\\platform-smoke\\browser-dogfood-windows.ps1 -AgentBrowserVersion ${psSingleQuote(agentBrowserVersion)}${dependenciesReady ? " -SkipNpmCi" : ""}`;
311
311
  }
312
312
 
313
313
  const lines = [];
@@ -329,8 +329,12 @@ export function buildBrowserDogfoodCommand(targetName, agentBrowserVersion = CAP
329
329
  lines.push(`echo "PLATFORM_AGENT_BROWSER_VERSION=$AGENT_BROWSER_VERSION_OUTPUT"`);
330
330
  lines.push(`if [ "$AGENT_BROWSER_VERSION_COMMAND_EXIT" -eq 0 ] && [ "$AGENT_BROWSER_VERSION_OUTPUT" = "$EXPECTED_AGENT_BROWSER_VERSION" ]; then AGENT_BROWSER_READY_EXIT=0; else AGENT_BROWSER_READY_EXIT=1; fi`);
331
331
  lines.push(`echo "PLATFORM_AGENT_BROWSER_READY_EXIT=$AGENT_BROWSER_READY_EXIT"`);
332
- lines.push(`npm ci 2>&1`);
333
- lines.push(`NPM_CI_EXIT=$?`);
332
+ if (dependenciesReady) {
333
+ lines.push(`if [ -d node_modules ]; then echo "PLATFORM_NPM_CI_SKIPPED=1"; NPM_CI_EXIT=0; else npm ci 2>&1; NPM_CI_EXIT=$?; fi`);
334
+ } else {
335
+ lines.push(`npm ci 2>&1`);
336
+ lines.push(`NPM_CI_EXIT=$?`);
337
+ }
334
338
  lines.push(`echo "PLATFORM_NPM_CI_EXIT=$NPM_CI_EXIT"`);
335
339
  lines.push(`TSX_CLI="$SOURCE_ROOT/node_modules/.bin/tsx"`);
336
340
  lines.push(`if [ ! -x "$TSX_CLI" ]; then TSX_CLI="$(command -v tsx || true)"; fi`);
@@ -349,7 +353,7 @@ async function runBrowserDogfoodSuite(config, targetName, suiteName, leaseSessio
349
353
  const startedAt = Date.now();
350
354
  const platform = platformFor(targetName);
351
355
  const slug = `${config.packageName}-${targetName}`;
352
- const command = buildBrowserDogfoodCommand(targetName, config.agentBrowserVersion);
356
+ const command = buildBrowserDogfoodCommand(targetName, config.agentBrowserVersion, leaseSession?.dependenciesReady === true);
353
357
  writeFileSync(resolve(suiteDir, "target.json"), JSON.stringify(targetEvidence(config, targetName, runId, slug), null, 2));
354
358
  writeFileSync(resolve(suiteDir, "suite.json"), JSON.stringify({ suiteName, modelCalls: 0, realBrowser: true }, null, 2));
355
359
  writeCommand(suiteDir, command);
@@ -496,12 +500,14 @@ export async function runTargetSuites(config, targetName, suiteNames) {
496
500
  let staleCleanupResult;
497
501
  try {
498
502
  let sync = true;
503
+ let dependenciesReady = false;
499
504
  for (const suiteName of suiteNames) {
500
505
  console.log(` Suite: ${suiteName}`);
501
- const result = await runTargetSuite(config, targetName, suiteName, { ...lease, sync }, runId);
506
+ const result = await runTargetSuite(config, targetName, suiteName, { ...lease, dependenciesReady, sync }, runId);
502
507
  results.push(result);
503
508
  console.log(` ${result.ok ? "PASS" : "FAIL"} ${suiteName} on ${targetName}`);
504
509
  sync = false;
510
+ if (result.ok && suiteName === "platform-build") dependenciesReady = true;
505
511
  if (!result.ok) break;
506
512
  }
507
513
  } finally {