agent-device 0.14.9 → 0.15.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 (44) hide show
  1. package/README.md +7 -4
  2. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.9.apk → agent-device-android-snapshot-helper-0.15.0.apk} +0 -0
  3. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.15.0.apk.sha256 +1 -0
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.9.manifest.json → agent-device-android-snapshot-helper-0.15.0.manifest.json} +6 -6
  5. package/dist/src/1769.js +7 -0
  6. package/dist/src/2151.js +429 -0
  7. package/dist/src/221.js +4 -4
  8. package/dist/src/2842.js +1 -0
  9. package/dist/src/3572.js +1 -0
  10. package/dist/src/4057.js +1 -1
  11. package/dist/src/840.js +2 -0
  12. package/dist/src/9542.js +2 -2
  13. package/dist/src/9639.js +2 -2
  14. package/dist/src/android-adb.d.ts +38 -9
  15. package/dist/src/android-adb.js +1 -1
  16. package/dist/src/android-snapshot-helper.d.ts +23 -0
  17. package/dist/src/cli.js +60 -57
  18. package/dist/src/contracts.d.ts +1 -0
  19. package/dist/src/finders.d.ts +1 -0
  20. package/dist/src/index.d.ts +19 -22
  21. package/dist/src/internal/companion-tunnel.js +1 -1
  22. package/dist/src/internal/daemon.js +51 -23
  23. package/dist/src/remote-config.d.ts +17 -14
  24. package/dist/src/selectors.d.ts +2 -0
  25. package/dist/src/server.js +2 -20
  26. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +7 -1
  27. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +128 -47
  28. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +734 -10
  29. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +93 -7
  30. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +5 -0
  31. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +9 -0
  32. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -0
  33. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +1 -2
  34. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +26 -0
  35. package/package.json +25 -11
  36. package/server.json +3 -3
  37. package/skills/agent-device/SKILL.md +2 -7
  38. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.9.apk.sha256 +0 -1
  39. package/dist/src/180.js +0 -1
  40. package/dist/src/6108.js +0 -26
  41. package/dist/src/6642.js +0 -1
  42. package/dist/src/7462.js +0 -1
  43. package/dist/src/8809.js +0 -8
  44. package/dist/src/command-schema.js +0 -382
package/dist/src/cli.js CHANGED
@@ -1,82 +1,85 @@
1
- import e from"node:path";import{styleText as t}from"node:util";import{pathToFileURL as r}from"node:url";import n from"node:fs";import o from"node:crypto";import{resolveRemoteConfigProfile as s,resolveRemoteConfigPath as i,REMOTE_CONFIG_FIELD_SPECS as a,parseSourceValue as l,buildPrimaryEnvVarName as c}from"./208.js";import{GLOBAL_FLAG_KEYS as u,isStrictFlagModeEnabled as d,getFlagDefinition as f,getCommandSchema as p,buildCommandUsageText as m,buildUsageText as h,getCliCommandNames as g,getFlagDefinitions as w}from"./command-schema.js";import{asAppError as v,normalizeError as y,AppError as I}from"./9152.js";import{buildMobileSnapshotPresentation as A,buildSnapshotDisplayLines as $,readLocationCoordinate as S,createAgentDevice as b,displayNodeLabel as D,localCommandPolicy as _,parseDeviceRotation as N,parseWaitArgs as C,formatSnapshotLine as k}from"./6108.js";import{ensureCompanionTunnel as R,stopCompanionTunnel as x}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as E}from"./2301.js";import{createRequestId as P,withDiagnosticsScope as L,getDiagnosticsMeta as T,flushDiagnosticsToSessionFile as U,emitDiagnostic as M}from"./7599.js";import{serializeOpenResult as O,serializeSnapshotResult as B,serializeSessionListEntry as V,serializeDeployResult as j,readCommandMessage as G,serializeCloseResult as F,resolveDaemonPaths as K,serializeEnsureSimulatorResult as H,serializeInstallFromSourceResult as q,serializeDevice as J}from"./180.js";import{stopMetroTunnel as z}from"./metro.js";import{runCmdStreaming as W,runCmd as Z}from"./9818.js";import{resolveUserPath as Y,expandUserHomePath as X}from"./3267.js";import{createLocalArtifactAdapter as Q}from"./7719.js";import{createAgentDeviceClient as ee,CLIENT_COMMANDS as et,sendToDaemon as er}from"./9542.js";import{splitSelectorFromArgs as en}from"./940.js";import{isEnvTruthy as eo}from"./8809.js";import{readVersion as es}from"./9671.js";import{parseBatchStepsJson as ei}from"./1231.js";import{maybeRunUpgradeNotifier as ea}from"./113.js";function el(e,t){for(let[r,n]of Object.entries(t))void 0!==n&&(e[r]=n);return e}let ec=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),eu={iosSimulatorDeviceSet:["IOS_SIMULATOR_DEVICE_SET"],androidDeviceAllowlist:["ANDROID_DEVICE_ALLOWLIST"],metroBearerToken:["AGENT_DEVICE_PROXY_TOKEN"]},ed=function(){let e=new Map;for(let t of w()){let r=e.get(t.key);r?r.push(t):e.set(t.key,[t])}let t=new Map;for(let e of u)t.set(e,new Set(["*"]));for(let e of g()){let r=p(e);if(r)for(let n of r.allowedFlags){let r=t.get(n);r&&r.has("*")||(r?r.add(e):t.set(n,new Set([e])))}}return[...e.entries()].map(([e,r])=>({key:e,flagDefinitions:r,config:{enabled:!ec.has(e),key:e},env:{names:[c(e),...eu[e]??[]]},supportsCommand(r){let n=t.get(e);return!!n&&(!!n.has("*")||!!r&&n.has(r))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),ef=new Map(ed.map(e=>[e.key,e]));function ep(e,t){return ef.get(e)?.supportsCommand(t)??!1}function em(e){let t=e.flagDefinitions.find(e=>void 0===e.setValue);if(t)return t;let r=function(e){let t=e.flagDefinitions[0];if(!t)throw Error(`Missing flag definition for option ${e.key}`);return t}(e);if("enum"===r.type){let t=e.flagDefinitions.map(e=>e.setValue).filter(e=>void 0!==e);return{...r,setValue:void 0,enumValues:t}}return r}function eh(e){let t=e.indexOf("=");return -1===t?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function eg(e){return e.replace(/^-+/,"")}function ew(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?eh(e):[e,void 0];return void 0!==f(t)}function ev(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}function ey(e){process.stdout.write(`${JSON.stringify(e,null,2)}
2
- `)}function eI(e,t={}){let r=e instanceof I?y(e):e;process.stderr.write(`Error (${r.code}): ${r.message}
1
+ import e from"node:path";import{styleText as t}from"node:util";import{pathToFileURL as r}from"node:url";import n from"node:fs";import o from"node:crypto";import{resolveRemoteConfigProfile as s,resolveRemoteConfigPath as i,REMOTE_CONFIG_FIELD_SPECS as a,parseSourceValue as l,buildPrimaryEnvVarName as c}from"./208.js";import{buildMobileSnapshotPresentation as u,formatSnapshotLine as d,isStrictFlagModeEnabled as f,getFlagDefinition as p,getCommandSchema as m,buildCommandUsageText as h,displayNodeLabel as g,getCliCommandNames as w,getFlagDefinitions as v,GLOBAL_FLAG_KEYS as y,createAgentDevice as I,applyCommandDefaults as $,localCommandPolicy as A,buildUsageText as S,parseDeviceRotation as b,buildSnapshotDisplayLines as C}from"./2151.js";import{asAppError as D,normalizeError as _,AppError as N}from"./9152.js";import{ensureCompanionTunnel as x,stopCompanionTunnel as k}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as R}from"./2301.js";import{createRequestId as P,withDiagnosticsScope as E,getDiagnosticsMeta as L,flushDiagnosticsToSessionFile as M,emitDiagnostic as U}from"./7599.js";import{typeCommandCodec as T,settingsCommandCodec as O,serializeSessionListEntry as B,serializeSnapshotResult as j,elementTargetCodec as V,serializeCloseResult as F,selectionOptionsFromFlags as G,screenshotOptionsFromFlags as H,selectorSnapshotOptionsFromFlags as K,serializeOpenResult as q,serializeDeployResult as J,readCommandMessage as z,resolveDaemonPaths as W,findCommandCodec as Z,isCommandCodec as Y,serializeInstallFromSourceResult as X,serializeDevice as Q,waitCommandCodec as ee,interactionTargetCodec as et,fillCommandCodec as er}from"./3572.js";import{stopMetroTunnel as en}from"./metro.js";import{isEnvTruthy as eo,assertResolvedAppsFilter as es}from"./840.js";import{runCmdStreaming as ei,runCmd as ea}from"./9818.js";import{resolveUserPath as el,expandUserHomePath as ec}from"./3267.js";import{createLocalArtifactAdapter as eu}from"./7719.js";import{readVersion as ed}from"./9671.js";import{createAgentDeviceClient as ef,sendToDaemon as ep}from"./9542.js";import{parseBatchStepsJson as em}from"./1231.js";import{maybeRunUpgradeNotifier as eh}from"./113.js";function eg(e,t){for(let[r,n]of Object.entries(t))void 0!==n&&(e[r]=n);return e}let ew=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),ev={iosSimulatorDeviceSet:["IOS_SIMULATOR_DEVICE_SET"],androidDeviceAllowlist:["ANDROID_DEVICE_ALLOWLIST"],metroBearerToken:["AGENT_DEVICE_PROXY_TOKEN"]},ey=function(){let e=new Map;for(let t of v()){let r=e.get(t.key);r?r.push(t):e.set(t.key,[t])}let t=new Map;for(let e of y)t.set(e,new Set(["*"]));for(let e of w()){let r=m(e);if(r)for(let n of r.allowedFlags){let r=t.get(n);r&&r.has("*")||(r?r.add(e):t.set(n,new Set([e])))}}return[...e.entries()].map(([e,r])=>({key:e,flagDefinitions:r,config:{enabled:!ew.has(e),key:e},env:{names:[c(e),...ev[e]??[]]},supportsCommand(r){let n=t.get(e);return!!n&&(!!n.has("*")||!!r&&n.has(r))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),eI=new Map(ey.map(e=>[e.key,e]));function e$(e,t){return eI.get(e)?.supportsCommand(t)??!1}function eA(e){let t=e.flagDefinitions.find(e=>void 0===e.setValue);if(t)return t;let r=function(e){let t=e.flagDefinitions[0];if(!t)throw Error(`Missing flag definition for option ${e.key}`);return t}(e);if("enum"===r.type){let t=r.enumValues??e.flagDefinitions.map(e=>e.setValue).filter(e=>void 0!==e);return{...r,setValue:void 0,enumValues:t}}return r}function eS(e){let t=e.indexOf("=");return -1===t?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function eb(e){return e.replace(/^-+/,"")}function eC(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?eS(e):[e,void 0];return void 0!==p(t)}function eD(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}let e_=["button","switch","checkbox","radio"],eN=["button","image","textview","view"];function ex(e,t,r){r.add(t),ek(e,t,r)}function ek(e,t,r){let n=[t];for(;n.length>0;){let t=n.pop();for(let o of e)o.parentIndex!==t||r.has(o.index)||(r.add(o.index),n.push(o.index))}}function eR(e,t,r){let n=e.get(t.index)??t,o=[...new Set([...eP(n),...r.filter(Boolean)])];e.set(t.index,{...n,presentationHints:o})}function eP(e){return Array.isArray(e.presentationHints)?e.presentationHints:[]}function eE(e){return e.width>0&&e.height>0}function eL(e){return"number"!=typeof e.parentIndex}function eM(e){let t=(e.type??"").toLowerCase(),r=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===r}function eU(e,t){let r=eT(e);return eT(t)>r?t:e}function eT(e){let t=(e.type??"").toLowerCase(),r=0;return eO(t,e_)?r+=100:t.includes("image")?r+=30:t.includes("textview")||"text"===t?r+=20:t.includes("view")&&(r+=10),!0===e.hittable&&(r+=20),!1!==e.enabled&&(r+=5),r}function eO(e,t){return t.some(t=>e.includes(t))}function eB(e,t){let r=g(e);if(r.trim())return r;let n=[e.index];for(;n.length>0;){let e=n.pop();for(let r of t){if(r.parentIndex!==e)continue;let t=g(r);if(t.trim())return t;n.push(r.index)}}return""}function ej(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||eF(t)?null:t}function eV(e,t){return Math.round(e/t)}function eF(e){return/\S+@\S+\.\S+/.test(e)}function eG(e,t){return!e||!t||Math.abs(e.y+e.height/2-(t.y+t.height/2))<=Math.max(e.height,t.height,1)}function eH(e){process.stdout.write(`${JSON.stringify(e,null,2)}
2
+ `)}function eK(e,t={}){let r=e instanceof N?_(e):e;process.stderr.write(`Error (${r.code}): ${r.message}
3
3
  `),r.hint&&process.stderr.write(`Hint: ${r.hint}
4
4
  `),r.diagnosticId&&process.stderr.write(`Diagnostic ID: ${r.diagnosticId}
5
5
  `),r.logPath&&process.stderr.write(`Diagnostics Log: ${r.logPath}
6
6
  `),t.showDetails&&r.details&&process.stderr.write(`${JSON.stringify(r.details,null,2)}
7
- `)}function eA(e){return e&&e.summaryLines.length>0?`
8
- ${e.summaryLines.join("\n")}`:""}function e$(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eS(e){return e>0?`+${e}`:String(e)}function eb(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",r=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${r}`}function eD(e){return e.min===e.max?eS(e.min):`${eS(e.min)}..${eS(e.max)}`}function e_(t){let r=process.cwd(),n=e.relative(r,t);return""!==n&&(n.startsWith("..")||e.isAbsolute(n))?t:""===n?".":`.${e.sep}${n}`}function eN(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eC(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function ek(e,r){return r?t("dim",e):e}function eR(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function ex(e,t){var r;let n="scroll-area"===(r=e.type)||"list"===r||"collection"===r||"table"===r?r:null;if(!n)return[];let o=[];if(e.node.hiddenContentAbove&&"below"!==t&&o.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&o.push(`[content below ${n} hidden]`),0===o.length)return[];let s=" ".repeat(e.depth+1);return o.map(e=>`${s}${e}`)}let eE={slug:"react-devtools-companion",runArg:E,displayName:"React DevTools companion"};async function eP(e){return await R({...e,definition:eE,localBaseUrl:e.localBaseUrl??"http://127.0.0.1:8097",registerPath:"/api/react-devtools/companion/register",unregisterPath:"/api/react-devtools/companion/unregister",devicePort:e.devicePort??8097})}async function eL(e){return await x({...e,definition:eE})}function eT(e){var t;let r,o=eV(e);if(!n.existsSync(o))return null;try{r=JSON.parse(n.readFileSync(o,"utf8"))}catch(t){return eH(e,t),null}return!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&1===t.version&&"string"==typeof t.session&&"string"==typeof t.remoteConfigPath&&"string"==typeof t.remoteConfigHash&&(void 0===t.daemon||"object"==typeof t.daemon&&null!==t.daemon&&!Array.isArray(t.daemon))&&"string"==typeof t.tenant&&"string"==typeof t.runId&&(void 0===t.leaseId||"string"==typeof t.leaseId)&&(void 0===t.leaseBackend||"string"==typeof t.leaseBackend)&&"string"==typeof t.connectedAt&&"string"==typeof t.updatedAt?r:(eH(e),null)}function eU(t){let r=eV({stateDir:t.stateDir,session:t.state.session});n.mkdirSync(e.dirname(r),{recursive:!0}),eK(r,t.state),eK(ej(t.stateDir),{session:t.state.session})}function eM(e){return{baseUrl:function(e){if(!e)return;let t=new URL(e);for(let e of(t.username="",t.password="",[...t.searchParams.keys()]))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,"")}(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function eO(e){n.rmSync(eV(e),{force:!0});let t=ej(e.stateDir);eF(e.stateDir)===e.session&&n.rmSync(t,{force:!0})}function eB(e){try{return o.createHash("sha256").update(n.readFileSync(e)).digest("hex")}catch(t){throw new I("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function eV(t){return e.join(t.stateDir,"remote-connections",`${function(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,"_");if(!t)return"default";if(t===e)return t;let r=o.createHash("sha256").update(e).digest("hex").slice(0,8);return`${t}-${r}`}(t.session)}.json`)}function ej(t){return e.join(t,"remote-connections",".active-session.json")}function eG(e){let t=eF(e.stateDir);return t?eT({stateDir:e.stateDir,session:t}):null}function eF(e){let t=ej(e);if(n.existsSync(t))try{let e=JSON.parse(n.readFileSync(t,"utf8"));return"string"==typeof e.session?e.session:void 0}catch{return}}function eK(e,t){n.writeFileSync(e,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),n.chmodSync(e,384)}function eH(e,t){M({level:"warn",phase:"remote_connection_state_invalid",data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),eO(e)}let eq=a.map(e=>e.key);function eJ(e){let t={};for(let r of eq){let n=e[r];void 0!==n&&(t[r]=n)}return t}let ez=new Set(["connect","connection","close","disconnect","ensure-simulator","metro","session"]),eW=new Set(["open"]);async function eZ(e){let t,r,{command:n,flags:o,client:i}=e;if(!o.remoteConfig)return{flags:o,runtime:e.runtime};let a=K(o.stateDir).baseDir,l=s({configPath:o.remoteConfig,cwd:process.cwd(),env:process.env}),c={...eJ(l.profile),...o,remoteConfig:l.resolvedPath},u=eT({stateDir:a,session:c.session??"default"});if(u&&u.remoteConfigPath!==l.resolvedPath)throw new I("INVALID_ARGS","A different remote connection is already active for this session. Run connect --force or disconnect before using a different --remote-config.",{session:u.session,activeRemoteConfig:u.remoteConfigPath,requestedRemoteConfig:l.resolvedPath});let d=u??function(e,t){if(!e.tenant)throw new I("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new I("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new I("INVALID_ARGS","remote command requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let r=new Date().toISOString();return{version:1,session:e.session??"default",remoteConfigPath:t,remoteConfigHash:eB(t),daemon:eM(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??e1(e),platform:e.platform,target:e.target,connectedAt:r,updatedAt:r}}(c,l.resolvedPath),f={...c,session:d.session},p=function(e,t){if(e)return e3(e,t)?e:void 0}(d.runtime,f.platform)??e.runtime,m=d,h=!u;if(g=n,!ez.has(g)){let e=d.leaseBackend??function(e,t){let r=e1(e);if(r)return r;throw new I("INVALID_ARGS",`${t} requires --platform ios|android or --lease-backend when the remote connection has not resolved a lease yet.`)}(o,n);var g,w,v,y,A,$=d,S=o,b=e;if($.leaseBackend&&$.leaseBackend!==b)throw new I("INVALID_ARGS","Active remote connection is already bound to a different lease backend. Re-run connect --force to replace it.",{session:$.session,leaseBackend:$.leaseBackend});if($.platform&&S.platform&&$.platform!==S.platform)throw new I("INVALID_ARGS","Active remote connection is already bound to a different platform. Re-run connect --force to replace it.",{session:$.session,platform:$.platform});if($.target&&S.target&&$.target!==S.target)throw new I("INVALID_ARGS","Active remote connection is already bound to a different target. Re-run connect --force to replace it.",{session:$.session,target:$.target});let t=await e8(i,m,e);f.leaseId=t.leaseId,f.leaseBackend=e,f.platform=m.platform??f.platform,f.target=m.target??f.target,(m.leaseId!==t.leaseId||m.leaseBackend!==e)&&(m={...m,leaseId:t.leaseId,leaseBackend:e,platform:m.platform??o.platform,target:m.target??o.target,updatedAt:new Date().toISOString()},h=!0)}if(w=n,v=e.batchSteps,(eW.has(w)||"batch"===w&&v&&v.some(e=>{let t=e.command.trim().toLowerCase();return eW.has(t)&&void 0===e.runtime}))&&e2(f)&&(!m.leaseId&&f.leaseId&&(m={...m,leaseId:f.leaseId,leaseBackend:f.leaseBackend}),e.forceRuntimePrepare||!p||!e3(p,f.platform))){if(!m.leaseId)throw new I("INVALID_ARGS",`${n} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await eY(f,i,d.remoteConfigPath,d.session,{tenantId:d.tenant,runId:d.runId,leaseId:m.leaseId});p=e.runtime;let o=(y=m.metro,A=e.cleanup,y?.projectRoot!==A?.projectRoot||y?.profileKey!==A?.profileKey||y?.consumerKey!==A?.consumerKey);t=o?m.metro:void 0,r=o?e.cleanup:void 0,m={...m,runtime:e.runtime,metro:e.cleanup,updatedAt:new Date().toISOString()},h=!0}if(h)try{eU({stateDir:a,state:m})}catch(e){throw await eX(r),e}return await eX(t),{flags:{...f,session:m.session,leaseId:m.leaseId,leaseBackend:m.leaseBackend,platform:m.platform??f.platform,target:m.target??f.target},runtime:p}}async function eY(e,t,r,n,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new I("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new I("INVALID_ARGS","Deferred Metro preparation requires metroPublicBaseUrl or metroProxyBaseUrl when Metro settings are provided.");let s=await t.metro.prepare({projectRoot:e.metroProjectRoot,kind:e.metroKind,publicBaseUrl:e.metroPublicBaseUrl,proxyBaseUrl:e.metroProxyBaseUrl,bearerToken:e.metroBearerToken,bridgeScope:o,launchUrl:e.launchUrl,companionProfileKey:r,companionConsumerKey:n,port:e.metroPreparePort,listenHost:e.metroListenHost,statusHost:e.metroStatusHost,startupTimeoutMs:e.metroStartupTimeoutMs,probeTimeoutMs:e.metroProbeTimeoutMs,reuseExisting:!e.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!e.metroNoInstallDeps&&void 0,runtimeFilePath:e.metroRuntimeFile});return{runtime:"ios"===e.platform?s.iosRuntime:s.androidRuntime,cleanup:e.metroProxyBaseUrl?{projectRoot:s.projectRoot,profileKey:r,consumerKey:n}:void 0}}async function eX(e){if(e)try{await z(e)}catch{}}async function eQ(e){try{await eL({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function e0(e,t){if(t.leaseId)try{await e.leases.release({tenant:t.tenant,runId:t.runId,leaseId:t.leaseId,daemonBaseUrl:t.daemon?.baseUrl,daemonTransport:t.daemon?.transport,daemonServerMode:t.daemon?.serverMode})}catch{}}function e1(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function e2(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function e3(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function e8(e,t,r){if(t.leaseId&&t.leaseBackend===r){let n=await e4(e,t.leaseId,{tenant:t.tenant,runId:t.runId,leaseBackend:r});if(n)return n}return await e.leases.allocate({tenant:t.tenant,runId:t.runId,leaseBackend:r})}async function e4(e,t,r){try{return await e.leases.heartbeat({tenant:r.tenant,runId:r.runId,leaseId:t,leaseBackend:r.leaseBackend})}catch(e){var n;if((n=e)instanceof I&&"UNAUTHORIZED"===n.code&&(n.details?.reason==="LEASE_NOT_FOUND"||n.details?.reason==="LEASE_EXPIRED"||n.details?.reason==="LEASE_REVOKED"))return;throw e}}function e6(e){return{platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,androidDeviceAllowlist:e.androidDeviceAllowlist}}function e5(e,t,r){var n;if(e.json)return void ey({success:!0,data:t});let o=r?.();o&&(n=o,process.stdout.write(n.endsWith("\n")?n:`${n}
10
- `))}function e9(e,t){e5(e,t,()=>G(t))}let e7=async({positionals:e,flags:t,client:r})=>{if("list"!==(e[0]??"list"))throw new I("INVALID_ARGS","session only supports list");let n={sessions:(await r.sessions.list()).map(V)};return e5(t,n,()=>JSON.stringify(n,null,2)),!0},te=async({flags:e,client:t})=>{let r=await t.devices.list(e6(e));return e5(e,{devices:r.map(J)},()=>r.map(tt).join("\n")),!0};function tt(e){let t=e.kind?` ${e.kind}`:"",r=e.target?` target=${e.target}`:"",n="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${r})${n}`}let tr=async({flags:e,client:t})=>{if(!e.device)throw new I("INVALID_ARGS","ensure-simulator requires --device <name>");let r=await t.simulators.ensure({device:e.device,runtime:e.runtime,boot:e.boot,reuseExisting:e.reuseExisting,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet});return e5(e,H(r),()=>{let e=r.created?"Created":"Reused",t=r.booted?" (booted)":"";return r.runtime?`${e}: ${r.device} ${r.udid}${t}
11
- Runtime: ${r.runtime}`:`${e}: ${r.device} ${r.udid}${t}`}),!0},tn=async({positionals:e,flags:t,client:r})=>{let n=(e[0]??"").toLowerCase();if("reload"===n){let e=await r.metro.reload({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs});return e5(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==n)throw new I("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new I("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");let o=await r.metro.prepare({projectRoot:t.metroProjectRoot,kind:t.metroKind,port:t.metroPreparePort,listenHost:t.metroListenHost,statusHost:t.metroStatusHost,publicBaseUrl:t.metroPublicBaseUrl,proxyBaseUrl:t.metroProxyBaseUrl,bearerToken:t.metroBearerToken,bridgeScope:t.tenant&&t.runId&&t.leaseId?{tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId}:void 0,startupTimeoutMs:t.metroStartupTimeoutMs,probeTimeoutMs:t.metroProbeTimeoutMs,reuseExisting:!t.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!t.metroNoInstallDeps&&void 0,runtimeFilePath:t.metroRuntimeFile});return e5(t,o,()=>JSON.stringify(o,null,2)),!0},to=async({flags:e,client:t})=>{let r=await t.apps.list({...e6(e),appsFilter:e.appsFilter});return e5(e,{apps:r},()=>r.join("\n")),!0};function ts(e,t,r,n){var o;return"number"==typeof r||"string"==typeof(o=r)&&/^\d+$/.test(o.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let r="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(r))throw new I("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:ta(r,n)}}function ti(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new I("INVALID_ARGS",`${t} must use owner/repo.`);let n={owner:e.slice(0,r).trim(),repo:e.slice(r+1).trim()};if(!n.owner||!n.repo)throw new I("INVALID_ARGS",`${t} must use owner/repo.`);return n}function ta(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new I("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let tl=async({positionals:e,flags:t,client:r})=>{let n=j(await td("install",e,t,r));return e9(t,n),!0},tc=async({positionals:e,flags:t,client:r})=>{let n=j(await td("reinstall",e,t,r));return e9(t,n),!0},tu=async({positionals:e,flags:t,client:r})=>{let n=q(await tf(e,t,r));return e9(t,n),!0};async function td(e,t,r,n){let o=t[0],s=t[1];if(!o||!s)throw new I("INVALID_ARGS",`${e} requires: ${e} <app> <path-to-app-binary>`);let i={app:o,appPath:s,...e6(r)};return"install"===e?await n.apps.install(i):await n.apps.reinstall(i)}async function tf(e,t,r){let n=function(e,t){let r=e[0]?.trim();if(e.length>1)throw new I("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let n=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let r=e.indexOf(":");if(r<=0||r===e.length-1)throw new I("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:o}=ti(e.slice(0,r),t);return ts(n,o,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,o=t.installSource;if(1!=+!!r+ +!!n+ +!!o)throw new I("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");return n||o||{kind:"url",url:r,headers:function(e){if(!e||0===e.length)return;let t={};for(let r of e){let e=r.indexOf(":");if(e<=0)throw new I("INVALID_ARGS",`Invalid --header value "${r}". Expected "name:value".`);let n=r.slice(0,e).trim(),o=r.slice(e+1).trim();if(!n)throw new I("INVALID_ARGS",`Invalid --header value "${r}". Header name cannot be empty.`);t[n]=o}return t}(t.header)}}(e,t);if("url"!==n.kind&&t.header&&t.header.length>0)throw new I("INVALID_ARGS","install-from-source --header is only supported for URL sources");return await r.apps.installFromSource({...e6(t),retainPaths:t.retainPaths,retentionMs:t.retentionMs,source:n})}let tp=async({positionals:e,flags:t,client:r})=>{let n=O(await r.apps.open({app:e[0],url:e[1],surface:t.surface,activity:t.activity,relaunch:t.relaunch,saveScript:t.saveScript,noRecord:t.noRecord,...e6(t)}));return e9(t,n),!0},tm=async({positionals:e,flags:t,client:r})=>{let n=F(e[0]?await r.apps.close({app:e[0],shutdown:t.shutdown}):await r.sessions.close({shutdown:t.shutdown}));return e9(t,n),!0};async function th(e){return await tg({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function tg(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tR(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tR(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:"env"};if(!function(e,t){if("1"===t.AGENT_DEVICE_CLOUD_AUTH||"true"===t.AGENT_DEVICE_CLOUD_AUTH||tR(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return"agent-device.dev"===t||t.endsWith(".agent-device.dev")}catch{return!1}}(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:"none"};let r=await tA({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:"cli-session"};if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new I("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tD(e.command,t)}let n=await tv({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"login"}}async function tw(e){let t=e.env??e.io?.env??process.env;if(tR(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:t_(t)};if(tR(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:t_(t)};let r=await tA({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{accessToken:r.accessToken,cloudBaseUrl:r.cloudBaseUrl};if(e.flags.noLogin)throw new I("UNAUTHORIZED","Cloud connection profile authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});let n=await tv({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:"agent-device connect"});return{accessToken:n.accessToken,cloudBaseUrl:n.session.cloudBaseUrl}}async function tv(t){let r,o,s,i=t.env??t.io?.env??process.env,a=(u=i,d=t.io,r=d?.stdinIsTTY??process.stdin.isTTY,o=d?.stdoutIsTTY??process.stdout.isTTY,"true"!==(f=u).CI&&"true"!==f.GITHUB_ACTIONS&&"true"!==f.BUILDKITE&&r&&o?(p=u).SSH_TTY||p.SSH_CONNECTION||"true"===p.CODESPACES||p.GITPOD_WORKSPACE_ID||"true"===p.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===a)throw tD(t.commandLabel??"agent-device connect",i);let l=t_(i),c=await tb({baseUrl:l,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:t.flags.tenant,runId:t.flags.runId,daemonBaseUrl:t.flags.daemonBaseUrl,session:t.flags.session},fetchImpl:t.io?.fetch});var u,d,f,p,m,h,g=c;if(!tR(g.deviceCode)||!tR(g.userCode)||!tR(g.verificationUri))throw new I("COMMAND_FAILED","Cloud auth start returned an unusable response.");let w=c.verificationUriComplete??c.verificationUri,v="local-browser"===a?c.verificationUri:(m=c.verificationUri,h=c.userCode,(s=new URL(m)).searchParams.set("user_code",h),s.toString());"local-browser"===a?(tC(t.io,`Opening ${c.verificationUri}...
12
- `),await tN(w,t.io)):tC(t.io,`Open this URL on your machine:
7
+ `)}function eq(e){return e&&e.summaryLines.length>0?`
8
+ ${e.summaryLines.join("\n")}`:""}function eJ(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function ez(e){return e>0?`+${e}`:String(e)}function eW(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",r=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${r}`}function eZ(e){return e.min===e.max?ez(e.min):`${ez(e.min)}..${ez(e.max)}`}function eY(t){let r=process.cwd(),n=e.relative(r,t);return""!==n&&(n.startsWith("..")||e.isAbsolute(n))?t:""===n?".":`.${e.sep}${n}`}function eX(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eQ(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function e0(e,r){return r?t("dim",e):e}function e1(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function e2(e,t){var r;let n="scroll-area"===(r=e.type)||"list"===r||"collection"===r||"table"===r?r:null;if(!n)return[];let o=[];if(e.node.hiddenContentAbove&&"below"!==t&&o.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&o.push(`[content below ${n} hidden]`),0===o.length)return[];let s=" ".repeat(e.depth+1);return o.map(e=>`${s}${e}`)}let e3={slug:"react-devtools-companion",runArg:R,displayName:"React DevTools companion"};async function e8(e){return await x({...e,definition:e3,localBaseUrl:e.localBaseUrl??"http://127.0.0.1:8097",registerPath:"/api/react-devtools/companion/register",unregisterPath:"/api/react-devtools/companion/unregister",devicePort:e.devicePort??8097})}async function e4(e){return await k({...e,definition:e3})}function e6(e){var t;let r,o=tt(e);if(!n.existsSync(o))return null;try{r=JSON.parse(n.readFileSync(o,"utf8"))}catch(t){return ti(e,t),null}return!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&1===t.version&&"string"==typeof t.session&&"string"==typeof t.remoteConfigPath&&"string"==typeof t.remoteConfigHash&&(void 0===t.daemon||"object"==typeof t.daemon&&null!==t.daemon&&!Array.isArray(t.daemon))&&"string"==typeof t.tenant&&"string"==typeof t.runId&&(void 0===t.leaseId||"string"==typeof t.leaseId)&&(void 0===t.leaseBackend||"string"==typeof t.leaseBackend)&&"string"==typeof t.connectedAt&&"string"==typeof t.updatedAt?r:(ti(e),null)}function e5(t){let r=tt({stateDir:t.stateDir,session:t.state.session});n.mkdirSync(e.dirname(r),{recursive:!0}),ts(r,t.state),ts(tr(t.stateDir),{session:t.state.session})}function e9(e){return{baseUrl:function(e){if(!e)return;let t=new URL(e);for(let e of(t.username="",t.password="",[...t.searchParams.keys()]))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,"")}(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function e7(e){n.rmSync(tt(e),{force:!0});let t=tr(e.stateDir);to(e.stateDir)===e.session&&n.rmSync(t,{force:!0})}function te(e){try{return o.createHash("sha256").update(n.readFileSync(e)).digest("hex")}catch(t){throw new N("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function tt(t){return e.join(t.stateDir,"remote-connections",`${function(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,"_");if(!t)return"default";if(t===e)return t;let r=o.createHash("sha256").update(e).digest("hex").slice(0,8);return`${t}-${r}`}(t.session)}.json`)}function tr(t){return e.join(t,"remote-connections",".active-session.json")}function tn(e){let t=to(e.stateDir);return t?e6({stateDir:e.stateDir,session:t}):null}function to(e){let t=tr(e);if(n.existsSync(t))try{let e=JSON.parse(n.readFileSync(t,"utf8"));return"string"==typeof e.session?e.session:void 0}catch{return}}function ts(e,t){n.writeFileSync(e,`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8",mode:384}),n.chmodSync(e,384)}function ti(e,t){U({level:"warn",phase:"remote_connection_state_invalid",data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),e7(e)}let ta=a.map(e=>e.key);function tl(e){let t={};for(let r of ta){let n=e[r];void 0!==n&&(t[r]=n)}return t}let tc=new Set(["connect","connection","close","disconnect","metro","session"]),tu=new Set(["open"]);async function td(e){let t,r,{command:n,flags:o,client:i}=e;if(!o.remoteConfig)return{flags:o,runtime:e.runtime};let a=W(o.stateDir).baseDir,l=s({configPath:o.remoteConfig,cwd:process.cwd(),env:process.env}),c={...tl(l.profile),...o,remoteConfig:l.resolvedPath},u=e6({stateDir:a,session:c.session??"default"});if(u&&u.remoteConfigPath!==l.resolvedPath)throw new N("INVALID_ARGS","A different remote connection is already active for this session. Run connect --force or disconnect before using a different --remote-config.",{session:u.session,activeRemoteConfig:u.remoteConfigPath,requestedRemoteConfig:l.resolvedPath});let d=u??function(e,t){if(!e.tenant)throw new N("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new N("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new N("INVALID_ARGS","remote command requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let r=new Date().toISOString();return{version:1,session:e.session??"default",remoteConfigPath:t,remoteConfigHash:te(t),daemon:e9(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??tg(e),platform:e.platform,target:e.target,connectedAt:r,updatedAt:r}}(c,l.resolvedPath),f={...c,session:d.session},p=function(e,t){if(e)return tv(e,t)?e:void 0}(d.runtime,f.platform)??e.runtime,m=d,h=!u;if(g=n,!tc.has(g)){let e=d.leaseBackend??function(e,t){let r=tg(e);if(r)return r;throw new N("INVALID_ARGS",`${t} requires --platform ios|android or --lease-backend when the remote connection has not resolved a lease yet.`)}(o,n);var g,w,v,y,I,$=d,A=o,S=e;if($.leaseBackend&&$.leaseBackend!==S)throw new N("INVALID_ARGS","Active remote connection is already bound to a different lease backend. Re-run connect --force to replace it.",{session:$.session,leaseBackend:$.leaseBackend});if($.platform&&A.platform&&$.platform!==A.platform)throw new N("INVALID_ARGS","Active remote connection is already bound to a different platform. Re-run connect --force to replace it.",{session:$.session,platform:$.platform});if($.target&&A.target&&$.target!==A.target)throw new N("INVALID_ARGS","Active remote connection is already bound to a different target. Re-run connect --force to replace it.",{session:$.session,target:$.target});let t=await ty(i,m,e);f.leaseId=t.leaseId,f.leaseBackend=e,f.platform=m.platform??f.platform,f.target=m.target??f.target,(m.leaseId!==t.leaseId||m.leaseBackend!==e)&&(m={...m,leaseId:t.leaseId,leaseBackend:e,platform:m.platform??o.platform,target:m.target??o.target,updatedAt:new Date().toISOString()},h=!0)}if(w=n,v=e.batchSteps,(tu.has(w)||"batch"===w&&v&&v.some(e=>{let t=e.command.trim().toLowerCase();return tu.has(t)&&void 0===e.runtime}))&&tw(f)&&(!m.leaseId&&f.leaseId&&(m={...m,leaseId:f.leaseId,leaseBackend:f.leaseBackend}),e.forceRuntimePrepare||!p||!tv(p,f.platform))){if(!m.leaseId)throw new N("INVALID_ARGS",`${n} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await tf(f,i,d.remoteConfigPath,d.session,{tenantId:d.tenant,runId:d.runId,leaseId:m.leaseId});p=e.runtime;let o=(y=m.metro,I=e.cleanup,y?.projectRoot!==I?.projectRoot||y?.profileKey!==I?.profileKey||y?.consumerKey!==I?.consumerKey);t=o?m.metro:void 0,r=o?e.cleanup:void 0,m={...m,runtime:e.runtime,metro:e.cleanup,updatedAt:new Date().toISOString()},h=!0}if(h)try{e5({stateDir:a,state:m})}catch(e){throw await tp(r),e}return await tp(t),{flags:{...f,session:m.session,leaseId:m.leaseId,leaseBackend:m.leaseBackend,platform:m.platform??f.platform,target:m.target??f.target},runtime:p}}async function tf(e,t,r,n,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new N("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new N("INVALID_ARGS","Deferred Metro preparation requires metroPublicBaseUrl or metroProxyBaseUrl when Metro settings are provided.");let s=await t.metro.prepare({projectRoot:e.metroProjectRoot,kind:e.metroKind,publicBaseUrl:e.metroPublicBaseUrl,proxyBaseUrl:e.metroProxyBaseUrl,bearerToken:e.metroBearerToken,bridgeScope:o,launchUrl:e.launchUrl,companionProfileKey:r,companionConsumerKey:n,port:e.metroPreparePort,listenHost:e.metroListenHost,statusHost:e.metroStatusHost,startupTimeoutMs:e.metroStartupTimeoutMs,probeTimeoutMs:e.metroProbeTimeoutMs,reuseExisting:!e.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!e.metroNoInstallDeps&&void 0,runtimeFilePath:e.metroRuntimeFile});return{runtime:"ios"===e.platform?s.iosRuntime:s.androidRuntime,cleanup:e.metroProxyBaseUrl?{projectRoot:s.projectRoot,profileKey:r,consumerKey:n}:void 0}}async function tp(e){if(e)try{await en(e)}catch{}}async function tm(e){try{await e4({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function th(e,t){if(t.leaseId)try{await e.leases.release({tenant:t.tenant,runId:t.runId,leaseId:t.leaseId,daemonBaseUrl:t.daemon?.baseUrl,daemonTransport:t.daemon?.transport,daemonServerMode:t.daemon?.serverMode})}catch{}}function tg(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function tw(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tv(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function ty(e,t,r){if(t.leaseId&&t.leaseBackend===r){let n=await tI(e,t.leaseId,{tenant:t.tenant,runId:t.runId,leaseBackend:r});if(n)return n}return await e.leases.allocate({tenant:t.tenant,runId:t.runId,leaseBackend:r})}async function tI(e,t,r){try{return await e.leases.heartbeat({tenant:r.tenant,runId:r.runId,leaseId:t,leaseBackend:r.leaseBackend})}catch(e){var n;if((n=e)instanceof N&&"UNAUTHORIZED"===n.code&&(n.details?.reason==="LEASE_NOT_FOUND"||n.details?.reason==="LEASE_EXPIRED"||n.details?.reason==="LEASE_REVOKED"))return;throw e}}function t$(e,t,r){var n;if(e.json)return void eH({success:!0,data:t});let o=r?.();o&&(n=o,process.stdout.write(n.endsWith("\n")?n:`${n}
10
+ `))}function tA(e,t){t$(e,t,()=>z(t))}function tS(e){let t=e.kind?` ${e.kind}`:"",r=e.target?` target=${e.target}`:"",n="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${r})${n}`}function tb(e,t,r,n){var o;return"number"==typeof r||"string"==typeof(o=r)&&/^\d+$/.test(o.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let r="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(r))throw new N("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:tD(r,n)}}function tC(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new N("INVALID_ARGS",`${t} must use owner/repo.`);let n={owner:e.slice(0,r).trim(),repo:e.slice(r+1).trim()};if(!n.owner||!n.repo)throw new N("INVALID_ARGS",`${t} must use owner/repo.`);return n}function tD(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new N("INVALID_ARGS",`${t} must be a non-empty string.`);return r}async function t_(e,t,r,n){let o=t[0],s=t[1];if(!o||!s)throw new N("INVALID_ARGS",`${e} requires: ${e} <app> <path-to-app-binary>`);let i={app:o,appPath:s,...G(r)};return"install"===e?await n.apps.install(i):await n.apps.reinstall(i)}async function tN(e,t,r){let n=function(e,t){let r=e[0]?.trim();if(e.length>1)throw new N("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let n=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let r=e.indexOf(":");if(r<=0||r===e.length-1)throw new N("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:o}=tC(e.slice(0,r),t);return tb(n,o,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,o=t.installSource;if(1!=+!!r+ +!!n+ +!!o)throw new N("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");return n||o||{kind:"url",url:r,headers:function(e){if(!e||0===e.length)return;let t={};for(let r of e){let e=r.indexOf(":");if(e<=0)throw new N("INVALID_ARGS",`Invalid --header value "${r}". Expected "name:value".`);let n=r.slice(0,e).trim(),o=r.slice(e+1).trim();if(!n)throw new N("INVALID_ARGS",`Invalid --header value "${r}". Header name cannot be empty.`);t[n]=o}return t}(t.header)}}(e,t);if("url"!==n.kind&&t.header&&t.header.length>0)throw new N("INVALID_ARGS","install-from-source --header is only supported for URL sources");return await r.apps.installFromSource({...G(t),retainPaths:t.retainPaths,retentionMs:t.retentionMs,source:n})}async function tx(e){return await tk({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function tk(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tH(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tH(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:"env"};if(!function(e,t){if("1"===t.AGENT_DEVICE_CLOUD_AUTH||"true"===t.AGENT_DEVICE_CLOUD_AUTH||tH(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return"agent-device.dev"===t||t.endsWith(".agent-device.dev")}catch{return!1}}(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:"none"};let r=await tM({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:"cli-session"};if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new N("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tB(e.command,t)}let n=await tP({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"login"}}async function tR(e){let t=e.env??e.io?.env??process.env;if(tH(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:tj(t)};if(tH(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:tj(t)};let r=await tM({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{accessToken:r.accessToken,cloudBaseUrl:r.cloudBaseUrl};if(e.flags.noLogin)throw new N("UNAUTHORIZED","Cloud connection profile authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});let n=await tP({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:"agent-device connect"});return{accessToken:n.accessToken,cloudBaseUrl:n.session.cloudBaseUrl}}async function tP(t){let r,o,s,i=t.env??t.io?.env??process.env,a=(u=i,d=t.io,r=d?.stdinIsTTY??process.stdin.isTTY,o=d?.stdoutIsTTY??process.stdout.isTTY,"true"!==(f=u).CI&&"true"!==f.GITHUB_ACTIONS&&"true"!==f.BUILDKITE&&r&&o?(p=u).SSH_TTY||p.SSH_CONNECTION||"true"===p.CODESPACES||p.GITPOD_WORKSPACE_ID||"true"===p.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===a)throw tB(t.commandLabel??"agent-device connect",i);let l=tj(i),c=await tO({baseUrl:l,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:t.flags.tenant,runId:t.flags.runId,daemonBaseUrl:t.flags.daemonBaseUrl,session:t.flags.session},fetchImpl:t.io?.fetch});var u,d,f,p,m,h,g=c;if(!tH(g.deviceCode)||!tH(g.userCode)||!tH(g.verificationUri))throw new N("COMMAND_FAILED","Cloud auth start returned an unusable response.");let w=c.verificationUriComplete??c.verificationUri,v="local-browser"===a?c.verificationUri:(m=c.verificationUri,h=c.userCode,(s=new URL(m)).searchParams.set("user_code",h),s.toString());"local-browser"===a?(tF(t.io,`Opening ${c.verificationUri}...
11
+ `),await tV(w,t.io)):tF(t.io,`Open this URL on your machine:
13
12
  ${v}
14
13
 
15
14
  Waiting for approval for 10 minutes...
16
- `);let y=await tS({cloudBaseUrl:l,deviceCode:c.deviceCode,expiresIn:c.expiresIn,interval:c.interval,fetchImpl:t.io?.fetch,now:t.io?.now}),A=y.cliSession?.refreshCredential??y.cliSession?.refreshToken;if(!tR(y.accessToken)||!tR(A))throw new I("UNAUTHORIZED","Device authorization did not return CLI credentials.");let $=new Date(t.io?.now?.()??Date.now()).toISOString(),S={version:1,id:y.cliSession?.id??`cli-${Date.now().toString(36)}`,cloudBaseUrl:l,workspaceId:y.cliSession?.workspaceId,accountId:y.cliSession?.accountId,name:y.cliSession?.name,refreshCredential:A,createdAt:$,expiresAt:y.cliSession?.expiresAt};return function(t){let r=tI(t.stateDir);n.mkdirSync(e.dirname(r),{recursive:!0,mode:448}),n.writeFileSync(r,`${JSON.stringify(t.session,null,2)}
17
- `,{mode:384});try{n.chmodSync(r,384)}catch{}}({stateDir:t.stateDir,session:S}),{accessToken:y.accessToken,expiresAt:y.expiresAt,session:S}}function ty(e){let t=tI(e.stateDir);if(!n.existsSync(t))return null;try{let e=JSON.parse(n.readFileSync(t,"utf8"));if(1!==e.version||!tR(e.id)||!tR(e.cloudBaseUrl)||!tR(e.refreshCredential)||!tR(e.createdAt))return null;return e}catch{return null}}function tI(t){return e.join(t,"auth","cli-session.json")}async function tA(e){let t=ty({stateDir:e.stateDir});return!t||tk(t.expiresAt,e.io?.now)?null:{accessToken:(await t$({session:t,flags:e.flags,env:e.env,io:e.io})).accessToken,cloudBaseUrl:t_(e.env,t.cloudBaseUrl)}}async function t$(e){let t=t_(e.env,e.session.cloudBaseUrl),r=await tb({baseUrl:t,pathName:"/api/control-plane/cli-session/refresh",body:{refreshCredential:e.session.refreshCredential,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});if(tR(r.accessToken))return{accessToken:r.accessToken,expiresAt:r.expiresAt};if("revoked"===r.status||"revoked"===r.error)throw new I("UNAUTHORIZED","Stored cloud CLI session was revoked.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:r.status,error:r.error});throw new I("UNAUTHORIZED","Failed to refresh CLI session.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:r.status,error:r.error})}async function tS(e){let t=e.now??Date.now,r=Math.min((e.expiresIn??600)*1e3,6e5),n=t()+r,o=Math.max(1e3,(e.interval??5)*1e3);for(;t()<n;){let t=await tb({baseUrl:e.cloudBaseUrl,pathName:"/api/control-plane/device-auth/poll",body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if("approved"===t.status||tR(t.accessToken))return t;if("slow_down"===t.status||"slow_down"===t.error)o+=1e3;else if("authorization_pending"!==t.status&&"authorization_pending"!==t.error)throw new I("UNAUTHORIZED","Device authorization was not approved.",{status:t.status,error:t.error});await tx(o)}throw new I("TIMEOUT","Device authorization expired before approval.")}async function tb(e){let t=e.fetchImpl??fetch,r=await t(new URL(e.pathName,e.baseUrl),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e.body),signal:AbortSignal.timeout(15e3)}),n=await r.text(),o={};if(n.trim().length>0)try{o=JSON.parse(n)}catch(e){throw new I("COMMAND_FAILED",`Cloud auth endpoint returned invalid JSON (${r.status}).`,{status:r.status},e instanceof Error?e:void 0)}if(!r.ok)throw new I("UNAUTHORIZED","Cloud auth endpoint rejected the request.",{status:r.status,response:o});return o}function tD(e,t){let r=t_(t);return new I("UNAUTHORIZED",`${e} cannot perform interactive login in CI or a non-interactive shell.`,{hint:`Create a service/API token: ${new URL("/api-keys",r).toString()} Then set AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...`})}function t_(e,t){let r=e.AGENT_DEVICE_CLOUD_BASE_URL??t??"https://cloud.agent-device.dev";try{return new URL(r).toString().replace(/\/+$/,"")}catch(e){throw new I("INVALID_ARGS","Invalid AGENT_DEVICE_CLOUD_BASE_URL.",{cloudBaseUrl:r},e instanceof Error?e:void 0)}}async function tN(e,t){if(t?.openBrowser)return void await t.openBrowser(e);let r=process.platform;try{"darwin"===r?await Z("open",[e],{allowFailure:!0,timeoutMs:5e3}):"win32"===r?await Z("cmd",["/c","start","",e],{allowFailure:!0,timeoutMs:5e3}):await Z("xdg-open",[e],{allowFailure:!0,timeoutMs:5e3})}catch{tC(t,`Open this URL on your machine:
15
+ `);let y=await tT({cloudBaseUrl:l,deviceCode:c.deviceCode,expiresIn:c.expiresIn,interval:c.interval,fetchImpl:t.io?.fetch,now:t.io?.now}),I=y.cliSession?.refreshCredential??y.cliSession?.refreshToken;if(!tH(y.accessToken)||!tH(I))throw new N("UNAUTHORIZED","Device authorization did not return CLI credentials.");let $=new Date(t.io?.now?.()??Date.now()).toISOString(),A={version:1,id:y.cliSession?.id??`cli-${Date.now().toString(36)}`,cloudBaseUrl:l,workspaceId:y.cliSession?.workspaceId,accountId:y.cliSession?.accountId,name:y.cliSession?.name,refreshCredential:I,createdAt:$,expiresAt:y.cliSession?.expiresAt};return function(t){let r=tL(t.stateDir);n.mkdirSync(e.dirname(r),{recursive:!0,mode:448}),n.writeFileSync(r,`${JSON.stringify(t.session,null,2)}
16
+ `,{mode:384});try{n.chmodSync(r,384)}catch{}}({stateDir:t.stateDir,session:A}),{accessToken:y.accessToken,expiresAt:y.expiresAt,session:A}}function tE(e){let t=tL(e.stateDir);if(!n.existsSync(t))return null;try{let e=JSON.parse(n.readFileSync(t,"utf8"));if(1!==e.version||!tH(e.id)||!tH(e.cloudBaseUrl)||!tH(e.refreshCredential)||!tH(e.createdAt))return null;return e}catch{return null}}function tL(t){return e.join(t,"auth","cli-session.json")}async function tM(e){let t=tE({stateDir:e.stateDir});return!t||tG(t.expiresAt,e.io?.now)?null:{accessToken:(await tU({session:t,flags:e.flags,env:e.env,io:e.io})).accessToken,cloudBaseUrl:tj(e.env,t.cloudBaseUrl)}}async function tU(e){let t=tj(e.env,e.session.cloudBaseUrl),r=await tO({baseUrl:t,pathName:"/api/control-plane/cli-session/refresh",body:{refreshCredential:e.session.refreshCredential,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});if(tH(r.accessToken))return{accessToken:r.accessToken,expiresAt:r.expiresAt};if("revoked"===r.status||"revoked"===r.error)throw new N("UNAUTHORIZED","Stored cloud CLI session was revoked.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:r.status,error:r.error});throw new N("UNAUTHORIZED","Failed to refresh CLI session.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:r.status,error:r.error})}async function tT(e){let t=e.now??Date.now,r=Math.min((e.expiresIn??600)*1e3,6e5),n=t()+r,o=Math.max(1e3,(e.interval??5)*1e3);for(;t()<n;){let t=await tO({baseUrl:e.cloudBaseUrl,pathName:"/api/control-plane/device-auth/poll",body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if("approved"===t.status||tH(t.accessToken))return t;if("slow_down"===t.status||"slow_down"===t.error)o+=1e3;else if("authorization_pending"!==t.status&&"authorization_pending"!==t.error)throw new N("UNAUTHORIZED","Device authorization was not approved.",{status:t.status,error:t.error});await tK(o)}throw new N("TIMEOUT","Device authorization expired before approval.")}async function tO(e){let t=e.fetchImpl??fetch,r=await t(new URL(e.pathName,e.baseUrl),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e.body),signal:AbortSignal.timeout(15e3)}),n=await r.text(),o={};if(n.trim().length>0)try{o=JSON.parse(n)}catch(e){throw new N("COMMAND_FAILED",`Cloud auth endpoint returned invalid JSON (${r.status}).`,{status:r.status},e instanceof Error?e:void 0)}if(!r.ok)throw new N("UNAUTHORIZED","Cloud auth endpoint rejected the request.",{status:r.status,response:o});return o}function tB(e,t){let r=tj(t);return new N("UNAUTHORIZED",`${e} cannot perform interactive login in CI or a non-interactive shell.`,{hint:`Create a service/API token: ${new URL("/api-keys",r).toString()} Then set AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...`})}function tj(e,t){let r=e.AGENT_DEVICE_CLOUD_BASE_URL??t??"https://cloud.agent-device.dev";try{return new URL(r).toString().replace(/\/+$/,"")}catch(e){throw new N("INVALID_ARGS","Invalid AGENT_DEVICE_CLOUD_BASE_URL.",{cloudBaseUrl:r},e instanceof Error?e:void 0)}}async function tV(e,t){if(t?.openBrowser)return void await t.openBrowser(e);let r=process.platform;try{"darwin"===r?await ea("open",[e],{allowFailure:!0,timeoutMs:5e3}):"win32"===r?await ea("cmd",["/c","start","",e],{allowFailure:!0,timeoutMs:5e3}):await ea("xdg-open",[e],{allowFailure:!0,timeoutMs:5e3})}catch{tF(t,`Open this URL on your machine:
18
17
  ${e}
19
- `)}}function tC(e,t){(e?.stderr??process.stderr).write(t)}function tk(e,t){if(!e)return!1;let r=Date.parse(e);return!Number.isFinite(r)||r<=(t?.()??Date.now())}function tR(e){return"string"==typeof e&&e.trim().length>0}async function tx(e){await new Promise(t=>setTimeout(t,e))}async function tE(t){let r=await tw({stateDir:t.stateDir,flags:t.flags,env:t.env,io:{env:t.env,fetch:t.fetchImpl}}),i=await tP({cloudBaseUrl:r.cloudBaseUrl,accessToken:r.accessToken,fetchImpl:t.fetchImpl}),a=function(e){try{return s(e)}catch(r){let t=v(r);throw new I("COMMAND_FAILED","Cloud connection profile returned invalid remote config.",{generatedConfigPath:e.configPath,cause:t.message},t)}}({configPath:function(t){var r;let s=function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).filter(([,e])=>void 0!==e).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(t.profile),i=e.join(t.stateDir,"remote-connections","generated");n.mkdirSync(i,{recursive:!0,mode:448});let a=e.join(i,`cloud-${(r=s,o.createHash("sha256").update(JSON.stringify(r)).digest("hex").slice(0,16))}.json`);n.writeFileSync(a,`${JSON.stringify(s,null,2)}
20
- `,{mode:384});try{n.chmodSync(a,384)}catch{}return a}({stateDir:t.stateDir,profile:i}),cwd:t.cwd,env:t.env});return{flags:{...eJ(a.profile),...t.flags,remoteConfig:a.resolvedPath,daemonAuthToken:r.accessToken},remoteConfigPath:a.resolvedPath}}async function tP(e){let t=e.fetchImpl??fetch,r=await t(new URL("/api/control-plane/connection-profile",e.cloudBaseUrl),{method:"GET",headers:{authorization:`Bearer ${e.accessToken}`},signal:AbortSignal.timeout(15e3)}),n=await r.text(),o={};if(n.trim())try{o=JSON.parse(n)}catch(e){throw new I("COMMAND_FAILED",`Cloud connection profile endpoint returned invalid JSON (${r.status}).`,{status:r.status},e instanceof Error?e:void 0)}if(!r.ok)throw new I("UNAUTHORIZED","Cloud connection profile endpoint rejected the request.",{status:r.status,response:o});var s=o;if(!s||"object"!=typeof s||Array.isArray(s))throw new I("COMMAND_FAILED","Cloud connection profile response is invalid.");let i=s.connection;if(!i||"object"!=typeof i)throw new I("COMMAND_FAILED","Cloud connection profile response is missing profile.");if(void 0!==i.remoteConfigProfile){var a=i.remoteConfigProfile;if(!a||"object"!=typeof a||Array.isArray(a))throw new I("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is invalid.");if(0===Object.keys(a).length)throw new I("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is empty.");return a}throw new I("COMMAND_FAILED","Cloud connection profile did not include remoteConfigProfile.")}let tL=async({flags:e,client:t})=>{var r,n,i,a;let l=K(e.stateDir).baseDir,c=e.remoteConfig?function(e){if(!e.remoteConfig)throw new I("INVALID_ARGS","connect requires --remote-config <path>.");let t=s({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env});return{flags:e,remoteConfigPath:t.resolvedPath}}(e):await tE({flags:e,stateDir:l,cwd:process.cwd(),env:process.env}),u=c.flags,d=u.tenant,f=u.runId;if(!d)throw new I("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!f)throw new I("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!u.daemonBaseUrl)throw new I("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let p=u.session?null:eG({stateDir:l}),m=u.session??p?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${o.randomBytes(3).toString("hex")}`;if(!eT({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${o.randomBytes(2).toString("hex")}`}(l),h=eB(c.remoteConfigPath),g=eM(u),w=p?.session===m?p:eT({stateDir:l,session:m});if(w&&(r=w,n={flags:u,session:m,remoteConfigPath:c.remoteConfigPath,remoteConfigHash:h,desiredLeaseBackend:e1(u),daemon:g},r.remoteConfigPath!==n.remoteConfigPath||r.remoteConfigHash!==n.remoteConfigHash||r.session!==n.session||r.tenant!==n.flags.tenant||r.runId!==n.flags.runId||void 0!==n.desiredLeaseBackend&&r.leaseBackend!==n.desiredLeaseBackend||void 0!==n.flags.platform&&r.platform!==n.flags.platform||void 0!==n.flags.target&&r.target!==n.flags.target||(i=r.daemon,a=n.daemon,(i?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(i?.transport??void 0)!==(a?.transport??void 0)||(i?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!u.force)throw new I("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:m,remoteConfig:w.remoteConfigPath});let v=new Date().toISOString(),y={version:1,session:m,remoteConfigPath:c.remoteConfigPath,remoteConfigHash:h,daemon:g,tenant:d,runId:f,leaseId:w&&!u.force?w.leaseId:void 0,leaseBackend:w&&!u.force?w.leaseBackend:e1(u),platform:u.platform??(w&&!u.force?w.platform:void 0),target:u.target??(w&&!u.force?w.target:void 0),runtime:w&&!u.force?w.runtime:void 0,metro:w&&!u.force?w.metro:void 0,connectedAt:w&&!u.force?w.connectedAt:v,updatedAt:v};eU({stateDir:l,state:y}),w&&u.force&&(await eX(w.metro),await eQ({stateDir:l,state:w}),await e0(t,w));let A=tM(y),$=function(e,t){if(!t.runtime&&(e2(e)||tB(t.remoteConfigPath)))return tO(t.remoteConfigPath)}(u,y);return e5(u,tV(y,$),()=>[`Connected remote session "${m}" tenant "${d}" run "${f}" ${y.leaseId?`lease ${y.leaseId}`:"lease pending"}`,A?.message,$?.message].filter(e=>!!e).join("\n")),!0},tT=async({flags:e,client:t})=>{let r=e.session??"default",n=K(e.stateDir).baseDir,o=eT({stateDir:n,session:r})??(e.session?null:eG({stateDir:n}));if(!o)return e5(e,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=o.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await eX(o.metro),await eQ({stateDir:n,state:o});let i=!1;if(o.leaseId)try{i=(await t.leases.release({tenant:o.tenant,runId:o.runId,leaseId:o.leaseId})).released}catch{}return eO({stateDir:n,session:s}),e5(e,{connected:!1,session:s,released:i},()=>`Disconnected remote session "${s}".`),!0},tU=async({positionals:e,flags:t})=>{if("status"!==e[0])throw new I("INVALID_ARGS","connection accepts only: status");let r=t.session??"default",n=K(t.stateDir).baseDir,o=eT({stateDir:n,session:r})??(t.session?null:eG({stateDir:n}));if(!o)return e5(t,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=tM(o),i=function(e){if(!e.runtime&&tB(e.remoteConfigPath))return tO(e.remoteConfigPath)}(o);return e5(t,tV(o,i),()=>[`Connected remote session "${o.session}".`,`tenant=${o.tenant} runId=${o.runId} leaseId=${o.leaseId??"pending"} backend=${o.leaseBackend??"pending"}`,`remoteConfig=${o.remoteConfigPath}`,o.runtime?"metro=prepared":"metro=not-prepared",s?.message,i?.message].filter(e=>!!e).join("\n")),!0};function tM(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tO(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tB(e){try{let t=s({configPath:e,cwd:process.cwd(),env:process.env}).profile;return!!(t.metroPublicBaseUrl||t.metroProxyBaseUrl||t.metroProjectRoot||t.metroKind)}catch{return!1}}function tV(e,t){let r=tM(e);return{connected:!0,session:e.session,tenant:e.tenant,runId:e.runId,leaseAllocated:!!e.leaseId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,platform:e.platform,target:e.target,remoteConfig:e.remoteConfigPath,remoteConfigHash:e.remoteConfigHash,daemonBaseUrlFingerprint:function(e){if(e)return o.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...r?{leasePreparation:r}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}let tj=async({positionals:e,flags:t})=>{let r=e[0]??"status",o=K(t.stateDir).baseDir;if("status"===r){var s;let e,r=(e=ty({stateDir:(s={stateDir:o}).stateDir}))?{authenticated:!0,source:"cli-session",sessionId:e.id,cloudBaseUrl:e.cloudBaseUrl,workspaceId:e.workspaceId,accountId:e.accountId,name:e.name,createdAt:e.createdAt,expiresAt:e.expiresAt,expired:tk(e.expiresAt,s.now)}:{authenticated:!1,source:"none"};return e5(t,r,()=>{var e;return(e=r).authenticated?["Authenticated with cloud CLI session.",`cloud=${e.cloudBaseUrl}`,`session=${e.sessionId}`,e.workspaceId?`workspace=${e.workspaceId}`:null,e.accountId?`account=${e.accountId}`:null,e.expiresAt?`expiresAt=${e.expiresAt}`:null,e.expired?"status=expired":null].filter(e=>!!e).join("\n"):"Not authenticated."}),!0}if("login"===r){let e=await tv({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return e5(t,{authenticated:!0,source:"cli-session",sessionId:e.session.id,cloudBaseUrl:e.session.cloudBaseUrl,workspaceId:e.session.workspaceId,accountId:e.session.accountId,expiresAt:e.session.expiresAt,agentTokenExpiresAt:e.expiresAt},()=>"Authenticated with cloud CLI session."),!0}if("logout"===r){let e,r=(e=tI({stateDir:o}.stateDir),!!n.existsSync(e)&&(n.rmSync(e,{force:!0}),!0));return e5(t,{authenticated:!1,removed:r},()=>r?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new I("INVALID_ARGS","auth accepts only: status, login, logout")},tG=async({flags:e,client:t})=>{let r=B(await t.capture.snapshot({...e6(e),interactiveOnly:e.snapshotInteractiveOnly,compact:e.snapshotCompact,depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}));return e5(e,r,()=>(function(e,t={}){var r,n,o,s,i,a;let l,c,u,d,f,p=e.nodes,m=Array.isArray(p)?p:[],h="string"==typeof e.backend?e.backend:void 0,g=t.raw||"macos-helper"===h?null:A(m),w=!!e.truncated,v=g?.nodes??m,y=t.raw||"macos-helper"===h?null:function(e,t,r,n){let o=e.visibility;if(o&&"object"==typeof o&&"boolean"==typeof o.partial&&"number"==typeof o.visibleNodeCount&&"number"==typeof o.totalNodeCount&&Array.isArray(o.reasons))return{partial:o.partial,visibleNodeCount:o.visibleNodeCount,totalNodeCount:o.totalNodeCount,reasons:o.reasons.filter(e=>"string"==typeof e)};let s=t?.hiddenCount??0,i=!!t&&t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow);return s>0?{partial:!0,visibleNodeCount:r,totalNodeCount:n,reasons:["offscreen-nodes"]}:i?{partial:!0,visibleNodeCount:r,totalNodeCount:r,reasons:[]}:null}(e,g,v.length,m.length),I=(r=m.length,n=y,l=w?" (truncated)":"",n?.partial?n.totalNodeCount>n.visibleNodeCount?`Snapshot: ${n.visibleNodeCount} visible nodes (${n.totalNodeCount} total)${l}`:`Snapshot: ${n.visibleNodeCount} visible nodes${l}`:`Snapshot: ${r} nodes${l}`),S=(c="string"==typeof(o=e).appName?o.appName:void 0,u="string"==typeof o.appBundleId?o.appBundleId:void 0,d=[],c&&d.push(`Page: ${c}`),u&&d.push(`App: ${u}`),d.length>0?`${d.join("\n")}
21
- `:""),b=(s=e,i=m,a=t,f=eR(s),!a.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let r of e){let e=(r.type??"").toLowerCase(),n=D(r).trim().toLowerCase();if(!n)continue;let o=`${e}|${n}`;t.set(o,(t.get(o)??0)+1)}let r=0;for(let e of t.values())e>1&&(r+=e);return r>=8}(i)&&f.push("Warning: possible repeated nav subtree detected."),f),_=b.length>0?`${b.join("\n")}
22
- `:"";return 0===m.length?`${S}${I}
23
- ${_}`:t.raw?`${S}${I}
24
- ${_}${m.map(e=>JSON.stringify(e)).join("\n")}
25
- `:t.flatten?`${S}${I}
26
- ${_}${$(v,{summarizeTextSurfaces:!0}).flatMap(e=>[k(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...ex({...e,depth:0})]).join("\n")}${eA(g)}
27
- `:`${S}${I}
28
- ${_}${(function(e){let t=[],r=[],n=e=>{for(;r.length>0&&e<=r[r.length-1].depth;)t.push(...ex(r.pop(),"below"))};for(let o of e)n(o.depth),t.push(o.text),t.push(...ex(o,"above")),o.node.hiddenContentBelow&&r.push(o);return n(0),t})($(v,{summarizeTextSurfaces:!0})).join("\n")}${eA(g)}
29
- `})(r,{raw:e.snapshotRaw,flatten:e.snapshotInteractiveOnly})),!0},tF=async({positionals:e,flags:t,client:r})=>{let n=await r.capture.screenshot({path:e[0]??t.out,overlayRefs:t.overlayRefs,maxSize:t.screenshotMaxSize,...void 0!==t.screenshotFullscreen?{fullscreen:t.screenshotFullscreen}:{}});return e5(t,{path:n.path,...n.overlayRefs?{overlayRefs:n.overlayRefs}:{}},()=>n.overlayRefs?`Annotated ${n.overlayRefs.length} refs onto ${n.path}`:n.path),!0},tK=async({positionals:e,flags:r,client:n})=>{var o;if("snapshot"===e[0]){let e=await n.capture.diff({...e6(r),kind:"snapshot",out:r.out,interactiveOnly:r.snapshotInteractiveOnly,compact:r.snapshotCompact,depth:r.snapshotDepth,scope:r.snapshotScope,raw:r.snapshotRaw});return e5(r,e,()=>(function(e){var r;let n=!0===e.baselineInitialized,o=e.summary??{},s=eN(o.additions),i=eN(o.removals),a=eN(o.unchanged),l=eC(),c=eR(e),u=c.length>0?`${c.join("\n")}
30
- `:"";if(n)return`${u}Baseline initialized (${a} lines).
31
- `;let d=(function(e){if(0===e.length)return e;let t=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>"added"===e.kind||"removed"===e.kind).map(e=>e.index);if(0===t.length)return e;let r=Array(e.length).fill(!1);for(let n of t){let t=Math.max(0,n-1),o=Math.min(e.length-1,n+1);for(let e=t;e<=o;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])})(Array.isArray(e.lines)?e.lines:[]).map(e=>{let r="string"==typeof e.text?e.text:"";if("added"===e.kind){let e=r.startsWith(" ")?`+${r}`:`+ ${r}`;return l?t("green",e):e}if("removed"===e.kind){let e=r.startsWith(" ")?`-${r}`:`- ${r}`;return l?t("red",e):e}return l?t("dim",r):r}),f=d.length>0?`${d.join("\n")}
32
- `:"";if(!l)return`${u}${f}${s} additions, ${i} removals, ${a} unchanged
33
- `;let p=`${(r=String(s),t("green",r))} additions, ${t("red",String(i))} removals, ${t("dim",String(a))} unchanged`;return`${u}${f}${p}
34
- `})(e)),!0}if("screenshot"!==e[0])return!1;let s=r.baseline;if(!s||"string"!=typeof s)throw new I("INVALID_ARGS","diff screenshot requires --baseline <path>");let i=Y(s),a="string"==typeof r.out?Y(r.out):void 0,l=e[1];if(e.length>2)throw new I("INVALID_ARGS","diff screenshot accepts at most one current screenshot path");let c=b({backend:(o=n,{platform:function(e){switch(e.platform){case"android":case"linux":case"macos":return e.platform;default:return"ios"}}(r),captureScreenshot:async(e,t,r)=>{let n=await o.capture.screenshot({path:t,session:e.session,overlayRefs:r?.overlayRefs,fullscreen:r?.fullscreen,surface:r?.surface});return{path:n.path,...n.overlayRefs?{overlayRefs:n.overlayRefs}:{}}}}),artifacts:Q(),sessions:{get:e=>({name:e}),set:()=>{}},policy:_()}),u=await c.capture.diffScreenshot({session:r.session,baseline:{kind:"path",path:i},current:l?{kind:"path",path:Y(l)}:{kind:"live"},...a?{out:{kind:"path",path:a}}:{},threshold:function(e){if(null!=e&&""!==e)return Number(e)}(r.threshold),overlayRefs:r.overlayRefs,surface:r.surface});return e5(r,u,()=>{var e,r,n,o;let s,i,a,l,c,d,f,p;return s=eC(),i=!0===u.match,a=u.dimensionMismatch,(l=[]).push(...function(e,r){if(!0===e.match){let e=r?t("green","✓"):"✓";return[`${e} Screenshots match.`]}let n=e.dimensionMismatch,o=r?t("red","✗"):"✗";if(n){let e=n.expected,t=n.actual;return[`${o} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let s=eN(e.differentPixels),i=eN(e.mismatchPercentage),a=0===i&&s>0?"<0.01":String(i),l=`${a}% pixels differ`;return[`${o} ${r?t("red",l):l}`]}(u,s)),l.push(...function(e,r,n){if(r)return[];let o=[];if(e.diffPath){let r=e_(e.diffPath),s=n?t("dim","Diff image:"):"Diff image:",i=n?t("green",r):r;o.push(` ${s} ${i}`)}if(e.currentOverlayPath){let r=e_(e.currentOverlayPath),s=n?t("dim","Current overlay:"):"Current overlay:",i=n?t("green",r):r,a=eN(e.currentOverlayRefCount),l=a>0?` (${a} refs)`:"";o.push(` ${s} ${i}${l}`)}return o}(u,i,s)),i||a||(l.push(...(e=u,r=s,c=eN(e.differentPixels),d=eN(e.totalPixels),f=r?t("red",String(c)):String(c),[` ${f} different / ${d} total pixels`])),l.push(...(n=u,o=s,0===(p=function(e){let t=[];for(let r of(e.ocr?.movementClusters??[]).slice(0,2))t.push(`text movement cluster: ${function(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),r=e.length>t.length?` +${e.length-t.length} more`:"";return`${t.join(", ")}${r}`}(r.texts)} dx=${eD(r.xRange)}px dy=${eD(r.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>["icon","toggle","chevron"].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(eb).join("; ")}`);let n=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return n.length>0&&t.push(`non-text boundaries: ${n.map(eb).join("; ")}`),t.slice(0,6)}(n)).length?[]:[` ${ek("Hints:",o)}`,...p.map(e=>` - ${e}`)])),l.push(...function(e,t){let r=Array.isArray(e.regions)?e.regions:[];if(0===r.length)return[];let n=[` ${ek("Changed regions:",t)}`];for(let e of r.slice(0,5))n.push(...function(e){let t=0===e.shareOfDiffPercentage&&e.differentPixels>0?"<0.01":String(e.shareOfDiffPercentage),r=e.rect,n=[` ${e.index}. ${e.location} x=${r.x} y=${r.y} ${r.width}x${r.height}, ${t}% of diff, change=${e.dominantChange}`],o=function(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,"number"==typeof e.densityPercentage?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,"number"==typeof e.baselineLuminance&&"number"==typeof e.currentLuminance?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>null!==e);return t.length>0?t.join(" "):null}(e);o&&n.push(` ${o}`);let s=e.currentOverlayMatches?.[0];if(s){let e=s.label?` "${s.label}"`:"";n.push(` overlaps @${s.ref}${e}, ${s.regionCoveragePercentage}% of region`)}return n}(e));return n}(u,s)),l.push(...function(e,t){let r=e.ocr?.matches??[];if(0===r.length)return[];let n=r.slice(0,8),o=[` ${ek(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${n.length}/${r.length}; px):`,t)}`,` ${ek("item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint",t)}`];for(let[e,t]of n.entries()){let r=t.delta;o.push(` ${e+1} | ${JSON.stringify(t.text)} | ${eS(r.x)},${eS(r.y)} | ${eS(r.width)},${eS(r.height)} | ${e$(t.baselineRect)} | ${e$(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?"ocr-bbox-size-change":"-"}`)}return o}(u,s)),l.push(...function(e,t){let r=e.nonTextDeltas??[];if(0===r.length)return[];let n=r.slice(0,8),o=[` ${ek(`Non-text visual deltas (showing ${n.length}/${r.length}; px):`,t)}`,` ${ek("item | region | slot | kind | bboxCurrent | nearestText",t)}`];for(let e of n)o.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:"-"} | ${e.slot} | ${e.likelyKind} | ${e$(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return o}(u,s))),`${l.join("\n")}
35
- `}),!0},tH={[et.wait]:async({positionals:e,flags:t,client:r})=>(e9(t,await r.command.wait(function(e,t){let r=C(e);if(!r)throw new I("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...e6(t),depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new I("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...tq(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...tq(r.timeoutMs)}:{...n,selector:r.selectorExpression,...tq(r.timeoutMs)}}(e,t))),!0),[et.alert]:async({positionals:e,flags:t,client:r})=>(e9(t,await r.command.alert(function(e,t){if(e.length>2)throw new I("INVALID_ARGS","alert accepts at most action and timeout arguments.");let r=function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new I("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),n=function(e,t){if(void 0===e)return;let r=Number(e);if(Number.isFinite(r))return r;throw new I("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout");return{...e6(t),...r?{action:r}:{},...void 0!==n?{timeoutMs:n}:{}}}(e,t))),!0),[et.appState]:async({flags:e,client:t})=>{let r=await t.command.appState(e6(e));return e5(e,r,()=>(function(e){if("ios"===e.platform){let t=[`Foreground app: ${e.appName??e.appBundleId??"unknown"}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join("\n")}if("android"===e.platform){let t=[`Foreground app: ${e.package??"unknown"}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join("\n")}return null})(r)),!0},[et.back]:async({flags:e,client:t})=>(e9(e,await t.command.back({...e6(e),mode:e.backMode})),!0),[et.home]:async({flags:e,client:t})=>(e9(e,await t.command.home(e6(e))),!0),[et.rotate]:async({positionals:e,flags:t,client:r})=>(e9(t,await r.command.rotate(function(e,t){if(e.length>1)throw new I("INVALID_ARGS","rotate accepts exactly one orientation argument.");return{...e6(t),orientation:N(e[0])}}(e,t))),!0),[et.appSwitcher]:async({flags:e,client:t})=>(e9(e,await t.command.appSwitcher(e6(e))),!0),[et.keyboard]:async({positionals:e,flags:t,client:r})=>(e9(t,await r.command.keyboard(function(e,t){if(e.length>1)throw new I("INVALID_ARGS","keyboard accepts at most one action argument.");let r=function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t)return t;throw new I("INVALID_ARGS","keyboard action must be status, get, or dismiss.")}(e[0]);return{...e6(t),...r?{action:r}:{}}}(e,t))),!0),[et.clipboard]:async({positionals:e,flags:t,client:r})=>{var n,o;return n=t,o=await r.command.clipboard(function(e,t){let r=e[0]?.toLowerCase();if("read"!==r&&"write"!==r)throw new I("INVALID_ARGS","clipboard requires a subcommand: read or write.");let n=e6(t);if("read"===r){if(1!==e.length)throw new I("INVALID_ARGS","clipboard read does not accept additional arguments.");return{...n,action:r}}if(e.length<2)throw new I("INVALID_ARGS","clipboard write requires text.");return{...n,action:r,text:e.slice(1).join(" ")}}(e,t)),n.json?e5(n,o):"read"===o.action?process.stdout.write(`${o.text}
36
- `):e9(n,o),!0}};function tq(e){return null===e?{}:{timeoutMs:e}}function tJ(t){let{suite:r,json:o,verbose:s,reportJunit:i}=t;return(i&&function(t,r){let o=e.dirname(t);try{n.mkdirSync(o,{recursive:!0}),n.writeFileSync(t,function(t){let r=['<?xml version="1.0" encoding="UTF-8"?>',"<testsuites>",` <testsuite name="agent-device replay suite" tests="${t.total}" failures="${t.failed}" skipped="${t.skipped}" time="${tZ(t.durationMs)}">`];for(let n of t.tests)r.push(...function(t){let r=tY(e.basename(t.file)),n=tY("."===e.dirname(t.file)?t.file:e.dirname(t.file)),o=tY(t.file),s=tZ(t.durationMs),i=[` <testcase classname="${n}" name="${r}" file="${o}" time="${s}">`];"failed"===t.status?i.push(` <failure message="${tY(t.error.message)}">${tY(function(e){let t=[e.error.message];e.error.hint&&t.push(`hint: ${e.error.hint}`),e.error.diagnosticId&&t.push(`diagnosticId: ${e.error.diagnosticId}`),e.error.logPath&&t.push(`logPath: ${e.error.logPath}`),e.artifactsDir&&t.push(`artifactsDir: ${e.artifactsDir}`);let r=e.error.details?JSON.stringify(e.error.details,null,2):void 0;return r&&t.push(`details: ${r}`),t.join("\n")}(t))}</failure>`):"skipped"===t.status&&i.push(` <skipped message="${tY(t.message)}" />`);let a=function(e){let t=[`status: ${e.status}`,`durationMs: ${e.durationMs}`];return"attempts"in e&&t.push(`attempts: ${e.attempts}`),"session"in e&&t.push(`session: ${e.session}`),"replayed"in e&&t.push(`replayed: ${e.replayed}`),"healed"in e&&t.push(`healed: ${e.healed}`),"artifactsDir"in e&&e.artifactsDir&&t.push(`artifactsDir: ${e.artifactsDir}`),"passed"===e.status&&e.attempts>1&&t.push("flaky: true"),t.join("\n")}(t);return a&&i.push(` <system-out>${tY(a)}</system-out>`),i.push(" </testcase>"),i}(n));return r.push(" </testsuite>"),r.push("</testsuites>"),`${r.join("\n")}
37
- `}(r),"utf8")}catch(r){let e=r instanceof Error?r.message:String(r);throw new I("COMMAND_FAILED",`Failed to write JUnit report to ${t}: ${e}`)}}(i,r),o)?(ey({success:!0,data:r}),function(e){return+(e.failed>0)}(r)):function(e,t={}){let r=e.tests.filter(tW);if(t.verbose)for(let t of e.tests)!function(e){if("failed"===e.status)return tz(e);let t="passed"===e.status?tW(e)?"FLAKY":"PASS":"skipped"===e.status?"SKIP":"INFO",r="attempts"in e&&e.attempts>1?` after ${e.attempts} attempts`:"",n=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`${t} ${e.file}${r}${n}
18
+ `)}}function tF(e,t){(e?.stderr??process.stderr).write(t)}function tG(e,t){if(!e)return!1;let r=Date.parse(e);return!Number.isFinite(r)||r<=(t?.()??Date.now())}function tH(e){return"string"==typeof e&&e.trim().length>0}async function tK(e){await new Promise(t=>setTimeout(t,e))}async function tq(t){let r=await tR({stateDir:t.stateDir,flags:t.flags,env:t.env,io:{env:t.env,fetch:t.fetchImpl}}),i=await tJ({cloudBaseUrl:r.cloudBaseUrl,accessToken:r.accessToken,fetchImpl:t.fetchImpl}),a=function(e){try{return s(e)}catch(r){let t=D(r);throw new N("COMMAND_FAILED","Cloud connection profile returned invalid remote config.",{generatedConfigPath:e.configPath,cause:t.message},t)}}({configPath:function(t){var r;let s=function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).filter(([,e])=>void 0!==e).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(t.profile),i=e.join(t.stateDir,"remote-connections","generated");n.mkdirSync(i,{recursive:!0,mode:448});let a=e.join(i,`cloud-${(r=s,o.createHash("sha256").update(JSON.stringify(r)).digest("hex").slice(0,16))}.json`);n.writeFileSync(a,`${JSON.stringify(s,null,2)}
19
+ `,{mode:384});try{n.chmodSync(a,384)}catch{}return a}({stateDir:t.stateDir,profile:i}),cwd:t.cwd,env:t.env});return{flags:{...tl(a.profile),...t.flags,remoteConfig:a.resolvedPath,daemonAuthToken:r.accessToken},remoteConfigPath:a.resolvedPath}}async function tJ(e){let t=e.fetchImpl??fetch,r=await t(new URL("/api/control-plane/connection-profile",e.cloudBaseUrl),{method:"GET",headers:{authorization:`Bearer ${e.accessToken}`},signal:AbortSignal.timeout(15e3)}),n=await r.text(),o={};if(n.trim())try{o=JSON.parse(n)}catch(e){throw new N("COMMAND_FAILED",`Cloud connection profile endpoint returned invalid JSON (${r.status}).`,{status:r.status},e instanceof Error?e:void 0)}if(!r.ok)throw new N("UNAUTHORIZED","Cloud connection profile endpoint rejected the request.",{status:r.status,response:o});var s=o;if(!s||"object"!=typeof s||Array.isArray(s))throw new N("COMMAND_FAILED","Cloud connection profile response is invalid.");let i=s.connection;if(!i||"object"!=typeof i)throw new N("COMMAND_FAILED","Cloud connection profile response is missing profile.");if(void 0!==i.remoteConfigProfile){var a=i.remoteConfigProfile;if(!a||"object"!=typeof a||Array.isArray(a))throw new N("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is invalid.");if(0===Object.keys(a).length)throw new N("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is empty.");return a}throw new N("COMMAND_FAILED","Cloud connection profile did not include remoteConfigProfile.")}function tz(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tW(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tZ(e){try{let t=s({configPath:e,cwd:process.cwd(),env:process.env}).profile;return!!(t.metroPublicBaseUrl||t.metroProxyBaseUrl||t.metroProjectRoot||t.metroKind)}catch{return!1}}function tY(e,t){let r=tz(e);return{connected:!0,session:e.session,tenant:e.tenant,runId:e.runId,leaseAllocated:!!e.leaseId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,platform:e.platform,target:e.target,remoteConfig:e.remoteConfigPath,remoteConfigHash:e.remoteConfigHash,daemonBaseUrlFingerprint:function(e){if(e)return o.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...r?{leasePreparation:r}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}function tX(t){let{suite:r,json:o,verbose:s,reportJunit:i}=t;return(i&&function(t,r){let o=e.dirname(t);try{n.mkdirSync(o,{recursive:!0}),n.writeFileSync(t,function(t){let r=['<?xml version="1.0" encoding="UTF-8"?>',"<testsuites>",` <testsuite name="agent-device replay suite" tests="${t.total}" failures="${t.failed}" skipped="${t.skipped}" time="${t1(t.durationMs)}">`];for(let n of t.tests)r.push(...function(t){let r=t2(e.basename(t.file)),n=t2("."===e.dirname(t.file)?t.file:e.dirname(t.file)),o=t2(t.file),s=t1(t.durationMs),i=[` <testcase classname="${n}" name="${r}" file="${o}" time="${s}">`];"failed"===t.status?i.push(` <failure message="${t2(t.error.message)}">${t2(function(e){let t=[e.error.message];e.error.hint&&t.push(`hint: ${e.error.hint}`),e.error.diagnosticId&&t.push(`diagnosticId: ${e.error.diagnosticId}`),e.error.logPath&&t.push(`logPath: ${e.error.logPath}`),e.artifactsDir&&t.push(`artifactsDir: ${e.artifactsDir}`);let r=e.error.details?JSON.stringify(e.error.details,null,2):void 0;return r&&t.push(`details: ${r}`),t.join("\n")}(t))}</failure>`):"skipped"===t.status&&i.push(` <skipped message="${t2(t.message)}" />`);let a=function(e){let t=[`status: ${e.status}`,`durationMs: ${e.durationMs}`];return"attempts"in e&&t.push(`attempts: ${e.attempts}`),"session"in e&&t.push(`session: ${e.session}`),"replayed"in e&&t.push(`replayed: ${e.replayed}`),"healed"in e&&t.push(`healed: ${e.healed}`),"artifactsDir"in e&&e.artifactsDir&&t.push(`artifactsDir: ${e.artifactsDir}`),"passed"===e.status&&e.attempts>1&&t.push("flaky: true"),t.join("\n")}(t);return a&&i.push(` <system-out>${t2(a)}</system-out>`),i.push(" </testcase>"),i}(n));return r.push(" </testsuite>"),r.push("</testsuites>"),`${r.join("\n")}
20
+ `}(r),"utf8")}catch(r){let e=r instanceof Error?r.message:String(r);throw new N("COMMAND_FAILED",`Failed to write JUnit report to ${t}: ${e}`)}}(i,r),o)?(eH({success:!0,data:r}),function(e){return+(e.failed>0)}(r)):function(e,t={}){let r=e.tests.filter(t0);if(t.verbose)for(let t of e.tests)!function(e){if("failed"===e.status)return tQ(e);let t="passed"===e.status?t0(e)?"FLAKY":"PASS":"skipped"===e.status?"SKIP":"INFO",r="attempts"in e&&e.attempts>1?` after ${e.attempts} attempts`:"",n=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`${t} ${e.file}${r}${n}
38
21
  `),"skipped"===e.status&&process.stdout.write(` ${e.message??"skipped"}
39
- `)}(t);else{for(let t of e.failures)tz(t);for(let e of r)!function(e){let t=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`FLAKY ${e.file} after ${e.attempts} attempts${t}
22
+ `)}(t);else{for(let t of e.failures)tQ(t);for(let e of r)!function(e){let t=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`FLAKY ${e.file} after ${e.attempts} attempts${t}
40
23
  `)}(e)}let n="number"==typeof e.durationMs?e.durationMs:void 0,o=r.length>0?`, ${r.length} flaky`:"";return process.stdout.write(`Test summary: ${e.passed} passed, ${e.failed} failed${o}${void 0!==n?` in ${n}ms`:""}
41
- `),function(e){return+(e.failed>0)}(e)}(r,{verbose:s})}function tz(e){let t=e.attempts>1?` after ${e.attempts} attempts`:"",r=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`FAIL ${e.file}${t}${r}
24
+ `),function(e){return+(e.failed>0)}(e)}(r,{verbose:s})}function tQ(e){let t=e.attempts>1?` after ${e.attempts} attempts`:"",r=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`FAIL ${e.file}${t}${r}
42
25
  `),process.stdout.write(` ${e.error?.message??"Unknown test failure"}
43
26
  `),e.error?.hint&&process.stdout.write(` hint: ${e.error.hint}
44
27
  `),e.artifactsDir&&process.stdout.write(` artifacts: ${e.artifactsDir}
45
28
  `),e.error?.logPath&&process.stdout.write(` log: ${e.error.logPath}
46
29
  `),e.error?.diagnosticId&&process.stdout.write(` diagnostic: ${e.error.diagnosticId}
47
- `)}function tW(e){return"passed"===e.status&&e.attempts>1}function tZ(e){return(Math.max(0,e)/1e3).toFixed(3)}function tY(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}let tX={[et.batch]:({data:e})=>{let t="number"==typeof e.total?e.total:0,r="number"==typeof e.executed?e.executed:0,n="number"==typeof e.totalDurationMs?e.totalDurationMs:void 0;for(let o of(process.stdout.write(`Batch completed: ${r}/${t} steps${void 0!==n?` in ${n}ms`:""}
48
- `),Array.isArray(e.results)?e.results:[])){let e=function(e){var t;let r=t0(e);if(!r)return;let n="number"==typeof r.step?r.step:void 0,o="string"==typeof r.command?r.command:"step",s=!1!==r.ok,i=t0(r.data),a=t0(r.error),l=s?G(i)??o:(t=a,("string"==typeof t?.message&&t.message.length>0?t.message:null)??o),c=void 0!==n?`${n}. `:"- ",u="number"==typeof r.durationMs?r.durationMs:void 0,d=void 0!==u?` (${u}ms)`:"";return`${c}${s?"OK":"FAILED"} ${l}${d}
49
- `}(o);e&&process.stdout.write(e)}return!0},[et.get]:({positionals:e,data:t})=>{var r,n;let o;return r=e,n=t,"text"===(o=r[0])?(process.stdout.write(`${"string"==typeof n.text?n.text:""}
30
+ `)}function t0(e){return"passed"===e.status&&e.attempts>1}function t1(e){return(Math.max(0,e)/1e3).toFixed(3)}function t2(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}let t3={batch:({data:e})=>{let t="number"==typeof e.total?e.total:0,r="number"==typeof e.executed?e.executed:0,n="number"==typeof e.totalDurationMs?e.totalDurationMs:void 0;for(let o of(process.stdout.write(`Batch completed: ${r}/${t} steps${void 0!==n?` in ${n}ms`:""}
31
+ `),Array.isArray(e.results)?e.results:[])){let e=function(e){var t;let r=t4(e);if(!r)return;let n="number"==typeof r.step?r.step:void 0,o="string"==typeof r.command?r.command:"step",s=!1!==r.ok,i=t4(r.data),a=t4(r.error),l=s?z(i)??o:(t=a,("string"==typeof t?.message&&t.message.length>0?t.message:null)??o),c=void 0!==n?`${n}. `:"- ",u="number"==typeof r.durationMs?r.durationMs:void 0,d=void 0!==u?` (${u}ms)`:"";return`${c}${s?"OK":"FAILED"} ${l}${d}
32
+ `}(o);e&&process.stdout.write(e)}return!0},get:({positionals:e,data:t})=>{var r,n;let o;return r=e,n=t,"text"===(o=r[0])?(process.stdout.write(`${"string"==typeof n.text?n.text:""}
50
33
  `),!0):"attrs"===o&&(process.stdout.write(`${JSON.stringify(n.node??{},null,2)}
51
- `),!0)},[et.find]:({data:e})=>{var t;return"string"==typeof(t=e).text?(process.stdout.write(`${t.text}
34
+ `),!0)},find:({data:e})=>{var t;return"string"==typeof(t=e).text?(process.stdout.write(`${t.text}
52
35
  `),!0):"boolean"==typeof t.found?(process.stdout.write(`Found: ${t.found}
53
36
  `),!0):!!t.node&&(process.stdout.write(`${JSON.stringify(t.node,null,2)}
54
- `),!0)},[et.is]:({data:e})=>(process.stdout.write(`Passed: is ${e.predicate??"assertion"}
55
- `),!0),[et.boot]:({data:e})=>{let t=e.platform??"unknown",r=e.device??e.id??"unknown";return process.stdout.write(`Boot ready: ${r} (${t})
56
- `),!0},[et.record]:({data:e})=>{let t="string"==typeof e.outPath?e.outPath:"";return t&&process.stdout.write(`${t}
57
- `),!0},[et.logs]:({data:e,flags:t})=>((function(e,t){var r;let n="string"==typeof e.path?e.path:"";if(!n)return;process.stdout.write(`${n}
58
- `);let o=t4(e,["active","state","backend","sizeBytes"]);o&&!t.json&&process.stderr.write(`${o}
37
+ `),!0)},is:({data:e})=>(process.stdout.write(`Passed: is ${e.predicate??"assertion"}
38
+ `),!0),boot:({data:e})=>{let t=e.platform??"unknown",r=e.device??e.id??"unknown";return process.stdout.write(`Boot ready: ${r} (${t})
39
+ `),!0},record:({data:e})=>{let t="string"==typeof e.outPath?e.outPath:"";return t&&process.stdout.write(`${t}
40
+ `),!0},logs:({data:e,flags:t})=>((function(e,t){var r;let n="string"==typeof e.path?e.path:"";if(!n)return;process.stdout.write(`${n}
41
+ `);let o=re(e,["active","state","backend","sizeBytes"]);o&&!t.json&&process.stderr.write(`${o}
59
42
  `);let s=(r=e,["started","stopped","marked","cleared","restarted","removedRotatedFiles"].map(e=>{var t,n;return t=e,!0===(n=r[e])?`${t}=true`:"number"==typeof n?`${t}=${n}`:""}).filter(Boolean).join(" "));s&&!t.json&&process.stderr.write(`${s}
60
43
  `),e.hint&&!t.json&&process.stderr.write(`${e.hint}
61
- `),t.json||t6(e.notes)})(e,t),!0),[et.network]:({data:e})=>((function(e){let t="string"==typeof e.path?e.path:"";t&&process.stdout.write(`${t}
44
+ `),t.json||rt(e.notes)})(e,t),!0),network:({data:e})=>((function(e){let t="string"==typeof e.path?e.path:"";t&&process.stdout.write(`${t}
62
45
  `);let r=Array.isArray(e.entries)?e.entries:[];if(0===r.length)process.stdout.write("No recent HTTP(s) entries found.\n");else for(let e of r)!function(e){let t="string"==typeof e.method?e.method:"HTTP",r="string"==typeof e.url?e.url:"<unknown-url>",n="number"==typeof e.status?` status=${e.status}`:"",o="string"==typeof e.timestamp?`${e.timestamp} `:"",s="number"==typeof e.durationMs?` durationMs=${e.durationMs}`:"";process.stdout.write(`${o}${t} ${r}${n}${s}
63
- `),t8("headers",e.headers),t8("request",e.requestBody),t8("response",e.responseBody)}(e);let n=t4(e,["active","state","backend","include","scannedLines","matchedLines"]);n&&process.stderr.write(`${n}
64
- `),t6(e.notes)})(e),!0),[et.click]:({data:e})=>tQ(e),[et.press]:({data:e})=>tQ(e),[et.perf]:({data:e})=>((function(e){let t=t0(e.metrics),r=t0(t?.fps),n=function(e){let t=[],r=t0(e?.cpu);if(r?.available===!0){let e=t1(r.usagePercent);void 0!==e&&t.push(`CPU ${t2(e)}`)}let n=t0(e?.memory);if(n?.available===!0){let e,r=t1(n.residentMemoryKb)??t1(n.totalPssKb)??t1(n.totalRssKb);void 0!==r&&t.push(`memory ${(e=r/1024,`${e>=10?Math.round(e):e.toFixed(1)}MB`)}`)}return t.length>0?t.join(", "):void 0}(t);if(!r)return process.stdout.write(n?`Performance: ${n}
46
+ `),t7("headers",e.headers),t7("request",e.requestBody),t7("response",e.responseBody)}(e);let n=re(e,["active","state","backend","include","scannedLines","matchedLines"]);n&&process.stderr.write(`${n}
47
+ `),rt(e.notes)})(e),!0),click:({data:e})=>t8(e),press:({data:e})=>t8(e),perf:({data:e})=>((function(e){let t=t4(e.metrics),r=t4(t?.fps),n=function(e){let t=[],r=t4(e?.cpu);if(r?.available===!0){let e=t6(r.usagePercent);void 0!==e&&t.push(`CPU ${t5(e)}`)}let n=t4(e?.memory);if(n?.available===!0){let e,r=t6(n.residentMemoryKb)??t6(n.totalPssKb)??t6(n.totalRssKb);void 0!==r&&t.push(`memory ${(e=r/1024,`${e>=10?Math.round(e):e.toFixed(1)}MB`)}`)}return t.length>0?t.join(", "):void 0}(t);if(!r)return process.stdout.write(n?`Performance: ${n}
65
48
  `:"Frame health: unavailable - missing frame metric\n");if(!1===r.available){if(n)return process.stdout.write(`Performance: ${n}
66
49
  `);let e="string"==typeof r.reason&&r.reason.length>0?r.reason:"not available";return process.stdout.write(`Frame health: unavailable - ${e}
67
- `)}let o=t1(r.droppedFramePercent),s=t1(r.droppedFrameCount),i=t1(r.totalFrameCount);if(void 0===o||void 0===s)return process.stdout.write(n?`Performance: ${n}
68
- `:"Frame health: unavailable - missing dropped-frame summary\n");let a=[`dropped ${t2(o)}`];void 0!==i?a.push(`(${Math.round(s)}/${Math.round(i)} frames)`):a.push(`(${Math.round(s)} dropped frames)`);let l=t1(r.sampleWindowMs);void 0!==l&&a.push(`window ${t3(l)}`),process.stdout.write(`Frame health: ${a.join(" ")}
69
- `),function(e){var t;let r=Array.isArray(t=e.worstWindows)?t.filter(e=>!!e&&"object"==typeof e&&!Array.isArray(e)):[];if(0!==r.length)for(let e of(process.stdout.write("Worst windows:\n"),r)){let t=function(e){let t=t1(e.startOffsetMs),r=t1(e.endOffsetMs),n=t1(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let o=t1(e.worstFrameMs),s=void 0===o?"":`, worst ${t3(o)}`;return`- +${t3(t)}-+${t3(r)}: ${Math.round(n)} missed-deadline frames${s}
70
- `}(e);t&&process.stdout.write(t)}}(r)})(e),!0)};function tQ(e){let t=e.ref??"",r=e.x,n=e.y;return!!t&&"number"==typeof r&&"number"==typeof n&&(process.stdout.write(`Tapped @${t} (${r}, ${n})
71
- `),!0)}function t0(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function t1(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function t2(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function t3(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let r=Math.round(t/1e3);if(r<60)return`${r}s`;let n=Math.floor(r/60),o=r%60;return o>0?`${n}m ${o}s`:`${n}m`}function t8(e,t){"string"==typeof t&&process.stdout.write(` ${e}: ${t}
72
- `)}function t4(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")}function t6(e){if(Array.isArray(e))for(let t of e)"string"==typeof t&&t.length>0&&process.stderr.write(`${t}
73
- `)}let t5={[et.boot]:t9(et.boot,({client:e,flags:t})=>e.devices.boot({...e6(t),headless:t.headless})),[et.push]:t9(et.push,({client:e,positionals:t,flags:r})=>e.apps.push({...e6(r),app:rr(t[0],"push requires bundleOrPackage"),payload:rr(t[1],"push requires payloadOrJson")})),[et.perf]:t9(et.perf,({client:e,flags:t})=>e.observability.perf(e6(t))),[et.click]:t9(et.click,({client:e,positionals:t,flags:r})=>e.interactions.click({...re(t),...t7(r),...e6(r),count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,button:r.clickButton})),[et.get]:t9(et.get,({client:e,positionals:t,flags:r})=>e.interactions.get({...function(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ")||void 0};let t=e.join(" ").trim();if(!t)throw new I("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(t.slice(1)),...t7(r),...e6(r),format:function(e){if("text"===e||"attrs"===e)return e;throw new I("INVALID_ARGS","get only supports text or attrs")}(t[0])})),[et.replay]:t9(et.replay,({client:e,positionals:t,flags:r})=>e.replay.run({...e6(r),path:rr(t[0],"replay requires path"),update:r.replayUpdate,env:r.replayEnv})),[et.test]:t9(et.test,({client:e,positionals:t,flags:r})=>(({json:r.json}).json||process.stderr.write("Running replay suite...\n"),e.replay.test({...e6(r),paths:t,update:r.replayUpdate,env:r.replayEnv,failFast:r.failFast,timeoutMs:r.timeoutMs,retries:r.retries,artifactsDir:r.artifactsDir,reportJunit:r.reportJunit}))),[et.batch]:t9(et.batch,({client:e,flags:t})=>e.batch.run({...e6(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out})),[et.press]:t9(et.press,({client:e,positionals:t,flags:r})=>e.interactions.press({...re(t),...t7(r),...e6(r),count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap})),[et.longPress]:t9(et.longPress,({client:e,positionals:t,flags:r})=>e.interactions.longPress({...e6(r),x:Number(t[0]),y:Number(t[1]),durationMs:rn(t[2])})),[et.swipe]:t9(et.swipe,({client:e,positionals:t,flags:r})=>e.interactions.swipe({...e6(r),from:{x:Number(t[0]),y:Number(t[1])},to:{x:Number(t[2]),y:Number(t[3])},durationMs:rn(t[4]),count:r.count,pauseMs:r.pauseMs,pattern:r.pattern})),[et.focus]:t9(et.focus,({client:e,positionals:t,flags:r})=>e.interactions.focus({...e6(r),x:Number(t[0]),y:Number(t[1])})),[et.type]:t9(et.type,({client:e,positionals:t,flags:r})=>e.interactions.type({...e6(r),text:t.join(" "),delayMs:r.delayMs})),[et.fill]:t9(et.fill,({client:e,positionals:t,flags:r})=>e.interactions.fill({...function(e){if(e[0]?.startsWith("@")){let t=e.length>=3?e.slice(2).join(" "):e.slice(1).join(" ");return{ref:e[0],label:e.length>=3?e[1]:void 0,text:t}}let t=en(e,{preferTrailingValue:!0});return t?{selector:t.selectorExpression,text:t.rest.join(" ")}:{x:Number(e[0]),y:Number(e[1]),text:e.slice(2).join(" ")}}(t),...t7(r),...e6(r),delayMs:r.delayMs})),[et.scroll]:t9(et.scroll,({client:e,positionals:t,flags:r})=>e.interactions.scroll({...e6(r),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new I("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(t[0]),amount:rn(t[1]),pixels:r.pixels})),[et.pinch]:t9(et.pinch,({client:e,positionals:t,flags:r})=>e.interactions.pinch({...e6(r),scale:Number(t[0]),x:rn(t[1]),y:rn(t[2])})),[et.triggerAppEvent]:t9(et.triggerAppEvent,({client:e,positionals:t,flags:r})=>e.apps.triggerEvent({...e6(r),event:rr(t[0],"trigger-app-event requires event"),payload:t[1]?function(e,t){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}throw new I("INVALID_ARGS",`${t} must be a JSON object`)}(t[1],"trigger-app-event payload"):void 0})),[et.record]:t9(et.record,({client:e,positionals:t,flags:r})=>e.recording.record({...e6(r),action:rt(t[0],"record"),path:t[1],fps:r.fps,quality:r.quality,hideTouches:r.hideTouches})),[et.trace]:t9(et.trace,({client:e,positionals:t,flags:r})=>e.recording.trace({...e6(r),action:rt(t[0],"trace"),path:t[1]})),[et.logs]:t9(et.logs,({client:e,positionals:t,flags:r})=>e.observability.logs({...e6(r),action:function(e){if(void 0!==e){if("path"===e||"start"===e||"stop"===e||"doctor"===e||"mark"===e||"clear"===e)return e;throw new I("INVALID_ARGS","logs requires path, start, stop, doctor, mark, or clear")}}(t[0]),message:t.slice(1).join(" ")||void 0,restart:r.restart})),[et.network]:t9(et.network,({client:e,positionals:t,flags:r})=>e.observability.network({...e6(r),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new I("INVALID_ARGS","network requires dump or log")}}(t[0]),limit:rn(t[1]),include:r.networkInclude??function(e){if(void 0!==e){if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new I("INVALID_ARGS","network include mode must be summary, headers, body, or all")}}(t[2])})),[et.find]:t9(et.find,({client:e,positionals:t,flags:r})=>{var n;return e.interactions.find({...function(e){let t=function(e){if("text"===e||"label"===e||"value"===e||"role"===e||"id"===e)return e}(e[0]),r=void 0!==t,n=r?e[1]:e[0],o=r?2:1,s=e[o];if(void 0===s)return{locator:t,query:rr(n,"find requires query")};if("get"===s){let r=e[o+1];if("text"===r)return{locator:t,query:rr(n,"find requires query"),action:"getText"};if("attrs"===r)return{locator:t,query:rr(n,"find requires query"),action:"getAttrs"};throw new I("INVALID_ARGS","find get only supports text or attrs")}if("wait"===s)return{locator:t,query:rr(n,"find requires query"),action:"wait",timeoutMs:rn(e[o+1])};if("fill"===s||"type"===s)return{locator:t,query:rr(n,"find requires query"),action:s,value:e.slice(o+1).join(" ")};if("click"===s||"focus"===s||"exists"===s)return{locator:t,query:rr(n,"find requires query"),action:s};throw new I("INVALID_ARGS",`Unsupported find action: ${s}`)}(t),...{depth:(n=r).snapshotDepth,raw:n.snapshotRaw},...e6(r),first:r.findFirst,last:r.findLast})}),[et.is]:t9(et.is,({client:e,positionals:t,flags:r})=>e.interactions.is({...function(e){let t=e[0],r=en(e.slice(1),{preferTrailingValue:"text"===t});if(!r)throw new I("INVALID_ARGS","is requires a selector expression");if("text"===t)return{predicate:t,selector:r.selectorExpression,value:r.rest.join(" ")};if("visible"===t||"hidden"===t||"exists"===t||"editable"===t||"selected"===t)return{predicate:t,selector:r.selectorExpression};throw new I("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")}(t),...t7(r),...e6(r)})),[et.settings]:t9(et.settings,({client:e,positionals:t,flags:r})=>e.settings.update(function(e,t){let r=e6(t),n=e[0],o=e[1];if(("wifi"===n||"airplane"===n||"location"===n||"animations"===n)&&("on"===o||"off"===o))return{...r,setting:n,state:o};if("location"===n&&"set"===o)return{...r,setting:n,state:o,latitude:S(e[2],"latitude"),longitude:S(e[3],"longitude")};if("appearance"===n&&("light"===o||"dark"===o||"toggle"===o)||("faceid"===n||"touchid"===n)&&("match"===o||"nonmatch"===o||"enroll"===o||"unenroll"===o)||"fingerprint"===n&&("match"===o||"nonmatch"===o))return{...r,setting:n,state:o};if("permission"===n&&("grant"===o||"deny"===o||"reset"===o))return{...r,setting:n,state:o,permission:function(e){switch(e){case"camera":case"microphone":case"photos":case"contacts":case"contacts-limited":case"notifications":case"calendar":case"location":case"location-always":case"media-library":case"motion":case"reminders":case"siri":case"accessibility":case"screen-recording":case"input-monitoring":return e;default:throw new I("INVALID_ARGS","settings permission requires a permission target.")}}(e[2]),mode:function(e){if(void 0===e||"full"===e||"limited"===e)return e;throw new I("INVALID_ARGS","settings permission mode must be full or limited.")}(e[3])};throw new I("INVALID_ARGS","Invalid settings arguments.")}(t,r)))};function t9(e,t){return async({positionals:r,flags:n,client:o})=>{let s=await t({client:o,positionals:r,flags:n}),i=function(e,t,r,n){if(r.json){var o,s,i;return o=e,s=r,i=n,o===et.test?tJ({suite:i,json:!0,reportJunit:s.reportJunit}):(ey({success:!0,data:i}),0)}if(e===et.test)return tJ({suite:n,verbose:r.verbose,reportJunit:r.reportJunit});let a=tX[e];if(a?.({positionals:t,flags:r,data:n}))return 0;let l=G(n);return l&&process.stdout.write(`${l}
74
- `),0}(e,r,n,s);return 0!==i&&process.exit(i),!0}}function t7(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function re(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ")||void 0};let t=en(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function rt(e,t){if("start"===e||"stop"===e)return e;throw new I("INVALID_ARGS",`${t} requires start|stop`)}function rr(e,t){if(void 0===e||""===e)throw new I("INVALID_ARGS",t);return e}function rn(e){return void 0===e?void 0:Number(e)}let ro={...{session:e7,[et.devices]:te,[et.apps]:to,"ensure-simulator":tr,metro:tn,install:tl,reinstall:tc,"install-from-source":tu,connect:tL,disconnect:tT,connection:tU,auth:tj,open:tp,close:tm,[et.snapshot]:tG,[et.screenshot]:tF,[et.diff]:tK},...tH,...t5};async function rs(e){let t=ro[e.command];return!!t&&await t(e)}function ri(e,t,r){return r||(e.push(t),"")}async function ra(e,t,r){let{flags:n}=t,o=function(e){var t;if(!e?.metroProxyBaseUrl||"android-instance"!==(t=e.leaseBackend)&&"ios-instance"!==t)return null;let r=[],n={serverBaseUrl:ri(r,"metroProxyBaseUrl",e.metroProxyBaseUrl),bearerToken:ri(r,"metroBearerToken",e.metroBearerToken),tenantId:ri(r,"tenant",e.tenant),runId:ri(r,"runId",e.runId),leaseId:ri(r,"leaseId",e.leaseId)};if(r.length>0)throw new I("INVALID_ARGS",`react-devtools remote bridge requires ${r.join(", ")}.`,{missing:r});return n}(n);if(!o)return r();let s=t.stateDir??process.cwd(),i=t.session??n?.session??"default",a=n?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;if("stop"===e[0])try{return await r()}finally{await eL({projectRoot:t.cwd??process.cwd(),stateDir:s,profileKey:a,consumerKey:i})}return await eP({projectRoot:t.cwd??process.cwd(),stateDir:s,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:i,profileKey:a,consumerKey:i,env:t.env??process.env}),await r()}async function rl(e,t={}){let r=t.cwd??process.cwd(),n=t.env??process.env,o=await ra(e,t,async()=>(await W("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:r,env:n,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode);var s,i=t.flags;return 0!==o&&"wait"===(s=e)[0]&&s.includes("--connected")&&"ios-instance"===i?.leaseBackend&&process.stderr.write("Hint: Remote iOS React DevTools connects during JavaScript startup.\nIf the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.\n"),o}function rc(e,t={}){let r=ru(t),n={...e};return r.defaultPlatform&&void 0===n.platform&&(n.platform=r.defaultPlatform),n}function ru(e){var t,r,n,o;let s,i=e.env??process.env,a=e.inheritedPlatform??e.configuredPlatform??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("ios"===t||"android"===t||"apple"===t)return t;throw new I("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(i.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??i.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:a,lockPolicy:(r=e.policyOverrides,n=i,o=l,(s=r?.sessionLock??r?.sessionLockConflicts??rd(n.AGENT_DEVICE_SESSION_LOCK)??rd(n.AGENT_DEVICE_SESSION_LOCK_CONFLICTS))||(r?.sessionLocked===!0||eo(n.AGENT_DEVICE_SESSION_LOCKED)||o?"reject":void 0))}}function rd(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new I("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}let rf={sendToDaemon:er},rp=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),rm=new Set(["connect","connection","close","disconnect","ensure-simulator","metro","session"]);async function rh(t,r=rf){let o=P(),a=es(),c=t.includes("--debug")||t.includes("--verbose")||t.includes("-v"),u=t.includes("--json"),g=function(e){for(let t=0;t<e.length;t+=1){let r=e[t];if(r.startsWith("--session=")){let e=r.slice(10).trim();return e.length>0?e:null}if("--session"===r){let r=e[t+1]?.trim();if(r&&!r.startsWith("-"))return r;break}}return null}(t)??process.env.AGENT_DEVICE_SESSION??"default";await L({session:g,requestId:o,command:t[0],debug:c},async()=>{var g,w,A,$,S,b,D,_,N,C,k,R,x,E,P,L,O;let B,V,j,G,F,H,q;try{let r,o,i,a,c,u,m,h;g={cwd:process.cwd(),env:process.env},r=function(e){let t={json:!1,help:!1,version:!1},r=null,n=[],o=[],s=!0;for(let l=0;l<e.length;l+=1){var i,a;let c=e[l];if(s&&"--"===c){s=!1;continue}if(!s){r?n.push(c):r=ev(c);continue}let u=c.startsWith("--"),d=c.startsWith("-")&&c.length>1;if(!u&&!d){r?n.push(c):r=ev(c);continue}let[m,h]=u?eh(c):[c,void 0],g=f(m);if(i=r,a=g,"react-devtools"===i&&(!a||!ep(a.key,i))){n.push(c);continue}if(!g){if(function(e,t,r){var n;if(n=r,!/^-\d+(\.\d+)?$/.test(n)||!e)return!1;let o=p(e);return!o||!!o.allowsExtraPositionals||0!==o.positionalArgs.length&&(t.length<o.positionalArgs.length||o.positionalArgs.some(e=>e.includes("?")))}(r,n,c)){r?n.push(c):r=c;continue}throw new I("INVALID_ARGS",`Unknown flag: ${m}`)}let w=function(e,t,r,n){if(void 0!==e.setValue){if(void 0!==r)throw new I("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==r)throw new I("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==r){if(0===r.trim().length)throw new I("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return void 0===n||ew(n)||!function(e){let t=e.trim();return!(!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t))&&!!(t.startsWith("./")||t.startsWith("../")||t.startsWith("~/")||t.startsWith("/")||t.includes("/")||t.includes("\\"))}(n)?{value:!0,consumeNext:!1}:{value:n,consumeNext:!0}}let o=r??n;if(void 0===o||void 0===r&&ew(o))throw new I("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:o,consumeNext:void 0===r};if("enum"===e.type){if(!e.enumValues?.includes(o))throw new I("INVALID_ARGS",`Invalid ${eg(t)}: ${o}`);return{value:o,consumeNext:void 0===r}}let s=Number(o);if(!Number.isFinite(s)||"number"==typeof e.min&&s<e.min||"number"==typeof e.max&&s>e.max)throw new I("INVALID_ARGS",`Invalid ${eg(t)}: ${o}`);return{value:Math.floor(s),consumeNext:void 0===r}}(g,m,h,e[l+1]);w.consumeNext&&(l+=1);let v=t[g.key];if(g.multiple){let e=Array.isArray(v)?[...v,w.value]:void 0===v?[w.value]:[v,w.value];t[g.key]=e}else t[g.key]=w.value;o.push({key:g.key,token:m})}return{command:r,positionals:n,flags:t,warnings:[],providedFlags:o}}(t),o=g?.env??process.env,i=g?.cwd??process.cwd(),$=r.command,a=null!==$&&(w={remoteConfig:r.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...eJ(s({configPath:w.remoteConfig,cwd:w.cwd,env:w.env}).profile),remoteConfig:w.remoteConfig}:{},m=el((c=(A={command:r.command,cwd:i,cliFlags:r.flags,env:o}).env??process.env,u=el({},function(e){let t={};for(let r of e)el(t,function(e,t){let r,o;if(!n.existsSync(e)){if(t)throw new I("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{r=n.readFileSync(e,"utf8")}catch(t){throw new I("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(r)}catch(t){throw new I("INVALID_ARGS",`Invalid JSON in config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}if(!o||"object"!=typeof o||Array.isArray(o))throw new I("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let r={};for(let[n,o]of Object.entries(e)){if("installSource"===n){r.installSource=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new I("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==ta(e.type,`${t} installSource.type`))throw new I("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=ti(ta(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return ts(r,n,e.artifact,`${t} installSource.artifact`)}(o,t);continue}let e=ef.get(n);if(!e)throw new I("INVALID_ARGS",`Unknown config key "${n}" in ${t}.`);if(!e.config.enabled)throw new I("INVALID_ARGS",`Unsupported config key "${n}" in ${t}.`);r[n]=l(em(e),o,t,n)}return r}(o,`config file ${e}`)}(r.path,r.required));return t}((S=A.cwd,b=A.cliFlags.config,D=c,(h=b??D.AGENT_DEVICE_CONFIG)?[{path:(_=h,N=S,C=D,Y(_,{cwd:N,env:C})),required:!0}]:[{path:(k=D,e.join(X("~",{env:k}),".agent-device","config.json")),required:!1},{path:e.resolve(S,"agent-device.json"),required:!1}]))),el(u,function(e,t){var r,n,o;let s={};for(let i of ed.filter(e=>e.config.enabled&&e.supportsCommand(t))){if("installSource"===i.key)continue;let t=i.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(s[i.key]=(r=t.value,n=`environment variable ${t.name}`,o=t.name,l(em(i),r,n,o)))}return s}(c,A.command))),a),B={...function(e,t){let r=t?.strictFlags??d(process.env.AGENT_DEVICE_STRICT_FLAGS),n=[...e.warnings],o=el({json:!1,help:!1,version:!1},t?.defaultFlags??{});el(o,e.flags);let s=p(e.command),i=e.providedFlags.filter(t=>!ep(t.key,e.command));if(i.length>0){var a,l;let t=i.map(e=>e.token),s=(a=e.command,l=t,a?1===l.length?`Flag ${l[0]} is not supported for command ${a}.`:`Flags ${l.join(", ")} are not supported for command ${a}.`:1===l.length?`Flag ${l[0]} requires a command that supports it.`:`Flags ${l.join(", ")} require a command that supports them.`);if(r)throw new I("INVALID_ARGS",s);for(let e of(n.push(`${s} Enable AGENT_DEVICE_STRICT_FLAGS=1 to fail fast.`),i))delete o[e.key]}for(let t of Object.keys(o))void 0!==o[t]&&(ep(t,e.command)||delete o[t]);if(function(e){if("back"===e.command&&!(new Set(e.providedFlags.filter(e=>"backMode"===e.key).map(e=>e.token)).size<=1))throw new I("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),s?.defaults)for(let[e,t]of Object.entries(s.defaults))void 0===o[e]&&(o[e]=t);if("batch"===e.command&&1!=+!!o.steps+ +!!o.stepsFile)throw new I("INVALID_ARGS","batch requires exactly one step source: --steps or --steps-file.");return function(e){if(e.flags.help)return e;if("snapshot"===e.command&&e.flags.snapshotDiff){let{snapshotDiff:t,...r}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:r,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:o,warnings:n})}(r,{strictFlags:g?.strictFlags,defaultFlags:m}),providedFlags:r.providedFlags}}catch(t){M({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=y(t,{diagnosticId:T().diagnosticId,logPath:U({force:!0})??void 0});u?ey({success:!1,error:e}):eI(e,{showDetails:c}),process.exit(1);return}for(let e of B.warnings)process.stderr.write(`Warning: ${e}
75
- `);B.flags.version&&(process.stdout.write(`${a}
76
- `),process.exit(0));let J="help"===B.command,z=B.flags.help;if(J||z){J&&B.positionals.length>1&&(eI(new I("INVALID_ARGS","help accepts at most one command.")),process.exit(1));let e=J?B.positionals[0]:B.command;e||(process.stdout.write(`${h()}
77
- `),process.exit(0));let t=m(ev(e));t&&(process.stdout.write(t),process.exit(0)),eI(new I("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${h()}
78
- `),process.exit(1)}B.command||(process.stdout.write(`${h()}
79
- `),process.exit(1));let{command:W,positionals:Z}=B,Q=new Set(B.providedFlags.map(e=>e.key));try{j=(V=ru({policyOverrides:B.flags,configuredPlatform:B.flags.platform,configuredSession:B.flags.session})).lockPolicy?{...B.flags}:rc(B.flags,{policyOverrides:B.flags,configuredPlatform:B.flags.platform,configuredSession:B.flags.session}),G=K(j.stateDir),F=j.session??"default",R={command:W,explicitFlagKeys:Q,stateDir:G.baseDir,session:F,remoteConfig:j.remoteConfig,hasResolvedSession:void 0!==j.session},q=(H="connect"===R.command||"connection"===R.command?null:function(e){let t=e.validateRemoteConfigHash??!0,r=e.remoteConfig?i({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,n=eT(e)??(e.allowActiveFallback?eG({stateDir:e.stateDir}):null);if(!n||r&&n.remoteConfigPath!==r)return null;if(t&&eB(n.remoteConfigPath)!==n.remoteConfigHash)throw new I("INVALID_ARGS","Active remote connection config changed. Run agent-device connect --force to refresh it.",{remoteConfig:n.remoteConfigPath});let o=function(e,t){try{return s({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(!1===t.validateRemoteConfigHash)return{};throw e}}(n,e);return{runtime:n.runtime,flags:{...o,remoteConfig:n.remoteConfigPath,daemonBaseUrl:n.daemon?.baseUrl??o.daemonBaseUrl,daemonTransport:n.daemon?.transport??o.daemonTransport,daemonServerMode:n.daemon?.serverMode??o.daemonServerMode,tenant:n.tenant,sessionIsolation:"tenant",runId:n.runId,leaseId:n.leaseId,leaseBackend:n.leaseBackend,session:n.session,platform:n.platform??o.platform,target:n.target??o.target}}}({stateDir:R.stateDir,session:R.session,remoteConfig:R.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!R.explicitFlagKeys.has("session")&&(!R.remoteConfig||"disconnect"===R.command||!R.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==R.command}))?function(e,t,r){let n={...e};for(let[e,o]of Object.entries(t))void 0!==o&&(r.has(e)||(n[e]=o));return n}(j,H.flags,Q):j}catch(t){let e=y(v(t),{diagnosticId:T().diagnosticId,logPath:U({force:!0})??void 0});B.flags.json?ey({success:!1,error:e}):eI(e,{showDetails:B.flags.verbose}),process.exit(1);return}let et=null;try{let e;if("react-devtools"===W){let e=await rl(Z,{flags:q,stateDir:G.baseDir,session:q.session??F,cwd:process.cwd(),env:process.env});process.exit(e);return}ea({command:W,currentVersion:a,stateDir:G.baseDir,flags:q});let t=H?.runtime,s=(e,t)=>({session:e.session??F,requestId:o,stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,tenant:e.tenant,sessionIsolation:e.sessionIsolation,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,runtime:t,lockPolicy:V.lockPolicy,lockPlatform:V.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===W){if(Z.length>0)throw new I("INVALID_ARGS","batch does not accept positional arguments.");e=function(e){let t="";if(e.steps)t=e.steps;else if(e.stepsFile)try{t=n.readFileSync(e.stepsFile,"utf8")}catch(r){let t=r instanceof Error?r.message:String(r);throw new I("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}return ei(t)}(j)}if(x=W,"auth"!==x&&"connection"!==x&&(q=(await th({command:W,flags:q,stateDir:G.baseDir,env:process.env})).flags),q.remoteConfig&&(E=W,!rm.has(E))){let n=ee(s(q,t),{transport:r.sendToDaemon}),o=await eZ({command:W,flags:q,client:n,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of rp)if(e.has(t))return!0;return!1}(Q)});q=o.flags,t=o.runtime}P={command:W,flags:q,runtime:t,explicitFlagKeys:Q,hadConnectionDefaults:!!H},!("open"===P.command&&!P.runtime&&!P.flags.bundleUrl&&!P.flags.metroHost&&!P.flags.metroPort&&!P.flags.remoteConfig&&!P.hadConnectionDefaults&&((L=P.explicitFlagKeys).has("daemonBaseUrl")||L.has("daemonTransport")||L.has("tenant")||L.has("sessionIsolation")||L.has("runId")||L.has("leaseId")||L.has("leaseBackend")))||process.stderr.write("Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.\n");let i=q.daemonBaseUrl;et=!q.verbose||q.json||i?null:function(e){try{let t=0,r=!1,o=setInterval(()=>{if(!r&&n.existsSync(e))try{let r=n.statSync(e);if(r.size<t&&(t=0),r.size<=t)return;let o=n.openSync(e,"r");try{let e=Buffer.alloc(r.size-t);n.readSync(o,e,0,e.length,t),t=r.size,e.length>0&&process.stdout.write(e.toString("utf8"))}finally{n.closeSync(o)}}catch{}},200);return()=>{r=!0,clearInterval(o)}}catch{return null}}(G.logPath);let l=ee(s(q,t),{transport:r.sendToDaemon});if("batch"===W){if(!e)throw new I("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,flags:V.lockPolicy&&void 0===j.platform?{...e.flags??{}}:rc(e.flags??{},{policyOverrides:q,configuredPlatform:q.platform,configuredSession:q.session,inheritedPlatform:q.platform})}));if(await rs({command:W,positionals:Z,flags:{...q,batchSteps:t},client:l}))return}else if("runtime"===W)throw new I("INVALID_ARGS","runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.");else if(await rs({command:W,positionals:Z,flags:q,client:l}))return;throw new I("INVALID_ARGS",`Unknown command: ${W}`)}catch(r){let e=v(r),t=y(e,{diagnosticId:T().diagnosticId,logPath:U({force:!0})??void 0});if("close"===W&&"COMMAND_FAILED"===(O=e).code&&(O.details?.kind==="daemon_startup_failed"||O.message.toLowerCase().includes("failed to start daemon")&&("string"==typeof O.details?.infoPath||"string"==typeof O.details?.lockPath))){q.json&&ey({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(q.json)ey({success:!1,error:t});else if(eI(t,{showDetails:q.verbose}),q.verbose)try{let e=G.logPath;if(n.existsSync(e)){let t=n.readFileSync(e,"utf8").split("\n"),r=t.slice(Math.max(0,t.length-200)).join("\n");r.trim().length>0&&process.stderr.write(`
50
+ `)}let o=t6(r.droppedFramePercent),s=t6(r.droppedFrameCount),i=t6(r.totalFrameCount);if(void 0===o||void 0===s)return process.stdout.write(n?`Performance: ${n}
51
+ `:"Frame health: unavailable - missing dropped-frame summary\n");let a=[`dropped ${t5(o)}`];void 0!==i?a.push(`(${Math.round(s)}/${Math.round(i)} frames)`):a.push(`(${Math.round(s)} dropped frames)`);let l=t6(r.sampleWindowMs);void 0!==l&&a.push(`window ${t9(l)}`),process.stdout.write(`Frame health: ${a.join(" ")}
52
+ `),function(e){var t;let r=Array.isArray(t=e.worstWindows)?t.filter(e=>!!e&&"object"==typeof e&&!Array.isArray(e)):[];if(0!==r.length)for(let e of(process.stdout.write("Worst windows:\n"),r)){let t=function(e){let t=t6(e.startOffsetMs),r=t6(e.endOffsetMs),n=t6(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let o=t6(e.worstFrameMs),s=void 0===o?"":`, worst ${t9(o)}`;return`- +${t9(t)}-+${t9(r)}: ${Math.round(n)} missed-deadline frames${s}
53
+ `}(e);t&&process.stdout.write(t)}}(r)})(e),!0)};function t8(e){let t=e.ref??"",r=e.x,n=e.y;return!!t&&"number"==typeof r&&"number"==typeof n&&(process.stdout.write(`Tapped @${t} (${r}, ${n})
54
+ `),!0)}function t4(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function t6(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function t5(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function t9(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let r=Math.round(t/1e3);if(r<60)return`${r}s`;let n=Math.floor(r/60),o=r%60;return o>0?`${n}m ${o}s`:`${n}m`}function t7(e,t){"string"==typeof t&&process.stdout.write(` ${e}: ${t}
55
+ `)}function re(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")}function rt(e){if(Array.isArray(e))for(let t of e)"string"==typeof t&&t.length>0&&process.stderr.write(`${t}
56
+ `)}function rr(e,t){if("start"===e||"stop"===e)return e;throw new N("INVALID_ARGS",`${t} requires start|stop`)}function rn(e,t){if(void 0===e||""===e)throw new N("INVALID_ARGS",t);return e}function ro(e){return void 0===e?void 0:Number(e)}let rs={session:async({positionals:e,flags:t,client:r})=>{if("list"!==(e[0]??"list"))throw new N("INVALID_ARGS","session only supports list");let n={sessions:(await r.sessions.list()).map(B)};return t$(t,n,()=>JSON.stringify(n,null,2)),!0},devices:async({flags:e,client:t})=>{let r=await t.devices.list(G(e));return t$(e,{devices:r.map(Q)},()=>r.map(tS).join("\n")),!0},apps:async({flags:e,client:t})=>{let r=es(e.appsFilter),n=await t.apps.list({...G(e),appsFilter:r});return t$(e,{apps:n},()=>(e.json||process.stderr.write("all"===r?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n"),n.length>0)?n.join("\n"):"all"===r?"No apps found.":"No user-installed apps found."),!0},metro:async({positionals:e,flags:t,client:r})=>{let n=(e[0]??"").toLowerCase();if("reload"===n){let e=await r.metro.reload({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs});return t$(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==n)throw new N("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new N("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");let o=await r.metro.prepare({projectRoot:t.metroProjectRoot,kind:t.metroKind,port:t.metroPreparePort,listenHost:t.metroListenHost,statusHost:t.metroStatusHost,publicBaseUrl:t.metroPublicBaseUrl,proxyBaseUrl:t.metroProxyBaseUrl,bearerToken:t.metroBearerToken,bridgeScope:t.tenant&&t.runId&&t.leaseId?{tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId}:void 0,startupTimeoutMs:t.metroStartupTimeoutMs,probeTimeoutMs:t.metroProbeTimeoutMs,reuseExisting:!t.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!t.metroNoInstallDeps&&void 0,runtimeFilePath:t.metroRuntimeFile});return t$(t,o,()=>JSON.stringify(o,null,2)),!0},install:async({positionals:e,flags:t,client:r})=>{let n=J(await t_("install",e,t,r));return tA(t,n),!0},reinstall:async({positionals:e,flags:t,client:r})=>{let n=J(await t_("reinstall",e,t,r));return tA(t,n),!0},"install-from-source":async({positionals:e,flags:t,client:r})=>{let n=X(await tN(e,t,r));return tA(t,n),!0},connect:async({flags:e,client:t})=>{var r,n,i,a;let l=W(e.stateDir).baseDir,c=e.remoteConfig?function(e){if(!e.remoteConfig)throw new N("INVALID_ARGS","connect requires --remote-config <path>.");let t=s({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env});return{flags:e,remoteConfigPath:t.resolvedPath}}(e):await tq({flags:e,stateDir:l,cwd:process.cwd(),env:process.env}),u=c.flags,d=u.tenant,f=u.runId;if(!d)throw new N("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!f)throw new N("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!u.daemonBaseUrl)throw new N("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let p=u.session?null:tn({stateDir:l}),m=u.session??p?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${o.randomBytes(3).toString("hex")}`;if(!e6({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${o.randomBytes(2).toString("hex")}`}(l),h=te(c.remoteConfigPath),g=e9(u),w=p?.session===m?p:e6({stateDir:l,session:m});if(w&&(r=w,n={flags:u,session:m,remoteConfigPath:c.remoteConfigPath,remoteConfigHash:h,desiredLeaseBackend:tg(u),daemon:g},r.remoteConfigPath!==n.remoteConfigPath||r.remoteConfigHash!==n.remoteConfigHash||r.session!==n.session||r.tenant!==n.flags.tenant||r.runId!==n.flags.runId||void 0!==n.desiredLeaseBackend&&r.leaseBackend!==n.desiredLeaseBackend||void 0!==n.flags.platform&&r.platform!==n.flags.platform||void 0!==n.flags.target&&r.target!==n.flags.target||(i=r.daemon,a=n.daemon,(i?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(i?.transport??void 0)!==(a?.transport??void 0)||(i?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!u.force)throw new N("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:m,remoteConfig:w.remoteConfigPath});let v=new Date().toISOString(),y={version:1,session:m,remoteConfigPath:c.remoteConfigPath,remoteConfigHash:h,daemon:g,tenant:d,runId:f,leaseId:w&&!u.force?w.leaseId:void 0,leaseBackend:w&&!u.force?w.leaseBackend:tg(u),platform:u.platform??(w&&!u.force?w.platform:void 0),target:u.target??(w&&!u.force?w.target:void 0),runtime:w&&!u.force?w.runtime:void 0,metro:w&&!u.force?w.metro:void 0,connectedAt:w&&!u.force?w.connectedAt:v,updatedAt:v};e5({stateDir:l,state:y}),w&&u.force&&(await tp(w.metro),await tm({stateDir:l,state:w}),await th(t,w));let I=tz(y),$=function(e,t){if(!t.runtime&&(tw(e)||tZ(t.remoteConfigPath)))return tW(t.remoteConfigPath)}(u,y);return t$(u,tY(y,$),()=>[`Connected remote session "${m}" tenant "${d}" run "${f}" ${y.leaseId?`lease ${y.leaseId}`:"lease pending"}`,I?.message,$?.message].filter(e=>!!e).join("\n")),!0},disconnect:async({flags:e,client:t})=>{let r=e.session??"default",n=W(e.stateDir).baseDir,o=e6({stateDir:n,session:r})??(e.session?null:tn({stateDir:n}));if(!o)return t$(e,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=o.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await tp(o.metro),await tm({stateDir:n,state:o});let i=!1;if(o.leaseId)try{i=(await t.leases.release({tenant:o.tenant,runId:o.runId,leaseId:o.leaseId})).released}catch{}return e7({stateDir:n,session:s}),t$(e,{connected:!1,session:s,released:i},()=>`Disconnected remote session "${s}".`),!0},connection:async({positionals:e,flags:t})=>{if("status"!==e[0])throw new N("INVALID_ARGS","connection accepts only: status");let r=t.session??"default",n=W(t.stateDir).baseDir,o=e6({stateDir:n,session:r})??(t.session?null:tn({stateDir:n}));if(!o)return t$(t,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=tz(o),i=function(e){if(!e.runtime&&tZ(e.remoteConfigPath))return tW(e.remoteConfigPath)}(o);return t$(t,tY(o,i),()=>[`Connected remote session "${o.session}".`,`tenant=${o.tenant} runId=${o.runId} leaseId=${o.leaseId??"pending"} backend=${o.leaseBackend??"pending"}`,`remoteConfig=${o.remoteConfigPath}`,o.runtime?"metro=prepared":"metro=not-prepared",s?.message,i?.message].filter(e=>!!e).join("\n")),!0},auth:async({positionals:e,flags:t})=>{let r=e[0]??"status",o=W(t.stateDir).baseDir;if("status"===r){var s;let e,r=(e=tE({stateDir:(s={stateDir:o}).stateDir}))?{authenticated:!0,source:"cli-session",sessionId:e.id,cloudBaseUrl:e.cloudBaseUrl,workspaceId:e.workspaceId,accountId:e.accountId,name:e.name,createdAt:e.createdAt,expiresAt:e.expiresAt,expired:tG(e.expiresAt,s.now)}:{authenticated:!1,source:"none"};return t$(t,r,()=>{var e;return(e=r).authenticated?["Authenticated with cloud CLI session.",`cloud=${e.cloudBaseUrl}`,`session=${e.sessionId}`,e.workspaceId?`workspace=${e.workspaceId}`:null,e.accountId?`account=${e.accountId}`:null,e.expiresAt?`expiresAt=${e.expiresAt}`:null,e.expired?"status=expired":null].filter(e=>!!e).join("\n"):"Not authenticated."}),!0}if("login"===r){let e=await tP({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return t$(t,{authenticated:!0,source:"cli-session",sessionId:e.session.id,cloudBaseUrl:e.session.cloudBaseUrl,workspaceId:e.session.workspaceId,accountId:e.session.accountId,expiresAt:e.session.expiresAt,agentTokenExpiresAt:e.expiresAt},()=>"Authenticated with cloud CLI session."),!0}if("logout"===r){let e,r=(e=tL({stateDir:o}.stateDir),!!n.existsSync(e)&&(n.rmSync(e,{force:!0}),!0));return t$(t,{authenticated:!1,removed:r},()=>r?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new N("INVALID_ARGS","auth accepts only: status, login, logout")},open:async({positionals:e,flags:t,client:r})=>{let n=q(await r.apps.open({app:e[0],url:e[1],surface:t.surface,activity:t.activity,relaunch:t.relaunch,saveScript:t.saveScript,noRecord:t.noRecord,...G(t)}));return tA(t,n),!0},close:async({positionals:e,flags:t,client:r})=>{let n=F(e[0]?await r.apps.close({app:e[0],shutdown:t.shutdown}):await r.sessions.close({shutdown:t.shutdown}));return tA(t,n),!0},snapshot:async({flags:e,client:t})=>{let r=j(await t.capture.snapshot({...G(e),interactiveOnly:e.snapshotInteractiveOnly,compact:e.snapshotCompact,depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw,forceFull:e.snapshotForceFull})),n=e.json?function(e){let{unchanged:t,...r}=e;return r}(r):r;return t$(e,n,()=>(function(e,t={}){var r,n,o,s;let i,a,l,c,f,p=e.nodes,m=Array.isArray(p)?p:[],h="string"==typeof e.backend?e.backend:void 0,w=function(e,t,r){let n;if(r.raw||!((n=e.androidSnapshot)&&"object"==typeof n&&"android-helper"===n.backend))return{nodes:t,filteredCount:0};let o=function(e){if(0===e.length)return e;let t=new Set,r=new Map;return function(e,t){for(let r of e)!r.rect||eE(r.rect)||eL(r)||ex(e,r.index,t)}(e,t),function(e,t,r){var n;let o,s,i=(s=(o=function(e){let t=null,r=0;for(let n of e){if(!n.rect||!eE(n.rect))continue;let e=n.rect.width*n.rect.height;e>r&&(t=n.rect,r=e)}return t}(n=e))?o.y+.65*o.height:-1/0,n.find(e=>!!e.rect&&!(e.rect.y<s)&&eM(e))??null);if(i?.rect)for(let n of function(e,t){let r=new Map;for(let n of e){if(!function(e,t,r){var n;let o;return!(!e.rect||!eE(e.rect)||eL(e)||eM(e)||function(e){let t=(e.type??"").toLowerCase();return t.includes("textview")||"text"===t}(e))&&(n=e.rect,o=Math.max(2*r.height,96),n.y<=r.y+r.height+o&&n.y+n.height>=r.y-o)&&null!==ej(eB(e,t))}(n,e,t))continue;let o=n.rect,s=["number"==typeof n.parentIndex?String(n.parentIndex):"root",eV(o.y+o.height/2,24),eV(o.width,24),eV(o.height,24)].join("|"),i=r.get(s);i?i.push(n):r.set(s,[n])}let n=[];for(let o of r.values())(function(e,t,r){if(e.length<3)return!1;let n=new Set;for(let r of e){let e=ej(eB(r,t));e&&n.add(e)}if(n.size<3)return!1;let o=[...e].sort((e,t)=>e.rect.x-t.rect.x),s=o[0].rect,i=o[o.length-1].rect;return i.x+i.width-s.x>=r.width})(o,e,t)&&n.push(...o);return n}(e,i.rect))eR(r,n,["likely navigation"]),ek(e,n.index,t)}(e,t,r),function(e,t){let r=new Map;for(let n of e){if(t.has(n.index)||!eF(g(n)))continue;let o="number"==typeof n.parentIndex?String(n.parentIndex):"root",s=`${o}|${g(n).trim().toLowerCase()}`,i=r.get(s);if(!i){r.set(s,n);continue}eG(i.rect,n.rect)&&ex(e,n.index,t)}}(e,t),function(e,t,r){let n=new Map;for(let i of e){var o,s;if(t.has(i.index)||!function(e){if(!e.rect||!eE(e.rect)||eL(e)||eM(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eO(t,eN)}(i))continue;let a=function(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}(g(i));if(!a)continue;let l=n.get(a);if(l&&(o=l,s=i,!t.has(o.index)&&eG(o.rect,s.rect)&&function(e,t){var r,n;return r=e,n=t,(r.parentIndex===n.parentIndex?!!(3>=Math.abs(r.index-n.index)):!!(r.parentIndex!==n.index&&n.parentIndex!==r.index&&1>=Math.abs((r.depth??0)-(n.depth??0))&&2>=Math.abs(r.index-n.index)))||function(e,t){let r=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,n=r?.index===e.index?t:r?.index===t.index?e:null;return!!r&&!!n&&eU(r,n).index===r.index}(e,t)}(o,s))){let o=function(e,t,r,n,o){let s=eU(t,r),i=s.index===t.index?r:t,a=(i.type??"").toLowerCase().includes("image")?"has image":null;return eR(o,s,[...eP(o.get(i.index)??i),...a?[a]:[]]),ex(e,i.index,n),o.get(s.index)??s}(e,l,i,t,r);n.set(a,o);continue}n.set(a,i)}}(e,t,r),e.filter(e=>!t.has(e.index)).map(e=>r.get(e.index)??e)}(t);return{nodes:o,filteredCount:t.length-o.length}}(e,m,t),v=(i="string"==typeof(r=e).appName?r.appName:void 0,a="string"==typeof r.appBundleId?r.appBundleId:void 0,l=[],i&&l.push(`Page: ${i}`),a&&l.push(`App: ${a}`),l.length>0?`${l.join("\n")}
57
+ `:""),y=function(e,t,r,n={nodes:t,filteredCount:0}){let o=e1(e);!r.raw&&n.filteredCount>0&&o.push(`Collapsed ${n.filteredCount} Android helper node${1===n.filteredCount?"":"s"} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let s=n.filteredCount>0?n.nodes:t;return!r.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let r of e){let e=(r.type??"").toLowerCase(),n=ej(g(r));if(!n)continue;let o=`${e}|${n}`;t.set(o,(t.get(o)??0)+1)}let r=0;for(let e of t.values())e>1&&(r+=e);return r>=8}(s)&&o.push("Warning: possible repeated nav subtree detected."),o}(e,m,t,w),I=y.length>0?`${y.join("\n")}
58
+ `:"",$=t.raw?null:(c=e.unchanged)&&"object"==typeof c?"number"!=typeof c.ageMs||"number"!=typeof c.nodeCount?null:{ageMs:c.ageMs,nodeCount:c.nodeCount,interactiveOnly:!0===c.interactiveOnly||void 0,scope:"string"==typeof c.scope?c.scope:void 0}:null;if($){let e;return`${v}${I}${e=function(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;return t<60?`${(Math.round(10*t)/10).toFixed(1)}m`:`${(Math.round(t/60*10)/10).toFixed(1)}h`}((n=$).ageMs),n.scope?`Scoped snapshot unchanged for scope "${n.scope}" since previous read ${e} ago.
59
+ Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`:n.interactiveOnly?`Interactive snapshot unchanged since previous read ${e} ago.
60
+ ${n.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`:`Snapshot unchanged since previous read ${e} ago.
61
+ Refs from the previous snapshot are still valid. Use --force-full to re-emit the tree, or use find/get/is for a targeted query.`}
62
+ `}let A=t.raw||"macos-helper"===h?null:u(w.nodes),S=!!e.truncated,b=A?.nodes??m,D=t.raw||"macos-helper"===h?null:function(e,t,r,n,o=0){let s,i=(s=e.visibility)&&"object"==typeof s&&"boolean"==typeof s.partial&&"number"==typeof s.visibleNodeCount&&"number"==typeof s.totalNodeCount&&Array.isArray(s.reasons)?{partial:s.partial,visibleNodeCount:s.visibleNodeCount,totalNodeCount:s.totalNodeCount,reasons:s.reasons.filter(e=>"string"==typeof e)}:null;if(0===o&&i)return i;let a=(t?.hiddenCount??0)+o,l=!!t&&t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow);return a>0?{partial:!0,visibleNodeCount:r,totalNodeCount:Math.max(n,i?.totalNodeCount??n),reasons:[...new Set([...i?.reasons??[],"offscreen-nodes"])]}:i||(l?{partial:!0,visibleNodeCount:r,totalNodeCount:r,reasons:[]}:null)}(e,A,b.length,m.length,w.filteredCount),_=(o=m.length,s=D,f=S?" (truncated)":"",s?.partial?s.totalNodeCount>s.visibleNodeCount?`Snapshot: ${s.visibleNodeCount} visible nodes (${s.totalNodeCount} total)${f}`:`Snapshot: ${s.visibleNodeCount} visible nodes${f}`:`Snapshot: ${o} nodes${f}`);return 0===m.length?`${v}${_}
63
+ ${I}`:t.raw?`${v}${_}
64
+ ${I}${m.map(e=>JSON.stringify(e)).join("\n")}
65
+ `:t.flatten?`${v}${_}
66
+ ${I}${C(b,{summarizeTextSurfaces:!0}).flatMap(e=>[d(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e2({...e,depth:0})]).join("\n")}${eq(A)}
67
+ `:`${v}${_}
68
+ ${I}${(function(e){let t=[],r=[],n=e=>{for(;r.length>0&&e<=r[r.length-1].depth;)t.push(...e2(r.pop(),"below"))};for(let o of e)n(o.depth),t.push(o.text),t.push(...e2(o,"above")),o.node.hiddenContentBelow&&r.push(o);return n(0),t})(C(b,{summarizeTextSurfaces:!0})).join("\n")}${eq(A)}
69
+ `})(n,{raw:e.snapshotRaw,flatten:e.snapshotInteractiveOnly})),!0},screenshot:async({positionals:e,flags:t,client:r})=>{let n=await r.capture.screenshot({path:e[0]??t.out,...H(t)});return t$(t,{path:n.path,...n.overlayRefs?{overlayRefs:n.overlayRefs}:{}},()=>n.overlayRefs?`Annotated ${n.overlayRefs.length} refs onto ${n.path}`:n.path),!0},diff:async({positionals:e,flags:r,client:n})=>{var o;if("snapshot"===e[0]){let e=await n.capture.diff({...G(r),kind:"snapshot",out:r.out,interactiveOnly:r.snapshotInteractiveOnly,compact:r.snapshotCompact,depth:r.snapshotDepth,scope:r.snapshotScope,raw:r.snapshotRaw});return t$(r,e,()=>(function(e){var r;let n=!0===e.baselineInitialized,o=e.summary??{},s=eX(o.additions),i=eX(o.removals),a=eX(o.unchanged),l=eQ(),c=e1(e),u=c.length>0?`${c.join("\n")}
70
+ `:"";if(n)return`${u}Baseline initialized (${a} lines).
71
+ `;let d=(function(e){if(0===e.length)return e;let t=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>"added"===e.kind||"removed"===e.kind).map(e=>e.index);if(0===t.length)return e;let r=Array(e.length).fill(!1);for(let n of t){let t=Math.max(0,n-1),o=Math.min(e.length-1,n+1);for(let e=t;e<=o;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])})(Array.isArray(e.lines)?e.lines:[]).map(e=>{let r="string"==typeof e.text?e.text:"";if("added"===e.kind){let e=r.startsWith(" ")?`+${r}`:`+ ${r}`;return l?t("green",e):e}if("removed"===e.kind){let e=r.startsWith(" ")?`-${r}`:`- ${r}`;return l?t("red",e):e}return l?t("dim",r):r}),f=d.length>0?`${d.join("\n")}
72
+ `:"";if(!l)return`${u}${f}${s} additions, ${i} removals, ${a} unchanged
73
+ `;let p=`${(r=String(s),t("green",r))} additions, ${t("red",String(i))} removals, ${t("dim",String(a))} unchanged`;return`${u}${f}${p}
74
+ `})(e)),!0}if("screenshot"!==e[0])return!1;let s=r.baseline;if(!s||"string"!=typeof s)throw new N("INVALID_ARGS","diff screenshot requires --baseline <path>");let i=el(s),a="string"==typeof r.out?el(r.out):void 0,l=e[1];if(e.length>2)throw new N("INVALID_ARGS","diff screenshot accepts at most one current screenshot path");let c=I({backend:(o=n,{platform:function(e){switch(e.platform){case"android":case"linux":case"macos":return e.platform;default:return"ios"}}(r),captureScreenshot:async(e,t,r)=>{let n=await o.capture.screenshot({path:t,session:e.session,overlayRefs:r?.overlayRefs,fullscreen:r?.fullscreen,stabilize:r?.stabilize,surface:r?.surface});return{path:n.path,...n.overlayRefs?{overlayRefs:n.overlayRefs}:{}}}}),artifacts:eu(),sessions:{get:e=>({name:e}),set:()=>{}},policy:A()}),u=await c.capture.diffScreenshot({session:r.session,baseline:{kind:"path",path:i},current:l?{kind:"path",path:el(l)}:{kind:"live"},...a?{out:{kind:"path",path:a}}:{},threshold:function(e){if(null!=e&&""!==e)return Number(e)}(r.threshold),overlayRefs:r.overlayRefs,surface:r.surface});return t$(r,u,()=>{var e,r,n,o;let s,i,a,l,c,d,f,p;return s=eQ(),i=!0===u.match,a=u.dimensionMismatch,(l=[]).push(...function(e,r){if(!0===e.match){let e=r?t("green","✓"):"✓";return[`${e} Screenshots match.`]}let n=e.dimensionMismatch,o=r?t("red","✗"):"✗";if(n){let e=n.expected,t=n.actual;return[`${o} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let s=eX(e.differentPixels),i=eX(e.mismatchPercentage),a=0===i&&s>0?"<0.01":String(i),l=`${a}% pixels differ`;return[`${o} ${r?t("red",l):l}`]}(u,s)),l.push(...function(e,r,n){if(r)return[];let o=[];if(e.diffPath){let r=eY(e.diffPath),s=n?t("dim","Diff image:"):"Diff image:",i=n?t("green",r):r;o.push(` ${s} ${i}`)}if(e.currentOverlayPath){let r=eY(e.currentOverlayPath),s=n?t("dim","Current overlay:"):"Current overlay:",i=n?t("green",r):r,a=eX(e.currentOverlayRefCount),l=a>0?` (${a} refs)`:"";o.push(` ${s} ${i}${l}`)}return o}(u,i,s)),i||a||(l.push(...(e=u,r=s,c=eX(e.differentPixels),d=eX(e.totalPixels),f=r?t("red",String(c)):String(c),[` ${f} different / ${d} total pixels`])),l.push(...(n=u,o=s,0===(p=function(e){let t=[];for(let r of(e.ocr?.movementClusters??[]).slice(0,2))t.push(`text movement cluster: ${function(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),r=e.length>t.length?` +${e.length-t.length} more`:"";return`${t.join(", ")}${r}`}(r.texts)} dx=${eZ(r.xRange)}px dy=${eZ(r.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>["icon","toggle","chevron"].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(eW).join("; ")}`);let n=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return n.length>0&&t.push(`non-text boundaries: ${n.map(eW).join("; ")}`),t.slice(0,6)}(n)).length?[]:[` ${e0("Hints:",o)}`,...p.map(e=>` - ${e}`)])),l.push(...function(e,t){let r=Array.isArray(e.regions)?e.regions:[];if(0===r.length)return[];let n=[` ${e0("Changed regions:",t)}`];for(let e of r.slice(0,5))n.push(...function(e){let t=0===e.shareOfDiffPercentage&&e.differentPixels>0?"<0.01":String(e.shareOfDiffPercentage),r=e.rect,n=[` ${e.index}. ${e.location} x=${r.x} y=${r.y} ${r.width}x${r.height}, ${t}% of diff, change=${e.dominantChange}`],o=function(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,"number"==typeof e.densityPercentage?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,"number"==typeof e.baselineLuminance&&"number"==typeof e.currentLuminance?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>null!==e);return t.length>0?t.join(" "):null}(e);o&&n.push(` ${o}`);let s=e.currentOverlayMatches?.[0];if(s){let e=s.label?` "${s.label}"`:"";n.push(` overlaps @${s.ref}${e}, ${s.regionCoveragePercentage}% of region`)}return n}(e));return n}(u,s)),l.push(...function(e,t){let r=e.ocr?.matches??[];if(0===r.length)return[];let n=r.slice(0,8),o=[` ${e0(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${n.length}/${r.length}; px):`,t)}`,` ${e0("item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint",t)}`];for(let[e,t]of n.entries()){let r=t.delta;o.push(` ${e+1} | ${JSON.stringify(t.text)} | ${ez(r.x)},${ez(r.y)} | ${ez(r.width)},${ez(r.height)} | ${eJ(t.baselineRect)} | ${eJ(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?"ocr-bbox-size-change":"-"}`)}return o}(u,s)),l.push(...function(e,t){let r=e.nonTextDeltas??[];if(0===r.length)return[];let n=r.slice(0,8),o=[` ${e0(`Non-text visual deltas (showing ${n.length}/${r.length}; px):`,t)}`,` ${e0("item | region | slot | kind | bboxCurrent | nearestText",t)}`];for(let e of n)o.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:"-"} | ${e.slot} | ${e.likelyKind} | ${eJ(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return o}(u,s))),`${l.join("\n")}
75
+ `}),!0},wait:async({positionals:e,flags:t,client:r})=>(tA(t,await r.command.wait(ee.decode(e,t))),!0),alert:async({positionals:e,flags:t,client:r})=>(tA(t,await r.command.alert(function(e,t){if(e.length>2)throw new N("INVALID_ARGS","alert accepts at most action and timeout arguments.");let r=function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new N("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),n=function(e,t){if(void 0===e)return;let r=Number(e);if(Number.isFinite(r))return r;throw new N("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout");return{...G(t),...r?{action:r}:{},...void 0!==n?{timeoutMs:n}:{}}}(e,t))),!0),appstate:async({flags:e,client:t})=>{let r=await t.command.appState(G(e));return t$(e,r,()=>(function(e){if("ios"===e.platform){let t=[`Foreground app: ${e.appName??e.appBundleId??"unknown"}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join("\n")}if("android"===e.platform){let t=[`Foreground app: ${e.package??"unknown"}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join("\n")}return null})(r)),!0},back:async({flags:e,client:t})=>(tA(e,await t.command.back({...G(e),mode:e.backMode})),!0),home:async({flags:e,client:t})=>(tA(e,await t.command.home(G(e))),!0),rotate:async({positionals:e,flags:t,client:r})=>(tA(t,await r.command.rotate(function(e,t){if(e.length>1)throw new N("INVALID_ARGS","rotate accepts exactly one orientation argument.");return{...G(t),orientation:b(e[0])}}(e,t))),!0),"app-switcher":async({flags:e,client:t})=>(tA(e,await t.command.appSwitcher(G(e))),!0),keyboard:async({positionals:e,flags:t,client:r})=>{var n;return t$(t,n=await r.command.keyboard(function(e,t){if(e.length>1)throw new N("INVALID_ARGS","keyboard accepts at most one action argument.");let r=function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t)return t;throw new N("INVALID_ARGS","keyboard action must be status, get, or dismiss.")}(e[0]);return{...G(t),...r?{action:r}:{}}}(e,t)),()=>{if("android"===n.platform&&"status"===n.action){var e;let t=[`Keyboard visible: ${!0===n.visible?"yes":"no"}`,`Input type: ${n.type??n.inputType??"unknown"}`,`Input owner: ${n.inputOwner??"unknown"}`];return n.inputMethodPackage&&t.push(`Input method: ${n.inputMethodPackage}`),n.focusedPackage&&t.push(`Focused package: ${n.focusedPackage}`),n.focusedResourceId&&t.push(`Focused resource: ${n.focusedResourceId}`),t.push(`Next action: ${(e=n.visible,"ime"===n.inputOwner?"Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.":!0===e?"Keyboard is visible and focused input appears app-owned; fill/type can proceed.":"Keyboard is hidden; focus an app field before type, or use fill with a concrete target.")}`),t.join("\n")}return z(n)}),!0},clipboard:async({positionals:e,flags:t,client:r})=>{var n,o;return n=t,o=await r.command.clipboard(function(e,t){let r=e[0]?.toLowerCase();if("read"!==r&&"write"!==r)throw new N("INVALID_ARGS","clipboard requires a subcommand: read or write.");let n=G(t);if("read"===r){if(1!==e.length)throw new N("INVALID_ARGS","clipboard read does not accept additional arguments.");return{...n,action:r}}if(e.length<2)throw new N("INVALID_ARGS","clipboard write requires text.");return{...n,action:r,text:e.slice(1).join(" ")}}(e,t)),n.json?t$(n,o):"read"===o.action?process.stdout.write(`${o.text}
76
+ `):tA(n,o),!0},...Object.fromEntries(Object.entries({boot:({client:e,flags:t})=>e.devices.boot({...G(t),headless:t.headless}),push:({client:e,positionals:t,flags:r})=>e.apps.push({...G(r),app:rn(t[0],"push requires bundleOrPackage"),payload:rn(t[1],"push requires payloadOrJson")}),perf:({client:e,flags:t})=>e.observability.perf(G(t)),click:({client:e,positionals:t,flags:r})=>e.interactions.click({...et.decode(t),...K(r),...G(r),count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,button:r.clickButton}),get:({client:e,positionals:t,flags:r})=>e.interactions.get({...V.decode(t.slice(1)),...K(r),...G(r),format:function(e){if("text"===e||"attrs"===e)return e;throw new N("INVALID_ARGS","get only supports text or attrs")}(t[0])}),replay:({client:e,positionals:t,flags:r})=>e.replay.run({...G(r),path:rn(t[0],"replay requires path"),update:r.replayUpdate,maestro:r.replayMaestro,env:r.replayEnv}),test:({client:e,positionals:t,flags:r})=>(({json:r.json}).json||process.stderr.write("Running replay suite...\n"),e.replay.test({...G(r),paths:t,update:r.replayUpdate,env:r.replayEnv,failFast:r.failFast,timeoutMs:r.timeoutMs,retries:r.retries,artifactsDir:r.artifactsDir,reportJunit:r.reportJunit})),batch:({client:e,flags:t})=>e.batch.run({...G(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),press:({client:e,positionals:t,flags:r})=>e.interactions.press({...et.decode(t),...K(r),...G(r),count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap}),longpress:({client:e,positionals:t,flags:r})=>e.interactions.longPress({...G(r),x:Number(t[0]),y:Number(t[1]),durationMs:ro(t[2])}),swipe:({client:e,positionals:t,flags:r})=>e.interactions.swipe({...G(r),from:{x:Number(t[0]),y:Number(t[1])},to:{x:Number(t[2]),y:Number(t[3])},durationMs:ro(t[4]),count:r.count,pauseMs:r.pauseMs,pattern:r.pattern}),focus:({client:e,positionals:t,flags:r})=>e.interactions.focus({...G(r),x:Number(t[0]),y:Number(t[1])}),type:async function e({client:t,positionals:r,flags:n}){let o=T.decode(r,n);return await t.interactions.type({...G(n),...o})},fill:({client:e,positionals:t,flags:r})=>{let n=er.decode(t);return e.interactions.fill({...n.target,text:n.text,...K(r),...G(r),delayMs:r.delayMs})},scroll:({client:e,positionals:t,flags:r})=>e.interactions.scroll({...G(r),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new N("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(t[0]),amount:ro(t[1]),pixels:r.pixels}),pinch:({client:e,positionals:t,flags:r})=>e.interactions.pinch({...G(r),scale:Number(t[0]),x:ro(t[1]),y:ro(t[2])}),"trigger-app-event":({client:e,positionals:t,flags:r})=>e.apps.triggerEvent({...G(r),event:rn(t[0],"trigger-app-event requires event"),payload:t[1]?function(e,t){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}throw new N("INVALID_ARGS",`${t} must be a JSON object`)}(t[1],"trigger-app-event payload"):void 0}),record:({client:e,positionals:t,flags:r})=>e.recording.record({...G(r),action:rr(t[0],"record"),path:t[1],fps:r.fps,quality:r.quality,hideTouches:r.hideTouches}),trace:({client:e,positionals:t,flags:r})=>e.recording.trace({...G(r),action:rr(t[0],"trace"),path:t[1]}),logs:({client:e,positionals:t,flags:r})=>e.observability.logs({...G(r),action:function(e){if(void 0!==e){if("path"===e||"start"===e||"stop"===e||"doctor"===e||"mark"===e||"clear"===e)return e;throw new N("INVALID_ARGS","logs requires path, start, stop, doctor, mark, or clear")}}(t[0]),message:t.slice(1).join(" ")||void 0,restart:r.restart}),network:({client:e,positionals:t,flags:r})=>e.observability.network({...G(r),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new N("INVALID_ARGS","network requires dump or log")}}(t[0]),limit:ro(t[1]),include:r.networkInclude??function(e){if(void 0!==e){if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new N("INVALID_ARGS","network include mode must be summary, headers, body, or all")}}(t[2])}),find:({client:e,positionals:t,flags:r})=>e.interactions.find(Z.decode(t,r)),is:({client:e,positionals:t,flags:r})=>e.interactions.is(Y.decode(t,r)),settings:({client:e,positionals:t,flags:r})=>e.settings.update(O.decode(t,r))}).map(([e,t])=>{var r,n;return[e,(r=e,n=t,async({positionals:e,flags:t,client:o})=>{let s=await n({client:o,positionals:e,flags:t}),i=function(e,t,r,n){if(r.json){var o,s,i;return o=e,s=r,i=n,"test"===o?tX({suite:i,json:!0,reportJunit:s.reportJunit}):(eH({success:!0,data:i}),0)}if("test"===e)return tX({suite:n,verbose:r.verbose,reportJunit:r.reportJunit});let a=t3[e];if(a?.({positionals:t,flags:r,data:n}))return 0;let l=z(n);return l&&process.stdout.write(`${l}
77
+ `),0}(r,e,t,s);return 0!==i&&process.exit(i),!0})]}))};async function ri(e){let t=rs[e.command];if(!t)return!1;let r={...e.flags};return $(e.command,r),await t({...e,flags:r})}function ra(e,t,r){return r||(e.push(t),"")}async function rl(e,t,r){let{flags:n}=t,o=function(e){var t;if(!e?.metroProxyBaseUrl||"android-instance"!==(t=e.leaseBackend)&&"ios-instance"!==t)return null;let r=[],n={serverBaseUrl:ra(r,"metroProxyBaseUrl",e.metroProxyBaseUrl),bearerToken:ra(r,"metroBearerToken",e.metroBearerToken),tenantId:ra(r,"tenant",e.tenant),runId:ra(r,"runId",e.runId),leaseId:ra(r,"leaseId",e.leaseId)};if(r.length>0)throw new N("INVALID_ARGS",`react-devtools remote bridge requires ${r.join(", ")}.`,{missing:r});return n}(n);if(!o)return r();let s=t.stateDir??process.cwd(),i=t.session??n?.session??"default",a=n?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;if("stop"===e[0])try{return await r()}finally{await e4({projectRoot:t.cwd??process.cwd(),stateDir:s,profileKey:a,consumerKey:i})}return await e8({projectRoot:t.cwd??process.cwd(),stateDir:s,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:i,profileKey:a,consumerKey:i,env:t.env??process.env}),await r()}async function rc(e,t={}){let r=t.cwd??process.cwd(),n=t.env??process.env,o=await rl(e,t,async()=>(await ei("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:r,env:n,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode);var s,i=t.flags;return 0!==o&&"wait"===(s=e)[0]&&s.includes("--connected")&&"ios-instance"===i?.leaseBackend&&process.stderr.write("Hint: Remote iOS React DevTools connects during JavaScript startup.\nIf the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.\n"),o}function ru(e,t={}){let r=rd(t),n={...e};return r.defaultPlatform&&void 0===n.platform&&(n.platform=r.defaultPlatform),n}function rd(e){var t,r,n,o;let s,i=e.env??process.env,a=e.inheritedPlatform??e.configuredPlatform??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("ios"===t||"android"===t||"apple"===t)return t;throw new N("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(i.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??i.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:a,lockPolicy:(r=e.policyOverrides,n=i,o=l,(s=r?.sessionLock??r?.sessionLockConflicts??rf(n.AGENT_DEVICE_SESSION_LOCK)??rf(n.AGENT_DEVICE_SESSION_LOCK_CONFLICTS))||(r?.sessionLocked===!0||eo(n.AGENT_DEVICE_SESSION_LOCKED)||o?"reject":void 0))}}function rf(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new N("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}let rp={sendToDaemon:ep},rm=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),rh=new Set(["connect","connection","close","disconnect","metro","session"]);async function rg(t,r=rp){let o=P(),a=ed(),c=t.includes("--debug")||t.includes("--verbose")||t.includes("-v"),u=t.includes("--json"),d=function(e){for(let t=0;t<e.length;t+=1){let r=e[t];if(r.startsWith("--session=")){let e=r.slice(10).trim();return e.length>0?e:null}if("--session"===r){let r=e[t+1]?.trim();if(r&&!r.startsWith("-"))return r;break}}return null}(t)??process.env.AGENT_DEVICE_SESSION??"default";await E({session:d,requestId:o,command:t[0],debug:c},async()=>{var d,g,w,v,y,I,A,b,C,x,k,R,P,E,T,O,B;let j,V,F,G,H,K,q;try{let r,o,i,a,c,u,h,S;d={cwd:process.cwd(),env:process.env},r=function(e){let t={json:!1,help:!1,version:!1},r=null,n=[],o=[],s=!0;for(let l=0;l<e.length;l+=1){var i,a;let c=e[l];if(s&&"--"===c){s=!1;continue}if(!s){r?n.push(c):r=eD(c);continue}let u=c.startsWith("--"),d=c.startsWith("-")&&c.length>1;if(!u&&!d){r?n.push(c):r=eD(c);continue}let[f,h]=u?eS(c):[c,void 0],g=p(f);if(i=r,a=g,"react-devtools"===i&&(!a||!e$(a.key,i))){n.push(c);continue}if(!g){if(function(e,t,r){var n;if(n=r,!/^-\d+(\.\d+)?$/.test(n)||!e)return!1;let o=m(e);return!o||!!o.allowsExtraPositionals||0!==o.positionalArgs.length&&(t.length<o.positionalArgs.length||o.positionalArgs.some(e=>e.includes("?")))}(r,n,c)){r?n.push(c):r=c;continue}throw new N("INVALID_ARGS",`Unknown flag: ${f}`)}let w=function(e,t,r,n){if(void 0!==e.setValue){if(void 0!==r)throw new N("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==r)throw new N("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==r){if(0===r.trim().length)throw new N("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return void 0===n||eC(n)||!function(e){let t=e.trim();return!(!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t))&&!!(t.startsWith("./")||t.startsWith("../")||t.startsWith("~/")||t.startsWith("/")||t.includes("/")||t.includes("\\"))}(n)?{value:!0,consumeNext:!1}:{value:n,consumeNext:!0}}let o=r??n;if(void 0===o||void 0===r&&eC(o))throw new N("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:o,consumeNext:void 0===r};if("enum"===e.type){if(!e.enumValues?.includes(o))throw new N("INVALID_ARGS",`Invalid ${eb(t)}: ${o}`);return{value:o,consumeNext:void 0===r}}let s=Number(o);if(!Number.isFinite(s)||"number"==typeof e.min&&s<e.min||"number"==typeof e.max&&s>e.max)throw new N("INVALID_ARGS",`Invalid ${eb(t)}: ${o}`);return{value:Math.floor(s),consumeNext:void 0===r}}(g,f,h,e[l+1]);w.consumeNext&&(l+=1);let v=t[g.key];if(g.multiple){let e=Array.isArray(v)?[...v,w.value]:void 0===v?[w.value]:[v,w.value];t[g.key]=e}else t[g.key]=w.value;o.push({key:g.key,token:f})}return{command:r,positionals:n,flags:t,warnings:[],providedFlags:o}}(t),o=d?.env??process.env,i=d?.cwd??process.cwd(),v=r.command,a=null!==v&&(g={remoteConfig:r.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...tl(s({configPath:g.remoteConfig,cwd:g.cwd,env:g.env}).profile),remoteConfig:g.remoteConfig}:{},h=eg((c=(w={command:r.command,cwd:i,cliFlags:r.flags,env:o}).env??process.env,u=eg({},function(e){let t={};for(let r of e)eg(t,function(e,t){let r,o;if(!n.existsSync(e)){if(t)throw new N("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{r=n.readFileSync(e,"utf8")}catch(t){throw new N("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(r)}catch(t){throw new N("INVALID_ARGS",`Invalid JSON in config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}if(!o||"object"!=typeof o||Array.isArray(o))throw new N("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let r={};for(let[n,o]of Object.entries(e)){if("installSource"===n){r.installSource=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new N("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==tD(e.type,`${t} installSource.type`))throw new N("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=tC(tD(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return tb(r,n,e.artifact,`${t} installSource.artifact`)}(o,t);continue}let e=eI.get(n);if(!e)throw new N("INVALID_ARGS",`Unknown config key "${n}" in ${t}.`);if(!e.config.enabled)throw new N("INVALID_ARGS",`Unsupported config key "${n}" in ${t}.`);r[n]=l(eA(e),o,t,n)}return r}(o,`config file ${e}`)}(r.path,r.required));return t}((y=w.cwd,I=w.cliFlags.config,A=c,(S=I??A.AGENT_DEVICE_CONFIG)?[{path:(b=S,C=y,x=A,el(b,{cwd:C,env:x})),required:!0}]:[{path:(k=A,e.join(ec("~",{env:k}),".agent-device","config.json")),required:!1},{path:e.resolve(y,"agent-device.json"),required:!1}]))),eg(u,function(e,t){var r,n,o;let s={};for(let i of ey.filter(e=>e.config.enabled&&e.supportsCommand(t))){if("installSource"===i.key)continue;let t=i.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(s[i.key]=(r=t.value,n=`environment variable ${t.name}`,o=t.name,l(eA(i),r,n,o)))}return s}(c,w.command))),a),j={...function(e,t){let r=t?.strictFlags??f(process.env.AGENT_DEVICE_STRICT_FLAGS),n=[...e.warnings],o=eg({json:!1,help:!1,version:!1},t?.defaultFlags??{});eg(o,e.flags);let s=e.providedFlags.filter(t=>!e$(t.key,e.command));if(s.length>0){var i,a;let t=s.map(e=>e.token),l=(i=e.command,a=t,i?1===a.length?`Flag ${a[0]} is not supported for command ${i}.`:`Flags ${a.join(", ")} are not supported for command ${i}.`:1===a.length?`Flag ${a[0]} requires a command that supports it.`:`Flags ${a.join(", ")} require a command that supports them.`);if(r)throw new N("INVALID_ARGS",l);for(let e of(n.push(`${l} Enable AGENT_DEVICE_STRICT_FLAGS=1 to fail fast.`),s))delete o[e.key]}for(let t of Object.keys(o))void 0!==o[t]&&(e$(t,e.command)||delete o[t]);if(function(e){if("back"===e.command&&!(new Set(e.providedFlags.filter(e=>"backMode"===e.key).map(e=>e.token)).size<=1))throw new N("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),$(e.command,o),"batch"===e.command&&1!=+!!o.steps+ +!!o.stepsFile)throw new N("INVALID_ARGS","batch requires exactly one step source: --steps or --steps-file.");return function(e){if(e.flags.help)return e;if("snapshot"===e.command&&e.flags.snapshotDiff){let{snapshotDiff:t,...r}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:r,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:o,warnings:n})}(r,{strictFlags:d?.strictFlags,defaultFlags:h}),providedFlags:r.providedFlags}}catch(t){U({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=_(t,{diagnosticId:L().diagnosticId,logPath:M({force:!0})??void 0});u?eH({success:!1,error:e}):eK(e,{showDetails:c}),process.exit(1);return}for(let e of j.warnings)process.stderr.write(`Warning: ${e}
78
+ `);j.flags.version&&(process.stdout.write(`${a}
79
+ `),process.exit(0));let J="help"===j.command,z=j.flags.help;if(J||z){J&&j.positionals.length>1&&(eK(new N("INVALID_ARGS","help accepts at most one command.")),process.exit(1));let e=J?j.positionals[0]:j.command;e||(process.stdout.write(`${S()}
80
+ `),process.exit(0));let t=h(eD(e));t&&(process.stdout.write(t),process.exit(0)),eK(new N("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${S()}
81
+ `),process.exit(1)}j.command||(process.stdout.write(`${S()}
82
+ `),process.exit(1));let{command:Z,positionals:Y}=j,X=new Set(j.providedFlags.map(e=>e.key));try{F=(V=rd({policyOverrides:j.flags,configuredPlatform:j.flags.platform,configuredSession:j.flags.session})).lockPolicy?{...j.flags}:ru(j.flags,{policyOverrides:j.flags,configuredPlatform:j.flags.platform,configuredSession:j.flags.session}),G=W(F.stateDir),H=F.session??"default",R={command:Z,explicitFlagKeys:X,stateDir:G.baseDir,session:H,remoteConfig:F.remoteConfig,hasResolvedSession:void 0!==F.session},q=(K="connect"===R.command||"connection"===R.command?null:function(e){let t=e.validateRemoteConfigHash??!0,r=e.remoteConfig?i({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,n=e6(e)??(e.allowActiveFallback?tn({stateDir:e.stateDir}):null);if(!n||r&&n.remoteConfigPath!==r)return null;if(t&&te(n.remoteConfigPath)!==n.remoteConfigHash)throw new N("INVALID_ARGS","Active remote connection config changed. Run agent-device connect --force to refresh it.",{remoteConfig:n.remoteConfigPath});let o=function(e,t){try{return s({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(!1===t.validateRemoteConfigHash)return{};throw e}}(n,e);return{runtime:n.runtime,flags:{...o,remoteConfig:n.remoteConfigPath,daemonBaseUrl:n.daemon?.baseUrl??o.daemonBaseUrl,daemonTransport:n.daemon?.transport??o.daemonTransport,daemonServerMode:n.daemon?.serverMode??o.daemonServerMode,tenant:n.tenant,sessionIsolation:"tenant",runId:n.runId,leaseId:n.leaseId,leaseBackend:n.leaseBackend,session:n.session,platform:n.platform??o.platform,target:n.target??o.target}}}({stateDir:R.stateDir,session:R.session,remoteConfig:R.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!R.explicitFlagKeys.has("session")&&(!R.remoteConfig||"disconnect"===R.command||!R.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==R.command}))?function(e,t,r){let n={...e};for(let[e,o]of Object.entries(t))void 0!==o&&(r.has(e)||(n[e]=o));return n}(F,K.flags,X):F}catch(t){let e=_(D(t),{diagnosticId:L().diagnosticId,logPath:M({force:!0})??void 0});j.flags.json?eH({success:!1,error:e}):eK(e,{showDetails:j.flags.verbose}),process.exit(1);return}let Q=null;try{let e;if("react-devtools"===Z){let e=await rc(Y,{flags:q,stateDir:G.baseDir,session:q.session??H,cwd:process.cwd(),env:process.env});process.exit(e);return}eh({command:Z,currentVersion:a,stateDir:G.baseDir,flags:q});let t=K?.runtime,s=(e,t)=>({session:e.session??H,requestId:o,stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,tenant:e.tenant,sessionIsolation:e.sessionIsolation,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,runtime:t,lockPolicy:V.lockPolicy,lockPlatform:V.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===Z){if(Y.length>0)throw new N("INVALID_ARGS","batch does not accept positional arguments.");e=function(e){let t="";if(e.steps)t=e.steps;else if(e.stepsFile)try{t=n.readFileSync(e.stepsFile,"utf8")}catch(r){let t=r instanceof Error?r.message:String(r);throw new N("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}return em(t)}(F)}if(P=Z,"auth"!==P&&"connection"!==P&&(q=(await tx({command:Z,flags:q,stateDir:G.baseDir,env:process.env})).flags),q.remoteConfig&&(E=Z,!rh.has(E))){let n=ef(s(q,t),{transport:r.sendToDaemon}),o=await td({command:Z,flags:q,client:n,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of rm)if(e.has(t))return!0;return!1}(X)});q=o.flags,t=o.runtime}T={command:Z,flags:q,runtime:t,explicitFlagKeys:X,hadConnectionDefaults:!!K},!("open"===T.command&&!T.runtime&&!T.flags.bundleUrl&&!T.flags.metroHost&&!T.flags.metroPort&&!T.flags.remoteConfig&&!T.hadConnectionDefaults&&((O=T.explicitFlagKeys).has("daemonBaseUrl")||O.has("daemonTransport")||O.has("tenant")||O.has("sessionIsolation")||O.has("runId")||O.has("leaseId")||O.has("leaseBackend")))||process.stderr.write("Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.\n");let i=q.daemonBaseUrl;Q=!q.verbose||q.json||i?null:function(e){try{let t=n.existsSync(e)?n.statSync(e).size:0,r=!1,o=setInterval(()=>{if(!r&&n.existsSync(e))try{let r=n.statSync(e);if(r.size<t&&(t=0),r.size<=t)return;let o=n.openSync(e,"r");try{let e=Buffer.alloc(r.size-t);n.readSync(o,e,0,e.length,t),t=r.size,e.length>0&&process.stdout.write(e.toString("utf8"))}finally{n.closeSync(o)}}catch{}},200);return()=>{r=!0,clearInterval(o)}}catch{return null}}(G.logPath);let l=ef(s(q,t),{transport:r.sendToDaemon});if("batch"===Z){if(!e)throw new N("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,flags:V.lockPolicy&&void 0===F.platform?{...e.flags??{}}:ru(e.flags??{},{policyOverrides:q,configuredPlatform:q.platform,configuredSession:q.session,inheritedPlatform:q.platform})}));if(await ri({command:Z,positionals:Y,flags:{...q,batchSteps:t},client:l}))return}else if("runtime"===Z)throw new N("INVALID_ARGS","runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.");else if(await ri({command:Z,positionals:Y,flags:q,client:l}))return;throw new N("INVALID_ARGS",`Unknown command: ${Z}`)}catch(r){let e=D(r),t=_(e,{diagnosticId:L().diagnosticId,logPath:M({force:!0})??void 0});if("close"===Z&&"COMMAND_FAILED"===(B=e).code&&(B.details?.kind==="daemon_startup_failed"||B.message.toLowerCase().includes("failed to start daemon")&&("string"==typeof B.details?.infoPath||"string"==typeof B.details?.lockPath))){q.json&&eH({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(q.json)eH({success:!1,error:t});else if(eK(t,{showDetails:q.verbose}),q.verbose)try{let e=G.logPath;if(n.existsSync(e)){let t=n.readFileSync(e,"utf8").split("\n"),r=t.slice(Math.max(0,t.length-200)).join("\n");r.trim().length>0&&process.stderr.write(`
80
83
  [daemon log]
81
84
  ${r}
82
- `)}}catch{}et&&et(),process.exit(1)}finally{et&&et()}})}r(process.argv[1]??"").href===import.meta.url&&rh(process.argv.slice(2)).catch(e=>{eI(y(v(e)),{showDetails:!0}),process.exit(1)});export{rh as runCli};
85
+ `)}}catch{}Q&&Q(),process.exit(1)}finally{Q&&Q()}})}r(process.argv[1]??"").href===import.meta.url&&rg(process.argv.slice(2)).catch(e=>{eK(_(D(e)),{showDetails:!0}),process.exit(1)});export{rg as runCli};