agent-device 0.15.1 → 0.15.2

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.
package/dist/src/cli.js CHANGED
@@ -1,13 +1,13 @@
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,getFlagDefinition as f,getCommandSchema as p,buildCommandUsageText as m,displayNodeLabel as h,getCliCommandNames as g,getFlagDefinitions as w,GLOBAL_FLAG_KEYS as v,createAgentDevice as y,applyCommandDefaults as I,localCommandPolicy as $,buildUsageText as A,parseDeviceRotation as b,buildSnapshotDisplayLines as S}from"./2151.js";import{asAppError as D,normalizeError as C,AppError as x}from"./9152.js";import{ensureCompanionTunnel as N,stopCompanionTunnel as _}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as k}from"./2301.js";import{createRequestId as R,withDiagnosticsScope as P,getDiagnosticsMeta as L,flushDiagnosticsToSessionFile as U,emitDiagnostic as M}from"./7599.js";import{typeCommandCodec as E,settingsCommandCodec as T,serializeSessionListEntry as B,serializeSnapshotResult as O,elementTargetCodec as j,longPressCommandCodec 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,fillCommandCodec as ee,waitCommandCodec as et,interactionTargetCodec as er}from"./3572.js";import{stopMetroTunnel as en}from"./metro.js";import{assertResolvedAppsFilter as eo}from"./1393.js";import{runCmdStreaming as es,runCmd as ei}from"./9818.js";import{resolveUserPath as ea,expandUserHomePath as el}from"./3267.js";import{createLocalArtifactAdapter as ec}from"./7719.js";import{readVersion as eu}from"./9671.js";import{createAgentDeviceClient as ed,sendToDaemon as ef}from"./9542.js";import{parseBatchStepsJson as ep}from"./1231.js";import{maybeRunUpgradeNotifier as em}from"./113.js";function eh(e,t){for(let[r,n]of Object.entries(t))void 0!==n&&(e[r]=n);return e}let eg=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),ew=new Set(["appsFilter","iosSimulatorDeviceSet","sessionLocked","sessionLockConflicts"]),ev=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 v)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:!eg.has(e),key:e},env:{names:ew.has(e)?[]:[c(e)]},supportsCommand(r){let n=t.get(e);return!!n&&(!!n.has("*")||!!r&&n.has(r))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),ey=new Map(ev.map(e=>[e.key,e]));function eI(e,t){return ey.get(e)?.supportsCommand(t)??!1}function e$(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 eA(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 eS(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?eA(e):[e,void 0];return void 0!==f(t)}function eD(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}let eC=["button","switch","checkbox","radio"],ex=["button","image","textview","view"];function eN(e,t,r){r.add(t),e_(e,t,r)}function e_(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 ek(e,t,r){let n=e.get(t.index)??t,o=[...new Set([...eR(n),...r.filter(Boolean)])];e.set(t.index,{...n,presentationHints:o})}function eR(e){return Array.isArray(e.presentationHints)?e.presentationHints:[]}function eP(e){return e.width>0&&e.height>0}function eL(e){return"number"!=typeof e.parentIndex}function eU(e){let t=(e.type??"").toLowerCase(),r=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===r}function eM(e,t){let r=eE(e);return eE(t)>r?t:e}function eE(e){let t=(e.type??"").toLowerCase(),r=0;return eT(t,eC)?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 eT(e,t){return t.some(t=>e.includes(t))}function eB(e,t){let r=h(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=h(r);if(t.trim())return t;n.push(r.index)}}return""}function eO(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||eV(t)?null:t}function ej(e,t){return Math.round(e/t)}function eV(e){return/\S+@\S+\.\S+/.test(e)}function eF(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 eG(e){process.stdout.write(`${JSON.stringify(e,null,2)}
2
- `)}function eH(e,t={}){let r=e instanceof x?C(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,getFlagDefinition as f,getCommandSchema as p,buildCommandUsageText as m,displayNodeLabel as h,getCliCommandNames as g,getFlagDefinitions as w,GLOBAL_FLAG_KEYS as v,createAgentDevice as y,applyCommandDefaults as I,localCommandPolicy as $,buildUsageText as A,parseDeviceRotation as b,buildSnapshotDisplayLines as S}from"./2151.js";import{asAppError as C,normalizeError as D,AppError as x}from"./9152.js";import{ensureCompanionTunnel as N,stopCompanionTunnel as _}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as k}from"./2301.js";import{createRequestId as R,withDiagnosticsScope as P,getDiagnosticsMeta as L,flushDiagnosticsToSessionFile as U,emitDiagnostic as M}from"./7599.js";import{typeCommandCodec as E,settingsCommandCodec as T,serializeSessionListEntry as B,serializeSnapshotResult as O,elementTargetCodec as j,longPressCommandCodec 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,fillCommandCodec as ee,waitCommandCodec as et,interactionTargetCodec as er}from"./3572.js";import{stopMetroTunnel as en}from"./metro.js";import{assertResolvedAppsFilter as eo}from"./1393.js";import{runCmdStreaming as es,runCmd as ei}from"./9818.js";import{resolveUserPath as ea,expandUserHomePath as el}from"./3267.js";import{createLocalArtifactAdapter as ec}from"./7719.js";import{readVersion as eu}from"./9671.js";import{createAgentDeviceClient as ed,sendToDaemon as ef}from"./9542.js";import{parseBatchStepsJson as ep}from"./1231.js";import{maybeRunUpgradeNotifier as em}from"./113.js";function eh(e,t){for(let[r,n]of Object.entries(t))void 0!==n&&(e[r]=n);return e}let eg=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),ew=new Set(["appsFilter","iosSimulatorDeviceSet","sessionLocked","sessionLockConflicts"]),ev=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 v)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:!eg.has(e),key:e},env:{names:ew.has(e)?[]:[c(e)]},supportsCommand(r){let n=t.get(e);return!!n&&(!!n.has("*")||!!r&&n.has(r))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),ey=new Map(ev.map(e=>[e.key,e]));function eI(e,t){return ey.get(e)?.supportsCommand(t)??!1}function e$(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 eA(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 eS(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?eA(e):[e,void 0];return void 0!==f(t)}function eC(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}function eD(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||ex(t)?null:t}function ex(e){return/\S+@\S+\.\S+/.test(e)}let eN=["button","switch","checkbox","radio"],e_=["button","image","textview","view"];function ek(e,t,r){r.add(t),eR(e,t,r)}function eR(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 eP(e,t,r){let n=e.get(t.index)??t,o=[...new Set([...eL(n),...r.filter(Boolean)])];e.set(t.index,{...n,presentationHints:o})}function eL(e){return Array.isArray(e.presentationHints)?e.presentationHints:[]}function eU(e){return e.width>0&&e.height>0}function eM(e){return"number"!=typeof e.parentIndex}function eE(e){let t=(e.type??"").toLowerCase(),r=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===r}function eT(e,t){let r=eB(e);return eB(t)>r?t:e}function eB(e){let t=(e.type??"").toLowerCase(),r=0;return eO(t,eN)?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 ej(e,t){let r=h(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=h(r);if(t.trim())return t;n.push(r.index)}}return""}function eV(e,t){return Math.round(e/t)}function eF(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 eG(e){process.stdout.write(`${JSON.stringify(e,null,2)}
2
+ `)}function eH(e,t={}){let r=e instanceof x?D(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
7
  `)}function eK(e){return e&&e.summaryLines.length>0?`
8
- ${e.summaryLines.join("\n")}`:""}function eq(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eJ(e){return e>0?`+${e}`:String(e)}function ez(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",r=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${r}`}function eW(e){return e.min===e.max?eJ(e.min):`${eJ(e.min)}..${eJ(e.max)}`}function eZ(t){let r=process.cwd(),n=e.relative(r,t);return""!==n&&(n.startsWith("..")||e.isAbsolute(n))?t:""===n?".":`.${e.sep}${n}`}function eY(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eX(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function eQ(e,r){return r?t("dim",e):e}function e0(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function e1(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 e2={slug:"react-devtools-companion",runArg:k,displayName:"React DevTools companion"};async function e3(e){return await N({...e,definition:e2,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 e8(e){return await _({...e,definition:e2})}function e6(e){var t;let r,o=te(e);if(!n.existsSync(o))return null;try{r=JSON.parse(n.readFileSync(o,"utf8"))}catch(t){return ts(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:(ts(e),null)}function e4(t){let r=te({stateDir:t.stateDir,session:t.state.session});n.mkdirSync(e.dirname(r),{recursive:!0}),to(r,t.state),to(tt(t.stateDir),{session:t.state.session})}function e5(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 e9(e){n.rmSync(te(e),{force:!0});let t=tt(e.stateDir);tn(e.stateDir)===e.session&&n.rmSync(t,{force:!0})}function e7(e){try{return o.createHash("sha256").update(n.readFileSync(e)).digest("hex")}catch(t){throw new x("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function te(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 tt(t){return e.join(t,"remote-connections",".active-session.json")}function tr(e){let t=tn(e.stateDir);return t?e6({stateDir:e.stateDir,session:t}):null}function tn(e){let t=tt(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 to(e,t){n.writeFileSync(e,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),n.chmodSync(e,384)}function ts(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}}),e9(e)}let ti=a.map(e=>e.key);function ta(e){let t={};for(let r of ti){let n=e[r];void 0!==n&&(t[r]=n)}return t}let tl=new Set(["connect","connection","close","disconnect","metro","session"]),tc=new Set(["open"]);async function tu(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={...ta(l.profile),...o,remoteConfig:l.resolvedPath},u=e6({stateDir:a,session:c.session??"default"});if(u&&u.remoteConfigPath!==l.resolvedPath)throw new x("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 x("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new x("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new x("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:e7(t),daemon:e5(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??th(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 tw(e,t)?e:void 0}(d.runtime,f.platform)??e.runtime,m=d,h=!u;if(g=n,!tl.has(g)){let e=d.leaseBackend??function(e,t){let r=th(e);if(r)return r;throw new x("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,b=e;if($.leaseBackend&&$.leaseBackend!==b)throw new x("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 x("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 x("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 tv(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,(tc.has(w)||"batch"===w&&v&&v.some(e=>{let t=e.command.trim().toLowerCase();return tc.has(t)&&void 0===e.runtime}))&&tg(f)&&(!m.leaseId&&f.leaseId&&(m={...m,leaseId:f.leaseId,leaseBackend:f.leaseBackend}),e.forceRuntimePrepare||!p||!tw(p,f.platform))){if(!m.leaseId)throw new x("INVALID_ARGS",`${n} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await td(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{e4({stateDir:a,state:m})}catch(e){throw await tf(r),e}return await tf(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 td(e,t,r,n,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new x("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new x("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 tf(e){if(e)try{await en(e)}catch{}}async function tp(e){try{await e8({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function tm(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 th(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function tg(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tw(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function tv(e,t,r){if(t.leaseId&&t.leaseBackend===r){let n=await ty(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 ty(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 x&&"UNAUTHORIZED"===n.code&&(n.details?.reason==="LEASE_NOT_FOUND"||n.details?.reason==="LEASE_EXPIRED"||n.details?.reason==="LEASE_REVOKED"))return;throw e}}function tI(e,t,r){var n;if(e.json)return void eG({success:!0,data:t});let o=r?.();o&&(n=o,process.stdout.write(n.endsWith("\n")?n:`${n}
10
- `))}function t$(e,t){tI(e,t,()=>z(t))}function tA(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 x("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:tD(r,n)}}function tS(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new x("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 x("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 x("INVALID_ARGS",`${t} must be a non-empty string.`);return r}async function tC(e,t,r,n){let o=t[0],s=t[1];if(!o||!s)throw new x("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 tx(e,t,r){let n=function(e,t){let r=e[0]?.trim();if(e.length>1)throw new x("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 x("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:o}=tS(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 x("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 x("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 x("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 x("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 tN(e){return await t_({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function t_(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tG(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tG(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||tG(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 tU({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 x("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 tR({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"login"}}async function tk(e){let t=e.env??e.io?.env??process.env;if(tG(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:tO(t)};if(tG(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:tO(t)};let r=await tU({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 x("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 tR({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 tR(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=tO(i),c=await tT({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(!tG(g.deviceCode)||!tG(g.userCode)||!tG(g.verificationUri))throw new x("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?(tV(t.io,`Opening ${c.verificationUri}...
8
+ ${e.summaryLines.join("\n")}`:""}function eq(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eJ(e){return e>0?`+${e}`:String(e)}function ez(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",r=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${r}`}function eW(e){return e.min===e.max?eJ(e.min):`${eJ(e.min)}..${eJ(e.max)}`}function eZ(t){let r=process.cwd(),n=e.relative(r,t);return""!==n&&(n.startsWith("..")||e.isAbsolute(n))?t:""===n?".":`.${e.sep}${n}`}function eY(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eX(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function eQ(e,r){return r?t("dim",e):e}function e0(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function e1(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 e2={slug:"react-devtools-companion",runArg:k,displayName:"React DevTools companion"};async function e3(e){return await N({...e,definition:e2,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 e8(e){return await _({...e,definition:e2})}function e5(e){var t;let r,o=te(e);if(!n.existsSync(o))return null;try{r=JSON.parse(n.readFileSync(o,"utf8"))}catch(t){return ts(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:(ts(e),null)}function e6(t){let r=te({stateDir:t.stateDir,session:t.state.session});n.mkdirSync(e.dirname(r),{recursive:!0}),to(r,t.state),to(tt(t.stateDir),{session:t.state.session})}function e4(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 e9(e){n.rmSync(te(e),{force:!0});let t=tt(e.stateDir);tn(e.stateDir)===e.session&&n.rmSync(t,{force:!0})}function e7(e){try{return o.createHash("sha256").update(n.readFileSync(e)).digest("hex")}catch(t){throw new x("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function te(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 tt(t){return e.join(t,"remote-connections",".active-session.json")}function tr(e){let t=tn(e.stateDir);return t?e5({stateDir:e.stateDir,session:t}):null}function tn(e){let t=tt(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 to(e,t){n.writeFileSync(e,`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8",mode:384}),n.chmodSync(e,384)}function ts(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}}),e9(e)}let ti=a.map(e=>e.key);function ta(e){let t={};for(let r of ti){let n=e[r];void 0!==n&&(t[r]=n)}return t}let tl=new Set(["connect","connection","close","disconnect","metro","session"]),tc=new Set(["open"]);async function tu(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={...ta(l.profile),...o,remoteConfig:l.resolvedPath},u=e5({stateDir:a,session:c.session??"default"});if(u&&u.remoteConfigPath!==l.resolvedPath)throw new x("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 x("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new x("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new x("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:e7(t),daemon:e4(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??th(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 tw(e,t)?e:void 0}(d.runtime,f.platform)??e.runtime,m=d,h=!u;if(g=n,!tl.has(g)){let e=d.leaseBackend??function(e,t){let r=th(e);if(r)return r;throw new x("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,b=e;if($.leaseBackend&&$.leaseBackend!==b)throw new x("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 x("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 x("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 tv(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,(tc.has(w)||"batch"===w&&v&&v.some(e=>{let t=e.command.trim().toLowerCase();return tc.has(t)&&void 0===e.runtime}))&&tg(f)&&(!m.leaseId&&f.leaseId&&(m={...m,leaseId:f.leaseId,leaseBackend:f.leaseBackend}),e.forceRuntimePrepare||!p||!tw(p,f.platform))){if(!m.leaseId)throw new x("INVALID_ARGS",`${n} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await td(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{e6({stateDir:a,state:m})}catch(e){throw await tf(r),e}return await tf(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 td(e,t,r,n,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new x("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new x("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 tf(e){if(e)try{await en(e)}catch{}}async function tp(e){try{await e8({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function tm(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 th(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function tg(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tw(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function tv(e,t,r){if(t.leaseId&&t.leaseBackend===r){let n=await ty(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 ty(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 x&&"UNAUTHORIZED"===n.code&&(n.details?.reason==="LEASE_NOT_FOUND"||n.details?.reason==="LEASE_EXPIRED"||n.details?.reason==="LEASE_REVOKED"))return;throw e}}function tI(e,t,r){var n;if(e.json)return void eG({success:!0,data:t});let o=r?.();o&&(n=o,process.stdout.write(n.endsWith("\n")?n:`${n}
10
+ `))}function t$(e,t){tI(e,t,()=>z(t))}function tA(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 x("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:tC(r,n)}}function tS(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new x("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 x("INVALID_ARGS",`${t} must use owner/repo.`);return n}function tC(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new x("INVALID_ARGS",`${t} must be a non-empty string.`);return r}async function tD(e,t,r,n){let o=t[0],s=t[1];if(!o||!s)throw new x("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 tx(e,t,r){let n=function(e,t){let r=e[0]?.trim();if(e.length>1)throw new x("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 x("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:o}=tS(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 x("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 x("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 x("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 x("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 tN(e){return await t_({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function t_(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tG(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tG(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||tG(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 tU({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 x("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 tR({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"login"}}async function tk(e){let t=e.env??e.io?.env??process.env;if(tG(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:tO(t)};if(tG(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:tO(t)};let r=await tU({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 x("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 tR({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 tR(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=tO(i),c=await tT({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(!tG(g.deviceCode)||!tG(g.userCode)||!tG(g.verificationUri))throw new x("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?(tV(t.io,`Opening ${c.verificationUri}...
11
11
  `),await tj(w,t.io)):tV(t.io,`Open this URL on your machine:
12
12
  ${v}
13
13
 
@@ -15,7 +15,7 @@ Waiting for approval for 10 minutes...
15
15
  `);let y=await tE({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(!tG(y.accessToken)||!tG(I))throw new x("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
16
  `,{mode:384});try{n.chmodSync(r,384)}catch{}}({stateDir:t.stateDir,session:A}),{accessToken:y.accessToken,expiresAt:y.expiresAt,session:A}}function tP(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||!tG(e.id)||!tG(e.cloudBaseUrl)||!tG(e.refreshCredential)||!tG(e.createdAt))return null;return e}catch{return null}}function tL(t){return e.join(t,"auth","cli-session.json")}async function tU(e){let t=tP({stateDir:e.stateDir});return!t||tF(t.expiresAt,e.io?.now)?null:{accessToken:(await tM({session:t,flags:e.flags,env:e.env,io:e.io})).accessToken,cloudBaseUrl:tO(e.env,t.cloudBaseUrl)}}async function tM(e){let t=tO(e.env,e.session.cloudBaseUrl),r=await tT({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(tG(r.accessToken))return{accessToken:r.accessToken,expiresAt:r.expiresAt};if("revoked"===r.status||"revoked"===r.error)throw new x("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 x("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 tE(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 tT({baseUrl:e.cloudBaseUrl,pathName:"/api/control-plane/device-auth/poll",body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if("approved"===t.status||tG(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 x("UNAUTHORIZED","Device authorization was not approved.",{status:t.status,error:t.error});await tH(o)}throw new x("TIMEOUT","Device authorization expired before approval.")}async function tT(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 x("COMMAND_FAILED",`Cloud auth endpoint returned invalid JSON (${r.status}).`,{status:r.status},e instanceof Error?e:void 0)}if(!r.ok)throw new x("UNAUTHORIZED","Cloud auth endpoint rejected the request.",{status:r.status,response:o});return o}function tB(e,t){let r=tO(t);return new x("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 tO(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 x("INVALID_ARGS","Invalid AGENT_DEVICE_CLOUD_BASE_URL.",{cloudBaseUrl:r},e instanceof Error?e:void 0)}}async function tj(e,t){if(t?.openBrowser)return void await t.openBrowser(e);let r=process.platform;try{"darwin"===r?await ei("open",[e],{allowFailure:!0,timeoutMs:5e3}):"win32"===r?await ei("cmd",["/c","start","",e],{allowFailure:!0,timeoutMs:5e3}):await ei("xdg-open",[e],{allowFailure:!0,timeoutMs:5e3})}catch{tV(t,`Open this URL on your machine:
17
17
  ${e}
18
- `)}}function tV(e,t){(e?.stderr??process.stderr).write(t)}function tF(e,t){if(!e)return!1;let r=Date.parse(e);return!Number.isFinite(r)||r<=(t?.()??Date.now())}function tG(e){return"string"==typeof e&&e.trim().length>0}async function tH(e){await new Promise(t=>setTimeout(t,e))}async function tK(t){let r=await tk({stateDir:t.stateDir,flags:t.flags,env:t.env,io:{env:t.env,fetch:t.fetchImpl}}),i=await tq({cloudBaseUrl:r.cloudBaseUrl,accessToken:r.accessToken,fetchImpl:t.fetchImpl}),a=function(e){try{return s(e)}catch(r){let t=D(r);throw new x("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)}
18
+ `)}}function tV(e,t){(e?.stderr??process.stderr).write(t)}function tF(e,t){if(!e)return!1;let r=Date.parse(e);return!Number.isFinite(r)||r<=(t?.()??Date.now())}function tG(e){return"string"==typeof e&&e.trim().length>0}async function tH(e){await new Promise(t=>setTimeout(t,e))}async function tK(t){let r=await tk({stateDir:t.stateDir,flags:t.flags,env:t.env,io:{env:t.env,fetch:t.fetchImpl}}),i=await tq({cloudBaseUrl:r.cloudBaseUrl,accessToken:r.accessToken,fetchImpl:t.fetchImpl}),a=function(e){try{return s(e)}catch(r){let t=C(r);throw new x("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
19
  `,{mode:384});try{n.chmodSync(a,384)}catch{}return a}({stateDir:t.stateDir,profile:i}),cwd:t.cwd,env:t.env});return{flags:{...ta(a.profile),...t.flags,remoteConfig:a.resolvedPath,daemonAuthToken:r.accessToken},remoteConfigPath:a.resolvedPath}}async function tq(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 x("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 x("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 x("COMMAND_FAILED","Cloud connection profile response is invalid.");let i=s.connection;if(!i||"object"!=typeof i)throw new x("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 x("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is invalid.");if(0===Object.keys(a).length)throw new x("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is empty.");return a}throw new x("COMMAND_FAILED","Cloud connection profile did not include remoteConfigProfile.")}function tJ(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 tz(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 tW(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 tZ(e,t){let r=tJ(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 tY(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="${t0(t.durationMs)}">`];for(let n of t.tests)r.push(...function(t){let r=t1(e.basename(t.file)),n=t1("."===e.dirname(t.file)?t.file:e.dirname(t.file)),o=t1(t.file),s=t0(t.durationMs),i=[` <testcase classname="${n}" name="${r}" file="${o}" time="${s}">`];"failed"===t.status?i.push(` <failure message="${t1(t.error.message)}">${t1(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="${t1(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>${t1(a)}</system-out>`),i.push(" </testcase>"),i}(n));return r.push(" </testsuite>"),r.push("</testsuites>"),`${r.join("\n")}
20
20
  `}(r),"utf8")}catch(r){let e=r instanceof Error?r.message:String(r);throw new x("COMMAND_FAILED",`Failed to write JUnit report to ${t}: ${e}`)}}(i,r),o)?(eG({success:!0,data:r}),function(e){return+(e.failed>0)}(r)):function(e,t={}){let r=e.tests.filter(tQ);if(t.verbose)for(let t of e.tests)!function(e){if("failed"===e.status)return tX(e);let t="passed"===e.status?tQ(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}
21
21
  `),"skipped"===e.status&&process.stdout.write(` ${e.message??"skipped"}
@@ -44,28 +44,28 @@ ${e}
44
44
  `),t.json||re(e.notes)})(e,t),!0),network:({data:e})=>((function(e){let t="string"==typeof e.path?e.path:"";t&&process.stdout.write(`${t}
45
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}
46
46
  `),t9("headers",e.headers),t9("request",e.requestBody),t9("response",e.responseBody)}(e);let n=t7(e,["active","state","backend","include","scannedLines","matchedLines"]);n&&process.stderr.write(`${n}
47
- `),re(e.notes)})(e),!0),click:({data:e})=>t3(e),press:({data:e})=>t3(e),perf:({data:e})=>((function(e){let t=t8(e.metrics),r=t8(t?.fps),n=function(e){let t=[],r=t8(e?.cpu);if(r?.available===!0){let e=t6(r.usagePercent);void 0!==e&&t.push(`CPU ${t4(e)}`)}let n=t8(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}
47
+ `),re(e.notes)})(e),!0),click:({data:e})=>t3(e),press:({data:e})=>t3(e),perf:({data:e})=>((function(e){let t=t8(e.metrics),r=t8(t?.fps),n=function(e){let t=[],r=t8(e?.cpu);if(r?.available===!0){let e=t5(r.usagePercent);void 0!==e&&t.push(`CPU ${t6(e)}`)}let n=t8(e?.memory);if(n?.available===!0){let e,r=t5(n.residentMemoryKb)??t5(n.totalPssKb)??t5(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}
48
48
  `:"Frame health: unavailable - missing frame metric\n");if(!1===r.available){if(n)return process.stdout.write(`Performance: ${n}
49
49
  `);let e="string"==typeof r.reason&&r.reason.length>0?r.reason:"not available";return process.stdout.write(`Frame health: unavailable - ${e}
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 ${t4(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 ${t5(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 ${t5(o)}`;return`- +${t5(t)}-+${t5(r)}: ${Math.round(n)} missed-deadline frames${s}
50
+ `)}let o=t5(r.droppedFramePercent),s=t5(r.droppedFrameCount),i=t5(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 ${t6(o)}`];void 0!==i?a.push(`(${Math.round(s)}/${Math.round(i)} frames)`):a.push(`(${Math.round(s)} dropped frames)`);let l=t5(r.sampleWindowMs);void 0!==l&&a.push(`window ${t4(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=t5(e.startOffsetMs),r=t5(e.endOffsetMs),n=t5(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let o=t5(e.worstFrameMs),s=void 0===o?"":`, worst ${t4(o)}`;return`- +${t4(t)}-+${t4(r)}: ${Math.round(n)} missed-deadline frames${s}
53
53
  `}(e);t&&process.stdout.write(t)}}(r)})(e),!0)};function t3(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 t8(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 t4(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function t5(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 t9(e,t){"string"==typeof t&&process.stdout.write(` ${e}: ${t}
54
+ `),!0)}function t8(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function t5(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function t6(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function t4(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 t9(e,t){"string"==typeof t&&process.stdout.write(` ${e}: ${t}
55
55
  `)}function t7(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")}function re(e){if(Array.isArray(e))for(let t of e)"string"==typeof t&&t.length>0&&process.stderr.write(`${t}
56
- `)}function rt(e,t){if("start"===e||"stop"===e)return e;throw new x("INVALID_ARGS",`${t} requires start|stop`)}function rr(e,t){if(void 0===e||""===e)throw new x("INVALID_ARGS",t);return e}function rn(e){return void 0===e?void 0:Number(e)}let ro={session:async({positionals:e,flags:t,client:r})=>{if("list"!==(e[0]??"list"))throw new x("INVALID_ARGS","session only supports list");let n={sessions:(await r.sessions.list()).map(B)};return tI(t,n,()=>JSON.stringify(n,null,2)),!0},devices:async({flags:e,client:t})=>{let r=await t.devices.list(G(e));return tI(e,{devices:r.map(Q)},()=>r.map(tA).join("\n")),!0},apps:async({flags:e,client:t})=>{let r=eo(e.appsFilter),n=await t.apps.list({...G(e),appsFilter:r});return tI(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 tI(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==n)throw new x("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new x("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 tI(t,o,()=>JSON.stringify(o,null,2)),!0},install:async({positionals:e,flags:t,client:r})=>{let n=J(await tC("install",e,t,r));return t$(t,n),!0},reinstall:async({positionals:e,flags:t,client:r})=>{let n=J(await tC("reinstall",e,t,r));return t$(t,n),!0},"install-from-source":async({positionals:e,flags:t,client:r})=>{let n=X(await tx(e,t,r));return t$(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 x("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 tK({flags:e,stateDir:l,cwd:process.cwd(),env:process.env}),u=c.flags,d=u.tenant,f=u.runId;if(!d)throw new x("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!f)throw new x("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!u.daemonBaseUrl)throw new x("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let p=u.session?null:tr({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=e7(c.remoteConfigPath),g=e5(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:th(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 x("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:th(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};e4({stateDir:l,state:y}),w&&u.force&&(await tf(w.metro),await tp({stateDir:l,state:w}),await tm(t,w));let I=tJ(y),$=function(e,t){if(!t.runtime&&(tg(e)||tW(t.remoteConfigPath)))return tz(t.remoteConfigPath)}(u,y);return tI(u,tZ(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:tr({stateDir:n}));if(!o)return tI(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 tf(o.metro),await tp({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 e9({stateDir:n,session:s}),tI(e,{connected:!1,session:s,released:i},()=>`Disconnected remote session "${s}".`),!0},connection:async({positionals:e,flags:t})=>{if("status"!==e[0])throw new x("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:tr({stateDir:n}));if(!o)return tI(t,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=tJ(o),i=function(e){if(!e.runtime&&tW(e.remoteConfigPath))return tz(e.remoteConfigPath)}(o);return tI(t,tZ(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=tP({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:tF(e.expiresAt,s.now)}:{authenticated:!1,source:"none"};return tI(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 tR({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return tI(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 tI(t,{authenticated:!1,removed:r},()=>r?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new x("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 t$(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 t$(t,n),!0},snapshot:async({flags:e,client:t})=>{let r=O(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 tI(e,n,()=>(function(e,t={}){var r,n,o,s;let i,a,l,c,f,p=e.nodes,m=Array.isArray(p)?p:[],g="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||eP(r.rect)||eL(r)||eN(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||!eP(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)&&eU(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||!eP(e.rect)||eL(e)||eU(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!==eO(eB(e,t))}(n,e,t))continue;let o=n.rect,s=["number"==typeof n.parentIndex?String(n.parentIndex):"root",ej(o.y+o.height/2,24),ej(o.width,24),ej(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=eO(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))ek(r,n,["likely navigation"]),e_(e,n.index,t)}(e,t,r),function(e,t){let r=new Map;for(let n of e){if(t.has(n.index)||!eV(h(n)))continue;let o="number"==typeof n.parentIndex?String(n.parentIndex):"root",s=`${o}|${h(n).trim().toLowerCase()}`,i=r.get(s);if(!i){r.set(s,n);continue}eF(i.rect,n.rect)&&eN(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||!eP(e.rect)||eL(e)||eU(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eT(t,ex)}(i))continue;let a=function(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}(h(i));if(!a)continue;let l=n.get(a);if(l&&(o=l,s=i,!t.has(o.index)&&eF(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&&eM(r,n).index===r.index}(e,t)}(o,s))){let o=function(e,t,r,n,o){let s=eM(t,r),i=s.index===t.index?r:t,a=(i.type??"").toLowerCase().includes("image")?"has image":null;return ek(o,s,[...eR(o.get(i.index)??i),...a?[a]:[]]),eN(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=e0(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=eO(h(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")}
56
+ `)}function rt(e,t){if("start"===e||"stop"===e)return e;throw new x("INVALID_ARGS",`${t} requires start|stop`)}function rr(e,t){if(void 0===e||""===e)throw new x("INVALID_ARGS",t);return e}function rn(e){return void 0===e?void 0:Number(e)}let ro={session:async({positionals:e,flags:t,client:r})=>{if("list"!==(e[0]??"list"))throw new x("INVALID_ARGS","session only supports list");let n={sessions:(await r.sessions.list()).map(B)};return tI(t,n,()=>JSON.stringify(n,null,2)),!0},devices:async({flags:e,client:t})=>{let r=await t.devices.list(G(e));return tI(e,{devices:r.map(Q)},()=>r.map(tA).join("\n")),!0},apps:async({flags:e,client:t})=>{let r=eo(e.appsFilter),n=await t.apps.list({...G(e),appsFilter:r});return tI(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 tI(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==n)throw new x("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new x("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 tI(t,o,()=>JSON.stringify(o,null,2)),!0},install:async({positionals:e,flags:t,client:r})=>{let n=J(await tD("install",e,t,r));return t$(t,n),!0},reinstall:async({positionals:e,flags:t,client:r})=>{let n=J(await tD("reinstall",e,t,r));return t$(t,n),!0},"install-from-source":async({positionals:e,flags:t,client:r})=>{let n=X(await tx(e,t,r));return t$(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 x("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 tK({flags:e,stateDir:l,cwd:process.cwd(),env:process.env}),u=c.flags,d=u.tenant,f=u.runId;if(!d)throw new x("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!f)throw new x("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!u.daemonBaseUrl)throw new x("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let p=u.session?null:tr({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(!e5({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${o.randomBytes(2).toString("hex")}`}(l),h=e7(c.remoteConfigPath),g=e4(u),w=p?.session===m?p:e5({stateDir:l,session:m});if(w&&(r=w,n={flags:u,session:m,remoteConfigPath:c.remoteConfigPath,remoteConfigHash:h,desiredLeaseBackend:th(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 x("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:th(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};e6({stateDir:l,state:y}),w&&u.force&&(await tf(w.metro),await tp({stateDir:l,state:w}),await tm(t,w));let I=tJ(y),$=function(e,t){if(!t.runtime&&(tg(e)||tW(t.remoteConfigPath)))return tz(t.remoteConfigPath)}(u,y);return tI(u,tZ(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=e5({stateDir:n,session:r})??(e.session?null:tr({stateDir:n}));if(!o)return tI(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 tf(o.metro),await tp({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 e9({stateDir:n,session:s}),tI(e,{connected:!1,session:s,released:i},()=>`Disconnected remote session "${s}".`),!0},connection:async({positionals:e,flags:t})=>{if("status"!==e[0])throw new x("INVALID_ARGS","connection accepts only: status");let r=t.session??"default",n=W(t.stateDir).baseDir,o=e5({stateDir:n,session:r})??(t.session?null:tr({stateDir:n}));if(!o)return tI(t,{connected:!1,session:r},()=>`No remote connection for "${r}".`),!0;let s=tJ(o),i=function(e){if(!e.runtime&&tW(e.remoteConfigPath))return tz(e.remoteConfigPath)}(o);return tI(t,tZ(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=tP({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:tF(e.expiresAt,s.now)}:{authenticated:!1,source:"none"};return tI(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 tR({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return tI(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 tI(t,{authenticated:!1,removed:r},()=>r?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new x("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,launchConsole:t.launchConsole,relaunch:t.relaunch,saveScript:t.saveScript,noRecord:t.noRecord,...G(t)}));return t$(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 t$(t,n),!0},snapshot:async({flags:e,client:t})=>{let r=O(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 tI(e,n,()=>(function(e,t={}){var r,n,o,s;let i,a,l,c,f,p=e.nodes,m=Array.isArray(p)?p:[],g="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||eU(r.rect)||eM(r)||ek(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||!eU(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)&&eE(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||!eU(e.rect)||eM(e)||eE(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!==eD(ej(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=eD(ej(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))eP(r,n,["likely navigation"]),eR(e,n.index,t)}(e,t,r),function(e,t){let r=new Map;for(let n of e){if(t.has(n.index)||!ex(h(n)))continue;let o="number"==typeof n.parentIndex?String(n.parentIndex):"root",s=`${o}|${h(n).trim().toLowerCase()}`,i=r.get(s);if(!i){r.set(s,n);continue}eF(i.rect,n.rect)&&ek(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||!eU(e.rect)||eM(e)||eE(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eO(t,e_)}(i))continue;let a=function(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}(h(i));if(!a)continue;let l=n.get(a);if(l&&(o=l,s=i,!t.has(o.index)&&eF(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&&eT(r,n).index===r.index}(e,t)}(o,s))){let o=function(e,t,r,n,o){let s=eT(t,r),i=s.index===t.index?r:t,a=(i.type??"").toLowerCase().includes("image")?"has image":null;return eP(o,s,[...eL(o.get(i.index)??i),...a?[a]:[]]),ek(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=e0(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=eD(h(r));if(!n)continue;let o=`${e}|${n}`,s=t.get(o)??[];s.push(r),t.set(o,s)}let r=0;for(let e of t.values())!(e.length<=1)&&function(e){for(let n=0;n<e.length;n+=1)for(let o=n+1;o<e.length;o+=1){var t,r;if(t=e[n]?.rect,r=e[o]?.rect,!t||!r||!(t.x+t.width<=r.x+.5||r.x+r.width<=t.x+.5||t.y+t.height<=r.y+.5||r.y+r.height<=t.y+.5))return!0}return!1}(e)&&(r+=e.length);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
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
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
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
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"===g?null:u(w.nodes),b=!!e.truncated,D=A?.nodes??m,C=t.raw||"macos-helper"===g?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,D.length,m.length,w.filteredCount),x=(o=m.length,s=C,f=b?" (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}${x}
62
+ `}let A=t.raw||"macos-helper"===g?null:u(w.nodes),b=!!e.truncated,C=A?.nodes??m,D=t.raw||"macos-helper"===g?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,C.length,m.length,w.filteredCount),x=(o=m.length,s=D,f=b?" (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}${x}
63
63
  ${I}`:t.raw?`${v}${x}
64
64
  ${I}${m.map(e=>JSON.stringify(e)).join("\n")}
65
65
  `:t.flatten?`${v}${x}
66
- ${I}${S(D,{summarizeTextSurfaces:!0}).flatMap(e=>[d(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e1({...e,depth:0})]).join("\n")}${eK(A)}
66
+ ${I}${S(C,{summarizeTextSurfaces:!0}).flatMap(e=>[d(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e1({...e,depth:0})]).join("\n")}${eK(A)}
67
67
  `:`${v}${x}
68
- ${I}${(function(e){let t=[],r=[],n=e=>{for(;r.length>0&&e<=r[r.length-1].depth;)t.push(...e1(r.pop(),"below"))};for(let o of e)n(o.depth),t.push(o.text),t.push(...e1(o,"above")),o.node.hiddenContentBelow&&r.push(o);return n(0),t})(S(D,{summarizeTextSurfaces:!0})).join("\n")}${eK(A)}
68
+ ${I}${(function(e){let t=[],r=[],n=e=>{for(;r.length>0&&e<=r[r.length-1].depth;)t.push(...e1(r.pop(),"below"))};for(let o of e)n(o.depth),t.push(o.text),t.push(...e1(o,"above")),o.node.hiddenContentBelow&&r.push(o);return n(0),t})(S(C,{summarizeTextSurfaces:!0})).join("\n")}${eK(A)}
69
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 tI(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 tI(r,e,()=>(function(e){var r;let n=!0===e.baselineInitialized,o=e.summary??{},s=eY(o.additions),i=eY(o.removals),a=eY(o.unchanged),l=eX(),c=e0(e),u=c.length>0?`${c.join("\n")}
70
70
  `:"";if(n)return`${u}Baseline initialized (${a} lines).
71
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")}
@@ -74,12 +74,12 @@ ${I}${(function(e){let t=[],r=[],n=e=>{for(;r.length>0&&e<=r[r.length-1].depth;)
74
74
  `})(e)),!0}if("screenshot"!==e[0])return!1;let s=r.baseline;if(!s||"string"!=typeof s)throw new x("INVALID_ARGS","diff screenshot requires --baseline <path>");let i=ea(s),a="string"==typeof r.out?ea(r.out):void 0,l=e[1];if(e.length>2)throw new x("INVALID_ARGS","diff screenshot accepts at most one current screenshot path");let c=y({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:ec(),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:ea(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 tI(r,u,()=>{var e,r,n,o;let s,i,a,l,c,d,f,p;return s=eX(),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=eY(e.differentPixels),i=eY(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=eZ(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=eZ(e.currentOverlayPath),s=n?t("dim","Current overlay:"):"Current overlay:",i=n?t("green",r):r,a=eY(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=eY(e.differentPixels),d=eY(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=${eW(r.xRange)}px dy=${eW(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(ez).join("; ")}`);let n=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return n.length>0&&t.push(`non-text boundaries: ${n.map(ez).join("; ")}`),t.slice(0,6)}(n)).length?[]:[` ${eQ("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=[` ${eQ("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=[` ${eQ(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${n.length}/${r.length}; px):`,t)}`,` ${eQ("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)} | ${eJ(r.x)},${eJ(r.y)} | ${eJ(r.width)},${eJ(r.height)} | ${eq(t.baselineRect)} | ${eq(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=[` ${eQ(`Non-text visual deltas (showing ${n.length}/${r.length}; px):`,t)}`,` ${eQ("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} | ${eq(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return o}(u,s))),`${l.join("\n")}
75
75
  `}),!0},wait:async({positionals:e,flags:t,client:r})=>(t$(t,await r.command.wait(et.decode(e,t))),!0),alert:async({positionals:e,flags:t,client:r})=>(t$(t,await r.command.alert(function(e,t){if(e.length>2)throw new x("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 x("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 x("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 tI(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})=>(t$(e,await t.command.back({...G(e),mode:e.backMode})),!0),home:async({flags:e,client:t})=>(t$(e,await t.command.home(G(e))),!0),rotate:async({positionals:e,flags:t,client:r})=>(t$(t,await r.command.rotate(function(e,t){if(e.length>1)throw new x("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})=>(t$(e,await t.command.appSwitcher(G(e))),!0),keyboard:async({positionals:e,flags:t,client:r})=>{var n;return tI(t,n=await r.command.keyboard(function(e,t){if(e.length>1)throw new x("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 x("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 x("INVALID_ARGS","clipboard requires a subcommand: read or write.");let n=G(t);if("read"===r){if(1!==e.length)throw new x("INVALID_ARGS","clipboard read does not accept additional arguments.");return{...n,action:r}}if(e.length<2)throw new x("INVALID_ARGS","clipboard write requires text.");return{...n,action:r,text:e.slice(1).join(" ")}}(e,t)),n.json?tI(n,o):"read"===o.action?process.stdout.write(`${o.text}
76
76
  `):t$(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:rr(t[0],"push requires bundleOrPackage"),payload:rr(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({...er.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({...j.decode(t.slice(1)),...K(r),...G(r),format:function(e){if("text"===e||"attrs"===e)return e;throw new x("INVALID_ARGS","get only supports text or attrs")}(t[0])}),replay:({client:e,positionals:t,flags:r})=>e.replay.run({...G(r),path:rr(t[0],"replay requires path"),update:r.replayUpdate,backend:r.replayMaestro?"maestro":void 0,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({...er.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({...V.decode(t),...K(r),...G(r)}),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:rn(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=E.decode(r,n);return await t.interactions.type({...G(n),...o})},fill:({client:e,positionals:t,flags:r})=>{let n=ee.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||"top"===e||"bottom"===e)return e;throw new x("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(t[0]),amount:rn(t[1]),pixels:r.pixels}),pinch:({client:e,positionals:t,flags:r})=>e.interactions.pinch({...G(r),scale:Number(t[0]),x:rn(t[1]),y:rn(t[2])}),"trigger-app-event":({client:e,positionals:t,flags:r})=>e.apps.triggerEvent({...G(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 x("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:rt(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:rt(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 x("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 x("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 x("INVALID_ARGS","network include mode must be summary, headers, body, or all")}}(t[2])}),"react-native":({client:e,positionals:t,flags:r})=>e.command.reactNative({...G(r),action:function(e){if("dismiss-overlay"===e)return e;throw new x("INVALID_ARGS","react-native supports only: dismiss-overlay")}(t[0])}),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(T.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?tY({suite:i,json:!0,reportJunit:s.reportJunit}):(eG({success:!0,data:i}),0)}if("test"===e)return tY({suite:n,verbose:r.verbose,reportJunit:r.reportJunit});let a=t2[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 rs(e){let t=ro[e.command];if(!t)return!1;let r={...e.flags};return I(e.command,r),await t({...e,flags:r})}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 x("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 e8({projectRoot:t.cwd??process.cwd(),stateDir:s,profileKey:a,consumerKey:i})}return await e3({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 es("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 x("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??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new x("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}(n.AGENT_DEVICE_SESSION_LOCK))||(r?.sessionLocked===!0||o?"reject":void 0))}}let rd={sendToDaemon:ef},rf=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),rp=new Set(["connect","connection","close","disconnect","metro","session"]);async function rm(t,r=rd){let o=R(),a=eu(),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 P({session:d,requestId:o,command:t[0],debug:c},async()=>{var d,h,g,w,v,y,$,b,S,N,_,k,R,P,E,T,B;let O,j,V,F,G,H,K;try{let r,o,i,a,c,u,m,A;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[m,h]=u?eA(c):[c,void 0],g=f(m);if(i=r,a=g,"react-devtools"===i&&(!a||!eI(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 x("INVALID_ARGS",`Unknown flag: ${m}`)}let w=function(e,t,r,n){if(void 0!==e.setValue){if(void 0!==r)throw new x("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 x("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 x("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return void 0===n||eS(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&&eS(o))throw new x("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 x("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 x("INVALID_ARGS",`Invalid ${eb(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=d?.env??process.env,i=d?.cwd??process.cwd(),w=r.command,a=null!==w&&(h={remoteConfig:r.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...ta(s({configPath:h.remoteConfig,cwd:h.cwd,env:h.env}).profile),remoteConfig:h.remoteConfig}:{},m=eh((c=(g={command:r.command,cwd:i,cliFlags:r.flags,env:o}).env??process.env,u=eh({},function(e){let t={};for(let r of e)eh(t,function(e,t){let r,o;if(!n.existsSync(e)){if(t)throw new x("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{r=n.readFileSync(e,"utf8")}catch(t){throw new x("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 x("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 x("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 x("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==tD(e.type,`${t} installSource.type`))throw new x("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=tS(tD(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return tb(r,n,e.artifact,`${t} installSource.artifact`)}(o,t);continue}let e=ey.get(n);if(!e)throw new x("INVALID_ARGS",`Unknown config key "${n}" in ${t}.`);if(!e.config.enabled)throw new x("INVALID_ARGS",`Unsupported config key "${n}" in ${t}.`);r[n]=l(e$(e),o,t,n)}return r}(o,`config file ${e}`)}(r.path,r.required));return t}((v=g.cwd,y=g.cliFlags.config,$=c,(A=y??$.AGENT_DEVICE_CONFIG)?[{path:(b=A,S=v,N=$,ea(b,{cwd:S,env:N})),required:!0}]:[{path:(_=$,e.join(el("~",{env:_}),".agent-device","config.json")),required:!1},{path:e.resolve(v,"agent-device.json"),required:!1}]))),eh(u,function(e,t){var r,n,o;let s={};for(let i of ev.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(e$(i),r,n,o)))}return s}(c,g.command))),a),O={...function(e,t){let r=t?.strictFlags??!0,n=[...e.warnings],o=eh({json:!1,help:!1,version:!1},t?.defaultFlags??{});eh(o,e.flags);let s=e.providedFlags.filter(t=>!eI(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 x("INVALID_ARGS",l);for(let e of(n.push(l),s))delete o[e.key]}for(let t of Object.keys(o))void 0!==o[t]&&(eI(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 x("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),I(e.command,o),"batch"===e.command&&1!=+!!o.steps+ +!!o.stepsFile)throw new x("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:m}),providedFlags:r.providedFlags}}catch(t){M({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=C(t,{diagnosticId:L().diagnosticId,logPath:U({force:!0})??void 0});u?eG({success:!1,error:e}):eH(e,{showDetails:c}),process.exit(1);return}for(let e of O.warnings)process.stderr.write(`Warning: ${e}
77
+ `),0}(r,e,t,s);return 0!==i&&process.exit(i),!0})]}))};async function rs(e){let t=ro[e.command];if(!t)return!1;let r={...e.flags};return I(e.command,r),await t({...e,flags:r})}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 x("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 e8({projectRoot:t.cwd??process.cwd(),stateDir:s,profileKey:a,consumerKey:i})}return await e3({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 es("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 x("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??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new x("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}(n.AGENT_DEVICE_SESSION_LOCK))||(r?.sessionLocked===!0||o?"reject":void 0))}}let rd={sendToDaemon:ef},rf=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),rp=new Set(["connect","connection","close","disconnect","metro","session"]);async function rm(t,r=rd){let o=R(),a=eu(),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 P({session:d,requestId:o,command:t[0],debug:c},async()=>{var d,h,g,w,v,y,$,b,S,N,_,k,R,P,E,T,B;let O,j,V,F,G,H,K;try{let r,o,i,a,c,u,m,A;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=eC(c);continue}let u=c.startsWith("--"),d=c.startsWith("-")&&c.length>1;if(!u&&!d){r?n.push(c):r=eC(c);continue}let[m,h]=u?eA(c):[c,void 0],g=f(m);if(i=r,a=g,"react-devtools"===i&&(!a||!eI(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 x("INVALID_ARGS",`Unknown flag: ${m}`)}let w=function(e,t,r,n){if(void 0!==e.setValue){if(void 0!==r)throw new x("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 x("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 x("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return void 0===n||eS(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&&eS(o))throw new x("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 x("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 x("INVALID_ARGS",`Invalid ${eb(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=d?.env??process.env,i=d?.cwd??process.cwd(),w=r.command,a=null!==w&&(h={remoteConfig:r.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...ta(s({configPath:h.remoteConfig,cwd:h.cwd,env:h.env}).profile),remoteConfig:h.remoteConfig}:{},m=eh((c=(g={command:r.command,cwd:i,cliFlags:r.flags,env:o}).env??process.env,u=eh({},function(e){let t={};for(let r of e)eh(t,function(e,t){let r,o;if(!n.existsSync(e)){if(t)throw new x("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{r=n.readFileSync(e,"utf8")}catch(t){throw new x("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 x("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 x("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 x("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==tC(e.type,`${t} installSource.type`))throw new x("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=tS(tC(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return tb(r,n,e.artifact,`${t} installSource.artifact`)}(o,t);continue}let e=ey.get(n);if(!e)throw new x("INVALID_ARGS",`Unknown config key "${n}" in ${t}.`);if(!e.config.enabled)throw new x("INVALID_ARGS",`Unsupported config key "${n}" in ${t}.`);r[n]=l(e$(e),o,t,n)}return r}(o,`config file ${e}`)}(r.path,r.required));return t}((v=g.cwd,y=g.cliFlags.config,$=c,(A=y??$.AGENT_DEVICE_CONFIG)?[{path:(b=A,S=v,N=$,ea(b,{cwd:S,env:N})),required:!0}]:[{path:(_=$,e.join(el("~",{env:_}),".agent-device","config.json")),required:!1},{path:e.resolve(v,"agent-device.json"),required:!1}]))),eh(u,function(e,t){var r,n,o;let s={};for(let i of ev.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(e$(i),r,n,o)))}return s}(c,g.command))),a),O={...function(e,t){let r=t?.strictFlags??!0,n=[...e.warnings],o=eh({json:!1,help:!1,version:!1},t?.defaultFlags??{});eh(o,e.flags);let s=e.providedFlags.filter(t=>!eI(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 x("INVALID_ARGS",l);for(let e of(n.push(l),s))delete o[e.key]}for(let t of Object.keys(o))void 0!==o[t]&&(eI(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 x("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),I(e.command,o),"batch"===e.command&&1!=+!!o.steps+ +!!o.stepsFile)throw new x("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:m}),providedFlags:r.providedFlags}}catch(t){M({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=D(t,{diagnosticId:L().diagnosticId,logPath:U({force:!0})??void 0});u?eG({success:!1,error:e}):eH(e,{showDetails:c}),process.exit(1);return}for(let e of O.warnings)process.stderr.write(`Warning: ${e}
78
78
  `);O.flags.version&&(process.stdout.write(`${a}
79
79
  `),process.exit(0));let q="help"===O.command,J=O.flags.help;if(q||J){q&&O.positionals.length>1&&(eH(new x("INVALID_ARGS","help accepts at most one command.")),process.exit(1));let e=q?O.positionals[0]:O.command;e||(process.stdout.write(`${A()}
80
- `),process.exit(0));let t=m(eD(e));t&&(process.stdout.write(t),process.exit(0)),eH(new x("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${A()}
80
+ `),process.exit(0));let t=m(eC(e));t&&(process.stdout.write(t),process.exit(0)),eH(new x("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${A()}
81
81
  `),process.exit(1)}O.command||(process.stdout.write(`${A()}
82
- `),process.exit(1));let{command:z,positionals:Z}=O,Y=new Set(O.providedFlags.map(e=>e.key));try{V=(j=ru({policyOverrides:O.flags,configuredPlatform:O.flags.platform,configuredSession:O.flags.session})).lockPolicy?{...O.flags}:rc(O.flags,{policyOverrides:O.flags,configuredPlatform:O.flags.platform,configuredSession:O.flags.session}),F=W(V.stateDir),G=V.session??"default",k={command:z,explicitFlagKeys:Y,stateDir:F.baseDir,session:G,remoteConfig:V.remoteConfig,hasResolvedSession:void 0!==V.session},K=(H="connect"===k.command||"connection"===k.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?tr({stateDir:e.stateDir}):null);if(!n||r&&n.remoteConfigPath!==r)return null;if(t&&e7(n.remoteConfigPath)!==n.remoteConfigHash)throw new x("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:k.stateDir,session:k.session,remoteConfig:k.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!k.explicitFlagKeys.has("session")&&(!k.remoteConfig||"disconnect"===k.command||!k.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==k.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}(V,H.flags,Y):V}catch(t){let e=C(D(t),{diagnosticId:L().diagnosticId,logPath:U({force:!0})??void 0});O.flags.json?eG({success:!1,error:e}):eH(e,{showDetails:O.flags.verbose}),process.exit(1);return}let X=null;try{let e;if("react-devtools"===z){let e=await rl(Z,{flags:K,stateDir:F.baseDir,session:K.session??G,cwd:process.cwd(),env:process.env});process.exit(e);return}em({command:z,currentVersion:a,stateDir:F.baseDir,flags:K});let t=H?.runtime,s=(e,t)=>({session:e.session??G,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:j.lockPolicy,lockPlatform:j.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===z){if(Z.length>0)throw new x("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 x("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}return ep(t)}(V)}if(R=z,"auth"!==R&&"connection"!==R&&(K=(await tN({command:z,flags:K,stateDir:F.baseDir,env:process.env})).flags),K.remoteConfig&&(P=z,!rp.has(P))){let n=ed(s(K,t),{transport:r.sendToDaemon}),o=await tu({command:z,flags:K,client:n,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of rf)if(e.has(t))return!0;return!1}(Y)});K=o.flags,t=o.runtime}E={command:z,flags:K,runtime:t,explicitFlagKeys:Y,hadConnectionDefaults:!!H},!("open"===E.command&&!E.runtime&&!E.flags.bundleUrl&&!E.flags.metroHost&&!E.flags.metroPort&&!E.flags.remoteConfig&&!E.hadConnectionDefaults&&((T=E.explicitFlagKeys).has("daemonBaseUrl")||T.has("daemonTransport")||T.has("tenant")||T.has("sessionIsolation")||T.has("runId")||T.has("leaseId")||T.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=K.daemonBaseUrl;X=!K.verbose||K.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}}(F.logPath);let l=ed(s(K,t),{transport:r.sendToDaemon});if("batch"===z){if(!e)throw new x("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,flags:j.lockPolicy&&void 0===V.platform?{...e.flags??{}}:rc(e.flags??{},{policyOverrides:K,configuredPlatform:K.platform,configuredSession:K.session,inheritedPlatform:K.platform})}));if(await rs({command:z,positionals:Z,flags:{...K,batchSteps:t},client:l}))return}else if("runtime"===z)throw new x("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:z,positionals:Z,flags:K,client:l}))return;throw new x("INVALID_ARGS",`Unknown command: ${z}`)}catch(r){let e=D(r),t=C(e,{diagnosticId:L().diagnosticId,logPath:U({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))){K.json&&eG({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(K.json)eG({success:!1,error:t});else if(eH(t,{showDetails:K.verbose}),K.verbose)try{let e=F.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(`
82
+ `),process.exit(1));let{command:z,positionals:Z}=O,Y=new Set(O.providedFlags.map(e=>e.key));try{V=(j=ru({policyOverrides:O.flags,configuredPlatform:O.flags.platform,configuredSession:O.flags.session})).lockPolicy?{...O.flags}:rc(O.flags,{policyOverrides:O.flags,configuredPlatform:O.flags.platform,configuredSession:O.flags.session}),F=W(V.stateDir),G=V.session??"default",k={command:z,explicitFlagKeys:Y,stateDir:F.baseDir,session:G,remoteConfig:V.remoteConfig,hasResolvedSession:void 0!==V.session},K=(H="connect"===k.command||"connection"===k.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=e5(e)??(e.allowActiveFallback?tr({stateDir:e.stateDir}):null);if(!n||r&&n.remoteConfigPath!==r)return null;if(t&&e7(n.remoteConfigPath)!==n.remoteConfigHash)throw new x("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:k.stateDir,session:k.session,remoteConfig:k.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!k.explicitFlagKeys.has("session")&&(!k.remoteConfig||"disconnect"===k.command||!k.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==k.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}(V,H.flags,Y):V}catch(t){let e=D(C(t),{diagnosticId:L().diagnosticId,logPath:U({force:!0})??void 0});O.flags.json?eG({success:!1,error:e}):eH(e,{showDetails:O.flags.verbose}),process.exit(1);return}let X=null;try{let e;if("react-devtools"===z){let e=await rl(Z,{flags:K,stateDir:F.baseDir,session:K.session??G,cwd:process.cwd(),env:process.env});process.exit(e);return}em({command:z,currentVersion:a,stateDir:F.baseDir,flags:K});let t=H?.runtime,s=(e,t)=>({session:e.session??G,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:j.lockPolicy,lockPlatform:j.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===z){if(Z.length>0)throw new x("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 x("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}return ep(t)}(V)}if(R=z,"auth"!==R&&"connection"!==R&&(K=(await tN({command:z,flags:K,stateDir:F.baseDir,env:process.env})).flags),K.remoteConfig&&(P=z,!rp.has(P))){let n=ed(s(K,t),{transport:r.sendToDaemon}),o=await tu({command:z,flags:K,client:n,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of rf)if(e.has(t))return!0;return!1}(Y)});K=o.flags,t=o.runtime}E={command:z,flags:K,runtime:t,explicitFlagKeys:Y,hadConnectionDefaults:!!H},!("open"===E.command&&!E.runtime&&!E.flags.bundleUrl&&!E.flags.metroHost&&!E.flags.metroPort&&!E.flags.remoteConfig&&!E.hadConnectionDefaults&&((T=E.explicitFlagKeys).has("daemonBaseUrl")||T.has("daemonTransport")||T.has("tenant")||T.has("sessionIsolation")||T.has("runId")||T.has("leaseId")||T.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=K.daemonBaseUrl;X=!K.verbose||K.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}}(F.logPath);let l=ed(s(K,t),{transport:r.sendToDaemon});if("batch"===z){if(!e)throw new x("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,flags:j.lockPolicy&&void 0===V.platform?{...e.flags??{}}:rc(e.flags??{},{policyOverrides:K,configuredPlatform:K.platform,configuredSession:K.session,inheritedPlatform:K.platform})}));if(await rs({command:z,positionals:Z,flags:{...K,batchSteps:t},client:l}))return}else if("runtime"===z)throw new x("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:z,positionals:Z,flags:K,client:l}))return;throw new x("INVALID_ARGS",`Unknown command: ${z}`)}catch(r){let e=C(r),t=D(e,{diagnosticId:L().diagnosticId,logPath:U({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))){K.json&&eG({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(K.json)eG({success:!1,error:t});else if(eH(t,{showDetails:K.verbose}),K.verbose)try{let e=F.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(`
83
83
  [daemon log]
84
84
  ${r}
85
- `)}}catch{}X&&X(),process.exit(1)}finally{X&&X()}})}r(process.argv[1]??"").href===import.meta.url&&rm(process.argv.slice(2)).catch(e=>{eH(C(D(e)),{showDetails:!0}),process.exit(1)});export{rm as runCli};
85
+ `)}}catch{}X&&X(),process.exit(1)}finally{X&&X()}})}r(process.argv[1]??"").href===import.meta.url&&rm(process.argv.slice(2)).catch(e=>{eH(D(C(e)),{showDetails:!0}),process.exit(1)});export{rm as runCli};
@@ -294,6 +294,7 @@ export declare type AppOpenOptions = AgentDeviceRequestOverrides & AgentDeviceSe
294
294
  url?: string;
295
295
  surface?: 'app' | 'frontmost-app' | 'desktop' | 'menubar';
296
296
  activity?: string;
297
+ launchConsole?: string;
297
298
  relaunch?: boolean;
298
299
  saveScript?: boolean | string;
299
300
  noRecord?: boolean;