import { LEASE_BACKENDS } from '@agent-device/kernel/contracts'; import { PROVIDER_DEVICE_ORIENTATIONS, PROVIDER_DEVICE_TYPES, } from '@agent-device/contracts/remote'; import type { FlagDefinition } from './flag-types.ts'; export const CONNECTION_FLAG_DEFINITIONS: readonly FlagDefinition[] = [ { key: 'config', names: ['--config'], type: 'string', usageLabel: '--config ', usageDescription: 'Load CLI defaults from a specific config file (required for connection/provider defaults outside user config)', projectConfig: false, recorded: false, }, { key: 'remoteConfig', names: ['--remote-config'], type: 'string', usageLabel: '--remote-config ', usageDescription: 'Load remote host + Metro workflow settings from a specific profile file', projectConfig: false, recorded: false, }, { key: 'stateDir', names: ['--state-dir'], type: 'string', usageLabel: '--state-dir ', usageDescription: 'Daemon state directory (defaults to ~/.agent-device for packages, or a worktree-scoped dev dir from source)', projectConfig: false, recorded: false, }, { key: 'daemonBaseUrl', names: ['--daemon-base-url'], type: 'string', usageLabel: '--daemon-base-url ', usageDescription: 'Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)', projectConfig: false, recorded: false, }, { key: 'daemonAuthToken', names: ['--daemon-auth-token'], type: 'string', usageLabel: '--daemon-auth-token ', usageDescription: 'Remote HTTP daemon or proxy auth token (sent as request token and bearer header)', projectConfig: false, recorded: false, }, { key: 'daemonTransport', names: ['--daemon-transport'], type: 'enum', enumValues: ['auto', 'socket', 'http'], usageLabel: '--daemon-transport auto|socket|http', usageDescription: 'Daemon client transport preference', projectConfig: false, recorded: false, }, { key: 'daemonServerMode', names: ['--daemon-server-mode'], type: 'enum', enumValues: ['socket', 'http', 'dual'], usageLabel: '--daemon-server-mode socket|http|dual', usageDescription: 'Daemon server mode used when spawning daemon', projectConfig: false, recorded: false, }, { key: 'proxyHost', names: ['--host'], type: 'string', usageLabel: '--host ', usageDescription: 'Proxy: host interface to bind (default: 127.0.0.1)', projectConfig: false, recorded: false, }, { key: 'proxyPort', names: ['--port'], type: 'int', min: 1, max: 65535, usageLabel: '--port ', usageDescription: 'Proxy: TCP port to bind (default: 0, choose a free port)', projectConfig: false, recorded: false, }, { key: 'tenant', names: ['--tenant'], type: 'string', usageLabel: '--tenant ', usageDescription: 'Tenant scope identifier for isolated daemon sessions', projectConfig: false, recorded: false, }, { key: 'sessionIsolation', names: ['--session-isolation'], type: 'enum', enumValues: ['none', 'tenant'], usageLabel: '--session-isolation none|tenant', usageDescription: 'Session isolation strategy (tenant prefixes session namespace)', projectConfig: false, recorded: false, }, { key: 'runId', names: ['--run-id'], type: 'string', usageLabel: '--run-id ', usageDescription: 'Run identifier used for tenant lease admission checks', projectConfig: false, recorded: false, }, { key: 'leaseId', names: ['--lease-id'], type: 'string', usageLabel: '--lease-id ', usageDescription: 'Lease identifier bound to tenant/run admission scope', projectConfig: false, recorded: false, }, { key: 'leaseBackend', names: ['--lease-backend'], type: 'enum', enumValues: LEASE_BACKENDS, usageLabel: `--lease-backend ${LEASE_BACKENDS.join('|')}`, usageDescription: 'Lease backend for remote tenant connection admission', projectConfig: false, recorded: false, }, { key: 'provider', names: ['--provider'], type: 'string', usageLabel: '--provider ', usageDescription: 'Cloud provider name for provider-scoped commands', projectConfig: false, recorded: false, }, { key: 'providerSessionId', names: ['--provider-session'], type: 'string', usageLabel: '--provider-session ', usageDescription: 'Cloud provider session id or ARN', projectConfig: false, recorded: false, }, { key: 'providerApp', names: ['--provider-app'], type: 'string', usageLabel: '--provider-app ', usageDescription: 'Cloud provider app reference or local app path used when creating hosted WebDriver sessions', projectConfig: false, recorded: false, }, { key: 'providerOsVersion', names: ['--provider-os-version', '--os-version'], type: 'string', usageLabel: '--provider-os-version ', usageDescription: 'Hosted cloud provider OS version, for example 17 or 14.0', projectConfig: false, recorded: false, }, { key: 'providerDeviceType', names: ['--provider-device-type'], type: 'enum', enumValues: PROVIDER_DEVICE_TYPES, usageLabel: '--provider-device-type real|virtual', usageDescription: 'TestMu AI device pool: real devices or virtual devices (emulators and simulators). Defaults to virtual', projectConfig: false, recorded: false, }, { key: 'providerProject', names: ['--provider-project'], type: 'string', usageLabel: '--provider-project ', usageDescription: 'Hosted cloud provider project label', projectConfig: false, recorded: false, }, { key: 'providerBuild', names: ['--provider-build'], type: 'string', usageLabel: '--provider-build ', usageDescription: 'Hosted cloud provider build label', projectConfig: false, recorded: false, }, { key: 'providerSessionName', names: ['--provider-session-name'], type: 'string', usageLabel: '--provider-session-name ', usageDescription: 'Hosted cloud provider session label', projectConfig: false, recorded: false, }, { key: 'providerDeviceOrientation', names: ['--provider-device-orientation', '--device-orientation'], type: 'enum', enumValues: PROVIDER_DEVICE_ORIENTATIONS, usageLabel: '--provider-device-orientation portrait|landscape', usageDescription: 'Screen orientation a hosted cloud provider session starts in. Set this rather than rotating after launch: a session that boots landscape renders login webviews landscape', projectConfig: false, recorded: false, }, { key: 'providerGeoLocation', names: ['--provider-geo-location', '--geo-location'], type: 'string', usageLabel: '--provider-geo-location ', usageDescription: 'Hosted cloud provider IP geolocation country code, for example US', projectConfig: false, recorded: false, }, { key: 'providerTimezone', names: ['--provider-timezone', '--timezone'], type: 'string', usageLabel: '--provider-timezone ', usageDescription: 'Hosted cloud provider device time zone, for example New_York', projectConfig: false, recorded: false, }, { key: 'providerAppiumVersion', names: ['--provider-appium-version', '--appium-version'], type: 'string', usageLabel: '--provider-appium-version ', usageDescription: 'Hosted cloud provider Appium server version, for example 3.2.0. Without it each provider starts its own default (Appium 1.x on BrowserStack)', projectConfig: false, recorded: false, }, { key: 'providerLanguage', names: ['--provider-language', '--language'], type: 'string', usageLabel: '--provider-language ', usageDescription: 'Hosted cloud provider app language, for example Fr', projectConfig: false, recorded: false, }, { key: 'providerLocale', names: ['--provider-locale', '--locale'], type: 'string', usageLabel: '--provider-locale ', usageDescription: 'Hosted cloud provider device locale, for example Fr', projectConfig: false, recorded: false, }, { key: 'providerNetworkProfile', names: ['--provider-network-profile', '--network-profile'], type: 'string', usageLabel: '--provider-network-profile ', usageDescription: 'Hosted cloud provider named network condition profile, for example 4g-lte-advanced-good. Mutually exclusive with --provider-custom-network', projectConfig: false, recorded: false, }, { key: 'providerCustomNetwork', names: ['--provider-custom-network', '--custom-network'], type: 'string', usageLabel: '--provider-custom-network ', usageDescription: 'Hosted cloud provider custom network shape. Mutually exclusive with --provider-network-profile', projectConfig: false, recorded: false, }, { key: 'providerNoResignApp', names: ['--provider-no-resign-app'], type: 'boolean', usageLabel: '--provider-no-resign-app', usageDescription: 'iOS only: keep an Enterprise-signed app as uploaded instead of letting the provider re-sign it, which strips entitlements such as push notifications', projectConfig: false, recorded: false, }, { key: 'providerNetworkLogs', names: ['--provider-network-logs'], type: 'boolean', usageLabel: '--provider-network-logs', usageDescription: 'Limrun: capture session network traffic; artifacts and close write it as a HAR file on the daemon host and print its path and any capture failures. Pass --provider-network-hosts with your app API hosts. Captured traffic exits through the daemon host, the HAR holds raw headers and bodies, certificate-pinned hosts and HTTPS hosts without HTTP/2 fail to connect, and DNS-over-HTTPS bypasses the capture', projectConfig: false, recorded: false, }, { key: 'providerNetworkHosts', names: ['--provider-network-hosts'], type: 'string', usageLabel: '--provider-network-hosts ', usageDescription: 'With --provider-network-logs: comma-separated hosts to capture, such as your app API hosts (exact hosts, wildcards like *.example.com, or localhost: routes). Replaces the noisy default of common public domains plus localhost:8081', projectConfig: false, recorded: false, }, { key: 'awsProjectArn', names: ['--aws-project-arn'], type: 'string', usageLabel: '--aws-project-arn ', usageDescription: 'AWS Device Farm project ARN for hosted WebDriver sessions', projectConfig: false, recorded: false, }, { key: 'awsDeviceArn', names: ['--aws-device-arn'], type: 'string', usageLabel: '--aws-device-arn ', usageDescription: 'AWS Device Farm device ARN for hosted WebDriver sessions', projectConfig: false, recorded: false, }, { key: 'awsAppArn', names: ['--aws-app-arn'], type: 'string', usageLabel: '--aws-app-arn ', usageDescription: 'AWS Device Farm app ARN attached to hosted remote access sessions', projectConfig: false, recorded: false, }, { key: 'awsRegion', names: ['--aws-region'], type: 'string', usageLabel: '--aws-region ', usageDescription: 'AWS region for Device Farm API calls', projectConfig: false, recorded: false, }, { key: 'awsInteractionMode', names: ['--aws-interaction-mode'], type: 'enum', enumValues: ['INTERACTIVE', 'NO_VIDEO', 'VIDEO_ONLY'], usageLabel: '--aws-interaction-mode INTERACTIVE|NO_VIDEO|VIDEO_ONLY', usageDescription: 'AWS Device Farm remote access interaction mode', projectConfig: false, recorded: false, }, { key: 'force', names: ['--force', '--overwrite'], type: 'boolean', usageLabel: '--force, --overwrite', usageDescription: 'Force replacement of existing state (connect: replace an active connection; --save-script: overwrite an existing target instead of refusing)', projectConfig: true, recorded: true, }, { key: 'clean', names: ['--clean'], type: 'boolean', usageLabel: '--clean', usageDescription: 'Daemon stop: remove retained runner processes and leases after stopping', projectConfig: true, recorded: false, }, { key: 'noLogin', names: ['--no-login'], type: 'boolean', usageLabel: '--no-login', usageDescription: 'Connect: fail instead of starting implicit cloud login', projectConfig: true, recorded: false, }, { key: 'sessionLock', names: ['--session-lock'], type: 'enum', enumValues: ['reject', 'strip'], usageLabel: '--session-lock reject|strip', usageDescription: 'Lock bound-session device routing for this CLI invocation and nested batch steps; strip drops conflicting platform/scope selectors only, and a selector naming a different device always fails', projectConfig: true, recorded: false, }, ];