agent-device 0.14.1 → 0.14.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/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.1.apk → agent-device-android-snapshot-helper-0.14.2.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.2.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.1.manifest.json → agent-device-android-snapshot-helper-0.14.2.manifest.json} +6 -6
- package/dist/src/1231.js +1 -0
- package/dist/src/2007.js +33 -0
- package/dist/src/batch.d.ts +138 -0
- package/dist/src/batch.js +1 -0
- package/dist/src/internal/bin.js +39 -39
- package/dist/src/internal/daemon.js +13 -13
- package/package.json +5 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.1.apk.sha256 +0 -1
- package/dist/src/3918.js +0 -33
package/dist/src/internal/bin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
let e,t,s,o,r,a,n,i;import l from"node:path";import{styleText as c}from"node:util";import{pathToFileURL as p}from"node:url";import d from"node:fs";import u from"node:crypto";import{buildMobileSnapshotPresentation as m,SESSION_SURFACES as f,formatSnapshotLine as g,SETTINGS_USAGE_OVERRIDE as h,
|
|
1
|
+
let e,t,s,o,r,a,n,i;import l from"node:path";import{styleText as c}from"node:util";import{pathToFileURL as p}from"node:url";import d from"node:fs";import u from"node:crypto";import{buildMobileSnapshotPresentation as m,SESSION_SURFACES as f,formatSnapshotLine as g,SETTINGS_USAGE_OVERRIDE as h,createAgentDevice as v,isEnvTruthy as y,displayNodeLabel as w,localCommandPolicy as b,parseDeviceRotation as k,parseWaitArgs as I,buildSnapshotDisplayLines as A}from"../2007.js";import{resolveRemoteConfigProfile as D,resolveRemoteConfigPath as S,REMOTE_CONFIG_FIELD_SPECS as x,parseSourceValue as $,buildPrimaryEnvVarName as L}from"../remote-config.js";import{asAppError as N,normalizeError as R,AppError as C}from"../9152.js";import{ensureCompanionTunnel as _,stopCompanionTunnel as E}from"../1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as O}from"../2301.js";import{createRequestId as U,serializeSessionListEntry as P,serializeSnapshotResult as T,serializeCloseResult as M,readVersion as F,getDiagnosticsMeta as B,emitDiagnostic as j,serializeOpenResult as V,serializeDeployResult as G,readCommandMessage as q,resolveDaemonPaths as H,withDiagnosticsScope as K,flushDiagnosticsToSessionFile as J,serializeEnsureSimulatorResult as z,serializeInstallFromSourceResult as W,serializeDevice as Y}from"../8161.js";import{stopMetroTunnel as Z}from"../metro.js";import{runCmdStreaming as X,runCmd as Q}from"../9818.js";import{resolveUserPath as ee,expandUserHomePath as et}from"../3267.js";import{createLocalArtifactAdapter as es}from"../io.js";import{createAgentDeviceClient as eo,CLIENT_COMMANDS as er,sendToDaemon as ea}from"../9542.js";import{splitSelectorFromArgs as en}from"../940.js";import{parseBatchStepsJson as ei}from"../1231.js";import{maybeRunUpgradeNotifier as el}from"../113.js";function ec(e,t){for(let[s,o]of Object.entries(t))void 0!==o&&(e[s]=o);return e}let ep=["snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw"],ed=["snapshotDepth","snapshotScope","snapshotRaw"],eu={workflow:{summary:"Normal agent-device bootstrap, exploration, and validation loop",body:`agent-device help workflow
|
|
2
2
|
|
|
3
3
|
Version-matched operating guide for normal agent-device work.
|
|
4
4
|
|
|
@@ -354,42 +354,42 @@ ${n}
|
|
|
354
354
|
${i}
|
|
355
355
|
`);function eI(e){return em.filter(t=>e.has(t.key)&&void 0!==t.usageLabel&&void 0!==t.usageDescription)}function eA(e,t){return eD(e,t.map(e=>({label:e.usageLabel??"",description:e.usageDescription??""})))}function eD(e,t){if(0===t.length)return`${e}
|
|
356
356
|
(none)`;let s=Math.max(...t.map(e=>e.label.length))+2,o=[e];for(let e of t)o.push(` ${e.label.padEnd(s)}${e.description}`);return o.join("\n")}function eS(e,t){return 0===t.length?`${e}
|
|
357
|
-
(none)`:[e,...t.map(e=>` ${e}`)].join("\n")}let ex=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),e$={iosSimulatorDeviceSet:["IOS_SIMULATOR_DEVICE_SET"],androidDeviceAllowlist:["ANDROID_DEVICE_ALLOWLIST"],metroBearerToken:["AGENT_DEVICE_PROXY_TOKEN"]},eL=function(){let e=new Map;for(let t of em){let s=e.get(t.key);s?s.push(t):e.set(t.key,[t])}let t=new Map;for(let e of ef)t.set(e,new Set(["*"]));for(let e of ew()){let s=ey(e);if(s)for(let o of s.allowedFlags){let s=t.get(o);s&&s.has("*")||(s?s.add(e):t.set(o,new Set([e])))}}return[...e.entries()].map(([e,s])=>({key:e,flagDefinitions:s,config:{enabled:!ex.has(e),key:e},env:{names:[
|
|
358
|
-
`)}function eT(e,t={}){let s=e instanceof
|
|
357
|
+
(none)`:[e,...t.map(e=>` ${e}`)].join("\n")}let ex=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),e$={iosSimulatorDeviceSet:["IOS_SIMULATOR_DEVICE_SET"],androidDeviceAllowlist:["ANDROID_DEVICE_ALLOWLIST"],metroBearerToken:["AGENT_DEVICE_PROXY_TOKEN"]},eL=function(){let e=new Map;for(let t of em){let s=e.get(t.key);s?s.push(t):e.set(t.key,[t])}let t=new Map;for(let e of ef)t.set(e,new Set(["*"]));for(let e of ew()){let s=ey(e);if(s)for(let o of s.allowedFlags){let s=t.get(o);s&&s.has("*")||(s?s.add(e):t.set(o,new Set([e])))}}return[...e.entries()].map(([e,s])=>({key:e,flagDefinitions:s,config:{enabled:!ex.has(e),key:e},env:{names:[L(e),...e$[e]??[]]},supportsCommand(s){let o=t.get(e);return!!o&&(!!o.has("*")||!!s&&o.has(s))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),eN=new Map(eL.map(e=>[e.key,e]));function eR(e,t){return eN.get(e)?.supportsCommand(t)??!1}function eC(e){let t=e.flagDefinitions.find(e=>void 0===e.setValue);if(t)return t;let s=function(e){let t=e.flagDefinitions[0];if(!t)throw Error(`Missing flag definition for option ${e.key}`);return t}(e);if("enum"===s.type){let t=e.flagDefinitions.map(e=>e.setValue).filter(e=>void 0!==e);return{...s,setValue:void 0,enumValues:t}}return s}function e_(e){let t=e.indexOf("=");return -1===t?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function eE(e){return e.replace(/^-+/,"")}function eO(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?e_(e):[e,void 0];return void 0!==eh.get(t)}function eU(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}function eP(e){process.stdout.write(`${JSON.stringify(e,null,2)}
|
|
358
|
+
`)}function eT(e,t={}){let s=e instanceof C?R(e):e;process.stderr.write(`Error (${s.code}): ${s.message}
|
|
359
359
|
`),s.hint&&process.stderr.write(`Hint: ${s.hint}
|
|
360
360
|
`),s.diagnosticId&&process.stderr.write(`Diagnostic ID: ${s.diagnosticId}
|
|
361
361
|
`),s.logPath&&process.stderr.write(`Diagnostics Log: ${s.logPath}
|
|
362
362
|
`),t.showDetails&&s.details&&process.stderr.write(`${JSON.stringify(s.details,null,2)}
|
|
363
363
|
`)}function eM(e){return e&&e.summaryLines.length>0?`
|
|
364
|
-
${e.summaryLines.join("\n")}`:""}function eF(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eB(e){return e>0?`+${e}`:String(e)}function ej(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",s=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${s}`}function eV(e){return e.min===e.max?eB(e.min):`${eB(e.min)}..${eB(e.max)}`}function eG(e){let t=process.cwd(),s=l.relative(t,e);return""!==s&&(s.startsWith("..")||l.isAbsolute(s))?e:""===s?".":`.${l.sep}${s}`}function eq(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eH(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function eK(e,t){return t?c("dim",e):e}function eJ(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function ez(e,t){var s;let o="scroll-area"===(s=e.type)||"list"===s||"collection"===s||"table"===s?s:null;if(!o)return[];let r=[];if(e.node.hiddenContentAbove&&"below"!==t&&r.push(`[content above ${o} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&r.push(`[content below ${o} hidden]`),0===r.length)return[];let a=" ".repeat(e.depth+1);return r.map(e=>`${a}${e}`)}let eW={slug:"react-devtools-companion",runArg:
|
|
365
|
-
`,{encoding:"utf8",mode:384}),d.chmodSync(e,384)}function e7(e,t){
|
|
366
|
-
`))}function tm(e,t){tu(e,t,()=>
|
|
367
|
-
Runtime: ${s.runtime}`:`${e}: ${s.device} ${s.udid}${t}`}),!0},ty=async({positionals:e,flags:t,client:s})=>{let o=(e[0]??"").toLowerCase();if("reload"===o){let e=await s.metro.reload({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs});return tu(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==o)throw new _("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new _("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");let r=await s.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 tu(t,r,()=>JSON.stringify(r,null,2)),!0},tw=async({flags:e,client:t})=>{let s=await t.apps.list({...td(e),appsFilter:e.appsFilter});return tu(e,{apps:s},()=>s.join("\n")),!0};function tb(e,t,s,o){var r;return"number"==typeof s||"string"==typeof(r=s)&&/^\d+$/.test(r.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let s="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(s))throw new _("INVALID_ARGS",`${t} must be an integer.`);return s}(s,o)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:tI(s,o)}}function tk(e,t){let s=e.indexOf("/");if(s<=0||s===e.length-1||-1!==e.indexOf("/",s+1))throw new _("INVALID_ARGS",`${t} must use owner/repo.`);let o={owner:e.slice(0,s).trim(),repo:e.slice(s+1).trim()};if(!o.owner||!o.repo)throw new _("INVALID_ARGS",`${t} must use owner/repo.`);return o}function tI(e,t){let s="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!s)throw new _("INVALID_ARGS",`${t} must be a non-empty string.`);return s}let tA=async({positionals:e,flags:t,client:s})=>{let o=q(await tx("install",e,t,s));return tm(t,o),!0},tD=async({positionals:e,flags:t,client:s})=>{let o=q(await tx("reinstall",e,t,s));return tm(t,o),!0},tS=async({positionals:e,flags:t,client:s})=>{let o=Y(await t$(e,t,s));return tm(t,o),!0};async function tx(e,t,s,o){let r=t[0],a=t[1];if(!r||!a)throw new _("INVALID_ARGS",`${e} requires: ${e} <app> <path-to-app-binary>`);let n={app:r,appPath:a,...td(s)};return"install"===e?await o.apps.install(n):await o.apps.reinstall(n)}async function t$(e,t,s){let o=function(e,t){let s=e[0]?.trim();if(e.length>1)throw new _("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let o=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let s=e.indexOf(":");if(s<=0||s===e.length-1)throw new _("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:o,repo:r}=tk(e.slice(0,s),t);return tb(o,r,e.slice(s+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,r=t.installSource;if(1!=+!!s+ +!!o+ +!!r)throw new _("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");return o||r||{kind:"url",url:s,headers:function(e){if(!e||0===e.length)return;let t={};for(let s of e){let e=s.indexOf(":");if(e<=0)throw new _("INVALID_ARGS",`Invalid --header value "${s}". Expected "name:value".`);let o=s.slice(0,e).trim(),r=s.slice(e+1).trim();if(!o)throw new _("INVALID_ARGS",`Invalid --header value "${s}". Header name cannot be empty.`);t[o]=r}return t}(t.header)}}(e,t);if("url"!==o.kind&&t.header&&t.header.length>0)throw new _("INVALID_ARGS","install-from-source --header is only supported for URL sources");return await s.apps.installFromSource({...td(t),retainPaths:t.retainPaths,retentionMs:t.retentionMs,source:o})}let tL=async({positionals:e,flags:t,client:s})=>{let o=G(await s.apps.open({app:e[0],url:e[1],surface:t.surface,activity:t.activity,relaunch:t.relaunch,saveScript:t.saveScript,noRecord:t.noRecord,...td(t)}));return tm(t,o),!0},tN=async({positionals:e,flags:t,client:s})=>{let o=F(e[0]?await s.apps.close({app:e[0],shutdown:t.shutdown}):await s.sessions.close({shutdown:t.shutdown}));return tm(t,o),!0},tR=async({flags:e,client:t})=>{var s,o,r,a;if(!e.remoteConfig)throw new _("INVALID_ARGS","connect requires --remote-config <path>.");let n=e.tenant,i=e.runId;if(!n)throw new _("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!i)throw new _("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new _("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let l=K(e.stateDir).baseDir,c=e.session?null:e8({stateDir:l}),p=e.session??c?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${u.randomBytes(3).toString("hex")}`;if(!eX({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${u.randomBytes(2).toString("hex")}`}(l),d=S({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env}),m=e2(d.resolvedPath),f=e0(e),g=c?.session===p?c:eX({stateDir:l,session:p});if(g&&(s=g,o={flags:e,session:p,remoteConfigPath:d.resolvedPath,remoteConfigHash:m,desiredLeaseBackend:tn(e),daemon:f},s.remoteConfigPath!==o.remoteConfigPath||s.remoteConfigHash!==o.remoteConfigHash||s.session!==o.session||s.tenant!==o.flags.tenant||s.runId!==o.flags.runId||void 0!==o.desiredLeaseBackend&&s.leaseBackend!==o.desiredLeaseBackend||void 0!==o.flags.platform&&s.platform!==o.flags.platform||void 0!==o.flags.target&&s.target!==o.flags.target||(r=s.daemon,a=o.daemon,(r?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(r?.transport??void 0)!==(a?.transport??void 0)||(r?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!e.force)throw new _("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:p,remoteConfig:g.remoteConfigPath});let h=new Date().toISOString(),v={version:1,session:p,remoteConfigPath:d.resolvedPath,remoteConfigHash:m,daemon:f,tenant:n,runId:i,leaseId:g&&!e.force?g.leaseId:void 0,leaseBackend:g&&!e.force?g.leaseBackend:tn(e),platform:e.platform??(g&&!e.force?g.platform:void 0),target:e.target??(g&&!e.force?g.target:void 0),runtime:g&&!e.force?g.runtime:void 0,metro:g&&!e.force?g.metro:void 0,connectedAt:g&&!e.force?g.connectedAt:h,updatedAt:h};eQ({stateDir:l,state:v}),g&&e.force&&(await to(g.metro),await tr({stateDir:l,state:g}),await ta(t,g));let y=tE(v),w=function(e,t){if(!t.runtime&&(ti(e)||tU(t.remoteConfigPath)))return tO(t.remoteConfigPath)}(e,v);return tu(e,tP(v,w),()=>[`Connected remote session "${p}" tenant "${n}" run "${i}" ${v.leaseId?`lease ${v.leaseId}`:"lease pending"}`,y?.message,w?.message].filter(e=>!!e).join("\n")),!0},tC=async({flags:e,client:t})=>{let s=e.session??"default",o=K(e.stateDir).baseDir,r=eX({stateDir:o,session:s})??(e.session?null:e8({stateDir:o}));if(!r)return tu(e,{connected:!1,session:s},()=>`No remote connection for "${s}".`),!0;let a=r.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await to(r.metro),await tr({stateDir:o,state:r});let n=!1;if(r.leaseId)try{n=(await t.leases.release({tenant:r.tenant,runId:r.runId,leaseId:r.leaseId})).released}catch{}return e1({stateDir:o,session:a}),tu(e,{connected:!1,session:a,released:n},()=>`Disconnected remote session "${a}".`),!0},t_=async({positionals:e,flags:t})=>{if("status"!==e[0])throw new _("INVALID_ARGS","connection accepts only: status");let s=t.session??"default",o=K(t.stateDir).baseDir,r=eX({stateDir:o,session:s})??(t.session?null:e8({stateDir:o}));if(!r)return tu(t,{connected:!1,session:s},()=>`No remote connection for "${s}".`),!0;let a=tE(r),n=function(e){if(!e.runtime&&tU(e.remoteConfigPath))return tO(e.remoteConfigPath)}(r);return tu(t,tP(r,n),()=>[`Connected remote session "${r.session}".`,`tenant=${r.tenant} runId=${r.runId} leaseId=${r.leaseId??"pending"} backend=${r.leaseBackend??"pending"}`,`remoteConfig=${r.remoteConfigPath}`,r.runtime?"metro=prepared":"metro=not-prepared",a?.message,n?.message].filter(e=>!!e).join("\n")),!0};function tE(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tO(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tU(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 tP(e,t){let s=tE(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 u.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...s?{leasePreparation:s}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}async function tT(e){return await tM({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function tM(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tY(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tY(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||tY(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 s=tB({stateDir:e.stateDir});if(s&&!tW(s.expiresAt,e.io?.now)){let o=await tV({session:s,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:o.accessToken},source:"cli-session"}}if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new _("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tH(e.command,t)}let o=await tF({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:o.accessToken},source:"login"}}async function tF(e){let t,s,o,r=e.env??e.io?.env??process.env,a=(c=r,p=e.io,t=p?.stdinIsTTY??process.stdin.isTTY,s=p?.stdoutIsTTY??process.stdout.isTTY,"true"!==(u=c).CI&&"true"!==u.GITHUB_ACTIONS&&"true"!==u.BUILDKITE&&t&&s?(m=c).SSH_TTY||m.SSH_CONNECTION||"true"===m.CODESPACES||m.GITPOD_WORKSPACE_ID||"true"===m.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===a)throw tH(e.commandLabel??"agent-device connect",r);let n=tK(r),i=await tq({baseUrl:n,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});var c,p,u,m,f,g,h=i;if(!tY(h.deviceCode)||!tY(h.userCode)||!tY(h.verificationUri))throw new _("COMMAND_FAILED","Cloud auth start returned an unusable response.");let v=i.verificationUriComplete??i.verificationUri,y="local-browser"===a?i.verificationUri:(f=i.verificationUri,g=i.userCode,(o=new URL(f)).searchParams.set("user_code",g),o.toString());"local-browser"===a?(tz(e.io,`Opening ${i.verificationUri}...
|
|
364
|
+
${e.summaryLines.join("\n")}`:""}function eF(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eB(e){return e>0?`+${e}`:String(e)}function ej(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",s=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${s}`}function eV(e){return e.min===e.max?eB(e.min):`${eB(e.min)}..${eB(e.max)}`}function eG(e){let t=process.cwd(),s=l.relative(t,e);return""!==s&&(s.startsWith("..")||l.isAbsolute(s))?e:""===s?".":`.${l.sep}${s}`}function eq(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eH(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function eK(e,t){return t?c("dim",e):e}function eJ(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function ez(e,t){var s;let o="scroll-area"===(s=e.type)||"list"===s||"collection"===s||"table"===s?s:null;if(!o)return[];let r=[];if(e.node.hiddenContentAbove&&"below"!==t&&r.push(`[content above ${o} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&r.push(`[content below ${o} hidden]`),0===r.length)return[];let a=" ".repeat(e.depth+1);return r.map(e=>`${a}${e}`)}let eW={slug:"react-devtools-companion",runArg:O,displayName:"React DevTools companion"};async function eY(e){return await _({...e,definition:eW,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 eZ(e){return await E({...e,definition:eW})}function eX(e){var t;let s,o=e3(e);if(!d.existsSync(o))return null;try{s=JSON.parse(d.readFileSync(o,"utf8"))}catch(t){return e7(e,t),null}return!(!(t=s)||"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?s:(e7(e),null)}function eQ(e){let t=e3({stateDir:e.stateDir,session:e.state.session});d.mkdirSync(l.dirname(t),{recursive:!0}),e6(t,e.state),e6(e5(e.stateDir),{session:e.state.session})}function e0(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 e1(e){d.rmSync(e3(e),{force:!0});let t=e5(e.stateDir);e4(e.stateDir)===e.session&&d.rmSync(t,{force:!0})}function e2(e){try{return u.createHash("sha256").update(d.readFileSync(e)).digest("hex")}catch(t){throw new C("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function e3(e){return l.join(e.stateDir,"remote-connections",`${function(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,"_");if(!t)return"default";if(t===e)return t;let s=u.createHash("sha256").update(e).digest("hex").slice(0,8);return`${t}-${s}`}(e.session)}.json`)}function e5(e){return l.join(e,"remote-connections",".active-session.json")}function e8(e){let t=e4(e.stateDir);return t?eX({stateDir:e.stateDir,session:t}):null}function e4(e){let t=e5(e);if(d.existsSync(t))try{let e=JSON.parse(d.readFileSync(t,"utf8"));return"string"==typeof e.session?e.session:void 0}catch{return}}function e6(e,t){d.writeFileSync(e,`${JSON.stringify(t,null,2)}
|
|
365
|
+
`,{encoding:"utf8",mode:384}),d.chmodSync(e,384)}function e7(e,t){j({level:"warn",phase:"remote_connection_state_invalid",data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),e1(e)}let e9=new Set(["connect","connection","close","disconnect","ensure-simulator","metro","session"]),te=new Set(["open"]);async function tt(e){let t,s,{command:o,flags:r,client:a}=e;if(!r.remoteConfig)return{flags:r,runtime:e.runtime};let n=H(r.stateDir).baseDir,i=D({configPath:r.remoteConfig,cwd:process.cwd(),env:process.env}),l={...function(e){let t={};for(let s of x){let o=e[s.key];void 0!==o&&(t[s.key]=o)}return t}(i.profile),...r,remoteConfig:i.resolvedPath},c=eX({stateDir:n,session:l.session??"default"});if(c&&c.remoteConfigPath!==i.resolvedPath)throw new C("INVALID_ARGS","A different remote connection is already active for this session. Run connect --force or disconnect before using a different --remote-config.",{session:c.session,activeRemoteConfig:c.remoteConfigPath,requestedRemoteConfig:i.resolvedPath});let p=c??function(e,t){if(!e.tenant)throw new C("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new C("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new C("INVALID_ARGS","remote command requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let s=new Date().toISOString();return{version:1,session:e.session??"default",remoteConfigPath:t,remoteConfigHash:e2(t),daemon:e0(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??tn(e),platform:e.platform,target:e.target,connectedAt:s,updatedAt:s}}(l,i.resolvedPath),d={...l,session:p.session},u=function(e,t){if(e)return tl(e,t)?e:void 0}(p.runtime,d.platform)??e.runtime,m=p,f=!c;if(g=o,!e9.has(g)){let e=p.leaseBackend??function(e,t){let s=tn(e);if(s)return s;throw new C("INVALID_ARGS",`${t} requires --platform ios|android or --lease-backend when the remote connection has not resolved a lease yet.`)}(r,o);var g,h,v,y,w,b=p,k=r,I=e;if(b.leaseBackend&&b.leaseBackend!==I)throw new C("INVALID_ARGS","Active remote connection is already bound to a different lease backend. Re-run connect --force to replace it.",{session:b.session,leaseBackend:b.leaseBackend});if(b.platform&&k.platform&&b.platform!==k.platform)throw new C("INVALID_ARGS","Active remote connection is already bound to a different platform. Re-run connect --force to replace it.",{session:b.session,platform:b.platform});if(b.target&&k.target&&b.target!==k.target)throw new C("INVALID_ARGS","Active remote connection is already bound to a different target. Re-run connect --force to replace it.",{session:b.session,target:b.target});let t=await tc(a,m,e);d.leaseId=t.leaseId,d.leaseBackend=e,d.platform=m.platform??d.platform,d.target=m.target??d.target,(m.leaseId!==t.leaseId||m.leaseBackend!==e)&&(m={...m,leaseId:t.leaseId,leaseBackend:e,platform:m.platform??r.platform,target:m.target??r.target,updatedAt:new Date().toISOString()},f=!0)}if(h=o,v=e.batchSteps,(te.has(h)||"batch"===h&&v&&v.some(e=>{let t=e.command.trim().toLowerCase();return te.has(t)&&void 0===e.runtime}))&&ti(d)&&(!m.leaseId&&d.leaseId&&(m={...m,leaseId:d.leaseId,leaseBackend:d.leaseBackend}),e.forceRuntimePrepare||!u||!tl(u,d.platform))){if(!m.leaseId)throw new C("INVALID_ARGS",`${o} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await ts(d,a,p.remoteConfigPath,p.session,{tenantId:p.tenant,runId:p.runId,leaseId:m.leaseId});u=e.runtime;let r=(y=m.metro,w=e.cleanup,y?.projectRoot!==w?.projectRoot||y?.profileKey!==w?.profileKey||y?.consumerKey!==w?.consumerKey);t=r?m.metro:void 0,s=r?e.cleanup:void 0,m={...m,runtime:e.runtime,metro:e.cleanup,updatedAt:new Date().toISOString()},f=!0}if(f)try{eQ({stateDir:n,state:m})}catch(e){throw await to(s),e}return await to(t),{flags:{...d,session:m.session,leaseId:m.leaseId,leaseBackend:m.leaseBackend,platform:m.platform??d.platform,target:m.target??d.target},runtime:u}}async function ts(e,t,s,o,r){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new C("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new C("INVALID_ARGS","Deferred Metro preparation requires metroPublicBaseUrl or metroProxyBaseUrl when Metro settings are provided.");let a=await t.metro.prepare({projectRoot:e.metroProjectRoot,kind:e.metroKind,publicBaseUrl:e.metroPublicBaseUrl,proxyBaseUrl:e.metroProxyBaseUrl,bearerToken:e.metroBearerToken,bridgeScope:r,launchUrl:e.launchUrl,companionProfileKey:s,companionConsumerKey:o,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?a.iosRuntime:a.androidRuntime,cleanup:e.metroProxyBaseUrl?{projectRoot:a.projectRoot,profileKey:s,consumerKey:o}:void 0}}async function to(e){if(e)try{await Z(e)}catch{}}async function tr(e){try{await eZ({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function ta(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 tn(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function ti(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tl(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function tc(e,t,s){if(t.leaseId&&t.leaseBackend===s){let o=await tp(e,t.leaseId,{tenant:t.tenant,runId:t.runId,leaseBackend:s});if(o)return o}return await e.leases.allocate({tenant:t.tenant,runId:t.runId,leaseBackend:s})}async function tp(e,t,s){try{return await e.leases.heartbeat({tenant:s.tenant,runId:s.runId,leaseId:t,leaseBackend:s.leaseBackend})}catch(e){var o;if((o=e)instanceof C&&"UNAUTHORIZED"===o.code&&(o.details?.reason==="LEASE_NOT_FOUND"||o.details?.reason==="LEASE_EXPIRED"||o.details?.reason==="LEASE_REVOKED"))return;throw e}}function td(e){return{platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,androidDeviceAllowlist:e.androidDeviceAllowlist}}function tu(e,t,s){var o;if(e.json)return void eP({success:!0,data:t});let r=s?.();r&&(o=r,process.stdout.write(o.endsWith("\n")?o:`${o}
|
|
366
|
+
`))}function tm(e,t){tu(e,t,()=>q(t))}let tf=async({positionals:e,flags:t,client:s})=>{if("list"!==(e[0]??"list"))throw new C("INVALID_ARGS","session only supports list");let o={sessions:(await s.sessions.list()).map(P)};return tu(t,o,()=>JSON.stringify(o,null,2)),!0},tg=async({flags:e,client:t})=>{let s=await t.devices.list(td(e));return tu(e,{devices:s.map(Y)},()=>s.map(th).join("\n")),!0};function th(e){let t=e.kind?` ${e.kind}`:"",s=e.target?` target=${e.target}`:"",o="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${s})${o}`}let tv=async({flags:e,client:t})=>{if(!e.device)throw new C("INVALID_ARGS","ensure-simulator requires --device <name>");let s=await t.simulators.ensure({device:e.device,runtime:e.runtime,boot:e.boot,reuseExisting:e.reuseExisting,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet});return tu(e,z(s),()=>{let e=s.created?"Created":"Reused",t=s.booted?" (booted)":"";return s.runtime?`${e}: ${s.device} ${s.udid}${t}
|
|
367
|
+
Runtime: ${s.runtime}`:`${e}: ${s.device} ${s.udid}${t}`}),!0},ty=async({positionals:e,flags:t,client:s})=>{let o=(e[0]??"").toLowerCase();if("reload"===o){let e=await s.metro.reload({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs});return tu(t,e,()=>`Reloaded React Native apps via ${e.reloadUrl}`),!0}if("prepare"!==o)throw new C("INVALID_ARGS","metro requires a subcommand: prepare or reload");if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new C("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");let r=await s.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 tu(t,r,()=>JSON.stringify(r,null,2)),!0},tw=async({flags:e,client:t})=>{let s=await t.apps.list({...td(e),appsFilter:e.appsFilter});return tu(e,{apps:s},()=>s.join("\n")),!0};function tb(e,t,s,o){var r;return"number"==typeof s||"string"==typeof(r=s)&&/^\d+$/.test(r.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let s="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(s))throw new C("INVALID_ARGS",`${t} must be an integer.`);return s}(s,o)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:tI(s,o)}}function tk(e,t){let s=e.indexOf("/");if(s<=0||s===e.length-1||-1!==e.indexOf("/",s+1))throw new C("INVALID_ARGS",`${t} must use owner/repo.`);let o={owner:e.slice(0,s).trim(),repo:e.slice(s+1).trim()};if(!o.owner||!o.repo)throw new C("INVALID_ARGS",`${t} must use owner/repo.`);return o}function tI(e,t){let s="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!s)throw new C("INVALID_ARGS",`${t} must be a non-empty string.`);return s}let tA=async({positionals:e,flags:t,client:s})=>{let o=G(await tx("install",e,t,s));return tm(t,o),!0},tD=async({positionals:e,flags:t,client:s})=>{let o=G(await tx("reinstall",e,t,s));return tm(t,o),!0},tS=async({positionals:e,flags:t,client:s})=>{let o=W(await t$(e,t,s));return tm(t,o),!0};async function tx(e,t,s,o){let r=t[0],a=t[1];if(!r||!a)throw new C("INVALID_ARGS",`${e} requires: ${e} <app> <path-to-app-binary>`);let n={app:r,appPath:a,...td(s)};return"install"===e?await o.apps.install(n):await o.apps.reinstall(n)}async function t$(e,t,s){let o=function(e,t){let s=e[0]?.trim();if(e.length>1)throw new C("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let o=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let s=e.indexOf(":");if(s<=0||s===e.length-1)throw new C("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:o,repo:r}=tk(e.slice(0,s),t);return tb(o,r,e.slice(s+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,r=t.installSource;if(1!=+!!s+ +!!o+ +!!r)throw new C("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");return o||r||{kind:"url",url:s,headers:function(e){if(!e||0===e.length)return;let t={};for(let s of e){let e=s.indexOf(":");if(e<=0)throw new C("INVALID_ARGS",`Invalid --header value "${s}". Expected "name:value".`);let o=s.slice(0,e).trim(),r=s.slice(e+1).trim();if(!o)throw new C("INVALID_ARGS",`Invalid --header value "${s}". Header name cannot be empty.`);t[o]=r}return t}(t.header)}}(e,t);if("url"!==o.kind&&t.header&&t.header.length>0)throw new C("INVALID_ARGS","install-from-source --header is only supported for URL sources");return await s.apps.installFromSource({...td(t),retainPaths:t.retainPaths,retentionMs:t.retentionMs,source:o})}let tL=async({positionals:e,flags:t,client:s})=>{let o=V(await s.apps.open({app:e[0],url:e[1],surface:t.surface,activity:t.activity,relaunch:t.relaunch,saveScript:t.saveScript,noRecord:t.noRecord,...td(t)}));return tm(t,o),!0},tN=async({positionals:e,flags:t,client:s})=>{let o=M(e[0]?await s.apps.close({app:e[0],shutdown:t.shutdown}):await s.sessions.close({shutdown:t.shutdown}));return tm(t,o),!0},tR=async({flags:e,client:t})=>{var s,o,r,a;if(!e.remoteConfig)throw new C("INVALID_ARGS","connect requires --remote-config <path>.");let n=e.tenant,i=e.runId;if(!n)throw new C("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!i)throw new C("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new C("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let l=H(e.stateDir).baseDir,c=e.session?null:e8({stateDir:l}),p=e.session??c?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${u.randomBytes(3).toString("hex")}`;if(!eX({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${u.randomBytes(2).toString("hex")}`}(l),d=D({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env}),m=e2(d.resolvedPath),f=e0(e),g=c?.session===p?c:eX({stateDir:l,session:p});if(g&&(s=g,o={flags:e,session:p,remoteConfigPath:d.resolvedPath,remoteConfigHash:m,desiredLeaseBackend:tn(e),daemon:f},s.remoteConfigPath!==o.remoteConfigPath||s.remoteConfigHash!==o.remoteConfigHash||s.session!==o.session||s.tenant!==o.flags.tenant||s.runId!==o.flags.runId||void 0!==o.desiredLeaseBackend&&s.leaseBackend!==o.desiredLeaseBackend||void 0!==o.flags.platform&&s.platform!==o.flags.platform||void 0!==o.flags.target&&s.target!==o.flags.target||(r=s.daemon,a=o.daemon,(r?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(r?.transport??void 0)!==(a?.transport??void 0)||(r?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!e.force)throw new C("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:p,remoteConfig:g.remoteConfigPath});let h=new Date().toISOString(),v={version:1,session:p,remoteConfigPath:d.resolvedPath,remoteConfigHash:m,daemon:f,tenant:n,runId:i,leaseId:g&&!e.force?g.leaseId:void 0,leaseBackend:g&&!e.force?g.leaseBackend:tn(e),platform:e.platform??(g&&!e.force?g.platform:void 0),target:e.target??(g&&!e.force?g.target:void 0),runtime:g&&!e.force?g.runtime:void 0,metro:g&&!e.force?g.metro:void 0,connectedAt:g&&!e.force?g.connectedAt:h,updatedAt:h};eQ({stateDir:l,state:v}),g&&e.force&&(await to(g.metro),await tr({stateDir:l,state:g}),await ta(t,g));let y=tE(v),w=function(e,t){if(!t.runtime&&(ti(e)||tU(t.remoteConfigPath)))return tO(t.remoteConfigPath)}(e,v);return tu(e,tP(v,w),()=>[`Connected remote session "${p}" tenant "${n}" run "${i}" ${v.leaseId?`lease ${v.leaseId}`:"lease pending"}`,y?.message,w?.message].filter(e=>!!e).join("\n")),!0},tC=async({flags:e,client:t})=>{let s=e.session??"default",o=H(e.stateDir).baseDir,r=eX({stateDir:o,session:s})??(e.session?null:e8({stateDir:o}));if(!r)return tu(e,{connected:!1,session:s},()=>`No remote connection for "${s}".`),!0;let a=r.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await to(r.metro),await tr({stateDir:o,state:r});let n=!1;if(r.leaseId)try{n=(await t.leases.release({tenant:r.tenant,runId:r.runId,leaseId:r.leaseId})).released}catch{}return e1({stateDir:o,session:a}),tu(e,{connected:!1,session:a,released:n},()=>`Disconnected remote session "${a}".`),!0},t_=async({positionals:e,flags:t})=>{if("status"!==e[0])throw new C("INVALID_ARGS","connection accepts only: status");let s=t.session??"default",o=H(t.stateDir).baseDir,r=eX({stateDir:o,session:s})??(t.session?null:e8({stateDir:o}));if(!r)return tu(t,{connected:!1,session:s},()=>`No remote connection for "${s}".`),!0;let a=tE(r),n=function(e){if(!e.runtime&&tU(e.remoteConfigPath))return tO(e.remoteConfigPath)}(r);return tu(t,tP(r,n),()=>[`Connected remote session "${r.session}".`,`tenant=${r.tenant} runId=${r.runId} leaseId=${r.leaseId??"pending"} backend=${r.leaseBackend??"pending"}`,`remoteConfig=${r.remoteConfigPath}`,r.runtime?"metro=prepared":"metro=not-prepared",a?.message,n?.message].filter(e=>!!e).join("\n")),!0};function tE(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tO(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tU(e){try{let t=D({configPath:e,cwd:process.cwd(),env:process.env}).profile;return!!(t.metroPublicBaseUrl||t.metroProxyBaseUrl||t.metroProjectRoot||t.metroKind)}catch{return!1}}function tP(e,t){let s=tE(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 u.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...s?{leasePreparation:s}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}async function tT(e){return await tM({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function tM(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(tY(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(tY(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||tY(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 s=tB({stateDir:e.stateDir});if(s&&!tW(s.expiresAt,e.io?.now)){let o=await tV({session:s,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:o.accessToken},source:"cli-session"}}if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new C("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tH(e.command,t)}let o=await tF({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:o.accessToken},source:"login"}}async function tF(e){let t,s,o,r=e.env??e.io?.env??process.env,a=(c=r,p=e.io,t=p?.stdinIsTTY??process.stdin.isTTY,s=p?.stdoutIsTTY??process.stdout.isTTY,"true"!==(u=c).CI&&"true"!==u.GITHUB_ACTIONS&&"true"!==u.BUILDKITE&&t&&s?(m=c).SSH_TTY||m.SSH_CONNECTION||"true"===m.CODESPACES||m.GITPOD_WORKSPACE_ID||"true"===m.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===a)throw tH(e.commandLabel??"agent-device connect",r);let n=tK(r),i=await tq({baseUrl:n,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});var c,p,u,m,f,g,h=i;if(!tY(h.deviceCode)||!tY(h.userCode)||!tY(h.verificationUri))throw new C("COMMAND_FAILED","Cloud auth start returned an unusable response.");let v=i.verificationUriComplete??i.verificationUri,y="local-browser"===a?i.verificationUri:(f=i.verificationUri,g=i.userCode,(o=new URL(f)).searchParams.set("user_code",g),o.toString());"local-browser"===a?(tz(e.io,`Opening ${i.verificationUri}...
|
|
368
368
|
`),await tJ(v,e.io)):tz(e.io,`Open this URL on your machine:
|
|
369
369
|
${y}
|
|
370
370
|
|
|
371
371
|
Waiting for approval for 10 minutes...
|
|
372
|
-
`);let w=await tG({cloudBaseUrl:n,deviceCode:i.deviceCode,expiresIn:i.expiresIn,interval:i.interval,fetchImpl:e.io?.fetch,now:e.io?.now}),b=w.cliSession?.refreshCredential??w.cliSession?.refreshToken;if(!tY(w.accessToken)||!tY(b))throw new
|
|
373
|
-
`,{mode:384});try{d.chmodSync(t,384)}catch{}}({stateDir:e.stateDir,session:I}),{accessToken:w.accessToken,expiresAt:w.expiresAt,session:I}}function tB(e){let t=tj(e.stateDir);if(!d.existsSync(t))return null;try{let e=JSON.parse(d.readFileSync(t,"utf8"));if(1!==e.version||!tY(e.id)||!tY(e.cloudBaseUrl)||!tY(e.refreshCredential)||!tY(e.createdAt))return null;return e}catch{return null}}function tj(e){return l.join(e,"auth","cli-session.json")}async function tV(e){let t=tK(e.env,e.session.cloudBaseUrl),s=await tq({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(tY(s.accessToken))return{accessToken:s.accessToken,expiresAt:s.expiresAt};if("revoked"===s.status||"revoked"===s.error)throw new
|
|
372
|
+
`);let w=await tG({cloudBaseUrl:n,deviceCode:i.deviceCode,expiresIn:i.expiresIn,interval:i.interval,fetchImpl:e.io?.fetch,now:e.io?.now}),b=w.cliSession?.refreshCredential??w.cliSession?.refreshToken;if(!tY(w.accessToken)||!tY(b))throw new C("UNAUTHORIZED","Device authorization did not return CLI credentials.");let k=new Date(e.io?.now?.()??Date.now()).toISOString(),I={version:1,id:w.cliSession?.id??`cli-${Date.now().toString(36)}`,cloudBaseUrl:n,workspaceId:w.cliSession?.workspaceId,accountId:w.cliSession?.accountId,name:w.cliSession?.name,refreshCredential:b,createdAt:k,expiresAt:w.cliSession?.expiresAt};return function(e){let t=tj(e.stateDir);d.mkdirSync(l.dirname(t),{recursive:!0,mode:448}),d.writeFileSync(t,`${JSON.stringify(e.session,null,2)}
|
|
373
|
+
`,{mode:384});try{d.chmodSync(t,384)}catch{}}({stateDir:e.stateDir,session:I}),{accessToken:w.accessToken,expiresAt:w.expiresAt,session:I}}function tB(e){let t=tj(e.stateDir);if(!d.existsSync(t))return null;try{let e=JSON.parse(d.readFileSync(t,"utf8"));if(1!==e.version||!tY(e.id)||!tY(e.cloudBaseUrl)||!tY(e.refreshCredential)||!tY(e.createdAt))return null;return e}catch{return null}}function tj(e){return l.join(e,"auth","cli-session.json")}async function tV(e){let t=tK(e.env,e.session.cloudBaseUrl),s=await tq({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(tY(s.accessToken))return{accessToken:s.accessToken,expiresAt:s.expiresAt};if("revoked"===s.status||"revoked"===s.error)throw new C("UNAUTHORIZED","Stored cloud CLI session was revoked.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:s.status,error:s.error});throw new C("UNAUTHORIZED","Failed to refresh CLI session.",{hint:"Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.",status:s.status,error:s.error})}async function tG(e){let t=e.now??Date.now,s=Math.min((e.expiresIn??600)*1e3,6e5),o=t()+s,r=Math.max(1e3,(e.interval??5)*1e3);for(;t()<o;){let t=await tq({baseUrl:e.cloudBaseUrl,pathName:"/api/control-plane/device-auth/poll",body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if("approved"===t.status||tY(t.accessToken))return t;if("slow_down"===t.status||"slow_down"===t.error)r+=1e3;else if("authorization_pending"!==t.status&&"authorization_pending"!==t.error)throw new C("UNAUTHORIZED","Device authorization was not approved.",{status:t.status,error:t.error});await tZ(r)}throw new C("TIMEOUT","Device authorization expired before approval.")}async function tq(e){let t=e.fetchImpl??fetch,s=await t(new URL(e.pathName,e.baseUrl),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e.body),signal:AbortSignal.timeout(15e3)}),o=await s.text(),r={};if(o.trim().length>0)try{r=JSON.parse(o)}catch(e){throw new C("COMMAND_FAILED",`Cloud auth endpoint returned invalid JSON (${s.status}).`,{status:s.status},e instanceof Error?e:void 0)}if(!s.ok)throw new C("UNAUTHORIZED","Cloud auth endpoint rejected the request.",{status:s.status,response:r});return r}function tH(e,t){let s=tK(t);return new C("UNAUTHORIZED",`${e} cannot perform interactive login in CI or a non-interactive shell.`,{hint:`Create a service/API token: ${new URL("/api-keys",s).toString()} Then set AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...`})}function tK(e,t){let s=e.AGENT_DEVICE_CLOUD_BASE_URL??t??"https://cloud.agent-device.dev";try{return new URL(s).toString().replace(/\/+$/,"")}catch(e){throw new C("INVALID_ARGS","Invalid AGENT_DEVICE_CLOUD_BASE_URL.",{cloudBaseUrl:s},e instanceof Error?e:void 0)}}async function tJ(e,t){if(t?.openBrowser)return void await t.openBrowser(e);let s=process.platform;try{"darwin"===s?await Q("open",[e],{allowFailure:!0,timeoutMs:5e3}):"win32"===s?await Q("cmd",["/c","start","",e],{allowFailure:!0,timeoutMs:5e3}):await Q("xdg-open",[e],{allowFailure:!0,timeoutMs:5e3})}catch{tz(t,`Open this URL on your machine:
|
|
374
374
|
${e}
|
|
375
|
-
`)}}function tz(e,t){(e?.stderr??process.stderr).write(t)}function tW(e,t){if(!e)return!1;let s=Date.parse(e);return!Number.isFinite(s)||s<=(t?.()??Date.now())}function tY(e){return"string"==typeof e&&e.trim().length>0}async function tZ(e){await new Promise(t=>setTimeout(t,e))}let tX=async({positionals:e,flags:t})=>{let s=e[0]??"status",o=
|
|
376
|
-
`:""),x=(a=e,n=h,i=t,u=eJ(a),!i.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let s of e){let e=(s.type??"").toLowerCase(),o=
|
|
377
|
-
`:"";return 0===h.length?`${S}${
|
|
378
|
-
${$}`:t.raw?`${S}${
|
|
375
|
+
`)}}function tz(e,t){(e?.stderr??process.stderr).write(t)}function tW(e,t){if(!e)return!1;let s=Date.parse(e);return!Number.isFinite(s)||s<=(t?.()??Date.now())}function tY(e){return"string"==typeof e&&e.trim().length>0}async function tZ(e){await new Promise(t=>setTimeout(t,e))}let tX=async({positionals:e,flags:t})=>{let s=e[0]??"status",o=H(t.stateDir).baseDir;if("status"===s){var r;let e,s=(e=tB({stateDir:(r={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:tW(e.expiresAt,r.now)}:{authenticated:!1,source:"none"};return tu(t,s,()=>{var e;return(e=s).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"===s){let e=await tF({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return tu(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"===s){let e,s=(e=tj({stateDir:o}.stateDir),!!d.existsSync(e)&&(d.rmSync(e,{force:!0}),!0));return tu(t,{authenticated:!1,removed:s},()=>s?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new C("INVALID_ARGS","auth accepts only: status, login, logout")},tQ=async({flags:e,client:t})=>{let s=T(await t.capture.snapshot({...td(e),interactiveOnly:e.snapshotInteractiveOnly,compact:e.snapshotCompact,depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}));return tu(e,s,()=>(function(e,t={}){var s,o,r,a,n,i;let l,c,p,d,u,f=e.nodes,h=Array.isArray(f)?f:[],v="string"==typeof e.backend?e.backend:void 0,y=t.raw||"macos-helper"===v?null:m(h),b=!!e.truncated,k=y?.nodes??h,I=t.raw||"macos-helper"===v?null:function(e,t,s,o){let r=e.visibility;if(r&&"object"==typeof r&&"boolean"==typeof r.partial&&"number"==typeof r.visibleNodeCount&&"number"==typeof r.totalNodeCount&&Array.isArray(r.reasons))return{partial:r.partial,visibleNodeCount:r.visibleNodeCount,totalNodeCount:r.totalNodeCount,reasons:r.reasons.filter(e=>"string"==typeof e)};let a=t?.hiddenCount??0,n=!!t&&t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow);return a>0?{partial:!0,visibleNodeCount:s,totalNodeCount:o,reasons:["offscreen-nodes"]}:n?{partial:!0,visibleNodeCount:s,totalNodeCount:s,reasons:[]}:null}(e,y,k.length,h.length),D=(s=h.length,o=I,l=b?" (truncated)":"",o?.partial?o.totalNodeCount>o.visibleNodeCount?`Snapshot: ${o.visibleNodeCount} visible nodes (${o.totalNodeCount} total)${l}`:`Snapshot: ${o.visibleNodeCount} visible nodes${l}`:`Snapshot: ${s} nodes${l}`),S=(c="string"==typeof(r=e).appName?r.appName:void 0,p="string"==typeof r.appBundleId?r.appBundleId:void 0,d=[],c&&d.push(`Page: ${c}`),p&&d.push(`App: ${p}`),d.length>0?`${d.join("\n")}
|
|
376
|
+
`:""),x=(a=e,n=h,i=t,u=eJ(a),!i.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let s of e){let e=(s.type??"").toLowerCase(),o=w(s).trim().toLowerCase();if(!o)continue;let r=`${e}|${o}`;t.set(r,(t.get(r)??0)+1)}let s=0;for(let e of t.values())e>1&&(s+=e);return s>=8}(n)&&u.push("Warning: possible repeated nav subtree detected."),u),$=x.length>0?`${x.join("\n")}
|
|
377
|
+
`:"";return 0===h.length?`${S}${D}
|
|
378
|
+
${$}`:t.raw?`${S}${D}
|
|
379
379
|
${$}${h.map(e=>JSON.stringify(e)).join("\n")}
|
|
380
|
-
`:t.flatten?`${S}${
|
|
381
|
-
${$}${
|
|
382
|
-
`:`${S}${
|
|
383
|
-
${$}${(function(e){let t=[],s=[],o=e=>{for(;s.length>0&&e<=s[s.length-1].depth;)t.push(...ez(s.pop(),"below"))};for(let r of e)o(r.depth),t.push(r.text),t.push(...ez(r,"above")),r.node.hiddenContentBelow&&s.push(r);return o(0),t})(
|
|
380
|
+
`:t.flatten?`${S}${D}
|
|
381
|
+
${$}${A(k,{summarizeTextSurfaces:!0}).flatMap(e=>[g(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...ez({...e,depth:0})]).join("\n")}${eM(y)}
|
|
382
|
+
`:`${S}${D}
|
|
383
|
+
${$}${(function(e){let t=[],s=[],o=e=>{for(;s.length>0&&e<=s[s.length-1].depth;)t.push(...ez(s.pop(),"below"))};for(let r of e)o(r.depth),t.push(r.text),t.push(...ez(r,"above")),r.node.hiddenContentBelow&&s.push(r);return o(0),t})(A(k,{summarizeTextSurfaces:!0})).join("\n")}${eM(y)}
|
|
384
384
|
`})(s,{raw:e.snapshotRaw,flatten:e.snapshotInteractiveOnly})),!0},t0=async({positionals:e,flags:t,client:s})=>{let o=await s.capture.screenshot({path:e[0]??t.out,overlayRefs:t.overlayRefs,maxSize:t.screenshotMaxSize,...void 0!==t.screenshotFullscreen?{fullscreen:t.screenshotFullscreen}:{}});return tu(t,{path:o.path,...o.overlayRefs?{overlayRefs:o.overlayRefs}:{}},()=>o.overlayRefs?`Annotated ${o.overlayRefs.length} refs onto ${o.path}`:o.path),!0},t1=async({positionals:e,flags:t,client:s})=>{var o;if("snapshot"===e[0]){let e=await s.capture.diff({...td(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,compact:t.snapshotCompact,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw});return tu(t,e,()=>(function(e){var t;let s=!0===e.baselineInitialized,o=e.summary??{},r=eq(o.additions),a=eq(o.removals),n=eq(o.unchanged),i=eH(),l=eJ(e),p=l.length>0?`${l.join("\n")}
|
|
385
385
|
`:"";if(s)return`${p}Baseline initialized (${n} lines).
|
|
386
386
|
`;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 s=Array(e.length).fill(!1);for(let o of t){let t=Math.max(0,o-1),r=Math.min(e.length-1,o+1);for(let e=t;e<=r;e+=1)s[e]=!0}return e.filter((e,t)=>s[t])})(Array.isArray(e.lines)?e.lines:[]).map(e=>{let t="string"==typeof e.text?e.text:"";if("added"===e.kind){let e=t.startsWith(" ")?`+${t}`:`+ ${t}`;return i?c("green",e):e}if("removed"===e.kind){let e=t.startsWith(" ")?`-${t}`:`- ${t}`;return i?c("red",e):e}return i?c("dim",t):t}),u=d.length>0?`${d.join("\n")}
|
|
387
387
|
`:"";if(!i)return`${p}${u}${r} additions, ${a} removals, ${n} unchanged
|
|
388
388
|
`;let m=`${(t=String(r),c("green",t))} additions, ${c("red",String(a))} removals, ${c("dim",String(n))} unchanged`;return`${p}${u}${m}
|
|
389
|
-
`})(e)),!0}if("screenshot"!==e[0])return!1;let r=t.baseline;if(!r||"string"!=typeof r)throw new
|
|
390
|
-
`}),!0},t2={[
|
|
389
|
+
`})(e)),!0}if("screenshot"!==e[0])return!1;let r=t.baseline;if(!r||"string"!=typeof r)throw new C("INVALID_ARGS","diff screenshot requires --baseline <path>");let a=ee(r),n="string"==typeof t.out?ee(t.out):void 0,i=e[1];if(e.length>2)throw new C("INVALID_ARGS","diff screenshot accepts at most one current screenshot path");let l=v({backend:(o=s,{platform:function(e){switch(e.platform){case"android":case"linux":case"macos":return e.platform;default:return"ios"}}(t),captureScreenshot:async(e,t,s)=>{let r=await o.capture.screenshot({path:t,session:e.session,overlayRefs:s?.overlayRefs,fullscreen:s?.fullscreen,surface:s?.surface});return{path:r.path,...r.overlayRefs?{overlayRefs:r.overlayRefs}:{}}}}),artifacts:es(),sessions:{get:e=>({name:e}),set:()=>{}},policy:b()}),p=await l.capture.diffScreenshot({session:t.session,baseline:{kind:"path",path:a},current:i?{kind:"path",path:ee(i)}:{kind:"live"},...n?{out:{kind:"path",path:n}}:{},threshold:function(e){if(null!=e&&""!==e)return Number(e)}(t.threshold),overlayRefs:t.overlayRefs,surface:t.surface});return tu(t,p,()=>{var e,t,s,o;let r,a,n,i,l,d,u,m;return r=eH(),a=!0===p.match,n=p.dimensionMismatch,(i=[]).push(...function(e,t){if(!0===e.match){let e=t?c("green","✓"):"✓";return[`${e} Screenshots match.`]}let s=e.dimensionMismatch,o=t?c("red","✗"):"✗";if(s){let e=s.expected,t=s.actual;return[`${o} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let r=eq(e.differentPixels),a=eq(e.mismatchPercentage),n=0===a&&r>0?"<0.01":String(a),i=`${n}% pixels differ`;return[`${o} ${t?c("red",i):i}`]}(p,r)),i.push(...function(e,t,s){if(t)return[];let o=[];if(e.diffPath){let t=eG(e.diffPath),r=s?c("dim","Diff image:"):"Diff image:",a=s?c("green",t):t;o.push(` ${r} ${a}`)}if(e.currentOverlayPath){let t=eG(e.currentOverlayPath),r=s?c("dim","Current overlay:"):"Current overlay:",a=s?c("green",t):t,n=eq(e.currentOverlayRefCount),i=n>0?` (${n} refs)`:"";o.push(` ${r} ${a}${i}`)}return o}(p,a,r)),a||n||(i.push(...(e=p,t=r,l=eq(e.differentPixels),d=eq(e.totalPixels),u=t?c("red",String(l)):String(l),[` ${u} different / ${d} total pixels`])),i.push(...(s=p,o=r,0===(m=function(e){let t=[];for(let s 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)),s=e.length>t.length?` +${e.length-t.length} more`:"";return`${t.join(", ")}${s}`}(s.texts)} dx=${eV(s.xRange)}px dy=${eV(s.yRange)}px`);let s=(e.nonTextDeltas??[]).filter(e=>["icon","toggle","chevron"].includes(e.likelyKind)).slice(0,3);s.length>0&&t.push(`non-text controls: ${s.map(ej).join("; ")}`);let o=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return o.length>0&&t.push(`non-text boundaries: ${o.map(ej).join("; ")}`),t.slice(0,6)}(s)).length?[]:[` ${eK("Hints:",o)}`,...m.map(e=>` - ${e}`)])),i.push(...function(e,t){let s=Array.isArray(e.regions)?e.regions:[];if(0===s.length)return[];let o=[` ${eK("Changed regions:",t)}`];for(let e of s.slice(0,5))o.push(...function(e){let t=0===e.shareOfDiffPercentage&&e.differentPixels>0?"<0.01":String(e.shareOfDiffPercentage),s=e.rect,o=[` ${e.index}. ${e.location} x=${s.x} y=${s.y} ${s.width}x${s.height}, ${t}% of diff, change=${e.dominantChange}`],r=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);r&&o.push(` ${r}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:"";o.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return o}(e));return o}(p,r)),i.push(...function(e,t){let s=e.ocr?.matches??[];if(0===s.length)return[];let o=s.slice(0,8),r=[` ${eK(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${o.length}/${s.length}; px):`,t)}`,` ${eK("item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint",t)}`];for(let[e,t]of o.entries()){let s=t.delta;r.push(` ${e+1} | ${JSON.stringify(t.text)} | ${eB(s.x)},${eB(s.y)} | ${eB(s.width)},${eB(s.height)} | ${eF(t.baselineRect)} | ${eF(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?"ocr-bbox-size-change":"-"}`)}return r}(p,r)),i.push(...function(e,t){let s=e.nonTextDeltas??[];if(0===s.length)return[];let o=s.slice(0,8),r=[` ${eK(`Non-text visual deltas (showing ${o.length}/${s.length}; px):`,t)}`,` ${eK("item | region | slot | kind | bboxCurrent | nearestText",t)}`];for(let e of o)r.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:"-"} | ${e.slot} | ${e.likelyKind} | ${eF(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return r}(p,r))),`${i.join("\n")}
|
|
390
|
+
`}),!0},t2={[er.wait]:async({positionals:e,flags:t,client:s})=>(tm(t,await s.command.wait(function(e,t){let s=I(e);if(!s)throw new C("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let o={...td(t),depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw};if("sleep"===s.kind)return{...o,durationMs:s.durationMs};if("text"===s.kind){if(!s.text)throw new C("INVALID_ARGS","wait requires text.");return{...o,text:s.text,...t3(s.timeoutMs)}}return"ref"===s.kind?{...o,ref:s.rawRef,...t3(s.timeoutMs)}:{...o,selector:s.selectorExpression,...t3(s.timeoutMs)}}(e,t))),!0),[er.alert]:async({positionals:e,flags:t,client:s})=>(tm(t,await s.command.alert(function(e,t){if(e.length>2)throw new C("INVALID_ARGS","alert accepts at most action and timeout arguments.");let s=function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new C("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),o=function(e,t){if(void 0===e)return;let s=Number(e);if(Number.isFinite(s))return s;throw new C("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout");return{...td(t),...s?{action:s}:{},...void 0!==o?{timeoutMs:o}:{}}}(e,t))),!0),[er.appState]:async({flags:e,client:t})=>{let s=await t.command.appState(td(e));return tu(e,s,()=>(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})(s)),!0},[er.back]:async({flags:e,client:t})=>(tm(e,await t.command.back({...td(e),mode:e.backMode})),!0),[er.home]:async({flags:e,client:t})=>(tm(e,await t.command.home(td(e))),!0),[er.rotate]:async({positionals:e,flags:t,client:s})=>(tm(t,await s.command.rotate(function(e,t){if(e.length>1)throw new C("INVALID_ARGS","rotate accepts exactly one orientation argument.");return{...td(t),orientation:k(e[0])}}(e,t))),!0),[er.appSwitcher]:async({flags:e,client:t})=>(tm(e,await t.command.appSwitcher(td(e))),!0),[er.keyboard]:async({positionals:e,flags:t,client:s})=>(tm(t,await s.command.keyboard(function(e,t){if(e.length>1)throw new C("INVALID_ARGS","keyboard accepts at most one action argument.");let s=function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t)return t;throw new C("INVALID_ARGS","keyboard action must be status, get, or dismiss.")}(e[0]);return{...td(t),...s?{action:s}:{}}}(e,t))),!0),[er.clipboard]:async({positionals:e,flags:t,client:s})=>{var o,r;return o=t,r=await s.command.clipboard(function(e,t){let s=e[0]?.toLowerCase();if("read"!==s&&"write"!==s)throw new C("INVALID_ARGS","clipboard requires a subcommand: read or write.");let o=td(t);if("read"===s){if(1!==e.length)throw new C("INVALID_ARGS","clipboard read does not accept additional arguments.");return{...o,action:s}}if(e.length<2)throw new C("INVALID_ARGS","clipboard write requires text.");return{...o,action:s,text:e.slice(1).join(" ")}}(e,t)),o.json?tu(o,r):"read"===r.action?process.stdout.write(`${r.text}
|
|
391
391
|
`):tm(o,r),!0}};function t3(e){return null===e?{}:{timeoutMs:e}}function t5(e){let{suite:t,json:s,verbose:o,reportJunit:r}=e;return(r&&function(e,t){let s=l.dirname(e);try{d.mkdirSync(s,{recursive:!0}),d.writeFileSync(e,function(e){let t=['<?xml version="1.0" encoding="UTF-8"?>',"<testsuites>",` <testsuite name="agent-device replay suite" tests="${e.total}" failures="${e.failed}" skipped="${e.skipped}" time="${t6(e.durationMs)}">`];for(let s of e.tests)t.push(...function(e){let t=t7(l.basename(e.file)),s=t7("."===l.dirname(e.file)?e.file:l.dirname(e.file)),o=t7(e.file),r=t6(e.durationMs),a=[` <testcase classname="${s}" name="${t}" file="${o}" time="${r}">`];"failed"===e.status?a.push(` <failure message="${t7(e.error.message)}">${t7(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 s=e.error.details?JSON.stringify(e.error.details,null,2):void 0;return s&&t.push(`details: ${s}`),t.join("\n")}(e))}</failure>`):"skipped"===e.status&&a.push(` <skipped message="${t7(e.message)}" />`);let n=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")}(e);return n&&a.push(` <system-out>${t7(n)}</system-out>`),a.push(" </testcase>"),a}(s));return t.push(" </testsuite>"),t.push("</testsuites>"),`${t.join("\n")}
|
|
392
|
-
`}(t),"utf8")}catch(s){let t=s instanceof Error?s.message:String(s);throw new
|
|
392
|
+
`}(t),"utf8")}catch(s){let t=s instanceof Error?s.message:String(s);throw new C("COMMAND_FAILED",`Failed to write JUnit report to ${e}: ${t}`)}}(r,t),s)?(eP({success:!0,data:t}),function(e){return+(e.failed>0)}(t)):function(e,t={}){let s=e.tests.filter(t4);if(t.verbose)for(let t of e.tests)!function(e){if("failed"===e.status)return t8(e);let t="passed"===e.status?t4(e)?"FLAKY":"PASS":"skipped"===e.status?"SKIP":"INFO",s="attempts"in e&&e.attempts>1?` after ${e.attempts} attempts`:"",o=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`${t} ${e.file}${s}${o}
|
|
393
393
|
`),"skipped"===e.status&&process.stdout.write(` ${e.message??"skipped"}
|
|
394
394
|
`)}(t);else{for(let t of e.failures)t8(t);for(let e of s)!function(e){let t=e.durationMs>0?` (${e.durationMs}ms)`:"";process.stdout.write(`FLAKY ${e.file} after ${e.attempts} attempts${t}
|
|
395
395
|
`)}(e)}let o="number"==typeof e.durationMs?e.durationMs:void 0,r=s.length>0?`, ${s.length} flaky`:"";return process.stdout.write(`Test summary: ${e.passed} passed, ${e.failed} failed${r}${void 0!==o?` in ${o}ms`:""}
|
|
@@ -399,34 +399,34 @@ ${$}${(function(e){let t=[],s=[],o=e=>{for(;s.length>0&&e<=s[s.length-1].depth;)
|
|
|
399
399
|
`),e.artifactsDir&&process.stdout.write(` artifacts: ${e.artifactsDir}
|
|
400
400
|
`),e.error?.logPath&&process.stdout.write(` log: ${e.error.logPath}
|
|
401
401
|
`),e.error?.diagnosticId&&process.stdout.write(` diagnostic: ${e.error.diagnosticId}
|
|
402
|
-
`)}function t4(e){return"passed"===e.status&&e.attempts>1}function t6(e){return(Math.max(0,e)/1e3).toFixed(3)}function t7(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}let t9={[
|
|
403
|
-
`),Array.isArray(e.results)?e.results:[])){var r;if(!a||"object"!=typeof a)continue;let e="number"==typeof a.step?a.step:void 0,t="string"==typeof a.command?a.command:"step",s=!1!==a.ok,o="number"==typeof a.durationMs?a.durationMs:void 0,n=a.data&&"object"==typeof a.data?a.data:void 0,i=a.error&&"object"==typeof a.error?a.error:void 0,l=s?
|
|
404
|
-
`)}}(o),0;if(e===
|
|
402
|
+
`)}function t4(e){return"passed"===e.status&&e.attempts>1}function t6(e){return(Math.max(0,e)/1e3).toFixed(3)}function t7(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}let t9={[er.boot]:se(er.boot,({client:e,flags:t})=>e.devices.boot({...td(t),headless:t.headless})),[er.push]:se(er.push,({client:e,positionals:t,flags:s})=>e.apps.push({...td(s),app:sr(t[0],"push requires bundleOrPackage"),payload:sr(t[1],"push requires payloadOrJson")})),[er.perf]:se(er.perf,({client:e,flags:t})=>e.observability.perf(td(t))),[er.click]:se(er.click,({client:e,positionals:t,flags:s})=>e.interactions.click({...ss(t),...st(s),...td(s),count:s.count,intervalMs:s.intervalMs,holdMs:s.holdMs,jitterPx:s.jitterPx,doubleTap:s.doubleTap,button:s.clickButton})),[er.get]:se(er.get,({client:e,positionals:t,flags:s})=>e.interactions.get({...function(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ")||void 0};let t=e.join(" ").trim();if(!t)throw new C("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(t.slice(1)),...st(s),...td(s),format:function(e){if("text"===e||"attrs"===e)return e;throw new C("INVALID_ARGS","get only supports text or attrs")}(t[0])})),[er.replay]:se(er.replay,({client:e,positionals:t,flags:s})=>e.replay.run({...td(s),path:sr(t[0],"replay requires path"),update:s.replayUpdate,env:s.replayEnv})),[er.test]:se(er.test,({client:e,positionals:t,flags:s})=>(({json:s.json}).json||process.stderr.write("Running replay suite...\n"),e.replay.test({...td(s),paths:t,update:s.replayUpdate,env:s.replayEnv,failFast:s.failFast,timeoutMs:s.timeoutMs,retries:s.retries,artifactsDir:s.artifactsDir,reportJunit:s.reportJunit}))),[er.batch]:se(er.batch,({client:e,flags:t})=>e.batch.run({...td(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out})),[er.press]:se(er.press,({client:e,positionals:t,flags:s})=>e.interactions.press({...ss(t),...st(s),...td(s),count:s.count,intervalMs:s.intervalMs,holdMs:s.holdMs,jitterPx:s.jitterPx,doubleTap:s.doubleTap})),[er.longPress]:se(er.longPress,({client:e,positionals:t,flags:s})=>e.interactions.longPress({...td(s),x:Number(t[0]),y:Number(t[1]),durationMs:sa(t[2])})),[er.swipe]:se(er.swipe,({client:e,positionals:t,flags:s})=>e.interactions.swipe({...td(s),from:{x:Number(t[0]),y:Number(t[1])},to:{x:Number(t[2]),y:Number(t[3])},durationMs:sa(t[4]),count:s.count,pauseMs:s.pauseMs,pattern:s.pattern})),[er.focus]:se(er.focus,({client:e,positionals:t,flags:s})=>e.interactions.focus({...td(s),x:Number(t[0]),y:Number(t[1])})),[er.type]:se(er.type,({client:e,positionals:t,flags:s})=>e.interactions.type({...td(s),text:t.join(" "),delayMs:s.delayMs})),[er.fill]:se(er.fill,({client:e,positionals:t,flags:s})=>e.interactions.fill({...function(e){if(e[0]?.startsWith("@")){let t=e.length>=3?e.slice(2).join(" "):e.slice(1).join(" ");return{ref:e[0],label:e.length>=3?e[1]:void 0,text:t}}let t=en(e,{preferTrailingValue:!0});return t?{selector:t.selectorExpression,text:t.rest.join(" ")}:{x:Number(e[0]),y:Number(e[1]),text:e.slice(2).join(" ")}}(t),...st(s),...td(s),delayMs:s.delayMs})),[er.scroll]:se(er.scroll,({client:e,positionals:t,flags:s})=>e.interactions.scroll({...td(s),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new C("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(t[0]),amount:sa(t[1]),pixels:s.pixels})),[er.pinch]:se(er.pinch,({client:e,positionals:t,flags:s})=>e.interactions.pinch({...td(s),scale:Number(t[0]),x:sa(t[1]),y:sa(t[2])})),[er.triggerAppEvent]:se(er.triggerAppEvent,({client:e,positionals:t,flags:s})=>e.apps.triggerEvent({...td(s),event:sr(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 C("INVALID_ARGS",`${t} must be a JSON object`)}(t[1],"trigger-app-event payload"):void 0})),[er.record]:se(er.record,({client:e,positionals:t,flags:s})=>e.recording.record({...td(s),action:so(t[0],"record"),path:t[1],fps:s.fps,quality:s.quality,hideTouches:s.hideTouches})),[er.trace]:se(er.trace,({client:e,positionals:t,flags:s})=>e.recording.trace({...td(s),action:so(t[0],"trace"),path:t[1]})),[er.logs]:se(er.logs,({client:e,positionals:t,flags:s})=>e.observability.logs({...td(s),action:function(e){if(void 0!==e){if("path"===e||"start"===e||"stop"===e||"doctor"===e||"mark"===e||"clear"===e)return e;throw new C("INVALID_ARGS","logs requires path, start, stop, doctor, mark, or clear")}}(t[0]),message:t.slice(1).join(" ")||void 0,restart:s.restart})),[er.network]:se(er.network,({client:e,positionals:t,flags:s})=>e.observability.network({...td(s),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new C("INVALID_ARGS","network requires dump or log")}}(t[0]),limit:sa(t[1]),include:s.networkInclude??function(e){if(void 0!==e){if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new C("INVALID_ARGS","network include mode must be summary, headers, body, or all")}}(t[2])})),[er.find]:se(er.find,({client:e,positionals:t,flags:s})=>{var o;return e.interactions.find({...function(e){let t=function(e){if("text"===e||"label"===e||"value"===e||"role"===e||"id"===e)return e}(e[0]),s=void 0!==t,o=s?e[1]:e[0],r=s?2:1,a=e[r];if(void 0===a)return{locator:t,query:sr(o,"find requires query")};if("get"===a){let s=e[r+1];if("text"===s)return{locator:t,query:sr(o,"find requires query"),action:"getText"};if("attrs"===s)return{locator:t,query:sr(o,"find requires query"),action:"getAttrs"};throw new C("INVALID_ARGS","find get only supports text or attrs")}if("wait"===a)return{locator:t,query:sr(o,"find requires query"),action:"wait",timeoutMs:sa(e[r+1])};if("fill"===a||"type"===a)return{locator:t,query:sr(o,"find requires query"),action:a,value:e.slice(r+1).join(" ")};if("click"===a||"focus"===a||"exists"===a)return{locator:t,query:sr(o,"find requires query"),action:a};throw new C("INVALID_ARGS",`Unsupported find action: ${a}`)}(t),...{depth:(o=s).snapshotDepth,raw:o.snapshotRaw},...td(s),first:s.findFirst,last:s.findLast})}),[er.is]:se(er.is,({client:e,positionals:t,flags:s})=>e.interactions.is({...function(e){let t=e[0],s=en(e.slice(1),{preferTrailingValue:"text"===t});if(!s)throw new C("INVALID_ARGS","is requires a selector expression");if("text"===t)return{predicate:t,selector:s.selectorExpression,value:s.rest.join(" ")};if("visible"===t||"hidden"===t||"exists"===t||"editable"===t||"selected"===t)return{predicate:t,selector:s.selectorExpression};throw new C("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")}(t),...st(s),...td(s)})),[er.settings]:se(er.settings,({client:e,positionals:t,flags:s})=>e.settings.update(function(e,t){let s=td(t),o=e[0],r=e[1];if(("wifi"===o||"airplane"===o||"location"===o||"animations"===o)&&("on"===r||"off"===r)||"appearance"===o&&("light"===r||"dark"===r||"toggle"===r)||("faceid"===o||"touchid"===o)&&("match"===r||"nonmatch"===r||"enroll"===r||"unenroll"===r)||"fingerprint"===o&&("match"===r||"nonmatch"===r))return{...s,setting:o,state:r};if("permission"===o&&("grant"===r||"deny"===r||"reset"===r))return{...s,setting:o,state:r,permission:function(e){switch(e){case"camera":case"microphone":case"photos":case"contacts":case"contacts-limited":case"notifications":case"calendar":case"location":case"location-always":case"media-library":case"motion":case"reminders":case"siri":case"accessibility":case"screen-recording":case"input-monitoring":return e;default:throw new C("INVALID_ARGS","settings permission requires a permission target.")}}(e[2]),mode:function(e){if(void 0===e||"full"===e||"limited"===e)return e;throw new C("INVALID_ARGS","settings permission mode must be full or limited.")}(e[3])};throw new C("INVALID_ARGS","Invalid settings arguments.")}(t,s)))};function se(e,t){return async({positionals:s,flags:o,client:r})=>{let a=await t({client:r,positionals:s,flags:o}),n=function(e,t,s,o){if(s.json)return e===er.test?t5({suite:o,json:!0,reportJunit:s.reportJunit}):(eP({success:!0,data:o}),0);if(e===er.test)return t5({suite:o,verbose:s.verbose,reportJunit:s.reportJunit});if(e===er.batch)return!function(e){let t="number"==typeof e.total?e.total:0,s="number"==typeof e.executed?e.executed:0,o="number"==typeof e.totalDurationMs?e.totalDurationMs:void 0;for(let a of(process.stdout.write(`Batch completed: ${s}/${t} steps${void 0!==o?` in ${o}ms`:""}
|
|
403
|
+
`),Array.isArray(e.results)?e.results:[])){var r;if(!a||"object"!=typeof a)continue;let e="number"==typeof a.step?a.step:void 0,t="string"==typeof a.command?a.command:"step",s=!1!==a.ok,o="number"==typeof a.durationMs?a.durationMs:void 0,n=a.data&&"object"==typeof a.data?a.data:void 0,i=a.error&&"object"==typeof a.error?a.error:void 0,l=s?q(n)??t:(r=i,("string"==typeof r?.message&&r.message.length>0?r.message:null)??t),c=void 0!==e?`${e}. `:"- ",p=void 0!==o?` (${o}ms)`:"";process.stdout.write(`${c}${s?"OK":"FAILED"} ${l}${p}
|
|
404
|
+
`)}}(o),0;if(e===er.get){let e=t[0];if("text"===e)return process.stdout.write(`${"string"==typeof o.text?o.text:""}
|
|
405
405
|
`),0;if("attrs"===e)return process.stdout.write(`${JSON.stringify(o.node??{},null,2)}
|
|
406
|
-
`),0}if(e===
|
|
406
|
+
`),0}if(e===er.find){if("string"==typeof o.text)return process.stdout.write(`${o.text}
|
|
407
407
|
`),0;if("boolean"==typeof o.found)return process.stdout.write(`Found: ${o.found}
|
|
408
408
|
`),0;if(o.node)return process.stdout.write(`${JSON.stringify(o.node,null,2)}
|
|
409
|
-
`),0}if(e===
|
|
410
|
-
`),0;if(e===
|
|
411
|
-
`),0}if(e===
|
|
412
|
-
`),0}if(e===
|
|
409
|
+
`),0}if(e===er.is)return process.stdout.write(`Passed: is ${o.predicate??"assertion"}
|
|
410
|
+
`),0;if(e===er.boot){let e=o.platform??"unknown",t=o.device??o.id??"unknown";return process.stdout.write(`Boot ready: ${t} (${e})
|
|
411
|
+
`),0}if(e===er.record){let e="string"==typeof o.outPath?o.outPath:"";return e&&process.stdout.write(`${e}
|
|
412
|
+
`),0}if(e===er.logs)return function(e,t){let s="string"==typeof e.path?e.path:"";if(!s)return;process.stdout.write(`${s}
|
|
413
413
|
`);let o=["active","state","backend","sizeBytes"].map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ");o&&!t.json&&process.stderr.write(`${o}
|
|
414
414
|
`);let r=["started","stopped","marked","cleared","restarted","removedRotatedFiles"].map(t=>{let s=e[t];return!0===s?`${t}=true`:"number"==typeof s?`${t}=${s}`:""}).filter(Boolean).join(" ");if(r&&!t.json&&process.stderr.write(`${r}
|
|
415
415
|
`),e.hint&&!t.json&&process.stderr.write(`${e.hint}
|
|
416
416
|
`),Array.isArray(e.notes)&&!t.json)for(let t of e.notes)"string"==typeof t&&t.length>0&&process.stderr.write(`${t}
|
|
417
|
-
`)}(o,s),0;if(e===
|
|
417
|
+
`)}(o,s),0;if(e===er.network)return function(e){let t="string"==typeof e.path?e.path:"";t&&process.stdout.write(`${t}
|
|
418
418
|
`);let s=Array.isArray(e.entries)?e.entries:[];if(0===s.length)process.stdout.write("No recent HTTP(s) entries found.\n");else for(let e of s){let t="string"==typeof e.method?e.method:"HTTP",s="string"==typeof e.url?e.url:"<unknown-url>",o="number"==typeof e.status?` status=${e.status}`:"",r="string"==typeof e.timestamp?`${e.timestamp} `:"",a="number"==typeof e.durationMs?` durationMs=${e.durationMs}`:"";process.stdout.write(`${r}${t} ${s}${o}${a}
|
|
419
419
|
`),"string"==typeof e.headers&&process.stdout.write(` headers: ${e.headers}
|
|
420
420
|
`),"string"==typeof e.requestBody&&process.stdout.write(` request: ${e.requestBody}
|
|
421
421
|
`),"string"==typeof e.responseBody&&process.stdout.write(` response: ${e.responseBody}
|
|
422
422
|
`)}let o=["active","state","backend","include","scannedLines","matchedLines"].map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ");if(o&&process.stderr.write(`${o}
|
|
423
423
|
`),Array.isArray(e.notes))for(let t of e.notes)"string"==typeof t&&t.length>0&&process.stderr.write(`${t}
|
|
424
|
-
`)}(o),0;if(e===
|
|
425
|
-
`),0}if(e===
|
|
426
|
-
`),0;let r=
|
|
427
|
-
`),0}(e,s,o,a);return 0!==n&&process.exit(n),!0}}function st(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function ss(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ")||void 0};let t=ei(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function so(e,t){if("start"===e||"stop"===e)return e;throw new _("INVALID_ARGS",`${t} requires start|stop`)}function sr(e,t){if(void 0===e||""===e)throw new _("INVALID_ARGS",t);return e}function sa(e){return void 0===e?void 0:Number(e)}let sn={...{session:tf,[ea.devices]:tg,[ea.apps]:tw,"ensure-simulator":tv,metro:ty,install:tA,reinstall:tD,"install-from-source":tS,connect:tR,disconnect:tC,connection:t_,auth:tX,open:tL,close:tN,[ea.snapshot]:tQ,[ea.screenshot]:t0,[ea.diff]:t1},...t2,...t9};async function si(e){let t=sn[e.command];return!!t&&await t(e)}async function sl(e,t){let{flags:s}=e,o=function(e){if(!e?.metroProxyBaseUrl||"android"!==e.platform&&"android-instance"!==e.leaseBackend)return null;let t=e?.metroProxyBaseUrl,s=e?.metroBearerToken,o=e?.tenant,r=e?.runId,a=e?.leaseId,n=[];if(t||n.push("metroProxyBaseUrl"),s||n.push("metroBearerToken"),o||n.push("tenant"),r||n.push("runId"),a||n.push("leaseId"),n.length>0)throw new _("INVALID_ARGS",`react-devtools remote Android bridge requires ${n.join(", ")}.`,{missing:n});if(!t||!s||!o||!r||!a)throw new _("INVALID_ARGS","react-devtools remote Android bridge is incomplete.");return{serverBaseUrl:t,bearerToken:s,tenantId:o,runId:r,leaseId:a}}(s);if(!o)return t();let r=e.stateDir??process.cwd(),a=e.session??s?.session??"default",n=s?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;await eY({projectRoot:e.cwd??process.cwd(),stateDir:r,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:a,profileKey:n,consumerKey:a,env:e.env??process.env});try{return await t()}finally{await eZ({projectRoot:e.cwd??process.cwd(),stateDir:r,profileKey:n,consumerKey:a})}}async function sc(e,t={}){let s=t.cwd??process.cwd(),o=t.env??process.env;return await sl(t,async()=>(await Q("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:s,env:o,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode)}function sp(e,t={}){let s=sd(t),o={...e};return s.defaultPlatform&&void 0===o.platform&&(o.platform=s.defaultPlatform),o}function sd(e){var t,s,o,r;let a,n=e.env??process.env,i=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 _("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(n.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??n.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:i,lockPolicy:(s=e.policyOverrides,o=n,r=l,(a=s?.sessionLock??s?.sessionLockConflicts??su(o.AGENT_DEVICE_SESSION_LOCK)??su(o.AGENT_DEVICE_SESSION_LOCK_CONFLICTS))||(s?.sessionLocked===!0||w(o.AGENT_DEVICE_SESSION_LOCKED)||r?"reject":void 0))}}function su(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new _("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}let sm=$.map(e=>e.key),sf={sendToDaemon:en},sg=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),sh=new Set(["connect","connection","close","disconnect","ensure-simulator","metro","session"]);async function sv(e,t=sf){let s=P(),o=B(),r=e.includes("--debug")||e.includes("--verbose")||e.includes("-v"),a=e.includes("--json"),n=function(e){for(let t=0;t<e.length;t+=1){let s=e[t];if(s.startsWith("--session=")){let e=s.slice(10).trim();return e.length>0?e:null}if("--session"===s){let s=e[t+1]?.trim();if(s&&!s.startsWith("-"))return s;break}}return null}(e)??process.env.AGENT_DEVICE_SESSION??"default";await J({session:n,requestId:s,command:e[0],debug:r},async()=>{var n,i,c,p,u,m,f,g,h,y,w,b,k,I,A,D,$;let N,E,O,U,P,T,M;try{let t,s,o,r,a,v,b,k;n={cwd:process.cwd(),env:process.env},t=function(e){let t={json:!1,help:!1,version:!1},s=null,o=[],r=[],a=!0;for(let l=0;l<e.length;l+=1){var n,i;let c=e[l];if(a&&"--"===c){a=!1;continue}if(!a){s?o.push(c):s=eU(c);continue}let p=c.startsWith("--"),d=c.startsWith("-")&&c.length>1;if(!p&&!d){s?o.push(c):s=eU(c);continue}let[u,m]=p?e_(c):[c,void 0],f=eh.get(u);if(n=s,i=f,"react-devtools"===n&&(!i||!eR(i.key,n))){o.push(c);continue}if(!f){if(function(e,t,s){var o;if(o=s,!/^-\d+(\.\d+)?$/.test(o)||!e)return!1;let r=ey(e);return!r||!!r.allowsExtraPositionals||0!==r.positionalArgs.length&&(t.length<r.positionalArgs.length||r.positionalArgs.some(e=>e.includes("?")))}(s,o,c)){s?o.push(c):s=c;continue}throw new _("INVALID_ARGS",`Unknown flag: ${u}`)}let g=function(e,t,s,o){if(void 0!==e.setValue){if(void 0!==s)throw new _("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==s)throw new _("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==s){if(0===s.trim().length)throw new _("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:s,consumeNext:!1}}return void 0===o||eO(o)||!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("\\"))}(o)?{value:!0,consumeNext:!1}:{value:o,consumeNext:!0}}let r=s??o;if(void 0===r||void 0===s&&eO(r))throw new _("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:r,consumeNext:void 0===s};if("enum"===e.type){if(!e.enumValues?.includes(r))throw new _("INVALID_ARGS",`Invalid ${eE(t)}: ${r}`);return{value:r,consumeNext:void 0===s}}let a=Number(r);if(!Number.isFinite(a)||"number"==typeof e.min&&a<e.min||"number"==typeof e.max&&a>e.max)throw new _("INVALID_ARGS",`Invalid ${eE(t)}: ${r}`);return{value:Math.floor(a),consumeNext:void 0===s}}(f,u,m,e[l+1]);g.consumeNext&&(l+=1);let h=t[f.key];if(f.multiple){let e=Array.isArray(h)?[...h,g.value]:void 0===h?[g.value]:[h,g.value];t[f.key]=e}else t[f.key]=g.value;r.push({key:f.key,token:u})}return{command:s,positionals:o,flags:t,warnings:[],providedFlags:r}}(e),s=n?.env??process.env,o=n?.cwd??process.cwd(),p=t.command,r=null!==p&&(i={remoteConfig:t.flags.remoteConfig,cwd:o,env:s}).remoteConfig?{...function(e){let t={};for(let s of sm){let o=e[s];void 0!==o&&(t[s]=o)}return t}(S({configPath:i.remoteConfig,cwd:i.cwd,env:i.env}).profile),remoteConfig:i.remoteConfig}:{},b=ec((a=(c={command:t.command,cwd:o,cliFlags:t.flags,env:s}).env??process.env,v=ec({},function(e){let t={};for(let s of e)ec(t,function(e,t){let s,o;if(!d.existsSync(e)){if(t)throw new _("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{s=d.readFileSync(e,"utf8")}catch(t){throw new _("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(s)}catch(t){throw new _("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 _("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let s={};for(let[o,r]of Object.entries(e)){if("installSource"===o){s.installSource=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new _("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==tI(e.type,`${t} installSource.type`))throw new _("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:s,repo:o}=tk(tI(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return tb(s,o,e.artifact,`${t} installSource.artifact`)}(r,t);continue}let e=eN.get(o);if(!e)throw new _("INVALID_ARGS",`Unknown config key "${o}" in ${t}.`);if(!e.config.enabled)throw new _("INVALID_ARGS",`Unsupported config key "${o}" in ${t}.`);s[o]=L(eC(e),r,t,o)}return s}(o,`config file ${e}`)}(s.path,s.required));return t}((u=c.cwd,m=c.cliFlags.config,f=a,(k=m??f.AGENT_DEVICE_CONFIG)?[{path:(g=k,h=u,y=f,et(g,{cwd:h,env:y})),required:!0}]:[{path:(w=f,l.join(es("~",{env:w}),".agent-device","config.json")),required:!1},{path:l.resolve(u,"agent-device.json"),required:!1}]))),ec(v,function(e,t){var s,o,r;let a={};for(let n of eL.filter(e=>e.config.enabled&&e.supportsCommand(t))){if("installSource"===n.key)continue;let t=n.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(a[n.key]=(s=t.value,o=`environment variable ${t.name}`,r=t.name,L(eC(n),s,o,r)))}return a}(a,c.command))),r),N={...function(e,t){let s=t?.strictFlags??function(e){if(!e)return!1;let t=e.trim().toLowerCase();return"1"===t||"true"===t||"yes"===t||"on"===t}(process.env.AGENT_DEVICE_STRICT_FLAGS),o=[...e.warnings],r=ec({json:!1,help:!1,version:!1},t?.defaultFlags??{});ec(r,e.flags);let a=ey(e.command),n=e.providedFlags.filter(t=>!eR(t.key,e.command));if(n.length>0){var i,l;let t=n.map(e=>e.token),a=(i=e.command,l=t,i?1===l.length?`Flag ${l[0]} is not supported for command ${i}.`:`Flags ${l.join(", ")} are not supported for command ${i}.`:1===l.length?`Flag ${l[0]} requires a command that supports it.`:`Flags ${l.join(", ")} require a command that supports them.`);if(s)throw new _("INVALID_ARGS",a);for(let e of(o.push(`${a} Enable AGENT_DEVICE_STRICT_FLAGS=1 to fail fast.`),n))delete r[e.key]}for(let t of Object.keys(r))void 0!==r[t]&&(eR(t,e.command)||delete r[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 _("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),a?.defaults)for(let[e,t]of Object.entries(a.defaults))void 0===r[e]&&(r[e]=t);if("batch"===e.command&&1!=+!!r.steps+ +!!r.stepsFile)throw new _("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,...s}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:s,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:r,warnings:o})}(t,{strictFlags:n?.strictFlags,defaultFlags:b}),providedFlags:t.providedFlags}}catch(t){V({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=C(t,{diagnosticId:j().diagnosticId,logPath:z({force:!0})??void 0});a?eP({success:!1,error:e}):eT(e,{showDetails:r}),process.exit(1);return}for(let e of N.warnings)process.stderr.write(`Warning: ${e}
|
|
428
|
-
`);
|
|
429
|
-
`),process.exit(0));let
|
|
424
|
+
`)}(o),0;if(e===er.click||e===er.press){let e=o.ref??"",t=o.x,s=o.y;if(e&&"number"==typeof t&&"number"==typeof s)return process.stdout.write(`Tapped @${e} (${t}, ${s})
|
|
425
|
+
`),0}if(e===er.perf)return process.stdout.write(`${JSON.stringify(o,null,2)}
|
|
426
|
+
`),0;let r=q(o);return r&&process.stdout.write(`${r}
|
|
427
|
+
`),0}(e,s,o,a);return 0!==n&&process.exit(n),!0}}function st(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function ss(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ")||void 0};let t=en(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function so(e,t){if("start"===e||"stop"===e)return e;throw new C("INVALID_ARGS",`${t} requires start|stop`)}function sr(e,t){if(void 0===e||""===e)throw new C("INVALID_ARGS",t);return e}function sa(e){return void 0===e?void 0:Number(e)}let sn={...{session:tf,[er.devices]:tg,[er.apps]:tw,"ensure-simulator":tv,metro:ty,install:tA,reinstall:tD,"install-from-source":tS,connect:tR,disconnect:tC,connection:t_,auth:tX,open:tL,close:tN,[er.snapshot]:tQ,[er.screenshot]:t0,[er.diff]:t1},...t2,...t9};async function si(e){let t=sn[e.command];return!!t&&await t(e)}async function sl(e,t){let{flags:s}=e,o=function(e){if(!e?.metroProxyBaseUrl||"android"!==e.platform&&"android-instance"!==e.leaseBackend)return null;let t=e?.metroProxyBaseUrl,s=e?.metroBearerToken,o=e?.tenant,r=e?.runId,a=e?.leaseId,n=[];if(t||n.push("metroProxyBaseUrl"),s||n.push("metroBearerToken"),o||n.push("tenant"),r||n.push("runId"),a||n.push("leaseId"),n.length>0)throw new C("INVALID_ARGS",`react-devtools remote Android bridge requires ${n.join(", ")}.`,{missing:n});if(!t||!s||!o||!r||!a)throw new C("INVALID_ARGS","react-devtools remote Android bridge is incomplete.");return{serverBaseUrl:t,bearerToken:s,tenantId:o,runId:r,leaseId:a}}(s);if(!o)return t();let r=e.stateDir??process.cwd(),a=e.session??s?.session??"default",n=s?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;await eY({projectRoot:e.cwd??process.cwd(),stateDir:r,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:a,profileKey:n,consumerKey:a,env:e.env??process.env});try{return await t()}finally{await eZ({projectRoot:e.cwd??process.cwd(),stateDir:r,profileKey:n,consumerKey:a})}}async function sc(e,t={}){let s=t.cwd??process.cwd(),o=t.env??process.env;return await sl(t,async()=>(await X("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:s,env:o,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode)}function sp(e,t={}){let s=sd(t),o={...e};return s.defaultPlatform&&void 0===o.platform&&(o.platform=s.defaultPlatform),o}function sd(e){var t,s,o,r;let a,n=e.env??process.env,i=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 C("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(n.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??n.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:i,lockPolicy:(s=e.policyOverrides,o=n,r=l,(a=s?.sessionLock??s?.sessionLockConflicts??su(o.AGENT_DEVICE_SESSION_LOCK)??su(o.AGENT_DEVICE_SESSION_LOCK_CONFLICTS))||(s?.sessionLocked===!0||y(o.AGENT_DEVICE_SESSION_LOCKED)||r?"reject":void 0))}}function su(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new C("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}let sm=x.map(e=>e.key),sf={sendToDaemon:ea},sg=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),sh=new Set(["connect","connection","close","disconnect","ensure-simulator","metro","session"]);async function sv(e,t=sf){let s=U(),o=F(),r=e.includes("--debug")||e.includes("--verbose")||e.includes("-v"),a=e.includes("--json"),n=function(e){for(let t=0;t<e.length;t+=1){let s=e[t];if(s.startsWith("--session=")){let e=s.slice(10).trim();return e.length>0?e:null}if("--session"===s){let s=e[t+1]?.trim();if(s&&!s.startsWith("-"))return s;break}}return null}(e)??process.env.AGENT_DEVICE_SESSION??"default";await K({session:n,requestId:s,command:e[0],debug:r},async()=>{var n,i,c,p,u,m,f,g,h,v,y,w,b,k,I,A,x;let L,_,E,O,U,P,T;try{let t,s,o,r,a,w,b,k;n={cwd:process.cwd(),env:process.env},t=function(e){let t={json:!1,help:!1,version:!1},s=null,o=[],r=[],a=!0;for(let l=0;l<e.length;l+=1){var n,i;let c=e[l];if(a&&"--"===c){a=!1;continue}if(!a){s?o.push(c):s=eU(c);continue}let p=c.startsWith("--"),d=c.startsWith("-")&&c.length>1;if(!p&&!d){s?o.push(c):s=eU(c);continue}let[u,m]=p?e_(c):[c,void 0],f=eh.get(u);if(n=s,i=f,"react-devtools"===n&&(!i||!eR(i.key,n))){o.push(c);continue}if(!f){if(function(e,t,s){var o;if(o=s,!/^-\d+(\.\d+)?$/.test(o)||!e)return!1;let r=ey(e);return!r||!!r.allowsExtraPositionals||0!==r.positionalArgs.length&&(t.length<r.positionalArgs.length||r.positionalArgs.some(e=>e.includes("?")))}(s,o,c)){s?o.push(c):s=c;continue}throw new C("INVALID_ARGS",`Unknown flag: ${u}`)}let g=function(e,t,s,o){if(void 0!==e.setValue){if(void 0!==s)throw new C("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==s)throw new C("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==s){if(0===s.trim().length)throw new C("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:s,consumeNext:!1}}return void 0===o||eO(o)||!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("\\"))}(o)?{value:!0,consumeNext:!1}:{value:o,consumeNext:!0}}let r=s??o;if(void 0===r||void 0===s&&eO(r))throw new C("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:r,consumeNext:void 0===s};if("enum"===e.type){if(!e.enumValues?.includes(r))throw new C("INVALID_ARGS",`Invalid ${eE(t)}: ${r}`);return{value:r,consumeNext:void 0===s}}let a=Number(r);if(!Number.isFinite(a)||"number"==typeof e.min&&a<e.min||"number"==typeof e.max&&a>e.max)throw new C("INVALID_ARGS",`Invalid ${eE(t)}: ${r}`);return{value:Math.floor(a),consumeNext:void 0===s}}(f,u,m,e[l+1]);g.consumeNext&&(l+=1);let h=t[f.key];if(f.multiple){let e=Array.isArray(h)?[...h,g.value]:void 0===h?[g.value]:[h,g.value];t[f.key]=e}else t[f.key]=g.value;r.push({key:f.key,token:u})}return{command:s,positionals:o,flags:t,warnings:[],providedFlags:r}}(e),s=n?.env??process.env,o=n?.cwd??process.cwd(),p=t.command,r=null!==p&&(i={remoteConfig:t.flags.remoteConfig,cwd:o,env:s}).remoteConfig?{...function(e){let t={};for(let s of sm){let o=e[s];void 0!==o&&(t[s]=o)}return t}(D({configPath:i.remoteConfig,cwd:i.cwd,env:i.env}).profile),remoteConfig:i.remoteConfig}:{},b=ec((a=(c={command:t.command,cwd:o,cliFlags:t.flags,env:s}).env??process.env,w=ec({},function(e){let t={};for(let s of e)ec(t,function(e,t){let s,o;if(!d.existsSync(e)){if(t)throw new C("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{s=d.readFileSync(e,"utf8")}catch(t){throw new C("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(s)}catch(t){throw new C("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 C("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let s={};for(let[o,r]of Object.entries(e)){if("installSource"===o){s.installSource=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new C("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==tI(e.type,`${t} installSource.type`))throw new C("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:s,repo:o}=tk(tI(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return tb(s,o,e.artifact,`${t} installSource.artifact`)}(r,t);continue}let e=eN.get(o);if(!e)throw new C("INVALID_ARGS",`Unknown config key "${o}" in ${t}.`);if(!e.config.enabled)throw new C("INVALID_ARGS",`Unsupported config key "${o}" in ${t}.`);s[o]=$(eC(e),r,t,o)}return s}(o,`config file ${e}`)}(s.path,s.required));return t}((u=c.cwd,m=c.cliFlags.config,f=a,(k=m??f.AGENT_DEVICE_CONFIG)?[{path:(g=k,h=u,v=f,ee(g,{cwd:h,env:v})),required:!0}]:[{path:(y=f,l.join(et("~",{env:y}),".agent-device","config.json")),required:!1},{path:l.resolve(u,"agent-device.json"),required:!1}]))),ec(w,function(e,t){var s,o,r;let a={};for(let n of eL.filter(e=>e.config.enabled&&e.supportsCommand(t))){if("installSource"===n.key)continue;let t=n.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(a[n.key]=(s=t.value,o=`environment variable ${t.name}`,r=t.name,$(eC(n),s,o,r)))}return a}(a,c.command))),r),L={...function(e,t){let s=t?.strictFlags??function(e){if(!e)return!1;let t=e.trim().toLowerCase();return"1"===t||"true"===t||"yes"===t||"on"===t}(process.env.AGENT_DEVICE_STRICT_FLAGS),o=[...e.warnings],r=ec({json:!1,help:!1,version:!1},t?.defaultFlags??{});ec(r,e.flags);let a=ey(e.command),n=e.providedFlags.filter(t=>!eR(t.key,e.command));if(n.length>0){var i,l;let t=n.map(e=>e.token),a=(i=e.command,l=t,i?1===l.length?`Flag ${l[0]} is not supported for command ${i}.`:`Flags ${l.join(", ")} are not supported for command ${i}.`:1===l.length?`Flag ${l[0]} requires a command that supports it.`:`Flags ${l.join(", ")} require a command that supports them.`);if(s)throw new C("INVALID_ARGS",a);for(let e of(o.push(`${a} Enable AGENT_DEVICE_STRICT_FLAGS=1 to fail fast.`),n))delete r[e.key]}for(let t of Object.keys(r))void 0!==r[t]&&(eR(t,e.command)||delete r[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 C("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),a?.defaults)for(let[e,t]of Object.entries(a.defaults))void 0===r[e]&&(r[e]=t);if("batch"===e.command&&1!=+!!r.steps+ +!!r.stepsFile)throw new C("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,...s}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:s,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:r,warnings:o})}(t,{strictFlags:n?.strictFlags,defaultFlags:b}),providedFlags:t.providedFlags}}catch(t){j({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=R(t,{diagnosticId:B().diagnosticId,logPath:J({force:!0})??void 0});a?eP({success:!1,error:e}):eT(e,{showDetails:r}),process.exit(1);return}for(let e of L.warnings)process.stderr.write(`Warning: ${e}
|
|
428
|
+
`);L.flags.version&&(process.stdout.write(`${o}
|
|
429
|
+
`),process.exit(0));let M="help"===L.command,F=L.flags.help;if(M||F){M&&L.positionals.length>1&&(eT(new C("INVALID_ARGS","help accepts at most one command.")),process.exit(1));let e=M?L.positionals[0]:L.command;e||(process.stdout.write(`${ek}
|
|
430
430
|
`),process.exit(0));let t=function(e){var t,s;let o,r=(o=eu[e])?`${o.body}
|
|
431
431
|
|
|
432
432
|
Related:
|
|
@@ -441,9 +441,9 @@ Usage:
|
|
|
441
441
|
agent-device ${n}
|
|
442
442
|
|
|
443
443
|
${c.join("\n\n")}
|
|
444
|
-
`}(eU(e));t&&(process.stdout.write(t),process.exit(0)),eT(new
|
|
445
|
-
`),process.exit(1)}
|
|
446
|
-
`),process.exit(1));let{command:
|
|
444
|
+
`}(eU(e));t&&(process.stdout.write(t),process.exit(0)),eT(new C("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${ek}
|
|
445
|
+
`),process.exit(1)}L.command||(process.stdout.write(`${ek}
|
|
446
|
+
`),process.exit(1));let{command:V,positionals:G}=L,q=new Set(L.providedFlags.map(e=>e.key));try{E=(_=sd({policyOverrides:L.flags,configuredPlatform:L.flags.platform,configuredSession:L.flags.session})).lockPolicy?{...L.flags}:sp(L.flags,{policyOverrides:L.flags,configuredPlatform:L.flags.platform,configuredSession:L.flags.session}),O=H(E.stateDir),U=E.session??"default",w={command:V,explicitFlagKeys:q,stateDir:O.baseDir,session:U,remoteConfig:E.remoteConfig},T=(P="connect"===w.command||"connection"===w.command?null:function(e){let t=e.validateRemoteConfigHash??!0,s=e.remoteConfig?S({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,o=eX(e)??(e.allowActiveFallback?e8({stateDir:e.stateDir}):null);if(!o||s&&o.remoteConfigPath!==s)return null;if(t&&e2(o.remoteConfigPath)!==o.remoteConfigHash)throw new C("INVALID_ARGS","Active remote connection config changed. Run agent-device connect --force to refresh it.",{remoteConfig:o.remoteConfigPath});let r=function(e,t){try{return D({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(!1===t.validateRemoteConfigHash)return{};throw e}}(o,e);return{runtime:o.runtime,flags:{...r,remoteConfig:o.remoteConfigPath,daemonBaseUrl:o.daemon?.baseUrl??r.daemonBaseUrl,daemonTransport:o.daemon?.transport??r.daemonTransport,daemonServerMode:o.daemon?.serverMode??r.daemonServerMode,tenant:o.tenant,sessionIsolation:"tenant",runId:o.runId,leaseId:o.leaseId,leaseBackend:o.leaseBackend,session:o.session,platform:o.platform??r.platform,target:o.target??r.target}}}({stateDir:w.stateDir,session:w.session,remoteConfig:w.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!w.explicitFlagKeys.has("session")&&(!w.remoteConfig||"disconnect"===w.command),validateRemoteConfigHash:"disconnect"!==w.command}))?function(e,t,s){let o={...e};for(let[e,r]of Object.entries(t))void 0!==r&&(s.has(e)||(o[e]=r));return o}(E,P.flags,q):E}catch(t){let e=R(N(t),{diagnosticId:B().diagnosticId,logPath:J({force:!0})??void 0});L.flags.json?eP({success:!1,error:e}):eT(e,{showDetails:L.flags.verbose}),process.exit(1);return}let K=null;try{let e;if("react-devtools"===V){let e=await sc(G,{flags:T,stateDir:O.baseDir,session:T.session??U,cwd:process.cwd(),env:process.env});process.exit(e);return}el({command:V,currentVersion:o,stateDir:O.baseDir,flags:T});let r=P?.runtime,a=(e,t)=>({session:e.session??U,requestId:s,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:_.lockPolicy,lockPlatform:_.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===V){if(G.length>0)throw new C("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=d.readFileSync(e.stepsFile,"utf8")}catch(s){let t=s instanceof Error?s.message:String(s);throw new C("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}return ei(t)}(E)}if(b=V,"auth"!==b&&"connection"!==b&&(T=(await tT({command:V,flags:T,stateDir:O.baseDir,env:process.env})).flags),T.remoteConfig&&(k=V,!sh.has(k))){let s=eo(a(T,r),{transport:t.sendToDaemon}),o=await tt({command:V,flags:T,client:s,runtime:r,batchSteps:e,forceRuntimePrepare:function(e){for(let t of sg)if(e.has(t))return!0;return!1}(q)});T=o.flags,r=o.runtime}I={command:V,flags:T,runtime:r,explicitFlagKeys:q,hadConnectionDefaults:!!P},!("open"===I.command&&!I.runtime&&!I.flags.bundleUrl&&!I.flags.metroHost&&!I.flags.metroPort&&!I.flags.remoteConfig&&!I.hadConnectionDefaults&&((A=I.explicitFlagKeys).has("daemonBaseUrl")||A.has("daemonTransport")||A.has("tenant")||A.has("sessionIsolation")||A.has("runId")||A.has("leaseId")||A.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 n=T.daemonBaseUrl;K=!T.verbose||T.json||n?null:function(e){try{let t=0,s=!1,o=setInterval(()=>{if(!s&&d.existsSync(e))try{let s=d.statSync(e);if(s.size<t&&(t=0),s.size<=t)return;let o=d.openSync(e,"r");try{let e=Buffer.alloc(s.size-t);d.readSync(o,e,0,e.length,t),t=s.size,e.length>0&&process.stdout.write(e.toString("utf8"))}finally{d.closeSync(o)}}catch{}},200);return()=>{s=!0,clearInterval(o)}}catch{return null}}(O.logPath);let i=eo(a(T,r),{transport:t.sendToDaemon});if("batch"===V){if(!e)throw new C("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,flags:_.lockPolicy&&void 0===E.platform?{...e.flags??{}}:sp(e.flags??{},{policyOverrides:T,configuredPlatform:T.platform,configuredSession:T.session,inheritedPlatform:T.platform})}));if(await si({command:V,positionals:G,flags:{...T,batchSteps:t},client:i}))return}else if("runtime"===V)throw new C("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 si({command:V,positionals:G,flags:T,client:i}))return;throw new C("INVALID_ARGS",`Unknown command: ${V}`)}catch(s){let e=N(s),t=R(e,{diagnosticId:B().diagnosticId,logPath:J({force:!0})??void 0});if("close"===V&&"COMMAND_FAILED"===(x=e).code&&(x.details?.kind==="daemon_startup_failed"||x.message.toLowerCase().includes("failed to start daemon")&&("string"==typeof x.details?.infoPath||"string"==typeof x.details?.lockPath))){T.json&&eP({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(T.json)eP({success:!1,error:t});else if(eT(t,{showDetails:T.verbose}),T.verbose)try{let e=O.logPath;if(d.existsSync(e)){let t=d.readFileSync(e,"utf8").split("\n"),s=t.slice(Math.max(0,t.length-200)).join("\n");s.trim().length>0&&process.stderr.write(`
|
|
447
447
|
[daemon log]
|
|
448
448
|
${s}
|
|
449
|
-
`)}}catch{}
|
|
449
|
+
`)}}catch{}K&&K(),process.exit(1)}finally{K&&K()}})}p(process.argv[1]??"").href===import.meta.url&&sv(process.argv.slice(2)).catch(e=>{eT(R(N(e)),{showDetails:!0}),process.exit(1)}),sv(process.argv.slice(2));
|