agent-device 0.14.8 → 0.14.9
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/README.md +1 -2
- package/android-snapshot-helper/README.md +4 -2
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.8.apk → agent-device-android-snapshot-helper-0.14.9.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.9.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.8.manifest.json → agent-device-android-snapshot-helper-0.14.9.manifest.json} +6 -6
- package/dist/src/6108.js +17 -17
- package/dist/src/7462.js +1 -1
- package/dist/src/9542.js +1 -1
- package/dist/src/9639.js +2 -2
- package/dist/src/9818.js +1 -1
- package/dist/src/android-adb.d.ts +11 -2
- package/dist/src/android-snapshot-helper.d.ts +12 -2
- package/dist/src/cli.js +46 -46
- package/dist/src/command-schema.js +1 -0
- package/dist/src/contracts.d.ts +1 -0
- package/dist/src/finders.d.ts +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/internal/daemon.js +20 -20
- package/dist/src/selectors.d.ts +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +86 -13
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +160 -93
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +3 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +15 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +185 -0
- package/package.json +1 -1
- package/server.json +3 -3
- package/skills/agent-device/SKILL.md +11 -1
- package/skills/dogfood/SKILL.md +3 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.8.apk.sha256 +0 -1
- package/skills/react-devtools/SKILL.md +0 -48
package/dist/src/7462.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AppError as t}from"./9152.js";let n="<wifi|airplane|location> <on|off>",e="animations <on|off>",
|
|
1
|
+
import{AppError as t}from"./9152.js";let n="<wifi|airplane|location> <on|off>",e="location set <lat> <lon>",i="animations <on|off>",o="appearance <light|dark|toggle>",s="faceid <match|nonmatch|enroll|unenroll>",a="touchid <match|nonmatch|enroll|unenroll>",r="fingerprint <match|nonmatch>",c="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",p="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",l=`macOS supports only settings ${o} and settings ${p}. wifi|airplane|location|animations remain unsupported on macOS.`,m=`settings ${n} | settings ${e} | settings ${i} | settings ${o} | settings ${s} | settings ${a} | settings ${r} | settings ${c} | settings ${p}`,g=`settings requires ${n}, ${e}, ${i}, ${o}, ${s}, ${a}, ${r}, ${c}, or ${p}`;function S(t){let n=t.trim().toLowerCase();return"appearance"===n||"permission"===n}function $(t){return`Unsupported macOS setting: ${t}. ${l}`}let u=["app","frontmost-app","desktop","menubar"];function f(n){let e=n?.trim().toLowerCase();if("app"===e||"frontmost-app"===e||"desktop"===e||"menubar"===e)return e;throw new t("INVALID_ARGS",`Invalid surface: ${n}. Use ${u.join("|")}.`)}export{u as SESSION_SURFACES,g as SETTINGS_INVALID_ARGS_MESSAGE,m as SETTINGS_USAGE_OVERRIDE,$ as getUnsupportedMacOsSettingMessage,S as isMacOsSettingSupported,f as parseSessionSurface};
|
package/dist/src/9542.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import e from"node:net";import t from"node:http";import a from"node:https";import r from"node:fs";import o from"node:path";import{pipeline as n}from"node:stream/promises";import i from"node:os";import{createHash as s,randomUUID as l}from"node:crypto";import{Writable as d}from"node:stream";import{toAppErrorCode as c,AppError as u}from"./9152.js";import{runCmdSync as p,runCmd as m,runCmdDetached as f}from"./9818.js";import{readVersion as h,findProjectRoot as y}from"./9671.js";import{createRequestId as w,withDiagnosticTimer as v,emitDiagnostic as g}from"./7599.js";import{isAgentDeviceDaemonProcess as I,stopProcessForTakeover as b}from"./8656.js";import{buildAppIdentifiers as A,resolveDaemonServerMode as _,computeDaemonCodeSignature as S,resolveDaemonTransportPreference as M,buildDeviceIdentifiers as k,resolveDaemonPaths as E}from"./180.js";import{sleep as D}from"./4829.js";import{tryParseSelectorChain as P}from"./940.js";import{reloadMetro as T,prepareMetroRuntime as N}from"./1974.js";let U="sha256";async function x(e){let t=await C(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await F({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await B(t.payloadPath,r),await j({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await L({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function C(e,t){var a,n,i;let s,l=r.statSync(e),d=o.basename(e),c=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(n=e,i=l,s=n.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=c?await R(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:d,artifactType:c?"app-bundle":"file",platform:u,contentType:c?"application/gzip":"application/octet-stream",sha256:await z(t),sizeBytes:a.size,cleanup:()=>O(p)}}catch(e){throw O(p),e}}async function R(e,t){let a=r.mkdtempSync(o.join(i.tmpdir(),`agent-device-upload-${l()}-`));t.push(a);let n=o.join(a,`${o.basename(e)}.tar.gz`);return await m("tar",["czf",n,"-C",o.dirname(e),o.basename(e)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),n}function O(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function L(e){let{normalizedBase:t,token:a,artifact:r}=e,o=new URL("upload",t),n={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":U,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await q({url:o,method:"POST",headers:n,payloadPath:r.payloadPath,timeoutMessage:"Artifact upload timed out",timeoutHint:"The upload to the remote daemon exceeded the 5-minute timeout.",errorMessage:"Failed to upload artifact to remote daemon",errorHint:"Verify the remote daemon is reachable and supports artifact uploads."});try{let e=JSON.parse(i.body);if(!e.ok||!e.uploadId)throw new u("COMMAND_FAILED",`Upload failed: ${i.body}`);return e.uploadId}catch(e){if(e instanceof u)throw e;throw new u("COMMAND_FAILED",`Invalid upload response: ${i.body}`)}}async function F(e){let t=new URL("upload/preflight",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(()=>void 0);if(r?.ok)return function(e){var t;if(!e||"object"!=typeof e||!0!==e.ok||"string"!=typeof e.uploadId)return;if(!0===e.cacheHit)return{kind:"cache-hit",uploadId:e.uploadId};let a=e.upload;if(!a||"string"!=typeof a.url)return;let r=a.headers??{};if(!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&Object.values(t).every(e=>"string"==typeof e))return{kind:"direct-upload",uploadId:e.uploadId,url:a.url,headers:r}}(await r.json().catch(()=>void 0))}async function B(e,t){let a=await q({url:new URL(t.url),method:"PUT",headers:t.headers,payloadPath:e,timeoutMessage:"Direct artifact upload timed out",timeoutHint:"The direct upload ticket did not accept the artifact within the timeout.",errorMessage:"Failed to upload artifact with direct upload ticket"});if(a.statusCode<200||a.statusCode>=300)throw new u("COMMAND_FAILED","Direct artifact upload failed",{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function q(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let i=o.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:e.headers},e=>{let a="";e.setEncoding("utf8"),e.on("data",e=>{a+=e}),e.on("end",()=>{clearTimeout(s),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})})}),s=setTimeout(()=>{i.destroy(),a(new u("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);i.on("error",t=>{clearTimeout(s),a(new u("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),i.on("close",()=>clearTimeout(s)),n(r.createReadStream(e.payloadPath),i).catch(e=>{i.destroy(),a(new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e))))})})}async function j(e){let t=new URL("upload/finalize",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new u("COMMAND_FAILED","Failed to finalize direct artifact upload",{},e)});if(!r.ok)throw new u("COMMAND_FAILED","Direct artifact upload finalize failed",{status:r.status,statusText:r.statusText});let o=await r.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new u("COMMAND_FAILED","Invalid upload finalize response");return o.uploadId}async function z(e){let t=s(U),a=new d({write(e,a,r){t.update(e),r()}});return await n(r.createReadStream(e),a).catch(e=>{throw new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:void 0)}),t.digest("hex")}let $=eA(),H=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_TIMEOUT_MS){if(!e)return 15e3;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):15e3}(),K=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_ATTEMPTS){if(!e)return 2;let t=Number(e);return Number.isFinite(t)?Math.min(5,Math.max(1,Math.floor(t))):2}(),V=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],G=new e.BlockList;async function J(t){let a=t.meta?.requestId??w(),r=!!(t.meta?.debug||t.flags?.verbose),o=function(t){let a,r=t.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR,o=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new u("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new u("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(t.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),n=t.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;var i=o,s=n;if(!(!i||"localhost"===(a=new URL(i).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(a)?G.check(a,"ipv4"):!!e.isIPv6(a)&&G.check(a,"ipv6")))&&("string"!=typeof s||!(s.trim().length>0)))throw new u("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:i,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."});let l=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,d=M(l);if(o&&"socket"===d)throw new u("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:o});let c=_(t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===l?"dual":void 0));return{paths:E(r),transportPreference:d,serverMode:c,remoteBaseUrl:o,remoteAuthToken:n}}(t),n=function(e,t=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if("test"!==e)return eA(t)}(t.command),i=await v("daemon_startup",async()=>await Z(o),{requestId:a,session:t.session}),s=await W(t,i),l={...t,positionals:s.positionals,flags:s.flags,token:i.token,meta:{...t.meta??{},requestId:a,debug:r,cwd:t.meta?.cwd,tenantId:t.meta?.tenantId??t.flags?.tenant,runId:t.meta?.runId??t.flags?.runId,leaseId:t.meta?.leaseId??t.flags?.leaseId,sessionIsolation:t.meta?.sessionIsolation??t.flags?.sessionIsolation,lockPolicy:t.meta?.lockPolicy,lockPlatform:t.meta?.lockPlatform,...s.uploadedArtifactId?{uploadedArtifactId:s.uploadedArtifactId}:{},...s.clientArtifactPaths?{clientArtifactPaths:s.clientArtifactPaths}:{},...s.installSource?{installSource:s.installSource}:{}}};return g({level:"info",phase:"daemon_request_prepare",data:{requestId:a,command:t.command,session:t.session}}),await v("daemon_request",async()=>await eu(i,l,o.transportPreference,n),{requestId:a,command:t.command})}async function W(e,t){let a,n=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,s=e.meta?.installSource,l={};if(ev(t)){let r=function(e,t){if("screenshot"===e.command){let a=Q(e,"path",".png");return t[0]?{field:"path",localPath:a,positionalIndex:0,positionalPath:X("screenshot",".png")}:{field:"path",localPath:a,positionalIndex:0,flagPath:X("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=Q(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:X("recording",o.extname(t)||".mp4")}}return null}(e,n);r&&(void 0!==r.positionalPath&&(n[r.positionalIndex]=r.positionalPath),void 0!==r.flagPath&&((i??={}).out=r.flagPath),l[r.field]=r.localPath);let d=await Y(e,t);d&&(s=d.installSource,a=d.uploadedArtifactId??a)}if(!ev(t)||"install"!==e.command&&"reinstall"!==e.command||n.length<2)return{positionals:n,flags:i,installSource:s,uploadedArtifactId:a,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let d=n[1];if(d.startsWith("remote:"))return n[1]=d.slice(7),{positionals:n,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let c=o.isAbsolute(d)?d:o.resolve(e.meta?.cwd??process.cwd(),d);return r.existsSync(c)?{positionals:n,flags:i,installSource:s,uploadedArtifactId:a=await x({localPath:c,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform}),...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}:{positionals:n,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}}async function Y(e,t){let a=e.meta?.installSource;if("install_source"!==e.command||!a||"path"!==a.kind)return null;let n=a.path.trim();if(!n)return{installSource:a};if(n.startsWith("remote:"))return{installSource:{...a,path:n.slice(7)}};let i=o.isAbsolute(n)?n:o.resolve(e.meta?.cwd??process.cwd(),n);if(!r.existsSync(i))return{installSource:{...a,path:i}};let s=await x({localPath:i,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform});return{installSource:{...a,path:i},uploadedArtifactId:s}}function Q(e,t,a,r=0){let n=e.positionals?.[r]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${a}`,s=n&&n.trim().length>0?n:i;return o.isAbsolute(s)?s:o.resolve(e.meta?.cwd??process.cwd(),s)}function X(e,t){let a=t.startsWith(".")?t:`.${t}`;return o.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${a}`)}async function Z(e){let t;if(e.remoteBaseUrl){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await el(t,"http"))return t;throw new u("COMMAND_FAILED","Remote daemon is unavailable",{daemonBaseUrl:e.remoteBaseUrl,hint:"Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc."})}let a=er(e.paths.infoPath),r=h(),o=S((t=ec()).useSrc?t.srcPath:t.distPath,t.root),n=!!a&&await el(a,e.transportPreference);if(a&&a.version===r&&a.codeSignature===o&&n)return a;a&&(a.version!==r||a.codeSignature!==o||!n)&&(await ea(a),es(e.paths.infoPath)),function(e){let t=en(e);if(!t.hasLock||t.hasInfo)return;let a=eo(e.lockPath);if(!a)return es(e.lockPath);I(a.pid,a.processStartTime)||es(e.lockPath)}(e.paths);let i=0;for(let t=1;t<=K;t+=1){await ed(e);let a=await ee(H,e);if(a)return a;if(await et(e.paths)){i+=1;continue}let r=en(e.paths);if(!(t<K))break;if(!r.hasInfo&&!r.hasLock){await D(150);continue}}let s=en(e.paths);throw new u("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:H,startupAttempts:K,lockRecoveryCount:i,metadataState:s,hint:function(e,t=E(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`Detected ${t.lockPath} without ${t.infoPath}. If no agent-device daemon process is running, delete ${t.lockPath} and retry.`:e.hasLock&&e.hasInfo?`Daemon metadata may be stale. If no agent-device daemon process is running, delete ${t.infoPath} and ${t.lockPath}, then retry.`:`Daemon metadata is missing or stale. Delete ${t.infoPath} if present and retry.`}(s,e.paths)})}async function ee(e,t){let a=Date.now();for(;Date.now()-a<e;){let e=er(t.paths.infoPath);if(e&&await el(e,t.transportPreference))return e;await D(100)}return null}async function et(e){let t=en(e);if(!t.hasLock||t.hasInfo)return!1;let a=eo(e.lockPath);return a&&I(a.pid,a.processStartTime)&&await b(a.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:a.processStartTime}),es(e.lockPath),!0}async function ea(e){await b(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function er(e){let t=ei(e);if(!t||"object"!=typeof t)return null;let a="string"==typeof t.token&&t.token.length>0?t.token:null;if(!a)return null;let r=Number.isInteger(t.port)&&Number(t.port)>0,o=Number.isInteger(t.httpPort)&&Number(t.httpPort)>0;if(!r&&!o)return null;let n=t.transport,i="string"==typeof t.version?t.version:void 0,s="string"==typeof t.codeSignature?t.codeSignature:void 0,l="string"==typeof t.processStartTime?t.processStartTime:void 0,d=Number.isInteger(t.pid)&&Number(t.pid)>0;return{token:a,port:r?Number(t.port):void 0,httpPort:o?Number(t.httpPort):void 0,transport:"socket"===n||"http"===n||"dual"===n?n:void 0,pid:d?Number(t.pid):0,version:i,codeSignature:s,processStartTime:l}}function eo(e){let t=ei(e);return t&&"object"==typeof t&&Number.isInteger(t.pid)&&Number(t.pid)>0?{pid:Number(t.pid),processStartTime:"string"==typeof t.processStartTime?t.processStartTime:void 0,startedAt:"number"==typeof t.startedAt?t.startedAt:void 0}:null}G.addSubnet("127.0.0.0",8,"ipv4"),G.addAddress("::1","ipv6"),G.addSubnet("::ffff:127.0.0.0",104,"ipv6");function en(e){return{hasInfo:r.existsSync(e.infoPath),hasLock:r.existsSync(e.lockPath)}}function ei(e){if(!r.existsSync(e))return null;try{return JSON.parse(r.readFileSync(e,"utf8"))}catch{return null}}function es(e){try{r.existsSync(e)&&r.unlinkSync(e)}catch{}}async function el(r,o){var n;return"http"===ep(r,o)?await function(e){let r=e.baseUrl?eg(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!r)return Promise.resolve(!1);let o=new URL(r),n="https:"===o.protocol?a:t,i=e.baseUrl?3e3:500;return new Promise(e=>{let t=n.request({protocol:o.protocol,host:o.hostname,port:o.port,path:o.pathname+o.search,method:"GET",timeout:i},t=>{t.resume(),e((t.statusCode??500)<500)});t.on("timeout",()=>{t.destroy(),e(!1)}),t.on("error",()=>{e(!1)}),t.end()})}(r):await ((n=r.port)?new Promise(t=>{let a=e.createConnection({host:"127.0.0.1",port:n},()=>{a.destroy(),t(!0)});a.on("error",()=>{t(!1)})}):Promise.resolve(!1))}async function ed(e){let t=ec(),a=t.useSrc?["--experimental-strip-types",t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};f(process.execPath,a,{env:r})}function ec(){let e=y(),t=[o.join(e,"dist","src","internal","daemon.js"),o.join(e,"dist","src","daemon.js")],a=t.find(e=>r.existsSync(e))??t[0],n=o.join(e,"src","daemon.ts"),i=t.some(e=>r.existsSync(e)),s=r.existsSync(n);if(!i&&!s)throw new u("COMMAND_FAILED","Daemon entry not found",{distPaths:t,srcPath:n});return{root:e,distPath:a,distPaths:t,srcPath:n,useSrc:process.execArgv.includes("--experimental-strip-types")?s:!i&&s}}async function eu(e,t,a,r){return"http"===ep(e,a)?await ew(e,t,r):await ey(e,t,r)}function ep(e,t){if(e.baseUrl){if("socket"===t)throw new u("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var a=e,r=t;if(em(a,r))return r;throw new u("COMMAND_FAILED","http"===r?"Daemon HTTP endpoint is unavailable":"Daemon socket endpoint is unavailable")}let o=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>em(e,t));if(o)return o;throw new u("COMMAND_FAILED","Daemon metadata has no reachable transport")}function em(e,t){return"http"===t?!!e.httpPort:!!e.port}function ef(e,t,a,r,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of V){let a=p("pkill",["-f",t],{allowFailure:!0});0===a.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=o?{forcedKill:!1}:function(e,t){let a=!1;try{I(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),a=!0)}catch{b(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{es(t.infoPath),es(t.lockPath)}return{forcedKill:a}}(e,t);return g({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:a,command:r,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:o?void 0:e.pid,daemonPidForceKilled:o?void 0:s.forcedKill,daemonBaseUrl:e.baseUrl}}),new u("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:a,hint:o?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected."})}function eh(e,t,a){return g({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new u("COMMAND_FAILED","Failed to communicate with daemon",{requestId:t,hint:a?"Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.":"Retry command. If this persists, clean stale daemon metadata and start a fresh session."},e instanceof Error?e:void 0)}async function ey(t,a,r){let o=t.port;if(!o)throw new u("COMMAND_FAILED","Daemon socket endpoint is unavailable");return new Promise((n,i)=>{let s=e.createConnection({host:"127.0.0.1",port:o},()=>{s.write(`${JSON.stringify(a)}
|
|
2
|
-
`)}),l=E(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),d="number"==typeof r?setTimeout(()=>{s.destroy(),i(ef(t,l,a.meta?.requestId,a.command,!1,r))},r):void 0,c="";s.setEncoding("utf8"),s.on("data",e=>{let t=(c+=e).indexOf("\n");if(-1===t)return;let r=c.slice(0,t).trim();if(r)try{let e=JSON.parse(r);s.end(),d&&clearTimeout(d),n(e)}catch(e){d&&clearTimeout(d),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:r},e instanceof Error?e:void 0))}}),s.on("error",e=>{d&&clearTimeout(d),i(eh(e,a.meta?.requestId,!1))})})}async function ew(e,r,o){var n,i,s;let l,d=e.baseUrl?new URL(eg(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!d)throw new u("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let p=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},l=n.meta?.requestId??w(),"lease_allocate"!==(s=n.command)&&"lease_heartbeat"!==s&&"lease_release"!==s?{jsonrpc:"2.0",id:l,method:"agent_device.command",params:n}:{jsonrpc:"2.0",id:l,method:function(e){switch(e){case"lease_allocate":return"agent_device.lease.allocate";case"lease_heartbeat":return"agent_device.lease.heartbeat";case"lease_release":return"agent_device.lease.release"}}(n.command),params:function(e,t,a){let r={...a.includeTokenParam?{token:e.token}:{},session:e.session,tenantId:e.meta?.tenantId,runId:e.meta?.runId};switch(t){case"lease_allocate":return{...r,ttlMs:e.meta?.leaseTtlMs,backend:e.meta?.leaseBackend};case"lease_heartbeat":return{...r,leaseId:e.meta?.leaseId,ttlMs:e.meta?.leaseTtlMs};case"lease_release":return{...r,leaseId:e.meta?.leaseId}}}(n,n.command,i)})),m={"content-type":"application/json","content-length":Buffer.byteLength(p)};return e.baseUrl&&e.token&&(m.authorization=`Bearer ${e.token}`,m["x-agent-device-token"]=e.token),await new Promise((n,i)=>{let s=E(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),l=("https:"===d.protocol?a:t).request({protocol:d.protocol,host:d.hostname,port:d.port,method:"POST",path:d.pathname+d.search,headers:m},t=>{let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{h&&clearTimeout(h);try{let t=JSON.parse(a);if(t.error){let e=t.error.data??{};i(new u(c(null!=e.code?String(e.code):void 0,"COMMAND_FAILED"),String(e.message??t.error.message??"Daemon RPC request failed"),{..."object"==typeof e.details&&e.details?e.details:{},hint:"string"==typeof e.hint?e.hint:void 0,diagnosticId:"string"==typeof e.diagnosticId?e.diagnosticId:void 0,logPath:"string"==typeof e.logPath?e.logPath:void 0,requestId:r.meta?.requestId}));return}if(!t.result||"object"!=typeof t.result)return void i(new u("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));if(e.baseUrl&&t.result.ok)return void eI(e,r,t.result).then(n).catch(i);n(t.result)}catch(e){h&&clearTimeout(h),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:a},e instanceof Error?e:void 0))}})}),f=ev(e),h="number"==typeof o?setTimeout(()=>{l.destroy(),i(ef(e,s,r.meta?.requestId,r.command,f,o))},o):void 0;l.on("error",e=>{h&&clearTimeout(h),i(eh(e,r.meta?.requestId,f))}),l.write(p),l.end()})}function ev(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eg(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function eI(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let n=a.data?{...a.data}:{},i=[];for(let a of r){if(!a||"object"!=typeof a||"string"!=typeof a.artifactId){i.push(a);continue}let r=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let a=e.fileName?.trim()||`${e.field}-${Date.now()}`;return o.resolve(t.meta?.cwd??process.cwd(),a)}(a,t);await eb({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),n[a.field]=r,i.push({...a,localPath:r})}return n.artifacts=i,{ok:!0,data:n}}async function eb(e){var i,s;let l,d=new URL((i=e.baseUrl,s=e.artifactId,l=i.endsWith("/")?i:`${i}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),c="https:"===d.protocol?a:t;await r.promises.mkdir(o.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,i=e.timeoutMs??$,s=n=>{if(!o){if(o=!0,clearTimeout(p),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},l=c.request({protocol:d.protocol,host:d.hostname,port:d.port,method:"GET",path:d.pathname+d.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:a}))});return}t.on("aborted",()=>{s(new u("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),n(t,r.createWriteStream(e.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),p=setTimeout(()=>{l.destroy(new u("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:i}))},i);l.on("error",t=>{t instanceof u?s(t):s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:i},t instanceof Error?t:void 0))}),l.end()})}function eA(e=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if(!e)return 9e4;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):9e4}let e_={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",get:"get",home:"home",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",perf:"perf",pinch:"pinch",press:"press",push:"push",record:"record",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",wait:"wait"};function eS(e,t,a,r){let o=a(e[t]);if(void 0===o)throw new u("COMMAND_FAILED",r,{response:e});return o}function eM(e,t){return eS(e,t,eN,`Daemon response is missing "${t}".`)}function ek(e,t){return eN(e[t])}function eE(e,t){var a;let r;return a=eN,null===(r=e[t])?null:a(r)}function eD(e,t){return eS(e,t,ex,`Daemon response has invalid "${t}".`)}function eP(e,t){return function(e){return"tv"===e||"mobile"===e||"desktop"===e?e:void 0}(e[t])??"mobile"}function eT(e,t){let a=e[t];if(!eO(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0,n="number"==typeof a.width?a.width:void 0,i="number"==typeof a.height?a.height:void 0;if(void 0!==r&&void 0!==o&&void 0!==n&&void 0!==i)return{x:r,y:o,width:n,height:i}}function eN(e){return"string"==typeof e&&e.length>0?e:void 0}function eU(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function ex(e){return"ios"===e||"macos"===e||"android"===e?e:void 0}function eC(e){return"simulator"===e||"emulator"===e||"device"===e?e:void 0}function eR(e){if(!eO(e))throw new u("COMMAND_FAILED","Daemon returned an unexpected response shape.",{value:e});return e}function eO(e){return"object"==typeof e&&null!==e}function eL(e){let t={};for(let[a,r]of Object.entries(e))void 0!==r&&(t[a]=r);return t}function eF(e,t){let a=ek(e,"bundleId"),r=ek(e,"package");return{app:eM(e,"app"),appPath:eM(e,"appPath"),platform:eD(e,"platform"),appId:a??r,bundleId:a,package:r,identifiers:A({session:t,bundleId:a,packageName:r})}}function eB(e){let t=eR(e),a=eD(t,"platform"),r=eM(t,"id"),o=eM(t,"name");return{platform:a,target:eP(t,"target"),kind:eS(t,"kind",eC,'Daemon response has invalid "kind".'),id:r,name:o,booted:"boolean"==typeof t.booted?t.booted:void 0,identifiers:k(a,r,o),ios:"ios"===a?{udid:r}:void 0,android:"android"===a?{serial:r}:void 0}}function eq(e){let t=eR(e),a=eD(t,"platform"),r=eM(t,"id"),o=eM(t,"name"),n=eP(t,"target"),i=eM(t,"device"),s={session:o,...k(a,r,i)};return{name:o,createdAt:eS(t,"createdAt",eU,'Daemon response is missing numeric "createdAt".'),device:{platform:a,target:n,id:r,name:i,identifiers:s,ios:"ios"===a?{udid:r,simulatorSetPath:eE(t,"ios_simulator_device_set")}:void 0,android:"android"===a?{serial:r}:void 0},identifiers:s}}function ej(e){return e??"default"}function ez(e={},t={}){var a;let r,o=t.transport??J,n=async(t,a=[],r={})=>{var n,i;let s=(n=e,i=r,{...n,...i}),l=await o({session:ej(s.session),command:t,positionals:a,flags:eL({stateDir:s.stateDir,daemonBaseUrl:s.daemonBaseUrl,daemonAuthToken:s.daemonAuthToken,daemonTransport:s.daemonTransport,daemonServerMode:s.daemonServerMode,tenant:s.tenant,sessionIsolation:s.sessionIsolation,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,platform:s.platform,target:s.target,device:s.device,udid:s.udid,serial:s.serial,iosSimulatorDeviceSet:s.iosSimulatorDeviceSet,androidDeviceAllowlist:s.androidDeviceAllowlist,runtime:s.simulatorRuntimeId,boot:s.boot,reuseExisting:s.reuseExisting,surface:s.surface,activity:s.activity,relaunch:s.relaunch,shutdown:s.shutdown,saveScript:s.saveScript,noRecord:s.noRecord,backMode:s.backMode,metroHost:s.metroHost,metroPort:s.metroPort,bundleUrl:s.bundleUrl,launchUrl:s.launchUrl,snapshotInteractiveOnly:s.interactiveOnly,snapshotCompact:s.compact,snapshotDepth:s.depth,snapshotScope:s.scope,snapshotRaw:s.raw,screenshotFullscreen:s.screenshotFullscreen,screenshotMaxSize:s.screenshotMaxSize,overlayRefs:s.overlayRefs,appsFilter:s.appsFilter,out:s.out,count:s.count,fps:s.fps,quality:s.quality,hideTouches:s.hideTouches,intervalMs:s.intervalMs,delayMs:s.delayMs,holdMs:s.holdMs,jitterPx:s.jitterPx,pixels:s.pixels,doubleTap:s.doubleTap,clickButton:s.clickButton,pauseMs:s.pauseMs,pattern:s.pattern,headless:s.headless,restart:s.restart,replayUpdate:s.replayUpdate,replayEnv:s.replayEnv,replayShellEnv:s.replayShellEnv,failFast:s.failFast,timeoutMs:s.timeoutMs,retries:s.retries,artifactsDir:s.artifactsDir,reportJunit:s.reportJunit,findFirst:s.findFirst,findLast:s.findLast,networkInclude:s.networkInclude,batchOnError:s.batchOnError,batchMaxSteps:s.batchMaxSteps,batchSteps:s.batchSteps,verbose:s.debug}),runtime:s.runtime,meta:eL({requestId:s.requestId,cwd:s.cwd,debug:s.debug,lockPolicy:s.lockPolicy,lockPlatform:s.lockPlatform,tenantId:s.tenant,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,leaseTtlMs:s.leaseTtlMs,sessionIsolation:s.sessionIsolation,installSource:s.installSource,retainMaterializedPaths:s.retainMaterializedPaths,materializedPathRetentionMs:s.materializedPathRetentionMs,materializationId:s.materializationId})});return l.ok||function(e){throw new u(c(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(l.error),l.data??{}},i=async(e={})=>{let t=await n("session_list",[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(eq)},s=async(e,t=[],a={})=>await n(e,t,a),l=(t={})=>{var a,r;return ej((a=e,r=t,{...a,...r}).session)};return{command:(a=async e=>await n(e.command,e.positionals,e.options),r=async e=>await a(e),{wait:async e=>await r(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new u("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return{command:e_.wait,positionals:[String(e.durationMs)],options:e};let t=void 0!==e.timeoutMs?[String(e.timeoutMs)]:[];if(void 0!==e.text)return{command:e_.wait,positionals:["text",e.text,...t],options:e};if(void 0!==e.ref)return{command:e_.wait,positionals:[e.ref,...t],options:e};let a=e.selector;return function(e){if(!P(e))throw new u("INVALID_ARGS",`Invalid wait selector: ${e}`)}(a),{command:e_.wait,positionals:[a,...t],options:e}}(e)),alert:async(e={})=>{var t;let a;return await r((a=(t=e).action??"get",{command:e_.alert,positionals:[a,...void 0!==t.timeoutMs?[String(t.timeoutMs)]:[]],options:t}))},appState:async(e={})=>await r({command:e_.appState,positionals:[],options:e}),back:async(e={})=>await r({command:e_.back,positionals:[],options:{...e,backMode:e.mode}}),home:async(e={})=>await r({command:e_.home,positionals:[],options:e}),rotate:async e=>await r({command:e_.rotate,positionals:[e.orientation],options:e}),appSwitcher:async(e={})=>await r({command:e_.appSwitcher,positionals:[],options:e}),keyboard:async(e={})=>await r({command:e_.keyboard,positionals:e.action?[e.action]:[],options:e}),clipboard:async e=>{var t;return await r("read"===(t=e).action?{command:e_.clipboard,positionals:["read"],options:t}:{command:e_.clipboard,positionals:["write",t.text],options:t})}}),devices:{list:async(e={})=>{let t=await n(e_.devices,[],e);return(Array.isArray(t.devices)?t.devices:[]).map(eB)},boot:async(e={})=>await s(e_.boot,[],e)},sessions:{list:async(e={})=>await i(e),close:async(e={})=>{let t=l(e),a=(await n("close",[],e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},simulators:{ensure:async e=>{let{runtime:t,...a}=e,r=await n("ensure-simulator",[],{...a,simulatorRuntimeId:t}),o=eM(r,"udid"),i=eM(r,"device");return{udid:o,device:i,runtime:eM(r,"runtime"),created:!0===r.created,booted:!0===r.booted,iosSimulatorDeviceSet:eE(r,"ios_simulator_device_set"),identifiers:{deviceId:o,deviceName:i,udid:o}}}},apps:{install:async e=>eF(await n("install",[e.app,e.appPath],e),l(e)),reinstall:async e=>eF(await n("reinstall",[e.app,e.appPath],e),l(e)),installFromSource:async e=>(function(e,t){let a=ek(e,"bundleId"),r=ek(e,"packageName"),o=a??r??ek(e,"appId"),n=ek(e,"launchTarget")??r??a??o;if(!n)throw new u("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:ek(e,"appName"),appId:o,bundleId:a,packageName:r,launchTarget:n,installablePath:ek(e,"installablePath"),archivePath:ek(e,"archivePath"),materializationId:ek(e,"materializationId"),materializationExpiresAt:ek(e,"materializationExpiresAt"),identifiers:A({session:t,bundleId:a,packageName:r,appId:o})}})(await n("install_source",[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),l(e)),list:async(e={})=>{let t=await n(e_.apps,[],e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=l(e),a=e.app?e.url?[e.app,e.url]:[e.app]:[],r=await n("open",a,e),o=function(e){let t=e.platform,a=ek(e,"id"),r=ek(e,"device");if("ios"!==t&&"macos"!==t&&"android"!==t||!a||!r)return;let o=eP(e,"target"),n=k(t,a,r);return{platform:t,target:o,id:a,name:r,identifiers:n,ios:"ios"===t?{udid:ek(e,"device_udid")??a,simulatorSetPath:eE(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:ek(e,"serial")??a}:void 0}}(r),i=ek(r,"appBundleId");return{session:t,appName:ek(r,"appName"),appBundleId:i,appId:i,startup:function(e){if(eO(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:ek(e,"appTarget"),appBundleId:ek(e,"appBundleId")}}(r.startup),runtime:function(e){if(!eO(e))return;let t=e.platform,a=ek(e,"metroHost"),r="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:a,metroPort:r,bundleUrl:ek(e,"bundleUrl"),launchUrl:ek(e,"launchUrl")}}(r.runtime),device:o,identifiers:{session:t,deviceId:o?.id,deviceName:o?.name,udid:o?.ios?.udid,serial:o?.android?.serial,appId:i,appBundleId:i}}},close:async(e={})=>{let t=l(e),a=(await n("close",e.app?[e.app]:[],e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>{var t;return await s(e_.push,[e.app,"string"==typeof(t=e.payload)?t:JSON.stringify(t)],e)},triggerEvent:async e=>{var t;return await s(e_.triggerAppEvent,[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]],e)}},materializations:{release:async e=>{var t;return{released:!0===(t=await n("release_materialized_paths",[],{...e,materializationId:e.materializationId})).released,materializationId:eM(t,"materializationId"),identifiers:{}}}},leases:{allocate:async e=>eG(await n("lease_allocate",[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>eG(await n("lease_heartbeat",[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await n("lease_release",[],e)).released})},metro:{prepare:async t=>await N({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath}),reload:async(t={})=>await T({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t;let a=l(e),r=await n(e_.snapshot,[],e),o=ek(r,"appBundleId"),i="object"==typeof r.visibility&&null!==r.visibility?r.visibility:void 0,s="object"==typeof r.androidSnapshot&&null!==r.androidSnapshot?r.androidSnapshot:void 0;return{nodes:Array.isArray(t=r.nodes)?t:[],truncated:!0===r.truncated,appName:ek(r,"appName"),appBundleId:o,...i?{visibility:i}:{},...s?{androidSnapshot:s}:{},warnings:Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=l(e),a=await n(e_.screenshot,e.path?[e.path]:[],{...e,screenshotFullscreen:e.fullscreen,screenshotMaxSize:e.maxSize});return{path:eM(a,"path"),overlayRefs:function(e){let t=e.overlayRefs;if(!Array.isArray(t))return;let a=[];for(let e of t){if(!eO(e))continue;let t=ek(e,"ref"),r=eT(e,"rect"),o=eT(e,"overlayRect"),n=function(e,t){let a=e[t];if(!eO(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0;if(void 0!==r&&void 0!==o)return{x:r,y:o}}(e,"center");t&&r&&o&&n&&a.push({ref:t,label:ek(e,"label"),rect:r,overlayRect:o,center:n})}return a}(a),identifiers:{session:t}}},diff:async e=>await s(e_.diff,[e.kind],{...e,interactiveOnly:e.interactiveOnly,compact:e.compact,depth:e.depth,scope:e.scope,raw:e.raw})},interactions:{click:async e=>await s(e_.click,e$(e),{...e,clickButton:e.button}),press:async e=>await s(e_.press,e$(e),e),longPress:async e=>await s(e_.longPress,[String(e.x),String(e.y),...eK(e.durationMs)],e),swipe:async e=>await s(e_.swipe,[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y),...eK(e.durationMs)],e),focus:async e=>await s(e_.focus,[String(e.x),String(e.y)],e),type:async e=>await s(e_.type,[e.text],e),fill:async e=>await s(e_.fill,[...e$(e),e.text],e),scroll:async e=>await s(e_.scroll,[e.direction,...eK(e.amount)],e),pinch:async e=>await s(e_.pinch,[String(e.scale),...eK(e.x),...eK(e.y)],e),get:async e=>{var t;return await s(e_.get,[e.format,...void 0!==(t=e).ref?[t.ref,...eH(t.label)]:[t.selector]],e)},is:async e=>await s(e_.is,[e.predicate,e.selector,..."text"===e.predicate?[e.value]:[]],e),find:async e=>await s(e_.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...eK(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})},replay:{run:async e=>await s(e_.replay,[e.path],{...e,replayUpdate:e.update,replayEnv:e.env,replayShellEnv:eV(process.env)}),test:async e=>await s(e_.test,e.paths,{...e,replayUpdate:e.update,replayEnv:e.env,replayShellEnv:eV(process.env)})},batch:{run:async e=>await s(e_.batch,[],{...e,batchSteps:e.steps,batchOnError:e.onError,batchMaxSteps:e.maxSteps})},observability:{perf:async(e={})=>await s(e_.perf,[],e),logs:async(e={})=>{var t;return await s(e_.logs,[(t=e).action??"path",...eH(t.message)],e)},network:async(e={})=>{var t;return await s(e_.network,[...(t=e).action?[t.action]:[],...eK(t.limit)],{...e,networkInclude:e.include})}},recording:{record:async e=>await s(e_.record,[e.action,...eH(e.path)],e),trace:async e=>await s(e_.trace,[e.action,...eH(e.path)],e)},settings:{update:async e=>await s(e_.settings,[e.setting,e.state,..."permission"in e?[e.permission]:[],..."mode"in e&&e.mode?[e.mode]:[]],e)}}}function e$(e){return void 0!==e.ref?[e.ref,...eH(e.label)]:void 0!==e.selector?[e.selector]:[String(e.x),String(e.y)]}function eH(e){return void 0===e?[]:[e]}function eK(e){return void 0===e?[]:[String(e)]}function eV(e){let t={};for(let[a,r]of Object.entries(e))"string"==typeof r&&a.startsWith("AD_VAR_")&&(t[a]=r);return t}function eG(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:eM(t,"leaseId"),tenantId:eM(t,"tenantId"),runId:eM(t,"runId"),backend:eM(t,"backend"),createdAt:"number"==typeof t.createdAt?t.createdAt:void 0,heartbeatAt:"number"==typeof t.heartbeatAt?t.heartbeatAt:void 0,expiresAt:"number"==typeof t.expiresAt?t.expiresAt:void 0}}export{e_ as CLIENT_COMMANDS,ez as createAgentDeviceClient,J as sendToDaemon};
|
|
2
|
+
`)}),l=E(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),d="number"==typeof r?setTimeout(()=>{s.destroy(),i(ef(t,l,a.meta?.requestId,a.command,!1,r))},r):void 0,c="";s.setEncoding("utf8"),s.on("data",e=>{let t=(c+=e).indexOf("\n");if(-1===t)return;let r=c.slice(0,t).trim();if(r)try{let e=JSON.parse(r);s.end(),d&&clearTimeout(d),n(e)}catch(e){d&&clearTimeout(d),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:r},e instanceof Error?e:void 0))}}),s.on("error",e=>{d&&clearTimeout(d),i(eh(e,a.meta?.requestId,!1))})})}async function ew(e,r,o){var n,i,s;let l,d=e.baseUrl?new URL(eg(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!d)throw new u("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let p=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},l=n.meta?.requestId??w(),"lease_allocate"!==(s=n.command)&&"lease_heartbeat"!==s&&"lease_release"!==s?{jsonrpc:"2.0",id:l,method:"agent_device.command",params:n}:{jsonrpc:"2.0",id:l,method:function(e){switch(e){case"lease_allocate":return"agent_device.lease.allocate";case"lease_heartbeat":return"agent_device.lease.heartbeat";case"lease_release":return"agent_device.lease.release"}}(n.command),params:function(e,t,a){let r={...a.includeTokenParam?{token:e.token}:{},session:e.session,tenantId:e.meta?.tenantId,runId:e.meta?.runId};switch(t){case"lease_allocate":return{...r,ttlMs:e.meta?.leaseTtlMs,backend:e.meta?.leaseBackend};case"lease_heartbeat":return{...r,leaseId:e.meta?.leaseId,ttlMs:e.meta?.leaseTtlMs};case"lease_release":return{...r,leaseId:e.meta?.leaseId}}}(n,n.command,i)})),m={"content-type":"application/json","content-length":Buffer.byteLength(p)};return e.baseUrl&&e.token&&(m.authorization=`Bearer ${e.token}`,m["x-agent-device-token"]=e.token),await new Promise((n,i)=>{let s=E(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),l=("https:"===d.protocol?a:t).request({protocol:d.protocol,host:d.hostname,port:d.port,method:"POST",path:d.pathname+d.search,headers:m},t=>{let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{h&&clearTimeout(h);try{let t=JSON.parse(a);if(t.error){let e=t.error.data??{};i(new u(c(null!=e.code?String(e.code):void 0,"COMMAND_FAILED"),String(e.message??t.error.message??"Daemon RPC request failed"),{..."object"==typeof e.details&&e.details?e.details:{},hint:"string"==typeof e.hint?e.hint:void 0,diagnosticId:"string"==typeof e.diagnosticId?e.diagnosticId:void 0,logPath:"string"==typeof e.logPath?e.logPath:void 0,requestId:r.meta?.requestId}));return}if(!t.result||"object"!=typeof t.result)return void i(new u("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));if(e.baseUrl&&t.result.ok)return void eI(e,r,t.result).then(n).catch(i);n(t.result)}catch(e){h&&clearTimeout(h),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:a},e instanceof Error?e:void 0))}})}),f=ev(e),h="number"==typeof o?setTimeout(()=>{l.destroy(),i(ef(e,s,r.meta?.requestId,r.command,f,o))},o):void 0;l.on("error",e=>{h&&clearTimeout(h),i(eh(e,r.meta?.requestId,f))}),l.write(p),l.end()})}function ev(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eg(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function eI(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let n=a.data?{...a.data}:{},i=[];for(let a of r){if(!a||"object"!=typeof a||"string"!=typeof a.artifactId){i.push(a);continue}let r=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let a=e.fileName?.trim()||`${e.field}-${Date.now()}`;return o.resolve(t.meta?.cwd??process.cwd(),a)}(a,t);await eb({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),n[a.field]=r,i.push({...a,localPath:r})}return n.artifacts=i,{ok:!0,data:n}}async function eb(e){var i,s;let l,d=new URL((i=e.baseUrl,s=e.artifactId,l=i.endsWith("/")?i:`${i}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),c="https:"===d.protocol?a:t;await r.promises.mkdir(o.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,i=e.timeoutMs??$,s=n=>{if(!o){if(o=!0,clearTimeout(p),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},l=c.request({protocol:d.protocol,host:d.hostname,port:d.port,method:"GET",path:d.pathname+d.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:a}))});return}t.on("aborted",()=>{s(new u("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),n(t,r.createWriteStream(e.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),p=setTimeout(()=>{l.destroy(new u("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:i}))},i);l.on("error",t=>{t instanceof u?s(t):s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:i},t instanceof Error?t:void 0))}),l.end()})}function eA(e=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if(!e)return 9e4;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):9e4}let e_={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",get:"get",home:"home",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",perf:"perf",pinch:"pinch",press:"press",push:"push",record:"record",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",wait:"wait"};function eS(e,t,a,r){let o=a(e[t]);if(void 0===o)throw new u("COMMAND_FAILED",r,{response:e});return o}function eM(e,t){return eS(e,t,eN,`Daemon response is missing "${t}".`)}function ek(e,t){return eN(e[t])}function eE(e,t){var a;let r;return a=eN,null===(r=e[t])?null:a(r)}function eD(e,t){return eS(e,t,ex,`Daemon response has invalid "${t}".`)}function eP(e,t){return function(e){return"tv"===e||"mobile"===e||"desktop"===e?e:void 0}(e[t])??"mobile"}function eT(e,t){let a=e[t];if(!eO(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0,n="number"==typeof a.width?a.width:void 0,i="number"==typeof a.height?a.height:void 0;if(void 0!==r&&void 0!==o&&void 0!==n&&void 0!==i)return{x:r,y:o,width:n,height:i}}function eN(e){return"string"==typeof e&&e.length>0?e:void 0}function eU(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function ex(e){return"ios"===e||"macos"===e||"android"===e?e:void 0}function eC(e){return"simulator"===e||"emulator"===e||"device"===e?e:void 0}function eR(e){if(!eO(e))throw new u("COMMAND_FAILED","Daemon returned an unexpected response shape.",{value:e});return e}function eO(e){return"object"==typeof e&&null!==e}function eL(e){let t={};for(let[a,r]of Object.entries(e))void 0!==r&&(t[a]=r);return t}function eF(e,t){let a=ek(e,"bundleId"),r=ek(e,"package");return{app:eM(e,"app"),appPath:eM(e,"appPath"),platform:eD(e,"platform"),appId:a??r,bundleId:a,package:r,identifiers:A({session:t,bundleId:a,packageName:r})}}function eB(e){let t=eR(e),a=eD(t,"platform"),r=eM(t,"id"),o=eM(t,"name");return{platform:a,target:eP(t,"target"),kind:eS(t,"kind",eC,'Daemon response has invalid "kind".'),id:r,name:o,booted:"boolean"==typeof t.booted?t.booted:void 0,identifiers:k(a,r,o),ios:"ios"===a?{udid:r}:void 0,android:"android"===a?{serial:r}:void 0}}function eq(e){let t=eR(e),a=eD(t,"platform"),r=eM(t,"id"),o=eM(t,"name"),n=eP(t,"target"),i=eM(t,"device"),s={session:o,...k(a,r,i)};return{name:o,createdAt:eS(t,"createdAt",eU,'Daemon response is missing numeric "createdAt".'),device:{platform:a,target:n,id:r,name:i,identifiers:s,ios:"ios"===a?{udid:r,simulatorSetPath:eE(t,"ios_simulator_device_set")}:void 0,android:"android"===a?{serial:r}:void 0},identifiers:s}}function ej(e){return e??"default"}function ez(e={},t={}){var a;let r,o=t.transport??J,n=async(t,a=[],r={})=>{var n,i;let s=(n=e,i=r,{...n,...i}),l=await o({session:ej(s.session),command:t,positionals:a,flags:eL({stateDir:s.stateDir,daemonBaseUrl:s.daemonBaseUrl,daemonAuthToken:s.daemonAuthToken,daemonTransport:s.daemonTransport,daemonServerMode:s.daemonServerMode,tenant:s.tenant,sessionIsolation:s.sessionIsolation,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,platform:s.platform,target:s.target,device:s.device,udid:s.udid,serial:s.serial,iosSimulatorDeviceSet:s.iosSimulatorDeviceSet,androidDeviceAllowlist:s.androidDeviceAllowlist,runtime:s.simulatorRuntimeId,boot:s.boot,reuseExisting:s.reuseExisting,surface:s.surface,activity:s.activity,relaunch:s.relaunch,shutdown:s.shutdown,saveScript:s.saveScript,noRecord:s.noRecord,backMode:s.backMode,metroHost:s.metroHost,metroPort:s.metroPort,bundleUrl:s.bundleUrl,launchUrl:s.launchUrl,snapshotInteractiveOnly:s.interactiveOnly,snapshotCompact:s.compact,snapshotDepth:s.depth,snapshotScope:s.scope,snapshotRaw:s.raw,screenshotFullscreen:s.screenshotFullscreen,screenshotMaxSize:s.screenshotMaxSize,overlayRefs:s.overlayRefs,appsFilter:s.appsFilter,out:s.out,count:s.count,fps:s.fps,quality:s.quality,hideTouches:s.hideTouches,intervalMs:s.intervalMs,delayMs:s.delayMs,holdMs:s.holdMs,jitterPx:s.jitterPx,pixels:s.pixels,doubleTap:s.doubleTap,clickButton:s.clickButton,pauseMs:s.pauseMs,pattern:s.pattern,headless:s.headless,restart:s.restart,replayUpdate:s.replayUpdate,replayEnv:s.replayEnv,replayShellEnv:s.replayShellEnv,failFast:s.failFast,timeoutMs:s.timeoutMs,retries:s.retries,artifactsDir:s.artifactsDir,reportJunit:s.reportJunit,findFirst:s.findFirst,findLast:s.findLast,networkInclude:s.networkInclude,batchOnError:s.batchOnError,batchMaxSteps:s.batchMaxSteps,batchSteps:s.batchSteps,verbose:s.debug}),runtime:s.runtime,meta:eL({requestId:s.requestId,cwd:s.cwd,debug:s.debug,lockPolicy:s.lockPolicy,lockPlatform:s.lockPlatform,tenantId:s.tenant,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,leaseTtlMs:s.leaseTtlMs,sessionIsolation:s.sessionIsolation,installSource:s.installSource,retainMaterializedPaths:s.retainMaterializedPaths,materializedPathRetentionMs:s.materializedPathRetentionMs,materializationId:s.materializationId})});return l.ok||function(e){throw new u(c(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(l.error),l.data??{}},i=async(e={})=>{let t=await n("session_list",[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(eq)},s=async(e,t=[],a={})=>await n(e,t,a),l=(t={})=>{var a,r;return ej((a=e,r=t,{...a,...r}).session)};return{command:(a=async e=>await n(e.command,e.positionals,e.options),r=async e=>await a(e),{wait:async e=>await r(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new u("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return{command:e_.wait,positionals:[String(e.durationMs)],options:e};let t=void 0!==e.timeoutMs?[String(e.timeoutMs)]:[];if(void 0!==e.text)return{command:e_.wait,positionals:["text",e.text,...t],options:e};if(void 0!==e.ref)return{command:e_.wait,positionals:[e.ref,...t],options:e};let a=e.selector;return function(e){if(!P(e))throw new u("INVALID_ARGS",`Invalid wait selector: ${e}`)}(a),{command:e_.wait,positionals:[a,...t],options:e}}(e)),alert:async(e={})=>{var t;let a;return await r((a=(t=e).action??"get",{command:e_.alert,positionals:[a,...void 0!==t.timeoutMs?[String(t.timeoutMs)]:[]],options:t}))},appState:async(e={})=>await r({command:e_.appState,positionals:[],options:e}),back:async(e={})=>await r({command:e_.back,positionals:[],options:{...e,backMode:e.mode}}),home:async(e={})=>await r({command:e_.home,positionals:[],options:e}),rotate:async e=>await r({command:e_.rotate,positionals:[e.orientation],options:e}),appSwitcher:async(e={})=>await r({command:e_.appSwitcher,positionals:[],options:e}),keyboard:async(e={})=>await r({command:e_.keyboard,positionals:e.action?[e.action]:[],options:e}),clipboard:async e=>{var t;return await r("read"===(t=e).action?{command:e_.clipboard,positionals:["read"],options:t}:{command:e_.clipboard,positionals:["write",t.text],options:t})}}),devices:{list:async(e={})=>{let t=await n(e_.devices,[],e);return(Array.isArray(t.devices)?t.devices:[]).map(eB)},boot:async(e={})=>await s(e_.boot,[],e)},sessions:{list:async(e={})=>await i(e),close:async(e={})=>{let t=l(e),a=(await n("close",[],e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},simulators:{ensure:async e=>{let{runtime:t,...a}=e,r=await n("ensure-simulator",[],{...a,simulatorRuntimeId:t}),o=eM(r,"udid"),i=eM(r,"device");return{udid:o,device:i,runtime:eM(r,"runtime"),created:!0===r.created,booted:!0===r.booted,iosSimulatorDeviceSet:eE(r,"ios_simulator_device_set"),identifiers:{deviceId:o,deviceName:i,udid:o}}}},apps:{install:async e=>eF(await n("install",[e.app,e.appPath],e),l(e)),reinstall:async e=>eF(await n("reinstall",[e.app,e.appPath],e),l(e)),installFromSource:async e=>(function(e,t){let a=ek(e,"bundleId"),r=ek(e,"packageName"),o=a??r??ek(e,"appId"),n=ek(e,"launchTarget")??r??a??o;if(!n)throw new u("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:ek(e,"appName"),appId:o,bundleId:a,packageName:r,launchTarget:n,installablePath:ek(e,"installablePath"),archivePath:ek(e,"archivePath"),materializationId:ek(e,"materializationId"),materializationExpiresAt:ek(e,"materializationExpiresAt"),identifiers:A({session:t,bundleId:a,packageName:r,appId:o})}})(await n("install_source",[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),l(e)),list:async(e={})=>{let t=await n(e_.apps,[],e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=l(e),a=e.app?e.url?[e.app,e.url]:[e.app]:[],r=await n("open",a,e),o=function(e){let t=e.platform,a=ek(e,"id"),r=ek(e,"device");if("ios"!==t&&"macos"!==t&&"android"!==t||!a||!r)return;let o=eP(e,"target"),n=k(t,a,r);return{platform:t,target:o,id:a,name:r,identifiers:n,ios:"ios"===t?{udid:ek(e,"device_udid")??a,simulatorSetPath:eE(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:ek(e,"serial")??a}:void 0}}(r),i=ek(r,"appBundleId");return{session:t,appName:ek(r,"appName"),appBundleId:i,appId:i,startup:function(e){if(eO(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:ek(e,"appTarget"),appBundleId:ek(e,"appBundleId")}}(r.startup),runtime:function(e){if(!eO(e))return;let t=e.platform,a=ek(e,"metroHost"),r="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:a,metroPort:r,bundleUrl:ek(e,"bundleUrl"),launchUrl:ek(e,"launchUrl")}}(r.runtime),device:o,identifiers:{session:t,deviceId:o?.id,deviceName:o?.name,udid:o?.ios?.udid,serial:o?.android?.serial,appId:i,appBundleId:i}}},close:async(e={})=>{let t=l(e),a=(await n("close",e.app?[e.app]:[],e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>{var t;return await s(e_.push,[e.app,"string"==typeof(t=e.payload)?t:JSON.stringify(t)],e)},triggerEvent:async e=>{var t;return await s(e_.triggerAppEvent,[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]],e)}},materializations:{release:async e=>{var t;return{released:!0===(t=await n("release_materialized_paths",[],{...e,materializationId:e.materializationId})).released,materializationId:eM(t,"materializationId"),identifiers:{}}}},leases:{allocate:async e=>eG(await n("lease_allocate",[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>eG(await n("lease_heartbeat",[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await n("lease_release",[],e)).released})},metro:{prepare:async t=>await N({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath}),reload:async(t={})=>await T({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t;let a=l(e),r=await n(e_.snapshot,[],e),o=ek(r,"appBundleId"),i="object"==typeof r.visibility&&null!==r.visibility?r.visibility:void 0,s="object"==typeof r.androidSnapshot&&null!==r.androidSnapshot?r.androidSnapshot:void 0;return{nodes:Array.isArray(t=r.nodes)?t:[],truncated:!0===r.truncated,appName:ek(r,"appName"),appBundleId:o,...i?{visibility:i}:{},...s?{androidSnapshot:s}:{},warnings:Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=l(e),a=await n(e_.screenshot,e.path?[e.path]:[],{...e,screenshotFullscreen:e.fullscreen,screenshotMaxSize:e.maxSize});return{path:eM(a,"path"),overlayRefs:function(e){let t=e.overlayRefs;if(!Array.isArray(t))return;let a=[];for(let e of t){if(!eO(e))continue;let t=ek(e,"ref"),r=eT(e,"rect"),o=eT(e,"overlayRect"),n=function(e,t){let a=e[t];if(!eO(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0;if(void 0!==r&&void 0!==o)return{x:r,y:o}}(e,"center");t&&r&&o&&n&&a.push({ref:t,label:ek(e,"label"),rect:r,overlayRect:o,center:n})}return a}(a),identifiers:{session:t}}},diff:async e=>await s(e_.diff,[e.kind],{...e,interactiveOnly:e.interactiveOnly,compact:e.compact,depth:e.depth,scope:e.scope,raw:e.raw})},interactions:{click:async e=>await s(e_.click,e$(e),{...e,clickButton:e.button}),press:async e=>await s(e_.press,e$(e),e),longPress:async e=>await s(e_.longPress,[String(e.x),String(e.y),...eK(e.durationMs)],e),swipe:async e=>await s(e_.swipe,[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y),...eK(e.durationMs)],e),focus:async e=>await s(e_.focus,[String(e.x),String(e.y)],e),type:async e=>await s(e_.type,[e.text],e),fill:async e=>await s(e_.fill,[...e$(e),e.text],e),scroll:async e=>await s(e_.scroll,[e.direction,...eK(e.amount)],e),pinch:async e=>await s(e_.pinch,[String(e.scale),...eK(e.x),...eK(e.y)],e),get:async e=>{var t;return await s(e_.get,[e.format,...void 0!==(t=e).ref?[t.ref,...eH(t.label)]:[t.selector]],e)},is:async e=>await s(e_.is,[e.predicate,e.selector,..."text"===e.predicate?[e.value]:[]],e),find:async e=>await s(e_.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...eK(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})},replay:{run:async e=>await s(e_.replay,[e.path],{...e,replayUpdate:e.update,replayEnv:e.env,replayShellEnv:eV(process.env)}),test:async e=>await s(e_.test,e.paths,{...e,replayUpdate:e.update,replayEnv:e.env,replayShellEnv:eV(process.env)})},batch:{run:async e=>await s(e_.batch,[],{...e,batchSteps:e.steps,batchOnError:e.onError,batchMaxSteps:e.maxSteps})},observability:{perf:async(e={})=>await s(e_.perf,[],e),logs:async(e={})=>{var t;return await s(e_.logs,[(t=e).action??"path",...eH(t.message)],e)},network:async(e={})=>{var t;return await s(e_.network,[...(t=e).action?[t.action]:[],...eK(t.limit)],{...e,networkInclude:e.include})}},recording:{record:async e=>await s(e_.record,[e.action,...eH(e.path)],e),trace:async e=>await s(e_.trace,[e.action,...eH(e.path)],e)},settings:{update:async e=>await s(e_.settings,[e.setting,e.state,..."latitude"in e?[String(e.latitude),String(e.longitude)]:[],..."permission"in e?[e.permission]:[],..."mode"in e&&e.mode?[e.mode]:[]],e)}}}function e$(e){return void 0!==e.ref?[e.ref,...eH(e.label)]:void 0!==e.selector?[e.selector]:[String(e.x),String(e.y)]}function eH(e){return void 0===e?[]:[e]}function eK(e){return void 0===e?[]:[String(e)]}function eV(e){let t={};for(let[a,r]of Object.entries(e))"string"==typeof r&&a.startsWith("AD_VAR_")&&(t[a]=r);return t}function eG(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:eM(t,"leaseId"),tenantId:eM(t,"tenantId"),runId:eM(t,"runId"),backend:eM(t,"backend"),createdAt:"number"==typeof t.createdAt?t.createdAt:void 0,heartbeatAt:"number"==typeof t.heartbeatAt?t.heartbeatAt:void 0,expiresAt:"number"==typeof t.expiresAt?t.expiresAt:void 0}}export{e_ as CLIENT_COMMANDS,ez as createAgentDeviceClient,J as sendToDaemon};
|
package/dist/src/9639.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{AsyncLocalStorage as e}from"node:async_hooks";import{
|
|
2
|
-
${i}`.toLowerCase()).includes("listener")&&o.includes("not found"))))throw Error(`Failed to remove Android port reverse ${t}: ${l.stderr}`);for(let e of r.values())e.delete(t)},async removeAllOwned(e,t){for(let
|
|
1
|
+
import{AsyncLocalStorage as e}from"node:async_hooks";import{runCmdBackground as r,withoutCommandExecutorOverride as t,runCmd as a,withCommandExecutorOverride as n}from"./9818.js";import{AppError as i}from"./9152.js";let o=new e;function l(e){return async(r,n)=>await t(async()=>await a("adb",["-s",e,...r],n))}function s(e){var t;let a=l(e.id);return{exec:a,spawn:(t=e.id,(e,a)=>{let n=r("adb",["-s",t,...e],{...a,allowFailure:!0,captureOutput:!1});return n.wait.catch(()=>{}),n.child}),reverse:A(a),pull:async(e,r,t)=>await a(["pull",e,r],t),install:async(e,r)=>{let{installArgs:t,execOptions:n}=y(r);return await a(["install",...t,e],n)}}}function d(e,r){let t=o.getStore();return r?r:t?.serial===e.id?t.provider.exec:l(e.id)}function u(e,r){if(r)return w(r);let t=o.getStore();return t?.serial===e.id?w(t.provider):s(e)}function c(e){let r=w(e),t=r.reverse??A(r.exec),a=new Map;return{async ensure(e,r){let n=a.get(e.local);if(n&&n.ownerId!==e.ownerId)throw new i("COMMAND_FAILED",`Android port reverse ${e.local} is already owned by ${n.ownerId??"another session"}`,{current:n,requested:e});n?.remote!==e.remote&&(await t.ensure(e,r),a.set(e.local,{...e}))},async remove(e,r){a.has(e)?(await t.remove(e,r),a.delete(e)):await t.remove(e,r)},async removeAllOwned(e,r){let n=[...a.values()].filter(r=>r.ownerId===e).map(e=>e.local);if(0===n.length)return void await t.removeAllOwned(e,r);for(let e of n)await t.remove(e,r),a.delete(e)},list:async e=>t.list?await t.list(e):[...a.values()]}}function w(e){return"function"==typeof e?{exec:e}:e}async function f(e,r,a){let{device:n,provider:o,...l}=a??{},s=p(n,o),d=s?.pull;if(d)return await t(async()=>await d(e,r,l));let u=s?.exec;if(!u)throw new i("COMMAND_FAILED","Android adb pull requires an adb provider");return await t(async()=>await u(["pull",e,r],l))}async function v(e,r){let{device:a,provider:n,...o}=r??{},l=p(a,n),s=l?.install;if(s)return await t(async()=>await s(e,o));let d=l?.exec;if(!d)throw new i("COMMAND_FAILED","Android adb install requires an adb provider");let{installArgs:u,execOptions:c}=y(o);return await t(async()=>await d(["install",...u,e],c))}function p(e,r){if(r)return w(r);if(e)return u(e);let t=o.getStore();if(t)return w(t.provider)}async function m(e,r,a){var i;if(!e)return await a();let l={provider:"function"==typeof e?{exec:e}:e,serial:r.serial},s=(i=l,(e,r,a)=>{if("adb"!==e)return;let n=function(e,r){if("-s"===e[0]&&e[1]&&e[1]===r)return e.slice(2)}(r,i.serial);if(n)return t(async()=>await i.provider.exec(n,a))});return await o.run(l,async()=>await n(s,a))}function A(e){let r=new Map;return{async ensure(t,a){if(await e(["reverse",t.local,t.remote],{allowFailure:!1,signal:a?.signal,timeoutMs:a?.timeoutMs}),t.ownerId){let e=r.get(t.ownerId)??new Set;e.add(t.local),r.set(t.ownerId,e)}},async remove(t,a){var n,i;let o,l=await e(["reverse","--remove",t],{allowFailure:!0,signal:a?.signal,timeoutMs:a?.timeoutMs});if(0!==l.exitCode&&(n=l.stdout,i=l.stderr,!((o=`${n}
|
|
2
|
+
${i}`.toLowerCase()).includes("listener")&&o.includes("not found"))))throw Error(`Failed to remove Android port reverse ${t}: ${l.stderr}`);for(let e of r.values())e.delete(t)},async removeAllOwned(e,t){for(let a of[...r.get(e)??[]])await this.remove(a,t);r.delete(e)},async list(t){let a=await e(["reverse","--list"],{allowFailure:!0,signal:t?.signal,timeoutMs:t?.timeoutMs});return 0!==a.exitCode?[]:function(e,r){let t=new Map;for(let[e,a]of r)for(let r of a)t.set(r,e);return e.split("\n").map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,r])=>({local:e,remote:r,ownerId:t.get(e)}))}(a.stdout,r)}}}function y(e){let{replace:r,allowTestPackages:t,allowDowngrade:a,grantPermissions:n,...i}=e??{},o=[];return r&&o.push("-r"),t&&o.push("-t"),a&&o.push("-d"),n&&o.push("-g"),{installArgs:o,execOptions:i}}export{c as createAndroidPortReverseManager,s as createLocalAndroidAdbProvider,v as installAndroidAdbPackage,f as pullAndroidAdbFile,d as resolveAndroidAdbExecutor,u as resolveAndroidAdbProvider,m as withAndroidAdbProvider};
|
package/dist/src/9818.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AsyncLocalStorage as t}from"node:async_hooks";import{constants as e}from"node:fs";import{access as r,stat as n}from"node:fs/promises";import o from"node:path";import{spawn as i,spawnSync as
|
|
1
|
+
import{AsyncLocalStorage as t}from"node:async_hooks";import{constants as e}from"node:fs";import{access as r,stat as n}from"node:fs/promises";import o from"node:path";import{spawn as i,spawnSync as d}from"node:child_process";import{Readable as u}from"node:stream";import{pipeline as s}from"node:stream/promises";import{AppError as a}from"./9152.js";let c=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,f=[".com",".exe",".bat",".cmd"],l=new t;async function m(t,e){return t?await l.run(t,e):await e()}async function p(t){return await l.run(void 0,t)}async function w(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await A(t,e,r)}async function h(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await A(t,e,r)}function A(t,e,r={}){let n=O(t);return new Promise((o,d)=>{let u=i(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1});r.onSpawn?.(u);let s="",c=r.binaryStdout?[]:void 0,f="",l=!1,m=T(r.timeoutMs),p=m?setTimeout(()=>{l=!0,P(u,r.detached)},m):null,w=x(u,r);r.binaryStdout||u.stdout.setEncoding("utf8"),u.stderr.setEncoding("utf8"),B(u,r.stdin).catch(o=>{var i,s,c,f;w.didAbort||l||(i=o)instanceof Error&&"code"in i&&"EPIPE"===i.code||(d((s=n,c=t,new a("COMMAND_FAILED",`Failed to write stdin for ${s}`,{cmd:c,args:e},(f=o)instanceof Error?f:void 0))),P(u,r.detached))}),u.stdout.on("data",t=>{if(r.binaryStdout)return void c?.push(Buffer.isBuffer(t)?t:Buffer.from(t));let e=String(t);s+=e,r.onStdoutChunk?.(e)}),u.stderr.on("data",t=>{let e=String(t);f+=e,r.onStderrChunk?.(e)}),u.on("error",r=>{p&&clearTimeout(p),w.dispose(),d(w.didAbort?C(n,t,e):I(n,t,e,r))}),u.on("close",i=>{var u,h,A,v,S,b;p&&clearTimeout(p),w.dispose();let E=i??1;w.didAbort?d(C(n,t,e)):l&&m?d((u=n,h=t,A=e,v=m,S=E,b=s,new a("COMMAND_FAILED",`${u} timed out after ${v}ms`,{cmd:h,args:A,stdout:b,stderr:f,exitCode:S,timeoutMs:v}))):0===E||r.allowFailure?o({stdout:s,stderr:f,exitCode:E,stdoutBuffer:c?Buffer.concat(c):void 0}):d($(n,t,e,E,s,f))})})}async function v(t){let e=N(t);if(!e)return!1;if(o.isAbsolute(e))return D(e);let r=process.env.PATH;if(!r)return!1;let n=function(){if("win32"!==process.platform)return[""];let t=process.env.PATHEXT;if(!t)return f;let e=t.split(";").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0);return e.length>0?e:f}();for(let t of r.split(o.delimiter)){let r=t.trim();if(r){for(let t of function(t,e){if("win32"!==process.platform)return[t];let r=t.toLowerCase();return e.some(t=>r.endsWith(t))?[t]:e.map(e=>`${t}${e}`)}(e,n))if(await D(o.join(r,t)))return!0}}return!1}async function S(t,e){let r=L(t,e,"executable");if(r){if(!await D(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-executable file: ${r}`,{envName:e,path:r});return r}}async function b(t,e){let r=L(t,e,"file");if(r){if(!await F(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-file path: ${r}`,{envName:e,path:r});return r}}function E(t,e,r={}){let n=O(t),o=d(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:T(r.timeoutMs),windowsHide:!0,shell:!1});if(o.error){let i=o.error.code;if("ETIMEDOUT"===i)throw new a("COMMAND_FAILED",`${n} timed out after ${T(r.timeoutMs)}ms`,{cmd:t,args:e,timeoutMs:T(r.timeoutMs)},o.error);if("ENOENT"===i)throw M(n,t,o.error);throw _(n,t,e,o.error)}let i=r.binaryStdout?Buffer.isBuffer(o.stdout)?o.stdout:Buffer.from(o.stdout??""):void 0,u=r.binaryStdout?"":"string"==typeof o.stdout?o.stdout:(o.stdout??"").toString(),s="string"==typeof o.stderr?o.stderr:(o.stderr??"").toString(),c=o.status??1;if(0!==c&&!r.allowFailure)throw $(n,t,e,c,u,s);return{stdout:u,stderr:s,exitCode:c,stdoutBuffer:i}}function g(t,e,r={}){let n=i(O(t),e,{cwd:r.cwd,env:r.env,stdio:r.stdio??"ignore",detached:!0,windowsHide:!0,shell:!1});return n.unref(),n.pid??0}function y(t,e,r={}){let n=O(t),o=i(n,e,{cwd:r.cwd,env:r.env,stdio:r.stdio??["ignore","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1}),d="",u="",s=r.captureOutput??!0,a=x(o,r);s&&(o.stdout?.setEncoding("utf8"),o.stderr?.setEncoding("utf8"),o.stdout?.on("data",t=>{d+=t}),o.stderr?.on("data",t=>{u+=t}));let c=new Promise((i,s)=>{o.on("error",r=>{a.dispose(),s(a.didAbort?C(n,t,e):I(n,t,e,r))}),o.on("close",o=>{a.dispose();let c=o??1;a.didAbort?s(C(n,t,e)):0===c||r.allowFailure?i({stdout:d,stderr:u,exitCode:c}):s($(n,t,e,c,d,u))})});return{child:o,wait:c}}function O(t){let e=N(t);if(!e)throw new a("INVALID_ARGS",`Invalid executable command: ${JSON.stringify(t)}`,{cmd:t,hint:"Use a bare command name from PATH or an absolute executable path."});return e}function I(t,e,r,n){return"ENOENT"===n.code?M(t,e,n):_(t,e,r,n)}function M(t,e,r){return new a("TOOL_MISSING",`${t} not found in PATH`,{cmd:e},r)}function _(t,e,r,n){return new a("COMMAND_FAILED",`Failed to run ${t}`,{cmd:e,args:r},n)}function C(t,e,r){return new a("COMMAND_FAILED","request canceled",{cmd:e,args:r,executable:t,reason:"request_canceled"})}function $(t,e,r,n,o,i){return new a("COMMAND_FAILED",`${t} exited with code ${n}`,{cmd:e,args:r,stdout:o,stderr:i,exitCode:n,processExitError:!0})}function L(t,e,r){let n=t?.trim();if(n){if(!o.isAbsolute(n)||n.includes("\0"))throw new a("INVALID_ARGS",`${e} must be an absolute ${r} path, not ${JSON.stringify(t)}`,{envName:e,path:t});return n}}function N(t){let e=t.trim();return!e||e.includes("\0")?null:o.isAbsolute(e)?e:e.includes("/")||e.includes("\\")?null:c.test(e)?e:null}async function D(t){try{if(!await F(t))return!1;return await r(t,"win32"===process.platform?e.F_OK:e.X_OK),!0}catch{return!1}}async function F(t){try{return(await n(t)).isFile()}catch{return!1}}function T(t){if(!Number.isFinite(t))return;let e=Math.floor(t);if(!(e<=0))return e}function x(t,e){let r=!1,n=()=>{r=!0,P(t,e.detached)};return e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0}),{get didAbort(){return r},dispose:()=>{e.signal?.removeEventListener("abort",n)}}}function P(t,e){if(e&&t.pid&&"win32"!==process.platform)try{process.kill(-t.pid,"SIGKILL");return}catch{}t.kill("SIGKILL")}async function B(t,e){if(t.stdin){if(void 0===e)return void t.stdin?.end();await s(u.from([e]),t.stdin)}}export{D as isExecutablePath,S as resolveExecutableOverridePath,b as resolveFileOverridePath,w as runCmd,y as runCmdBackground,g as runCmdDetached,h as runCmdStreaming,E as runCmdSync,v as whichCmd,m as withCommandExecutorOverride,p as withoutCommandExecutorOverride};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import type { Readable } from 'node:stream';
|
|
3
|
-
import {
|
|
3
|
+
import { StdioOptions } from 'node:child_process';
|
|
4
4
|
import type { Writable } from 'node:stream';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -52,7 +52,7 @@ export declare type AndroidAdbProvider = {
|
|
|
52
52
|
|
|
53
53
|
export declare type AndroidAdbPuller = (remotePath: string, localPath: string, options?: AndroidAdbTransferOptions) => Promise<AndroidAdbExecutorResult>;
|
|
54
54
|
|
|
55
|
-
export declare type AndroidAdbSpawner = (args: string[], options?:
|
|
55
|
+
export declare type AndroidAdbSpawner = (args: string[], options?: ExecBackgroundOptions) => AndroidAdbProcess;
|
|
56
56
|
|
|
57
57
|
export declare type AndroidAdbTransferOptions = AndroidAdbExecutorOptions;
|
|
58
58
|
|
|
@@ -146,6 +146,15 @@ export declare function dismissAndroidKeyboardWithAdb(adb: AndroidAdbExecutor):
|
|
|
146
146
|
type?: AndroidKeyboardType;
|
|
147
147
|
}>;
|
|
148
148
|
|
|
149
|
+
declare type ExecBackgroundOptions = ExecOptions & {
|
|
150
|
+
/**
|
|
151
|
+
* Capture stdout/stderr into the wait result when the child has piped stdio.
|
|
152
|
+
* Set false when the caller owns, ignores, or forwards the streams.
|
|
153
|
+
*/
|
|
154
|
+
captureOutput?: boolean;
|
|
155
|
+
stdio?: StdioOptions;
|
|
156
|
+
};
|
|
157
|
+
|
|
149
158
|
declare type ExecOptions = {
|
|
150
159
|
cwd?: string;
|
|
151
160
|
env?: NodeJS.ProcessEnv;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Readable } from 'node:stream';
|
|
2
|
-
import {
|
|
2
|
+
import { StdioOptions } from 'node:child_process';
|
|
3
3
|
import type { Writable } from 'node:stream';
|
|
4
4
|
|
|
5
5
|
export declare const ANDROID_SNAPSHOT_HELPER_NAME = "android-snapshot-helper";
|
|
@@ -63,7 +63,7 @@ declare type AndroidAdbProvider = {
|
|
|
63
63
|
|
|
64
64
|
declare type AndroidAdbPuller = (remotePath: string, localPath: string, options?: AndroidAdbTransferOptions) => Promise<AndroidAdbExecutorResult>;
|
|
65
65
|
|
|
66
|
-
declare type AndroidAdbSpawner = (args: string[], options?:
|
|
66
|
+
declare type AndroidAdbSpawner = (args: string[], options?: ExecBackgroundOptions) => AndroidAdbProcess;
|
|
67
67
|
|
|
68
68
|
declare type AndroidAdbTransferOptions = AndroidAdbExecutorOptions;
|
|
69
69
|
|
|
@@ -196,6 +196,15 @@ export declare function ensureAndroidSnapshotHelper(options: {
|
|
|
196
196
|
timeoutMs?: number;
|
|
197
197
|
}): Promise<AndroidSnapshotHelperInstallResult>;
|
|
198
198
|
|
|
199
|
+
declare type ExecBackgroundOptions = ExecOptions & {
|
|
200
|
+
/**
|
|
201
|
+
* Capture stdout/stderr into the wait result when the child has piped stdio.
|
|
202
|
+
* Set false when the caller owns, ignores, or forwards the streams.
|
|
203
|
+
*/
|
|
204
|
+
captureOutput?: boolean;
|
|
205
|
+
stdio?: StdioOptions;
|
|
206
|
+
};
|
|
207
|
+
|
|
199
208
|
declare type ExecOptions = {
|
|
200
209
|
cwd?: string;
|
|
201
210
|
env?: NodeJS.ProcessEnv;
|
|
@@ -237,6 +246,7 @@ declare type RawSnapshotNode = {
|
|
|
237
246
|
rect?: Rect;
|
|
238
247
|
enabled?: boolean;
|
|
239
248
|
selected?: boolean;
|
|
249
|
+
focused?: boolean;
|
|
240
250
|
hittable?: boolean;
|
|
241
251
|
depth?: number;
|
|
242
252
|
parentIndex?: number;
|