Purpose and evidence
0.22 stops bundling hosted device providers with the default installation. BrowserStack already presents the plugin factory shape inside core: packages/provider-webdriver/src/browserstack-provider.ts returns { webDriver, connection } next to a manifest-shaped declaration (CLOUD_WEBDRIVER_PROVIDER_DECLARATIONS in providers.ts), composed through the same route an installed WebDriver plugin uses (PR #3312). TestMu (packages/provider-testmu, #3118) is the packaging template: bundled ESM, agentDevicePlugin manifest, ./connection-verification subpath, test/package-smoke.mjs, release through scripts/release-workspace.mjs.
Required behavior and boundary
- New workspace package
packages/provider-browserstack publishing @agent-device/browserstack, versioned with core, built with tsdown like TestMu. Its default export is (host: ProviderPluginHost) => { webDriver, connection }; the manifest declares provider: "browserstack", the connection capabilities and credentialVariables: ["BROWSERSTACK_USERNAME", "BROWSERSTACK_ACCESS_KEY"] exactly as CLOUD_WEBDRIVER_PROVIDER_DECLARATIONS does today.
- Move the BrowserStack modules out of
provider-webdriver (browserstack.ts, browserstack-provider.ts, browserstack-connection.ts, browserstack-connection-verification.ts, browserstack-device-features.ts, their tests, and the bs:// helpers from providers.ts). provider-webdriver keeps the shared engine and the ./plugin surface only.
- Core drops
browserstack from BUNDLED_CLOUD_WEBDRIVER_PROVIDERS and from RESERVED_PLUGIN_PROVIDERS; the connect route, credential fingerprint, and daemon composition keep working through the plugin manifest with no provider-name branch left in src/.
agent-device connect browserstack without the plugin fails with the existing unknown-provider error naming plugins add @agent-device/browserstack; help, website/docs/docs/browserstack.md, device-clouds.md, plugins.md ("remain bundled"), and the README move the provider to the plugin install flow.
agent-device plugins add @agent-device/browserstack
export BROWSERSTACK_USERNAME=... BROWSERSTACK_ACCESS_KEY=...
agent-device connect browserstack --platform android --device "Google Pixel 8" --provider-os-version 14.0 --provider-app bs://app-id
Completion and validation
node scripts/check-provider-plugin.mjs packages/provider-browserstack passes (packed install, host-recognized errors, CLI connect).
- Provider-scenario integration tests that today build the BrowserStack runtime through
createBundledCloudWebDriverRuntimes run the plugin factory through createCloudWebDriverRuntime the way the TestMu scenarios do.
pnpm check:affected --run passes; the Size report shows the default install shrinking by the BrowserStack modules; eager-closure budgets need no approval row.
- One live BrowserStack session (connect, open, snapshot, close, artifacts) with the packed plugin, recorded in the PR.
Dependencies and readiness
Blocked by: #3312 landing on main. Sibling: the AWS Device Farm and Limrun extractions in this milestone; land this one first, it needs no plugin-host change.
Effort: M. Risk: low (shape already proven by TestMu; user-visible change is the install step).
Purpose and evidence
0.22 stops bundling hosted device providers with the default installation. BrowserStack already presents the plugin factory shape inside core:
packages/provider-webdriver/src/browserstack-provider.tsreturns{ webDriver, connection }next to a manifest-shaped declaration (CLOUD_WEBDRIVER_PROVIDER_DECLARATIONSinproviders.ts), composed through the same route an installed WebDriver plugin uses (PR #3312). TestMu (packages/provider-testmu, #3118) is the packaging template: bundled ESM,agentDevicePluginmanifest,./connection-verificationsubpath,test/package-smoke.mjs, release throughscripts/release-workspace.mjs.Required behavior and boundary
packages/provider-browserstackpublishing@agent-device/browserstack, versioned with core, built with tsdown like TestMu. Its default export is(host: ProviderPluginHost) => { webDriver, connection }; the manifest declaresprovider: "browserstack", theconnectioncapabilities andcredentialVariables: ["BROWSERSTACK_USERNAME", "BROWSERSTACK_ACCESS_KEY"]exactly asCLOUD_WEBDRIVER_PROVIDER_DECLARATIONSdoes today.provider-webdriver(browserstack.ts,browserstack-provider.ts,browserstack-connection.ts,browserstack-connection-verification.ts,browserstack-device-features.ts, their tests, and thebs://helpers fromproviders.ts).provider-webdriverkeeps the shared engine and the./pluginsurface only.browserstackfromBUNDLED_CLOUD_WEBDRIVER_PROVIDERSand fromRESERVED_PLUGIN_PROVIDERS; the connect route, credential fingerprint, and daemon composition keep working through the plugin manifest with no provider-name branch left insrc/.agent-device connect browserstackwithout the plugin fails with the existing unknown-provider error namingplugins add @agent-device/browserstack; help,website/docs/docs/browserstack.md,device-clouds.md,plugins.md("remain bundled"), and the README move the provider to the plugin install flow.Completion and validation
node scripts/check-provider-plugin.mjs packages/provider-browserstackpasses (packed install, host-recognized errors, CLI connect).createBundledCloudWebDriverRuntimesrun the plugin factory throughcreateCloudWebDriverRuntimethe way the TestMu scenarios do.pnpm check:affected --runpasses; the Size report shows the default install shrinking by the BrowserStack modules; eager-closure budgets need no approval row.Dependencies and readiness
Blocked by: #3312 landing on
main. Sibling: the AWS Device Farm and Limrun extractions in this milestone; land this one first, it needs no plugin-host change.Effort: M. Risk: low (shape already proven by TestMu; user-visible change is the install step).