agent-device 0.16.1 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.1.apk → agent-device-android-multitouch-helper-0.16.4.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.4.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.1.manifest.json → agent-device-android-multitouch-helper-0.16.4.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.4.apk +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.4.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.1.manifest.json → agent-device-android-snapshot-helper-0.16.4.manifest.json} +6 -6
  7. package/dist/src/1393.js +1 -0
  8. package/dist/src/1769.js +7 -7
  9. package/dist/src/221.js +6 -4
  10. package/dist/src/6277.js +4 -0
  11. package/dist/src/7519.js +1 -1
  12. package/dist/src/7599.js +3 -0
  13. package/dist/src/89.js +1 -1
  14. package/dist/src/9542.js +3 -2
  15. package/dist/src/android-adb.js +1 -1
  16. package/dist/src/android-snapshot-helper.d.ts +10 -1
  17. package/dist/src/android-snapshot-helper.js +1 -1
  18. package/dist/src/batch.d.ts +1 -0
  19. package/dist/src/cli.js +15 -13
  20. package/dist/src/contracts.d.ts +1 -0
  21. package/dist/src/contracts.js +1 -1
  22. package/dist/src/index.d.ts +3 -0
  23. package/dist/src/internal/daemon.js +52 -52
  24. package/dist/src/server.js +1 -1
  25. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AppIcon.appiconset/logo.jpg +0 -0
  26. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Logo.imageset/logo.jpg +0 -0
  27. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -4
  28. package/package.json +1 -4
  29. package/server.json +2 -2
  30. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.1.apk.sha256 +0 -1
  31. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.1.apk +0 -0
  32. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.1.apk.sha256 +0 -1
  33. package/dist/src/2099.js +0 -1
  34. package/dist/src/3622.js +0 -3
  35. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -14
  36. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/Assets.xcassets/AppIcon.appiconset/logo-tinted.jpg +0 -0
  37. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/Assets.xcassets/Contents.json +0 -6
@@ -0,0 +1,3 @@
1
+ import{AsyncLocalStorage as e}from"node:async_hooks";import t from"node:crypto";import n from"node:fs";import o from"node:os";import r from"node:path";import{redactDiagnosticData as i}from"./9152.js";let a=new e;function s(){return t.randomBytes(8).toString("hex")}async function d(e,n){let o={...e,diagnosticId:`${Date.now().toString(36)}-${t.randomBytes(4).toString("hex")}`,events:[]};return await a.run(o,n)}function c(){let e=a.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function g(e){let t=a.getStore();if(!t)return;let o={ts:new Date().toISOString(),level:e.level??"info",phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?i(e.data):void 0};if(t.events.push(o),!t.debug)return;let r=`[agent-device][diag] ${JSON.stringify(o)}
2
+ `;try{t.logPath&&n.appendFile(t.logPath,r,()=>{}),t.traceLogPath&&n.appendFile(t.traceLogPath,r,()=>{}),t.logPath||t.traceLogPath||process.stderr.write(r)}catch{}}async function l(e,t,n){let o=Date.now();try{let r=await t();return g({level:"info",phase:e,durationMs:Date.now()-o,data:n}),r}catch(t){throw g({level:"error",phase:e,durationMs:Date.now()-o,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function u(e={}){let t=a.getStore();if(!t||!e.force&&!t.debug||0===t.events.length)return null;try{let e=(t.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),a=new Date().toISOString().slice(0,10),s=r.join(o.homedir(),".agent-device","logs",e,a);n.mkdirSync(s,{recursive:!0});let d=new Date().toISOString().replace(/[:.]/g,"-"),c=r.join(s,`${d}-${t.diagnosticId}.ndjson`),g=t.events.map(e=>JSON.stringify(i(e)));return n.writeFileSync(c,`${g.join("\n")}
3
+ `),t.events=[],c}catch{return null}}export{s as createRequestId,g as emitDiagnostic,u as flushDiagnosticsToSessionFile,c as getDiagnosticsMeta,l as withDiagnosticTimer,d as withDiagnosticsScope};
package/dist/src/89.js CHANGED
@@ -1 +1 @@
1
- var t;let e;import{DEFAULT_BATCH_MAX_STEPS as r}from"./1231.js";import{jsonSchemaField as a,stringField as i,batchCommandNames as n,toSelectorSnapshotOptions as o,booleanSchema as s,integerSchema as p,assertAllowedKeys as c,requiredEnum as d,looseObjectField as l,requiredField as u,listMcpExposedCommandNames as m,readFieldInput as h,commonToClientOptions as g,integerField as f,numberField as y,booleanField as b,readInputRecord as v,repeatedFields as w,stringSchema as x,stringArrayField as M,toClientElementTarget as S,customField as k,optionalEnum as I,enumField as P,toRepeatedOptions as R,pointField as U,command_input_readPoint as C,toClientInteractionTarget as E,interactionTargetField as T,fieldsInputSchema as j,requiredNumber as A,selectorSnapshotFields as F,elementTargetField as N,readCommonInput as O,looseObjectSchema as B,optionalInteger as H}from"./2099.js";function D(t){return{...t,invoke:async(e,r)=>await t.run(e,t.readInput(r))}}function L(t,e,r,a){return D({name:t,description:e,inputSchema:j(r),readInput:t=>h(t,r),run:a})}let _=["app","frontmost-app","desktop","menubar"],$=["duration","text","ref","selector"],G=["start","stop"],q=[L("devices","List available devices.",{},(t,e)=>t.devices.list(e)),L("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:b("Boot without showing simulator UI when supported.")},(t,e)=>t.devices.boot(e)),L("apps","List installed apps.",{appsFilter:P(["user-installed","all"])},(t,e)=>t.apps.list(e)),L("session","List active sessions.",{action:P(["list"])},async(t,{action:e,...r})=>({sessions:await t.sessions.list(r)})),L("open","Open an app, deep link, URL, or platform surface.",{app:i("App name, bundle id, package, or URL."),url:i("Optional URL passed with an app shell."),surface:P(_),activity:i("Android activity name."),launchConsole:i("Launch console mode."),relaunch:b("Force relaunch."),saveScript:a({oneOf:[s(),x()]}),noRecord:b("Do not record this action.")},(t,e)=>t.apps.open(e)),L("close","Close an app or end the active session.",{app:i("Optional app to close."),shutdown:b("Shutdown the session/device where supported."),saveScript:a({oneOf:[s(),x()]})},(t,e)=>e.app?t.apps.close(e):t.sessions.close(function(t){let{app:e,...r}=t;return r}(e))),L("install","Install an app binary.",{app:u(i()),appPath:u(i("Path to app binary."))},(t,e)=>t.apps.install(e)),L("reinstall","Reinstall an app binary.",{app:u(i()),appPath:u(i("Path to app binary."))},(t,e)=>t.apps.reinstall(e)),L("install-from-source","Install an app from a structured source.",{source:u(a(B("Install source object."))),retainPaths:b(),retentionMs:f()},(t,e)=>t.apps.installFromSource(e)),L("push","Deliver a push payload.",{app:u(i()),payload:u(a({oneOf:[x(),B()]}))},(t,e)=>t.apps.push(e)),L("trigger-app-event","Trigger an app-defined event.",{event:u(i()),payload:l()},(t,e)=>t.apps.triggerEvent(e)),L("snapshot","Capture an accessibility snapshot.",{interactiveOnly:b(),compact:b(),depth:f(),scope:i(),raw:b(),forceFull:b()},(t,e)=>t.capture.snapshot(e)),L("screenshot","Capture a screenshot.",{path:i("Output path."),overlayRefs:b(),fullscreen:b(),maxSize:f(),stabilize:b(),surface:P(_)},(t,e)=>t.capture.screenshot(e)),L("diff","Diff accessibility snapshots.",{kind:u(a({type:"string",const:"snapshot"})),out:i(),interactiveOnly:b(),compact:b(),depth:f(),scope:i(),raw:b()},(t,e)=>t.capture.diff(e)),L("wait","Wait for duration, text, ref, or selector.",{kind:P($),durationMs:f(),text:i(),ref:i(),selector:i(),timeoutMs:f(),depth:f(),scope:i(),raw:b()},(t,e)=>{var r;let a;return t.command.wait((I(r=e,"kind",$),a={...r},delete a.kind,a))}),L("alert","Inspect or handle platform alerts.",{action:P(["get","accept","dismiss","wait"]),timeoutMs:f()},(t,e)=>t.command.alert(e)),L("appstate","Show foreground app or activity.",{},(t,e)=>t.command.appState(e)),L("back","Navigate back.",{mode:P(["in-app","system"])},(t,e)=>t.command.back(e)),L("home","Go to the home screen.",{},(t,e)=>t.command.home(e)),L("rotate","Rotate device orientation.",{orientation:u(P(["portrait","portrait-upside-down","landscape-left","landscape-right"]))},(t,e)=>t.command.rotate(e)),L("app-switcher","Open the app switcher.",{},(t,e)=>t.command.appSwitcher(e)),L("keyboard","Inspect or dismiss the keyboard.",{action:P(["status","dismiss"])},(t,e)=>t.command.keyboard(e)),L("clipboard","Read or write clipboard text.",{action:u(P(["read","write"])),text:i()},(t,e)=>t.command.clipboard(e)),L("react-native","Run supported React Native app automation helpers.",{action:u(P(["dismiss-overlay"]))},(t,e)=>t.command.reactNative(e)),L("replay","Replay a recorded session.",{path:u(i()),update:b(),backend:i(),maestro:b(),env:M()},(t,e)=>t.replay.run(e)),L("test","Run one or more replay scripts.",{paths:u(M()),update:b(),backend:i(),maestro:b(),env:M(),failFast:b(),timeoutMs:f(),retries:f(),artifactsDir:i(),reportJunit:i()},(t,e)=>t.replay.test(e)),L("perf","Show session performance metrics.",{},(t,e)=>t.observability.perf(e)),L("logs","Manage session app logs.",{action:P(["path","start","stop","doctor","mark","clear"]),message:i(),restart:b()},(t,e)=>t.observability.logs(e)),L("network","Show recent HTTP traffic.",{action:P(["dump","log"]),limit:f(),include:P(["summary","headers","body","all"])},(t,e)=>t.observability.network(e)),L("record","Start or stop screen recording.",{action:u(P(G)),path:i(),fps:f(),quality:a(p()),hideTouches:b()},(t,e)=>t.recording.record(e)),L("trace","Start or stop trace capture.",{action:u(P(G)),path:i()},(t,e)=>t.recording.trace(e)),L("settings","Change OS settings and app permissions.",{setting:u(i()),state:u(i()),latitude:y(),longitude:y(),permission:i(),mode:P(["full","limited"])},(t,e)=>t.settings.update(e)),L("metro","Prepare Metro runtime or reload React Native apps.",{action:u(P(["prepare","reload"])),projectRoot:i(),kind:a(x()),publicBaseUrl:i(),proxyBaseUrl:i(),bearerToken:i(),bridgeScope:a({type:"object",additionalProperties:!0}),launchUrl:i(),port:f(),listenHost:i(),statusHost:i(),startupTimeoutMs:f(),probeTimeoutMs:f(),reuseExisting:b(),installDependenciesIfNeeded:b(),runtimeFilePath:i(),logPath:i(),metroHost:i(),metroPort:f(),bundleUrl:i(),timeoutMs:f()},async(t,e)=>{var r,a,i;return"prepare"===e.action?await t.metro.prepare({projectRoot:(r=e).projectRoot,kind:r.kind,publicBaseUrl:r.publicBaseUrl,proxyBaseUrl:r.proxyBaseUrl,bearerToken:r.bearerToken,bridgeScope:r.bridgeScope??((a=r).tenant&&a.runId&&a.leaseId?{tenantId:a.tenant,runId:a.runId,leaseId:a.leaseId}:void 0),port:r.port,listenHost:r.listenHost,statusHost:r.statusHost,startupTimeoutMs:r.startupTimeoutMs,probeTimeoutMs:r.probeTimeoutMs,reuseExisting:r.reuseExisting,installDependenciesIfNeeded:r.installDependenciesIfNeeded,runtimeFilePath:r.runtimeFilePath}):await t.metro.reload({metroHost:(i=e).metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,timeoutMs:i.timeoutMs})})],K=["pan","fling","pinch","rotate","transform"],z=["up","down","left","right"],J={target:u(T()),button:P(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...F(),...w()},W={target:u(T()),...F(),...w()},X={target:u(T()),text:u(i("Text to enter into the target.")),delayMs:f("Delay between typed characters.",{min:0}),...F()},Y={target:u(T()),durationMs:f("Long press duration in milliseconds.",{min:0}),...F()},Q={from:u(U("Swipe start point.")),to:u(U("Swipe end point.")),durationMs:f("Swipe duration in milliseconds.",{min:0}),count:f("Number of swipe repetitions.",{min:1}),pauseMs:f("Pause between repeated swipes.",{min:0}),pattern:P(["one-way","ping-pong"])},V={x:u(y("X coordinate.")),y:u(y("Y coordinate."))},Z={text:u(i("Text to type.")),delayMs:f("Delay between typed characters.",{min:0})},tt={direction:u(P(["up","down","left","right","top","bottom"])),amount:y("Platform scroll amount."),pixels:f("Pixel scroll amount.",{min:0})},te={format:u(P(["text","attrs"])),target:u(N()),...F()},tr={predicate:u(P(["visible","hidden","exists","editable","selected","text"])),selector:u(i()),value:i(),...F()},ta={locator:P(["any","text","label","value","role","id"]),query:u(i()),action:P(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:i(),timeoutMs:f(),first:b(),last:b(),depth:f(),raw:b()},ti={kind:u(P(K,"Gesture variant.")),direction:P(z,"Fling direction."),origin:U("Gesture origin point."),delta:U("Movement delta for pan or transform gestures."),distance:f("Fling distance.",{min:0}),scale:y("Pinch or transform scale."),degrees:y("Rotation in degrees."),velocity:f("Rotate gesture velocity.",{min:0}),durationMs:f("Gesture duration in milliseconds.",{min:0})};function tn(t,e){return void 0===t[e]?void 0:C(t,e)}let to=[D({name:"click",description:"Click or tap a semantic UI target by ref, selector, or point.",inputSchema:j(J),readInput:t=>h(t,J),run:(t,e)=>{var r;return t.interactions.click({...g(r=e),...E(r.target),...o(r),...R(r),button:r.button})}}),D({name:"press",description:"Press a semantic UI target by ref, selector, or point.",inputSchema:j(W),readInput:t=>h(t,W),run:(t,e)=>{var r;return t.interactions.press({...g(r=e),...E(r.target),...o(r),...R(r)})}}),D({name:"fill",description:"Fill text into a semantic UI target by ref, selector, or point.",inputSchema:j(X),readInput:t=>h(t,X),run:(t,e)=>{var r;return t.interactions.fill({...g(r=e),...E(r.target),...o(r),text:r.text,delayMs:r.delayMs})}}),L("longpress","Long press by ref, selector, or point.",Y,(t,e)=>{var r;return t.interactions.longPress({...g(r=e),...E(r.target),...o(r),durationMs:r.durationMs})}),L("swipe","Swipe between two points.",Q,(t,e)=>t.interactions.swipe(e)),L("focus","Focus input at coordinates.",V,(t,e)=>t.interactions.focus(e)),L("type","Type text in the focused field.",Z,(t,e)=>t.interactions.type(e)),L("scroll","Scroll in a direction or to an edge.",tt,(t,e)=>t.interactions.scroll(e)),L("get","Get element text or attributes.",te,(t,e)=>{var r;return t.interactions.get({...g(r=e),...S(r.target),...o(r),format:r.format})}),L("is","Assert UI state.",tr,(t,e)=>t.interactions.is(e)),L("find","Find an element and optionally act on it.",ta,(t,e)=>t.interactions.find(e)),D({name:"gesture",description:"Run a structured gesture.",inputSchema:j(ti),readInput:function(t){let e=v(t),r=O(e),a=d(e,"kind",K);return"pan"===a?{...r,kind:a,origin:C(e,"origin"),delta:C(e,"delta"),durationMs:H(e,"durationMs",{min:0})}:"fling"===a?{...r,kind:a,direction:d(e,"direction",z),origin:C(e,"origin"),distance:H(e,"distance",{min:0}),durationMs:H(e,"durationMs",{min:0})}:"pinch"===a?{...r,kind:a,scale:A(e,"scale"),origin:tn(e,"origin")}:"rotate"===a?{...r,kind:a,degrees:A(e,"degrees"),origin:tn(e,"origin"),velocity:H(e,"velocity",{min:0})}:{...r,kind:a,origin:C(e,"origin"),delta:C(e,"delta"),scale:A(e,"scale"),degrees:A(e,"degrees"),durationMs:H(e,"durationMs",{min:0})}},run:async(t,e)=>{var r,a,i,n,o;switch(e.kind){case"pan":return await t.interactions.pan({...g(r=e),x:r.origin.x,y:r.origin.y,dx:r.delta.x,dy:r.delta.y,durationMs:r.durationMs});case"fling":return await t.interactions.fling({...g(a=e),direction:a.direction,x:a.origin.x,y:a.origin.y,distance:a.distance,durationMs:a.durationMs});case"pinch":return await t.interactions.pinch({...g(i=e),scale:i.scale,x:i.origin?.x,y:i.origin?.y});case"rotate":return await t.interactions.rotateGesture({...g(n=e),degrees:n.degrees,x:n.origin?.x,y:n.origin?.y,velocity:n.velocity});case"transform":return await t.interactions.transformGesture({...g(o=e),x:o.origin.x,y:o.origin.y,dx:o.delta.x,dy:o.delta.y,scale:o.scale,degrees:o.degrees,durationMs:o.durationMs})}}}),...q,D({name:"batch",description:"Run multiple structured command steps in one daemon request.",inputSchema:j(e={steps:u(k({type:"array",description:"Structured batch steps. Each step uses a command name and the same input object as that command tool.",items:{type:"object",properties:{command:{type:"string",enum:t=n,description:"Command name to run with structured input."},input:{type:"object",additionalProperties:!0,description:"Structured command input for the nested command. Use the matching MCP tool schema for this object."},runtime:{type:"object",additionalProperties:!0,description:"Optional per-step runtime payload."}},required:["command","input"],additionalProperties:!1}},(e,r)=>(function(t,e){if(!Array.isArray(t))throw Error("Expected steps to be an array.");return t.map((t,r)=>{var a,i,n;let o;return a=t,i=r+1,n=e,c(o=function(t,e){if(!t||"object"!=typeof t||Array.isArray(t))throw Error(`Invalid batch step ${e}.`);return t}(a,i),["command","input","runtime"],`Batch step ${i}`),{command:d(o,"command",n),input:function(t,e){let r=t.input;if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Batch step ${e} input must be an object.`);return r}(o,i),...function(t,e){let r=t.runtime;if(void 0!==r&&(!r||"object"!=typeof r||Array.isArray(r)))throw Error(`Batch step ${e} runtime must be an object.`);return void 0===r?{}:{runtime:r}}(o,i)}})})(e[r],t))),onError:P(["stop"],"Batch failure policy."),maxSteps:f("Maximum number of steps accepted for this batch.",{min:1,max:1e3}),out:i("Optional output path for command artifacts.")}),readInput:t=>(function(t,e){let a=h(t,e),i=a.maxSteps??r;if(!Number.isInteger(i)||i<1||i>1e3)throw Error(`Invalid batch maxSteps: ${String(a.maxSteps)}`);if(a.steps.length>i)throw Error(`batch has ${a.steps.length} steps; max allowed is ${i}.`);return{...a}})(t,e),run:(t,e)=>{var r;return t.batch.run({...g(r=e),steps:r.steps,onError:r.onError,maxSteps:r.maxSteps,out:r.out})}})],ts=new Map(to.map(t=>[t.name,t]));function tp(){return m().map(t=>{var e;if(!tl(t))throw Error(`Missing command for MCP-exposed command: ${t}`);return e=t,ts.get(e)})}function tc(){return to.map(t=>t.name)}function td(){return[...to]}function tl(t){return ts.has(t)}async function tu(t,e,r){var a;return await (a=e,ts.get(a)).invoke(t,r)}export{tl as isCommandName,td as listCommandDefinitions,tc as listCommandNames,tp as listMcpToolDefinitions,tu as runCommand};
1
+ var t;let e;import{DEFAULT_BATCH_MAX_STEPS as r}from"./1231.js";import{jsonSchemaField as a,stringField as i,batchCommandNames as n,toSelectorSnapshotOptions as o,booleanSchema as s,integerSchema as p,assertAllowedKeys as c,requiredEnum as d,looseObjectField as l,requiredField as u,listMcpExposedCommandNames as m,readFieldInput as h,commonToClientOptions as g,integerField as f,numberField as y,booleanField as b,readInputRecord as v,repeatedFields as w,stringSchema as x,stringArrayField as M,toClientElementTarget as S,customField as k,optionalEnum as I,enumField as P,toRepeatedOptions as R,pointField as U,command_input_readPoint as C,toClientInteractionTarget as E,interactionTargetField as T,fieldsInputSchema as j,requiredNumber as A,selectorSnapshotFields as F,elementTargetField as N,readCommonInput as O,looseObjectSchema as B,optionalInteger as H}from"./6277.js";function D(t){return{...t,invoke:async(e,r)=>await t.run(e,t.readInput(r))}}function L(t,e,r,a){return D({name:t,description:e,inputSchema:j(r),readInput:t=>h(t,r),run:a})}let _=["app","frontmost-app","desktop","menubar"],$=["duration","text","ref","selector"],G=["start","stop"],q=[L("devices","List available devices.",{},(t,e)=>t.devices.list(e)),L("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:b("Boot without showing simulator UI when supported.")},(t,e)=>t.devices.boot(e)),L("apps","List installed apps.",{appsFilter:P(["user-installed","all"])},(t,e)=>t.apps.list(e)),L("session","List active sessions.",{action:P(["list"])},async(t,{action:e,...r})=>({sessions:await t.sessions.list(r)})),L("open","Open an app, deep link, URL, or platform surface.",{app:i("App name, bundle id, package, or URL."),url:i("Optional URL passed with an app shell."),surface:P(_),activity:i("Android activity name."),launchConsole:i("Launch console mode."),relaunch:b("Force relaunch."),saveScript:a({oneOf:[s(),x()]}),noRecord:b("Do not record this action.")},(t,e)=>t.apps.open(e)),L("close","Close an app or end the active session.",{app:i("Optional app to close."),shutdown:b("Shutdown the session/device where supported."),saveScript:a({oneOf:[s(),x()]})},(t,e)=>e.app?t.apps.close(e):t.sessions.close(function(t){let{app:e,...r}=t;return r}(e))),L("install","Install an app binary.",{app:u(i()),appPath:u(i("Path to app binary."))},(t,e)=>t.apps.install(e)),L("reinstall","Reinstall an app binary.",{app:u(i()),appPath:u(i("Path to app binary."))},(t,e)=>t.apps.reinstall(e)),L("install-from-source","Install an app from a structured source.",{source:u(a(B("Install source object."))),retainPaths:b(),retentionMs:f()},(t,e)=>t.apps.installFromSource(e)),L("push","Deliver a push payload.",{app:u(i()),payload:u(a({oneOf:[x(),B()]}))},(t,e)=>t.apps.push(e)),L("trigger-app-event","Trigger an app-defined event.",{event:u(i()),payload:l()},(t,e)=>t.apps.triggerEvent(e)),L("snapshot","Capture an accessibility snapshot.",{interactiveOnly:b(),compact:b(),depth:f(),scope:i(),raw:b(),forceFull:b()},(t,e)=>t.capture.snapshot(e)),L("screenshot","Capture a screenshot.",{path:i("Output path."),overlayRefs:b(),fullscreen:b(),maxSize:f(),stabilize:b(),surface:P(_)},(t,e)=>t.capture.screenshot(e)),L("diff","Diff accessibility snapshots.",{kind:u(a({type:"string",const:"snapshot"})),out:i(),interactiveOnly:b(),compact:b(),depth:f(),scope:i(),raw:b()},(t,e)=>t.capture.diff(e)),L("wait","Wait for duration, text, ref, or selector.",{kind:P($),durationMs:f(),text:i(),ref:i(),selector:i(),timeoutMs:f(),depth:f(),scope:i(),raw:b()},(t,e)=>{var r;let a;return t.command.wait((I(r=e,"kind",$),a={...r},delete a.kind,a))}),L("alert","Inspect or handle platform alerts.",{action:P(["get","accept","dismiss","wait"]),timeoutMs:f()},(t,e)=>t.command.alert(e)),L("appstate","Show foreground app or activity.",{},(t,e)=>t.command.appState(e)),L("back","Navigate back.",{mode:P(["in-app","system"])},(t,e)=>t.command.back(e)),L("home","Go to the home screen.",{},(t,e)=>t.command.home(e)),L("rotate","Rotate device orientation.",{orientation:u(P(["portrait","portrait-upside-down","landscape-left","landscape-right"]))},(t,e)=>t.command.rotate(e)),L("app-switcher","Open the app switcher.",{},(t,e)=>t.command.appSwitcher(e)),L("keyboard","Inspect or dismiss the keyboard.",{action:P(["status","dismiss"])},(t,e)=>t.command.keyboard(e)),L("clipboard","Read or write clipboard text.",{action:u(P(["read","write"])),text:i()},(t,e)=>t.command.clipboard(e)),L("react-native","Run supported React Native app automation helpers.",{action:u(P(["dismiss-overlay"]))},(t,e)=>t.command.reactNative(e)),L("replay","Replay a recorded session.",{path:u(i()),update:b(),backend:i(),maestro:b(),env:M()},(t,e)=>t.replay.run(e)),L("test","Run one or more replay scripts.",{paths:u(M()),update:b(),backend:i(),maestro:b(),env:M(),failFast:b(),timeoutMs:f(),retries:f(),artifactsDir:i(),reportJunit:i()},(t,e)=>t.replay.test(e)),L("perf","Show session performance metrics.",{},(t,e)=>t.observability.perf(e)),L("logs","Manage session app logs.",{action:P(["path","start","stop","doctor","mark","clear"]),message:i(),restart:b()},(t,e)=>t.observability.logs(e)),L("network","Show recent HTTP traffic.",{action:P(["dump","log"]),limit:f(),include:P(["summary","headers","body","all"])},(t,e)=>t.observability.network(e)),L("record","Start or stop screen recording.",{action:u(P(G)),path:i(),fps:f(),quality:a(p()),hideTouches:b()},(t,e)=>t.recording.record(e)),L("trace","Start or stop trace capture.",{action:u(P(G)),path:i()},(t,e)=>t.recording.trace(e)),L("settings","Change OS settings and app permissions.",{setting:u(i()),state:u(i()),latitude:y(),longitude:y(),permission:i(),mode:P(["full","limited"])},(t,e)=>t.settings.update(e)),L("metro","Prepare Metro runtime or reload React Native apps.",{action:u(P(["prepare","reload"])),projectRoot:i(),kind:a(x()),publicBaseUrl:i(),proxyBaseUrl:i(),bearerToken:i(),bridgeScope:a({type:"object",additionalProperties:!0}),launchUrl:i(),port:f(),listenHost:i(),statusHost:i(),startupTimeoutMs:f(),probeTimeoutMs:f(),reuseExisting:b(),installDependenciesIfNeeded:b(),runtimeFilePath:i(),logPath:i(),metroHost:i(),metroPort:f(),bundleUrl:i(),timeoutMs:f()},async(t,e)=>{var r,a,i;return"prepare"===e.action?await t.metro.prepare({projectRoot:(r=e).projectRoot,kind:r.kind,publicBaseUrl:r.publicBaseUrl,proxyBaseUrl:r.proxyBaseUrl,bearerToken:r.bearerToken,bridgeScope:r.bridgeScope??((a=r).tenant&&a.runId&&a.leaseId?{tenantId:a.tenant,runId:a.runId,leaseId:a.leaseId}:void 0),port:r.port,listenHost:r.listenHost,statusHost:r.statusHost,startupTimeoutMs:r.startupTimeoutMs,probeTimeoutMs:r.probeTimeoutMs,reuseExisting:r.reuseExisting,installDependenciesIfNeeded:r.installDependenciesIfNeeded,runtimeFilePath:r.runtimeFilePath}):await t.metro.reload({metroHost:(i=e).metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,timeoutMs:i.timeoutMs})})],K=["pan","fling","pinch","rotate","transform"],z=["up","down","left","right"],J={target:u(T()),button:P(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...F(),...w()},W={target:u(T()),...F(),...w()},X={target:u(T()),text:u(i("Text to enter into the target.")),delayMs:f("Delay between typed characters.",{min:0}),...F()},Y={target:u(T()),durationMs:f("Long press duration in milliseconds.",{min:0}),...F()},Q={from:u(U("Swipe start point.")),to:u(U("Swipe end point.")),durationMs:f("Swipe duration in milliseconds.",{min:0}),count:f("Number of swipe repetitions.",{min:1}),pauseMs:f("Pause between repeated swipes.",{min:0}),pattern:P(["one-way","ping-pong"])},V={x:u(y("X coordinate.")),y:u(y("Y coordinate."))},Z={text:u(i("Text to type.")),delayMs:f("Delay between typed characters.",{min:0})},tt={direction:u(P(["up","down","left","right","top","bottom"])),amount:y("Platform scroll amount."),pixels:f("Pixel scroll amount.",{min:0})},te={format:u(P(["text","attrs"])),target:u(N()),...F()},tr={predicate:u(P(["visible","hidden","exists","editable","selected","text"])),selector:u(i()),value:i(),...F()},ta={locator:P(["any","text","label","value","role","id"]),query:u(i()),action:P(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:i(),timeoutMs:f(),first:b(),last:b(),depth:f(),raw:b()},ti={kind:u(P(K,"Gesture variant.")),direction:P(z,"Fling direction."),origin:U("Gesture origin point."),delta:U("Movement delta for pan or transform gestures."),distance:f("Fling distance.",{min:0}),scale:y("Pinch or transform scale."),degrees:y("Rotation in degrees."),velocity:f("Rotate gesture velocity.",{min:0}),durationMs:f("Gesture duration in milliseconds.",{min:0})};function tn(t,e){return void 0===t[e]?void 0:C(t,e)}let to=[D({name:"click",description:"Click or tap a semantic UI target by ref, selector, or point.",inputSchema:j(J),readInput:t=>h(t,J),run:(t,e)=>{var r;return t.interactions.click({...g(r=e),...E(r.target),...o(r),...R(r),button:r.button})}}),D({name:"press",description:"Press a semantic UI target by ref, selector, or point.",inputSchema:j(W),readInput:t=>h(t,W),run:(t,e)=>{var r;return t.interactions.press({...g(r=e),...E(r.target),...o(r),...R(r)})}}),D({name:"fill",description:"Fill text into a semantic UI target by ref, selector, or point.",inputSchema:j(X),readInput:t=>h(t,X),run:(t,e)=>{var r;return t.interactions.fill({...g(r=e),...E(r.target),...o(r),text:r.text,delayMs:r.delayMs})}}),L("longpress","Long press by ref, selector, or point.",Y,(t,e)=>{var r;return t.interactions.longPress({...g(r=e),...E(r.target),...o(r),durationMs:r.durationMs})}),L("swipe","Swipe between two points.",Q,(t,e)=>t.interactions.swipe(e)),L("focus","Focus input at coordinates.",V,(t,e)=>t.interactions.focus(e)),L("type","Type text in the focused field.",Z,(t,e)=>t.interactions.type(e)),L("scroll","Scroll in a direction or to an edge.",tt,(t,e)=>t.interactions.scroll(e)),L("get","Get element text or attributes.",te,(t,e)=>{var r;return t.interactions.get({...g(r=e),...S(r.target),...o(r),format:r.format})}),L("is","Assert UI state.",tr,(t,e)=>t.interactions.is(e)),L("find","Find an element and optionally act on it.",ta,(t,e)=>t.interactions.find(e)),D({name:"gesture",description:"Run a structured gesture.",inputSchema:j(ti),readInput:function(t){let e=v(t),r=O(e),a=d(e,"kind",K);return"pan"===a?{...r,kind:a,origin:C(e,"origin"),delta:C(e,"delta"),durationMs:H(e,"durationMs",{min:0})}:"fling"===a?{...r,kind:a,direction:d(e,"direction",z),origin:C(e,"origin"),distance:H(e,"distance",{min:0}),durationMs:H(e,"durationMs",{min:0})}:"pinch"===a?{...r,kind:a,scale:A(e,"scale"),origin:tn(e,"origin")}:"rotate"===a?{...r,kind:a,degrees:A(e,"degrees"),origin:tn(e,"origin"),velocity:H(e,"velocity",{min:0})}:{...r,kind:a,origin:C(e,"origin"),delta:C(e,"delta"),scale:A(e,"scale"),degrees:A(e,"degrees"),durationMs:H(e,"durationMs",{min:0})}},run:async(t,e)=>{var r,a,i,n,o;switch(e.kind){case"pan":return await t.interactions.pan({...g(r=e),x:r.origin.x,y:r.origin.y,dx:r.delta.x,dy:r.delta.y,durationMs:r.durationMs});case"fling":return await t.interactions.fling({...g(a=e),direction:a.direction,x:a.origin.x,y:a.origin.y,distance:a.distance,durationMs:a.durationMs});case"pinch":return await t.interactions.pinch({...g(i=e),scale:i.scale,x:i.origin?.x,y:i.origin?.y});case"rotate":return await t.interactions.rotateGesture({...g(n=e),degrees:n.degrees,x:n.origin?.x,y:n.origin?.y,velocity:n.velocity});case"transform":return await t.interactions.transformGesture({...g(o=e),x:o.origin.x,y:o.origin.y,dx:o.delta.x,dy:o.delta.y,scale:o.scale,degrees:o.degrees,durationMs:o.durationMs})}}}),...q,D({name:"batch",description:"Run multiple structured command steps in one daemon request.",inputSchema:j(e={steps:u(k({type:"array",description:"Structured batch steps. Each step uses a command name and the same input object as that command tool.",items:{type:"object",properties:{command:{type:"string",enum:t=n,description:"Command name to run with structured input."},input:{type:"object",additionalProperties:!0,description:"Structured command input for the nested command. Use the matching MCP tool schema for this object."},runtime:{type:"object",additionalProperties:!0,description:"Optional per-step runtime payload."}},required:["command","input"],additionalProperties:!1}},(e,r)=>(function(t,e){if(!Array.isArray(t))throw Error("Expected steps to be an array.");return t.map((t,r)=>{var a,i,n;let o;return a=t,i=r+1,n=e,c(o=function(t,e){if(!t||"object"!=typeof t||Array.isArray(t))throw Error(`Invalid batch step ${e}.`);return t}(a,i),["command","input","runtime"],`Batch step ${i}`),{command:d(o,"command",n),input:function(t,e){let r=t.input;if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Batch step ${e} input must be an object.`);return r}(o,i),...function(t,e){let r=t.runtime;if(void 0!==r&&(!r||"object"!=typeof r||Array.isArray(r)))throw Error(`Batch step ${e} runtime must be an object.`);return void 0===r?{}:{runtime:r}}(o,i)}})})(e[r],t))),onError:P(["stop"],"Batch failure policy."),maxSteps:f("Maximum number of steps accepted for this batch.",{min:1,max:1e3}),out:i("Optional output path for command artifacts.")}),readInput:t=>(function(t,e){let a=h(t,e),i=a.maxSteps??r;if(!Number.isInteger(i)||i<1||i>1e3)throw Error(`Invalid batch maxSteps: ${String(a.maxSteps)}`);if(a.steps.length>i)throw Error(`batch has ${a.steps.length} steps; max allowed is ${i}.`);return{...a}})(t,e),run:(t,e)=>{var r;return t.batch.run({...g(r=e),steps:r.steps,onError:r.onError,maxSteps:r.maxSteps,out:r.out})}})],ts=new Map(to.map(t=>[t.name,t]));function tp(){return m().map(t=>{var e;if(!tl(t))throw Error(`Missing command for MCP-exposed command: ${t}`);return e=t,ts.get(e)})}function tc(){return to.map(t=>t.name)}function td(){return[...to]}function tl(t){return ts.has(t)}async function tu(t,e,r){var a;return await (a=e,ts.get(a)).invoke(t,r)}export{tl as isCommandName,td as listCommandDefinitions,tc as listCommandNames,tp as listMcpToolDefinitions,tu as runCommand};
package/dist/src/9542.js CHANGED
@@ -1,2 +1,3 @@
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:os";import n from"node:path";import{pipeline as i}from"node:stream/promises";import{createHash as s,randomUUID as l}from"node:crypto";import{Writable as c}from"node:stream";import{toAppErrorCode as d,AppError as u}from"./9152.js";import{runCmdSync as p,runCmd as m,runCmdDetached as f}from"./9818.js";import{normalizeSession as h,readRequiredString as y,PUBLIC_COMMANDS as w,normalizeMaterializationReleaseResult as g,readVersion as I,readSnapshotNodes as v,findProjectRoot as A,computeDaemonCodeSignature as k,resolveDaemonTransportPreference as b,prepareDaemonCommandRequest as P,normalizeDeployResult as _,normalizeOpenDevice as S,buildMeta as D,resolveSessionName as E,buildFlags as T,readOptionalString as M,resolveDaemonPaths as N,INTERNAL_COMMANDS as C,resolveDaemonServerMode as L,normalizeRuntimeHints as U,normalizeDevice as R,readScreenshotOverlayRefs as O,normalizeStartupSample as x,normalizeInstallFromSourceResult as F}from"./2099.js";import{createRequestId as B,withDiagnosticTimer as q,emitDiagnostic as $}from"./3622.js";import{isAgentDeviceDaemonProcess as j,stopProcessForTakeover as H}from"./8656.js";import{sleep as K}from"./4829.js";import{reloadMetro as z,prepareMetroRuntime as G}from"./1974.js";function V(e){return new Promise((t,a)=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>t(r)),e.on("error",a)})}let W="sha256";async function J(e){let t=await Y(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await ee({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await et(t.payloadPath,r),await er({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await Z({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function Y(e,t){var a,o,i;let s,l=r.statSync(e),c=n.basename(e),d=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(o=e,i=l,s=o.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=d?await Q(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:c,artifactType:d?"app-bundle":"file",platform:u,contentType:d?"application/gzip":"application/octet-stream",sha256:await eo(t),sizeBytes:a.size,cleanup:()=>X(p)}}catch(e){throw X(p),e}}async function Q(e,t){let a=r.mkdtempSync(n.join(o.tmpdir(),`agent-device-upload-${l()}-`));t.push(a);let i=n.join(a,`${n.basename(e)}.tar.gz`);return await m("tar",["czf",i,"-C",n.dirname(e),n.basename(e)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),i}function X(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function Z(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":W,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await ea({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 ee(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 et(e,t){let a=await ea({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 ea(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let n=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=>{V(e).then(a=>{clearTimeout(s),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})}).catch(a)}),s=setTimeout(()=>{n.destroy(),a(new u("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);n.on("error",t=>{clearTimeout(s),a(new u("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),n.on("close",()=>clearTimeout(s)),i(r.createReadStream(e.payloadPath),n).catch(e=>{n.destroy(),a(new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e))))})})}async function er(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 eo(e){let t=s(W),a=new c({write(e,a,r){t.update(e),r()}});return await i(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 en=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],ei=new e.BlockList;async function es(t){let a=t.meta?.requestId??B(),i=!!(t.meta?.debug||t.flags?.verbose),s=function(t){let a,i=t.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR,s=t.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,l=eg(t.command)&&!i&&!s,c=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(/\/+$/,"")}}(s),d=t.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;var p=c,m=d;if(!(!p||"localhost"===(a=new URL(p).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(a)?ei.check(a,"ipv4"):!!e.isIPv6(a)&&ei.check(a,"ipv6")))&&("string"!=typeof m||!(m.trim().length>0)))throw new u("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:p,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."});let f=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,h=b(f);if(c&&"socket"===h)throw new u("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:c});let y=L(t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===f?"dual":void 0));return{paths:N(l?r.mkdtempSync(n.join(o.tmpdir(),"agent-device-replay-daemon-")):i),transportPreference:h,serverMode:y,ownedStateDir:l,remoteBaseUrl:c,remoteAuthToken:d}}(t),l=function(e){if(e.command!==w.test)return e.command===w.replay&&"number"==typeof e.flags?.timeoutMs?e.flags.timeoutMs:9e4}(t),c=await q("daemon_startup",async()=>await em(s),{requestId:a,session:t.session}),d=c.info,p=await el(t,d),m={...t,positionals:p.positionals,flags:p.flags,token:d.token,meta:{...t.meta??{},requestId:a,debug:i,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,...p.uploadedArtifactId?{uploadedArtifactId:p.uploadedArtifactId}:{},...p.clientArtifactPaths?{clientArtifactPaths:p.clientArtifactPaths}:{},...p.installSource?{installSource:p.installSource}:{}}};$({level:"info",phase:"daemon_request_prepare",data:{requestId:a,command:t.command,session:t.session}});try{return await q("daemon_request",async()=>await eL(d,m,s.transportPreference,l),{requestId:a,command:t.command})}finally{await ew(t,c,s)}}async function el(e,t){var a,o;let i,s,l=[...e.positionals??[]],c=e.flags?{...e.flags}:void 0,d=e.meta?.installSource,u={};if(e$(t)){c=function(e,t,a,r){var o,i;let s=function(e,t){if("screenshot"===e.command){let a=eu(e,"path",".png");return t[0]?{field:"path",localPath:a,positionalIndex:0,positionalPath:ep("screenshot",".png")}:{field:"path",localPath:a,positionalIndex:0,flagPath:ep("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=eu(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:ep("recording",n.extname(t)||".mp4")}}return null}(e,t);if(!s)return a;void 0!==s.positionalPath&&(t[s.positionalIndex]=s.positionalPath);let l=(o=a,void 0===(i=s.flagPath)?o:{...o??{},out:i});return r[s.field]=s.localPath,l}(e,l,c,u);let a=await ed(e,t);a&&(d=a.installSource,s=a.uploadedArtifactId??s)}let p=()=>ec({positionals:l,flags:c,installSource:d,uploadedArtifactId:s,clientArtifactPaths:u});if(!e$(t)||"install"!==e.command&&"reinstall"!==e.command)return p();let m=l[1];if(void 0===m)return p();if(m.startsWith("remote:"))return l[1]=m.slice(7),ec({positionals:l,flags:c,clientArtifactPaths:u});let f=(a=m,o=e.meta?.cwd,i=n.isAbsolute(a)?a:n.resolve(o??process.cwd(),a),r.existsSync(i)?i:void 0);return f?(s=await J({localPath:f,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform}),p()):ec({positionals:l,flags:c,clientArtifactPaths:u})}function ec(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function ed(e,t){let a=e.meta?.installSource;if("install_source"!==e.command||!a||"path"!==a.kind)return null;let o=a.path.trim();if(!o)return{installSource:a};if(o.startsWith("remote:"))return{installSource:{...a,path:o.slice(7)}};let i=n.isAbsolute(o)?o:n.resolve(e.meta?.cwd??process.cwd(),o);if(!r.existsSync(i))return{installSource:{...a,path:i}};let s=await J({localPath:i,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform});return{installSource:{...a,path:i},uploadedArtifactId:s}}function eu(e,t,a,r=0){let o=e.positionals?.[r]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${a}`,s=o&&o.trim().length>0?o:i;return n.isAbsolute(s)?s:n.resolve(e.meta?.cwd??process.cwd(),s)}function ep(e,t){let a=t.startsWith(".")?t:`.${t}`;return n.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${a}`)}async function em(e){if(e.remoteBaseUrl)return await ef(e);let t=await eh(e);return t?{info:t,startedByClient:!1}:(function(e){let t=eD(e);if(!t.hasLock||t.hasInfo)return;let a=e_(e.lockPath);if(!a)return eT(e.lockPath);j(a.pid,a.processStartTime)||eT(e.lockPath)}(e.paths),await ey(e))}async function ef(e){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await eM(t,"http"))return{info:t,startedByClient:!1};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."})}async function eh(e){var t,a;let r,o=ek(e.paths.infoPath);if(!o)return null;let n=await eM(o,e.transportPreference);return(t=o,a=n,t.version===I()&&t.codeSignature===k((r=eC()).useSrc?r.srcPath:r.distPath,r.root)&&a)?o:(await eA(o),eT(e.paths.infoPath),null)}async function ey(e){let t,a=0,r=[];for(let o=1;o<=2;o+=1){try{await eN(e)}catch(a){if(t=a instanceof Error?a.message:String(a),r.push(await eS(e.paths,"start_error")),o<2){await K(150);continue}break}let n=await eI(15e3,e);if(n)return{info:n,startedByClient:!0};if(await ev(e.paths)){a+=1;continue}let i=eD(e.paths),s=o<2,l=await eS(e.paths,"startup_timeout",{stopLiveProcesses:!1});if(r.push(l),l.retainedInfoProcess||l.retainedLockProcess){let t=await eI(15e3,e);if(t)return{info:t,startedByClient:!0};break}if(!s)break;i.hasInfo||i.hasLock||await K(150)}let o=eD(e.paths);throw new u("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:15e3,startupAttempts:2,lockRecoveryCount:a,cleanupResults:r,startError:t,metadataState:o,hint:function(e,t=N(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists, remove ${t.lockPath} after confirming no agent-device daemon process is running.`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists, remove both files after confirming no agent-device daemon process is running.`:"agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs."}(o,e.paths)})}async function ew(e,t,a){if(!eg(e.command)||!t.startedByClient&&!a.ownedStateDir||e$(t.info))return;let o={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0};try{await eA(t.info)}catch(e){o.error=e instanceof Error?e.message:String(e)}finally{let e=r.existsSync(a.paths.infoPath);eT(a.paths.infoPath),o.removedInfo=e&&!r.existsSync(a.paths.infoPath);let t=r.existsSync(a.paths.lockPath);eT(a.paths.lockPath),o.removedLock=t&&!r.existsSync(a.paths.lockPath),a.ownedStateDir&&(r.rmSync(a.paths.baseDir,{recursive:!0,force:!0}),o.removedStateDir=!r.existsSync(a.paths.baseDir))}$({level:o.error?"warn":"info",phase:"daemon_replay_cleanup",data:o})}function eg(e){return e===w.replay||e===w.test}async function eI(e,t){let a=Date.now();for(;Date.now()-a<e;){let e=ek(t.paths.infoPath);if(e&&await eM(e,t.transportPreference))return e;await K(100)}return null}async function ev(e){let t=eD(e);if(!t.hasLock||t.hasInfo)return!1;let a=e_(e.lockPath);return!(a&&j(a.pid,a.processStartTime))&&(eT(e.lockPath),!0)}async function eA(e){await H(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function ek(e){var t,a,r;let o,n,i=eE(e);if(!i||"object"!=typeof i)return null;let s="string"==typeof(t=i).token&&t.token.length>0?t.token:null;if(!s)return null;let l=(o=eP((a=i).port),n=eP(a.httpPort),void 0===o&&void 0===n?null:{port:o,httpPort:n});return l?{token:s,...l,transport:"socket"===(r=i.transport)||"http"===r||"dual"===r?r:void 0,pid:eP(i.pid)??0,version:eb(i.version),codeSignature:eb(i.codeSignature),processStartTime:eb(i.processStartTime)}:null}function eb(e){return"string"==typeof e?e:void 0}function eP(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function e_(e){let t=eE(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}ei.addSubnet("127.0.0.0",8,"ipv4"),ei.addAddress("::1","ipv6"),ei.addSubnet("::ffff:127.0.0.0",104,"ipv6");async function eS(e,t,a={}){let o=a.stopLiveProcesses??!0,n={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{var i,s,l,c;let t=r.existsSync(e.infoPath),a=ek(e.infoPath);if(a){let t=j(a.pid,a.processStartTime);t&&!o?n.retainedInfoProcess=!0:(t&&(await eA(a),n.stoppedInfoProcess=!0),i=e.infoPath,eT(i),n.removedInfo=!0)}else t&&(s=e.infoPath,eT(s),n.removedInfo=!0);let d=r.existsSync(e.lockPath),u=e_(e.lockPath);if(u){let t=j(u.pid,u.processStartTime);t&&!o?n.retainedLockProcess=!0:(t&&(await H(u.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:u.processStartTime}),n.stoppedLockProcess=!0),l=e.lockPath,eT(l),n.removedLock=!0)}else d&&(c=e.lockPath,eT(c),n.removedLock=!0)}catch(e){n.error=e instanceof Error?e.message:String(e)}return $({level:n.error?"warn":"info",phase:"daemon_startup_metadata_cleanup",data:n}),n}function eD(e){return{hasInfo:r.existsSync(e.infoPath),hasLock:r.existsSync(e.lockPath)}}function eE(e){if(!r.existsSync(e))return null;try{return JSON.parse(r.readFileSync(e,"utf8"))}catch{return null}}function eT(e){try{r.existsSync(e)&&r.unlinkSync(e)}catch{}}async function eM(r,o){var n;return"http"===eU(r,o)?await function(e){let r=e.baseUrl?ej(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=!1,r=e.createConnection({host:"127.0.0.1",port:n},()=>{o(!0)}),o=e=>{a||(a=!0,r.destroy(),t(e))};r.setTimeout(500),r.on("timeout",()=>{o(!1)}),r.on("error",()=>{o(!1)})}):Promise.resolve(!1))}async function eN(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=A(),t=[n.join(e,"dist","src","internal","daemon.js"),n.join(e,"dist","src","daemon.js")],a=t[0];if(void 0===a)throw new u("COMMAND_FAILED","Daemon dist path list is empty");let o=t.find(e=>r.existsSync(e))??a,i=n.join(e,"src","daemon.ts"),s=t.some(e=>r.existsSync(e)),l=r.existsSync(i);if(!s&&!l)throw new u("COMMAND_FAILED","Daemon entry not found",{distPaths:t,srcPath:i});return{root:e,distPath:o,distPaths:t,srcPath:i,useSrc:process.execArgv.includes("--experimental-strip-types")?l:!s&&l}}async function eL(e,t,a,r){return"http"===eU(e,a)?await eB(e,t,r):await eF(e,t,r)}function eU(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(eR(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=>eR(e,t));if(o)return o;throw new u("COMMAND_FAILED","Daemon metadata has no reachable transport")}function eR(e,t){return"http"===t?!!e.httpPort:!!e.port}function eO(e,t,a,r,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of en){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&&"snapshot"!==r,l=s?function(e,t){let a=!1;try{j(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),a=!0)}catch{H(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{eT(t.infoPath),eT(t.lockPath)}return{forcedKill:a}}(e,t):{forcedKill:!1};return $({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:a,command:r,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:s?e.pid:void 0,daemonPidForceKilled:s?l.forcedKill:void 0,daemonPreservedAfterTimeout:!o&&!s,daemonBaseUrl:e.baseUrl}}),new u("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:a,hint:function(e){let{remote:t,resetDaemon:a,command:r}=e;return t?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":a?"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected.":`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??"request"} request was canceled and iOS runner work was aborted when detected; the daemon was kept alive so the session can still be closed or inspected.`}({remote:o,resetDaemon:s,command:r})})}function ex(e,t,a){return $({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 eF(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=N(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c="number"==typeof r?setTimeout(()=>{s.destroy(),i(eO(t,l,a.meta?.requestId,a.command,!1,r))},r):void 0,d="";s.setEncoding("utf8"),s.on("data",e=>{let t=(d+=e).indexOf("\n");if(-1===t)return;let r=d.slice(0,t).trim();if(r)try{let e=JSON.parse(r);s.end(),c&&clearTimeout(c),n(e)}catch(e){c&&clearTimeout(c),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:r},e instanceof Error?e:void 0))}}),s.on("error",e=>{c&&clearTimeout(c),i(ex(e,a.meta?.requestId,!1))})})}async function eB(e,r,o){var n,i,s;let l,c=e.baseUrl?new URL(ej(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!c)throw new u("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let p=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},l=n.meta?.requestId??B(),"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=N(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),l=("https:"===c.protocol?a:t).request({protocol:c.protocol,host:c.hostname,port:c.port,method:"POST",path:c.pathname+c.search,headers:m},t=>{V(t).then(t=>{h&&clearTimeout(h),function(e,t){let{info:a,req:r,resolve:o,reject:n}=t;try{var i,s,l;let t=(i=e,JSON.parse(i));if(t.error){let e;return void n((s=t.error,l=r.meta?.requestId,e=s.data??{},new u(d(null!=e.code?String(e.code):void 0,"COMMAND_FAILED"),String(e.message??s.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:l})))}if(!t.result||"object"!=typeof t.result)return void n(new u("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));eq(a,r,t.result,o,n)}catch(t){n(new u("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}(t,{info:e,req:r,resolve:n,reject:i})}).catch(e=>{h&&clearTimeout(h),i(new u("COMMAND_FAILED","Failed to read daemon response",{requestId:r.meta?.requestId},e instanceof Error?e:void 0))})}),f=e$(e),h="number"==typeof o?setTimeout(()=>{l.destroy(),i(eO(e,s,r.meta?.requestId,r.command,f,o))},o):void 0;l.on("error",e=>{h&&clearTimeout(h),i(ex(e,r.meta?.requestId,f))}),l.write(p),l.end()})}async function eq(e,t,a,r,o){try{r(e.baseUrl&&a.ok?await eH(e,t,a):a)}catch(e){o(e)}}function e$(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function ej(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function eH(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let o=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=t.meta?.clientArtifactPaths?.[e.field];if(a&&a.trim().length>0)return a;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return n.resolve(t.meta?.cwd??process.cwd(),r)}(a,t);await eK({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),o[a.field]=r,i.push({...a,localPath:r})}return o.artifacts=i,{ok:!0,data:o}}async function eK(e){var o,s;let l,c=new URL((o=e.baseUrl,s=e.artifactId,l=o.endsWith("/")?o:`${o}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),d="https:"===c.protocol?a:t;await r.promises.mkdir(n.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,n=e.timeoutMs??9e4,s=n=>{if(!o){if(o=!0,clearTimeout(p),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},l=d.request({protocol:c.protocol,host:c.hostname,port:c.port,method:"GET",path:c.pathname+c.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}))}),i(t,r.createWriteStream(e.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),p=setTimeout(()=>{let t=new u("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n});s(t),l.destroy(t)},n);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:n},t instanceof Error?t:void 0))}),l.end()})}function ez(e={},t={}){let a=t.transport??es,r=async(t,r=[],o={})=>{var n,i;let s=(n=e,i=o,{...n,...i}),l=await a({session:E(s.session),command:t,positionals:r,flags:T(s),runtime:s.runtime,meta:D(s)});return l.ok||function(e){throw new u(d(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(l.error),l.data??{}},o=async(e={})=>{let t=await r(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(h)},n=async(e,t={})=>{let a=P(e,t);return await r(a.command,a.positionals,a.options)},i=(t={})=>{var a,r;return E((a=e,r=t,{...a,...r}).session)};return{command:{wait:async e=>await n("wait",e),alert:async(e={})=>await n("alert",e),appState:async(e={})=>await n("appstate",e),back:async(e={})=>await n("back",e),home:async(e={})=>await n("home",e),rotate:async e=>await n("rotate",e),appSwitcher:async(e={})=>await n("app-switcher",e),keyboard:async(e={})=>await n("keyboard",e),clipboard:async e=>await n("clipboard",e),reactNative:async e=>await n("react-native",e)},devices:{list:async(e={})=>{let t=await n("devices",e);return(Array.isArray(t.devices)?t.devices:[]).map(R)},boot:async(e={})=>await n("boot",e)},sessions:{list:async(e={})=>await o(e),close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},apps:{install:async e=>_(await n("install",e),i(e)),reinstall:async e=>_(await n("reinstall",e),i(e)),installFromSource:async e=>F(await n("install-from-source",e),i(e)),list:async(e={})=>{let t=await n("apps",e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=i(e),a=await n("open",e),r=S(a),o=M(a,"appBundleId");return{session:t,appName:M(a,"appName"),appBundleId:o,appId:o,startup:x(a.startup),runtime:U(a.runtime),device:r,identifiers:{session:t,deviceId:r?.id,deviceName:r?.name,udid:r?.ios?.udid,serial:r?.android?.serial,appId:o,appBundleId:o}}},close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>await n("push",e),triggerEvent:async e=>await n("trigger-app-event",e)},materializations:{release:async e=>g(await r(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>eV(await r(C.leaseAllocate,[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>eV(await r(C.leaseHeartbeat,[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await r(C.leaseRelease,[],e)).released})},metro:{prepare:async t=>await G({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 z({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t,a,r;let o,s,l,c,d,u=i(e);return t=await n("snapshot",e),a=u,o=M(t,"appBundleId"),{nodes:v(t.nodes),truncated:!0===t.truncated,appName:M(t,"appName"),appBundleId:o,...(s=eG((r=t).visibility),l=eG(r.androidSnapshot),c=eG(r.unchanged),d=Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,{...s?{visibility:s}:{},...l?{androidSnapshot:l}:{},...c?{unchanged:c}:{},...d?{warnings:d}:{}}),identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=i(e),a=await n("screenshot",e);return{path:y(a,"path"),overlayRefs:O(a),identifiers:{session:t}}},diff:async e=>await n("diff",e)},interactions:{click:async e=>await n("click",e),press:async e=>await n("press",e),longPress:async e=>await n("longpress",e),swipe:async e=>await n("swipe",e),pan:async e=>await n("gesture-pan",e),fling:async e=>await n("gesture-fling",e),focus:async e=>await n("focus",e),type:async e=>await n("type",e),fill:async e=>await n("fill",e),scroll:async e=>await n("scroll",e),pinch:async e=>await n("gesture-pinch",e),rotateGesture:async e=>await n("gesture-rotate",e),transformGesture:async e=>await n("gesture-transform",e),get:async e=>await n("get",e),is:async e=>await n("is",e),find:async e=>await n("find",e)},replay:{run:async e=>await n("replay",e),test:async e=>await n("test",e)},batch:{run:async e=>await n("batch",e)},observability:{perf:async(e={})=>await n("perf",e),logs:async(e={})=>await n("logs",e),network:async(e={})=>await n("network",e)},recording:{record:async e=>await n("record",e),trace:async e=>await n("trace",e)},settings:{update:async e=>await n("settings",e)}}}function eG(e){return"object"==typeof e&&null!==e?e:void 0}function eV(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:y(t,"leaseId"),tenantId:y(t,"tenantId"),runId:y(t,"runId"),backend:y(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{ez as createAgentDeviceClient,es as sendToDaemon};
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:os";import n from"node:path";import{pipeline as i}from"node:stream/promises";import{createHash as s,randomUUID as l}from"node:crypto";import{Writable as c}from"node:stream";import{toAppErrorCode as d,AppError as u}from"./9152.js";import{runCmdSync as p,runCmd as m,runCmdDetached as f}from"./9818.js";import{normalizeSession as h,consumeTextLines as y,PUBLIC_COMMANDS as w,isDaemonResponseEnvelope as I,isDaemonProgressEnvelope as g,prepareDaemonCommandRequest as v,readSnapshotNodes as A,normalizeMaterializationReleaseResult as k,computeDaemonCodeSignature as b,resolveDaemonTransportPreference as P,normalizeDeployResult as _,buildMeta as S,buildFlags as D,readOptionalString as E,resolveSessionName as M,formatRequestProgressEvent as T,shouldStreamRequestProgress as N,INTERNAL_COMMANDS as C,normalizeDevice as L,readRequiredString as U,readVersion as R,findProjectRoot as O,normalizeOpenDevice as x,resolveDaemonPaths as F,resolveDaemonServerMode as q,normalizeRuntimeHints as B,normalizeStartupSample as $,readScreenshotOverlayRefs as j,normalizeInstallFromSourceResult as H}from"./6277.js";import{createRequestId as K,withDiagnosticTimer as z,emitDiagnostic as G}from"./7599.js";import{isAgentDeviceDaemonProcess as V,stopProcessForTakeover as W}from"./8656.js";import{sleep as J}from"./4829.js";import{reloadMetro as Y,prepareMetroRuntime as Q}from"./1974.js";function X(e){return new Promise((t,a)=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>t(r)),e.on("error",a)})}let Z="sha256";async function ee(e){let t=await et(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await en({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await ei(t.payloadPath,r),await el({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await eo({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function et(e,t){var a,o,i;let s,l=r.statSync(e),c=n.basename(e),d=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(o=e,i=l,s=o.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=d?await ea(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:c,artifactType:d?"app-bundle":"file",platform:u,contentType:d?"application/gzip":"application/octet-stream",sha256:await ec(t),sizeBytes:a.size,cleanup:()=>er(p)}}catch(e){throw er(p),e}}async function ea(e,t){let a=r.mkdtempSync(n.join(o.tmpdir(),`agent-device-upload-${l()}-`));t.push(a);let i=n.join(a,`${n.basename(e)}.tar.gz`);return await m("tar",["czf",i,"-C",n.dirname(e),n.basename(e)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),i}function er(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function eo(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":Z,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await es({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 en(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 ei(e,t){let a=await es({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 es(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let n=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=>{X(e).then(a=>{clearTimeout(s),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})}).catch(a)}),s=setTimeout(()=>{n.destroy(),a(new u("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);n.on("error",t=>{clearTimeout(s),a(new u("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),n.on("close",()=>clearTimeout(s)),i(r.createReadStream(e.payloadPath),n).catch(e=>{n.destroy(),a(new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e))))})})}async function el(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 ec(e){let t=s(Z),a=new c({write(e,a,r){t.update(e),r()}});return await i(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")}function ed(e){let t=T(e);t&&process.stderr.write(`${t}
2
+ `)}let eu=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],ep=new e.BlockList;async function em(t){var a,i,s,l,c,d;let p,m,f,h,y,I,g,v=t.meta?.requestId??K(),A=!!(t.meta?.debug||t.flags?.verbose),k=(h=(i=a=t,i.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),y=(s=a,m=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(/\/+$/,"")}}(p=s.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),function(t,a){let r;if(!(!t||"localhost"===(r=new URL(t).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(r)?ep.check(r,"ipv4"):!!e.isIPv6(r)&&ep.check(r,"ipv6")))&&("string"!=typeof a||!(a.trim().length>0)))throw new u("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:t,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."})}(m,f=s.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN),{rawBaseUrl:p,remoteBaseUrl:m,authToken:f}),I=function(e,t){let a=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,r=P(a);if(t&&"socket"===r)throw new u("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:t});return{preference:r,serverMode:q(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===a?"dual":void 0))}}(a,y.remoteBaseUrl),{paths:F((g=(l=a,c=h,d=y.rawBaseUrl,e_(l.command)&&!c&&!d))?r.mkdtempSync(n.join(o.tmpdir(),"agent-device-replay-daemon-")):h),transportPreference:I.preference,serverMode:I.serverMode,ownedStateDir:g,remoteBaseUrl:y.remoteBaseUrl,remoteAuthToken:y.authToken}),b=function(e){if(e.command!==w.test)return e.command===w.replay&&"number"==typeof e.flags?.timeoutMs?e.flags.timeoutMs:9e4}(t),_=await z("daemon_startup",async()=>await ev(k),{requestId:v,session:t.session}),S=_.info,D=await ef(t,S),E={...t,positionals:D.positionals,flags:D.flags,token:S.token,meta:{...t.meta??{},requestId:v,debug:A,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,...D.uploadedArtifactId?{uploadedArtifactId:D.uploadedArtifactId}:{},...D.clientArtifactPaths?{clientArtifactPaths:D.clientArtifactPaths}:{},...D.installSource?{installSource:D.installSource}:{}}};G({level:"info",phase:"daemon_request_prepare",data:{requestId:v,command:t.command,session:t.session}});try{return await z("daemon_request",async()=>await eB(S,E,k.transportPreference,b),{requestId:v,command:t.command})}finally{await eP(t,_,k)}}async function ef(e,t){let a,r=[...e.positionals??[]],o=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,s={};if(!eJ(t))return ey({positionals:r,flags:o,installSource:i,uploadedArtifactId:a,clientArtifactPaths:s});o=function(e,t,a,r){var o,i;let s=function(e,t){if("screenshot"===e.command){let a=eI(e,"path",".png");return t[0]?{field:"path",localPath:a,positionalIndex:0,positionalPath:eg("screenshot",".png")}:{field:"path",localPath:a,positionalIndex:0,flagPath:eg("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=eI(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:eg("recording",n.extname(t)||".mp4")}}return null}(e,t);if(!s)return a;void 0!==s.positionalPath&&(t[s.positionalIndex]=s.positionalPath);let l=(o=a,void 0===(i=s.flagPath)?o:{...o??{},out:i});return r[s.field]=s.localPath,l}(e,r,o,s);let l=await ew(e,t);l&&(i=l.installSource,a=l.uploadedArtifactId??a);let c=()=>ey({positionals:r,flags:o,installSource:i,uploadedArtifactId:a,clientArtifactPaths:s});return"install"!==e.command&&"reinstall"!==e.command||(a=await eh(e,t,r)??a),c()}async function eh(e,t,a){var o,i;let s,l=a[1];if(void 0===l)return;if(l.startsWith("remote:")){a[1]=l.slice(7);return}let c=(o=l,i=e.meta?.cwd,s=n.isAbsolute(o)?o:n.resolve(i??process.cwd(),o),r.existsSync(s)?s:void 0);if(c)return await ee({localPath:c,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform})}function ey(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function ew(e,t){let a=e.meta?.installSource;if("install_source"!==e.command||!a||"path"!==a.kind)return null;let o=a.path.trim();if(!o)return{installSource:a};if(o.startsWith("remote:"))return{installSource:{...a,path:o.slice(7)}};let i=n.isAbsolute(o)?o:n.resolve(e.meta?.cwd??process.cwd(),o);if(!r.existsSync(i))return{installSource:{...a,path:i}};let s=await ee({localPath:i,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform});return{installSource:{...a,path:i},uploadedArtifactId:s}}function eI(e,t,a,r=0){let o=e.positionals?.[r]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${a}`,s=o&&o.trim().length>0?o:i;return n.isAbsolute(s)?s:n.resolve(e.meta?.cwd??process.cwd(),s)}function eg(e,t){let a=t.startsWith(".")?t:`.${t}`;return n.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${a}`)}async function ev(e){if(e.remoteBaseUrl)return await eA(e);let t=await ek(e);return t?{info:t,startedByClient:!1}:(function(e){let t=eU(e);if(!t.hasLock||t.hasInfo)return;let a=eC(e.lockPath);if(!a)return eO(e.lockPath);V(a.pid,a.processStartTime)||eO(e.lockPath)}(e.paths),await eb(e))}async function eA(e){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await ex(t,"http"))return{info:t,startedByClient:!1};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."})}async function ek(e){var t,a;let r,o=eM(e.paths.infoPath);if(!o)return null;let n=await ex(o,e.transportPreference);return(t=o,a=n,t.version===R()&&t.codeSignature===b((r=eq()).useSrc?r.srcPath:r.distPath,r.root)&&a)?o:(await eE(o),eO(e.paths.infoPath),null)}async function eb(e){let t,a=0,r=[];for(let o=1;o<=2;o+=1){try{await eF(e)}catch(a){if(t=a instanceof Error?a.message:String(a),r.push(await eL(e.paths,"start_error")),o<2){await J(150);continue}break}let n=await eS(15e3,e);if(n)return{info:n,startedByClient:!0};if(await eD(e.paths)){a+=1;continue}let i=eU(e.paths),s=o<2,l=await eL(e.paths,"startup_timeout",{stopLiveProcesses:!1});if(r.push(l),l.retainedInfoProcess||l.retainedLockProcess){let t=await eS(15e3,e);if(t)return{info:t,startedByClient:!0};break}if(!s)break;i.hasInfo||i.hasLock||await J(150)}let o=eU(e.paths);throw new u("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:15e3,startupAttempts:2,lockRecoveryCount:a,cleanupResults:r,startError:t,metadataState:o,hint:function(e,t=F(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists, remove ${t.lockPath} after confirming no agent-device daemon process is running.`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists, remove both files after confirming no agent-device daemon process is running.`:"agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs."}(o,e.paths)})}async function eP(e,t,a){if(!e_(e.command)||!t.startedByClient&&!a.ownedStateDir||eJ(t.info))return;let o={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0};try{await eE(t.info)}catch(e){o.error=e instanceof Error?e.message:String(e)}finally{let e=r.existsSync(a.paths.infoPath);eO(a.paths.infoPath),o.removedInfo=e&&!r.existsSync(a.paths.infoPath);let t=r.existsSync(a.paths.lockPath);eO(a.paths.lockPath),o.removedLock=t&&!r.existsSync(a.paths.lockPath),a.ownedStateDir&&(r.rmSync(a.paths.baseDir,{recursive:!0,force:!0}),o.removedStateDir=!r.existsSync(a.paths.baseDir))}G({level:o.error?"warn":"info",phase:"daemon_replay_cleanup",data:o})}function e_(e){return e===w.replay||e===w.test}async function eS(e,t){let a=Date.now();for(;Date.now()-a<e;){let e=eM(t.paths.infoPath);if(e&&await ex(e,t.transportPreference))return e;await J(100)}return null}async function eD(e){let t=eU(e);if(!t.hasLock||t.hasInfo)return!1;let a=eC(e.lockPath);return!(a&&V(a.pid,a.processStartTime))&&(eO(e.lockPath),!0)}async function eE(e){await W(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function eM(e){var t,a,r;let o,n,i=eR(e);if(!i||"object"!=typeof i)return null;let s="string"==typeof(t=i).token&&t.token.length>0?t.token:null;if(!s)return null;let l=(o=eN((a=i).port),n=eN(a.httpPort),void 0===o&&void 0===n?null:{port:o,httpPort:n});return l?{token:s,...l,transport:"socket"===(r=i.transport)||"http"===r||"dual"===r?r:void 0,pid:eN(i.pid)??0,version:eT(i.version),codeSignature:eT(i.codeSignature),processStartTime:eT(i.processStartTime)}:null}function eT(e){return"string"==typeof e?e:void 0}function eN(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function eC(e){let t=eR(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}ep.addSubnet("127.0.0.0",8,"ipv4"),ep.addAddress("::1","ipv6"),ep.addSubnet("::ffff:127.0.0.0",104,"ipv6");async function eL(e,t,a={}){let o=a.stopLiveProcesses??!0,n={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{var i,s,l,c;let t=r.existsSync(e.infoPath),a=eM(e.infoPath);if(a){let t=V(a.pid,a.processStartTime);t&&!o?n.retainedInfoProcess=!0:(t&&(await eE(a),n.stoppedInfoProcess=!0),i=e.infoPath,eO(i),n.removedInfo=!0)}else t&&(s=e.infoPath,eO(s),n.removedInfo=!0);let d=r.existsSync(e.lockPath),u=eC(e.lockPath);if(u){let t=V(u.pid,u.processStartTime);t&&!o?n.retainedLockProcess=!0:(t&&(await W(u.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:u.processStartTime}),n.stoppedLockProcess=!0),l=e.lockPath,eO(l),n.removedLock=!0)}else d&&(c=e.lockPath,eO(c),n.removedLock=!0)}catch(e){n.error=e instanceof Error?e.message:String(e)}return G({level:n.error?"warn":"info",phase:"daemon_startup_metadata_cleanup",data:n}),n}function eU(e){return{hasInfo:r.existsSync(e.infoPath),hasLock:r.existsSync(e.lockPath)}}function eR(e){if(!r.existsSync(e))return null;try{return JSON.parse(r.readFileSync(e,"utf8"))}catch{return null}}function eO(e){try{r.existsSync(e)&&r.unlinkSync(e)}catch{}}async function ex(r,o){var n;return"http"===e$(r,o)?await function(e){let r=e.baseUrl?eY(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=!1,r=e.createConnection({host:"127.0.0.1",port:n},()=>{o(!0)}),o=e=>{a||(a=!0,r.destroy(),t(e))};r.setTimeout(500),r.on("timeout",()=>{o(!1)}),r.on("error",()=>{o(!1)})}):Promise.resolve(!1))}async function eF(e){let t=eq(),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 eq(){let e=O(),t=[n.join(e,"dist","src","internal","daemon.js"),n.join(e,"dist","src","daemon.js")],a=t[0];if(void 0===a)throw new u("COMMAND_FAILED","Daemon dist path list is empty");let o=t.find(e=>r.existsSync(e))??a,i=n.join(e,"src","daemon.ts"),s=t.some(e=>r.existsSync(e)),l=r.existsSync(i);if(!s&&!l)throw new u("COMMAND_FAILED","Daemon entry not found",{distPaths:t,srcPath:i});return{root:e,distPath:o,distPaths:t,srcPath:i,useSrc:process.execArgv.includes("--experimental-strip-types")?l:!s&&l}}async function eB(e,t,a,r){return"http"===e$(e,a)?await eG(e,t,r):await ez(e,t,r)}function e$(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(ej(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=>ej(e,t));if(o)return o;throw new u("COMMAND_FAILED","Daemon metadata has no reachable transport")}function ej(e,t){return"http"===t?!!e.httpPort:!!e.port}function eH(e,t,a,r,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of eu){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&&"snapshot"!==r,l=s?function(e,t){let a=!1;try{V(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),a=!0)}catch{W(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{eO(t.infoPath),eO(t.lockPath)}return{forcedKill:a}}(e,t):{forcedKill:!1};return G({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:a,command:r,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:s?e.pid:void 0,daemonPidForceKilled:s?l.forcedKill:void 0,daemonPreservedAfterTimeout:!o&&!s,daemonBaseUrl:e.baseUrl}}),new u("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:a,hint:function(e){let{remote:t,resetDaemon:a,command:r}=e;return t?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":a?"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected.":`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??"request"} request was canceled and iOS runner work was aborted when detected; the daemon was kept alive so the session can still be closed or inspected.`}({remote:o,resetDaemon:s,command:r})})}function eK(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 ez(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)}
3
+ `)}),l=F(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c=!1,d="number"==typeof r?setTimeout(()=>{c=!0,s.destroy(),i(eH(t,l,a.meta?.requestId,a.command,!1,r))},r):void 0,p="";s.setEncoding("utf8"),s.on("data",e=>{if(c)return;let t=y(p,e);for(let e of(p=t.buffer,t.lines))try{let t=JSON.parse(e);if(g(t)){ed(t.event);continue}let a=I(t)?t.response:t;c=!0,s.end(),d&&clearTimeout(d),n(a);return}catch(t){c=!0,d&&clearTimeout(d),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e},t instanceof Error?t:void 0));return}}),s.on("error",e=>{c||(c=!0,d&&clearTimeout(d),i(eK(e,a.meta?.requestId,!1)))})})}async function eG(e,r,o){var n,i,s;let l,c=e.baseUrl?new URL(eY(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!c)throw new u("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let d=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},l=n.meta?.requestId??K(),"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)})),p={"content-type":"application/json","content-length":Buffer.byteLength(d)};return e.baseUrl&&e.token&&(p.authorization=`Bearer ${e.token}`,p["x-agent-device-token"]=e.token),await new Promise((n,i)=>{let s=F(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),l=("https:"===c.protocol?a:t).request({protocol:c.protocol,host:c.hostname,port:c.port,method:"POST",path:c.pathname+c.search,headers:p},t=>{var a;(a=t.headers?.["content-type"],N(r)&&String(Array.isArray(a)?a.join(","):a??"").includes("application/x-ndjson"))?function(e,t){let{req:a,handleResponseBody:r,reject:o,clearTimeout:n}=t,i="",s=!1,l=e=>{try{let t=JSON.parse(e);if(g(t))return ed(t.event),!1;if(I(t))return s=!0,n(),r(JSON.stringify(t.response)),!0;throw Error("Missing daemon progress response envelope")}catch(t){return s=!0,n(),o(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e},t instanceof Error?t:void 0)),!0}};e.setEncoding("utf8"),e.on("data",e=>{if(s)return;let t=y(i,e);for(let e of(i=t.buffer,t.lines))if(e&&l(e))return}),e.on("end",()=>{if(s)return;let e=i.trim();e&&l(e)||(s=!0,n(),o(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e})))}),e.on("error",e=>{s||(s=!0,n(),o(new u("COMMAND_FAILED","Failed to read daemon response",{requestId:a.meta?.requestId},e instanceof Error?e:void 0)))})}(t,{req:r,reject:i,clearTimeout:()=>{f&&clearTimeout(f)},handleResponseBody:t=>eV(t,{info:e,req:r,resolve:n,reject:i})}):X(t).then(t=>{f&&clearTimeout(f),eV(t,{info:e,req:r,resolve:n,reject:i})}).catch(e=>{f&&clearTimeout(f),i(new u("COMMAND_FAILED","Failed to read daemon response",{requestId:r.meta?.requestId},e instanceof Error?e:void 0))})}),m=eJ(e),f="number"==typeof o?setTimeout(()=>{l.destroy(),i(eH(e,s,r.meta?.requestId,r.command,m,o))},o):void 0;l.on("error",e=>{f&&clearTimeout(f),i(eK(e,r.meta?.requestId,m))}),l.write(d),l.end()})}function eV(e,t){let{info:a,req:r,resolve:o,reject:n}=t;try{var i,s,l;let t=(i=e,JSON.parse(i));if(t.error){let e;return void n((s=t.error,l=r.meta?.requestId,e=s.data??{},new u(d(null!=e.code?String(e.code):void 0,"COMMAND_FAILED"),String(e.message??s.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:l})))}if(!t.result||"object"!=typeof t.result)return void n(new u("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));eW(a,r,t.result,o,n)}catch(t){n(new u("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}async function eW(e,t,a,r,o){try{r(e.baseUrl&&a.ok?await eQ(e,t,a):a)}catch(e){o(e)}}function eJ(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eY(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function eQ(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let o=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=t.meta?.clientArtifactPaths?.[e.field];if(a&&a.trim().length>0)return a;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return n.resolve(t.meta?.cwd??process.cwd(),r)}(a,t);await eX({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),o[a.field]=r,i.push({...a,localPath:r})}return o.artifacts=i,{ok:!0,data:o}}async function eX(e){var o,s;let l,c=new URL((o=e.baseUrl,s=e.artifactId,l=o.endsWith("/")?o:`${o}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),d="https:"===c.protocol?a:t;await r.promises.mkdir(n.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,n=e.timeoutMs??9e4,s=n=>{if(!o){if(o=!0,clearTimeout(p),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},l=d.request({protocol:c.protocol,host:c.hostname,port:c.port,method:"GET",path:c.pathname+c.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}))}),i(t,r.createWriteStream(e.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),p=setTimeout(()=>{let t=new u("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n});s(t),l.destroy(t)},n);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:n},t instanceof Error?t:void 0))}),l.end()})}function eZ(e={},t={}){let a=t.transport??em,r=async(t,r=[],o={})=>{var n,i;let s=(n=e,i=o,{...n,...i}),l=await a({session:M(s.session),command:t,positionals:r,flags:D(s),runtime:s.runtime,meta:S(s)});return l.ok||function(e){throw new u(d(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(l.error),l.data??{}},o=async(e={})=>{let t=await r(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(h)},n=async(e,t={})=>{let a=v(e,t);return await r(a.command,a.positionals,a.options)},i=(t={})=>{var a,r;return M((a=e,r=t,{...a,...r}).session)};return{command:{wait:async e=>await n("wait",e),alert:async(e={})=>await n("alert",e),appState:async(e={})=>await n("appstate",e),back:async(e={})=>await n("back",e),home:async(e={})=>await n("home",e),rotate:async e=>await n("rotate",e),appSwitcher:async(e={})=>await n("app-switcher",e),keyboard:async(e={})=>await n("keyboard",e),clipboard:async e=>await n("clipboard",e),reactNative:async e=>await n("react-native",e)},devices:{list:async(e={})=>{let t=await n("devices",e);return(Array.isArray(t.devices)?t.devices:[]).map(L)},boot:async(e={})=>await n("boot",e)},sessions:{list:async(e={})=>await o(e),close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},apps:{install:async e=>_(await n("install",e),i(e)),reinstall:async e=>_(await n("reinstall",e),i(e)),installFromSource:async e=>H(await n("install-from-source",e),i(e)),list:async(e={})=>{let t=await n("apps",e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=i(e),a=await n("open",e),r=x(a),o=E(a,"appBundleId");return{session:t,appName:E(a,"appName"),appBundleId:o,appId:o,startup:$(a.startup),runtime:B(a.runtime),device:r,identifiers:{session:t,deviceId:r?.id,deviceName:r?.name,udid:r?.ios?.udid,serial:r?.android?.serial,appId:o,appBundleId:o}}},close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>await n("push",e),triggerEvent:async e=>await n("trigger-app-event",e)},materializations:{release:async e=>k(await r(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>e1(await r(C.leaseAllocate,[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>e1(await r(C.leaseHeartbeat,[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await r(C.leaseRelease,[],e)).released})},metro:{prepare:async t=>await Q({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 Y({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t,a,r;let o,s,l,c,d,u=i(e);return t=await n("snapshot",e),a=u,o=E(t,"appBundleId"),{nodes:A(t.nodes),truncated:!0===t.truncated,appName:E(t,"appName"),appBundleId:o,...(s=e0((r=t).visibility),l=e0(r.androidSnapshot),c=e0(r.unchanged),d=Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,{...s?{visibility:s}:{},...l?{androidSnapshot:l}:{},...c?{unchanged:c}:{},...d?{warnings:d}:{}}),identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=i(e),a=await n("screenshot",e);return{path:U(a,"path"),overlayRefs:j(a),identifiers:{session:t}}},diff:async e=>await n("diff",e)},interactions:{click:async e=>await n("click",e),press:async e=>await n("press",e),longPress:async e=>await n("longpress",e),swipe:async e=>await n("swipe",e),pan:async e=>await n("gesture-pan",e),fling:async e=>await n("gesture-fling",e),focus:async e=>await n("focus",e),type:async e=>await n("type",e),fill:async e=>await n("fill",e),scroll:async e=>await n("scroll",e),pinch:async e=>await n("gesture-pinch",e),rotateGesture:async e=>await n("gesture-rotate",e),transformGesture:async e=>await n("gesture-transform",e),get:async e=>await n("get",e),is:async e=>await n("is",e),find:async e=>await n("find",e)},replay:{run:async e=>await n("replay",e),test:async e=>await n("test",e)},batch:{run:async e=>await n("batch",e)},observability:{perf:async(e={})=>await n("perf",e),logs:async(e={})=>await n("logs",e),network:async(e={})=>await n("network",e)},recording:{record:async e=>await n("record",e),trace:async e=>await n("trace",e)},settings:{update:async e=>await n("settings",e)}}}function e0(e){return"object"==typeof e&&null!==e?e:void 0}function e1(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:U(t,"leaseId"),tenantId:U(t,"tenantId"),runId:U(t,"runId"),backend:U(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{eZ as createAgentDeviceClient,em as sendToDaemon};
@@ -1 +1 @@
1
- import{AppError as t}from"./9152.js";import{resolveAppsFilter as e}from"./3622.js";import{parseAndroidForegroundApp as i,parseAndroidLaunchablePackages as a,parseAndroidUserInstalledPackages as r,inferAndroidAppName as o,parseAndroidLaunchComponent as n,isAmStartError as d}from"./1769.js";let l="android.intent.category.LAUNCHER",s="android.intent.category.LEANBACK_LAUNCHER";async function c(t,i={}){let a=await A(t,i.target??"auto");return("user-installed"===e(i.filter)?(await p(t)).filter(t=>a.has(t)):Array.from(a)).map(t=>({package:t,name:o(t)})).sort((t,e)=>t.package.localeCompare(e.package))}async function u(t){let e=await f(t,[["shell","dumpsys","window","windows"],["shell","dumpsys","window"]]);if(e)return e;let i=await f(t,[["shell","dumpsys","activity","activities"],["shell","dumpsys","activity"]]);return i||{}}async function A(t,e){return new Set((await Promise.all((function(t){switch(t){case"mobile":return[l];case"tv":return[s];default:return[l,s]}})(e).map(async e=>{var i;let r=await t(["shell","cmd","package","query-activities","--brief","-a","android.intent.action.MAIN","-c",e],{allowFailure:!0});return 0===r.exitCode?0===(i=r.stdout).trim().length?[]:a(i):[]}))).flat())}async function p(e){let i=await e(["shell","pm","list","packages","-3"],{allowFailure:!0});if(0!==i.exitCode)throw new t("COMMAND_FAILED","Failed to list Android user-installed apps",{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode});return r(i.stdout)}async function f(t,e){for(let a of e){let e=i((await t(a,{allowFailure:!0})).stdout??"");if(e)return e}return null}let w="android.intent.category.LAUNCHER",m="android.intent.category.DEFAULT";async function h(t,e){await t(["shell","am","force-stop",e])}async function C(t,e,i=[w]){for(let a of i){let i=await t(["shell","cmd","package","resolve-activity","--brief","-a","android.intent.action.MAIN","-c",a,e],{allowFailure:!0});if(0!==i.exitCode)continue;let r=n(i.stdout);if(r)return r}return null}async function _(e,i,a={}){let r=a.category??w;if(a.activity){var o,n;return void await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-n",(o=i,(n=a.activity).includes("/")?n:`${o}/${n.startsWith(".")?n:`.${n}`}`)])}let l=await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-p",i],{allowFailure:!0});if(0===l.exitCode&&!d(l.stdout,l.stderr))return;let s=await C(e,i,[r]);if(!s)throw new t("COMMAND_FAILED",`Failed to resolve Android launch component for ${i}`,{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode});await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-n",s])}export{captureAndroidLogcatWithAdb,dismissAndroidKeyboardWithAdb,getAndroidKeyboardStatusWithAdb,readAndroidClipboardWithAdb,streamAndroidLogcatWithAdb,writeAndroidClipboardWithAdb}from"./1769.js";export{createAndroidPortReverseManager,createLocalAndroidAdbProvider}from"./9639.js";export{h as forceStopAndroidAppWithAdb,u as getAndroidAppStateWithAdb,c as listAndroidAppsWithAdb,_ as openAndroidAppWithAdb,C as resolveAndroidLaunchComponentWithAdb};
1
+ import{AppError as t}from"./9152.js";import{resolveAppsFilter as e}from"./1393.js";import{parseAndroidForegroundApp as i,parseAndroidLaunchablePackages as a,parseAndroidUserInstalledPackages as r,inferAndroidAppName as o,parseAndroidLaunchComponent as n,isAmStartError as d}from"./1769.js";let l="android.intent.category.LAUNCHER",s="android.intent.category.LEANBACK_LAUNCHER";async function c(t,i={}){let a=await A(t,i.target??"auto");return("user-installed"===e(i.filter)?(await p(t)).filter(t=>a.has(t)):Array.from(a)).map(t=>({package:t,name:o(t)})).sort((t,e)=>t.package.localeCompare(e.package))}async function u(t){let e=await f(t,[["shell","dumpsys","window","windows"],["shell","dumpsys","window"]]);if(e)return e;let i=await f(t,[["shell","dumpsys","activity","activities"],["shell","dumpsys","activity"]]);return i||{}}async function A(t,e){return new Set((await Promise.all((function(t){switch(t){case"mobile":return[l];case"tv":return[s];default:return[l,s]}})(e).map(async e=>{var i;let r=await t(["shell","cmd","package","query-activities","--brief","-a","android.intent.action.MAIN","-c",e],{allowFailure:!0});return 0===r.exitCode?0===(i=r.stdout).trim().length?[]:a(i):[]}))).flat())}async function p(e){let i=await e(["shell","pm","list","packages","-3"],{allowFailure:!0});if(0!==i.exitCode)throw new t("COMMAND_FAILED","Failed to list Android user-installed apps",{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode});return r(i.stdout)}async function f(t,e){for(let a of e){let e=i((await t(a,{allowFailure:!0})).stdout??"");if(e)return e}return null}let w="android.intent.category.LAUNCHER",m="android.intent.category.DEFAULT";async function h(t,e){await t(["shell","am","force-stop",e])}async function C(t,e,i=[w]){for(let a of i){let i=await t(["shell","cmd","package","resolve-activity","--brief","-a","android.intent.action.MAIN","-c",a,e],{allowFailure:!0});if(0!==i.exitCode)continue;let r=n(i.stdout);if(r)return r}return null}async function _(e,i,a={}){let r=a.category??w;if(a.activity){var o,n;return void await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-n",(o=i,(n=a.activity).includes("/")?n:`${o}/${n.startsWith(".")?n:`.${n}`}`)])}let l=await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-p",i],{allowFailure:!0});if(0===l.exitCode&&!d(l.stdout,l.stderr))return;let s=await C(e,i,[r]);if(!s)throw new t("COMMAND_FAILED",`Failed to resolve Android launch component for ${i}`,{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode});await e(["shell","am","start","-W","-a","android.intent.action.MAIN","-c",m,"-c",r,"-n",s])}export{captureAndroidLogcatWithAdb,dismissAndroidKeyboardWithAdb,getAndroidKeyboardStatusWithAdb,readAndroidClipboardWithAdb,streamAndroidLogcatWithAdb,writeAndroidClipboardWithAdb}from"./1769.js";export{createAndroidPortReverseManager,createLocalAndroidAdbProvider}from"./9639.js";export{h as forceStopAndroidAppWithAdb,u as getAndroidAppStateWithAdb,c as listAndroidAppsWithAdb,_ as openAndroidAppWithAdb,C as resolveAndroidLaunchComponentWithAdb};
@@ -12,7 +12,7 @@ export declare const ANDROID_SNAPSHOT_HELPER_PROTOCOL = "android-snapshot-helper
12
12
 
13
13
  export declare const ANDROID_SNAPSHOT_HELPER_RUNNER = "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation";
14
14
 
15
- export declare const ANDROID_SNAPSHOT_HELPER_WAIT_FOR_IDLE_TIMEOUT_MS = 500;
15
+ export declare const ANDROID_SNAPSHOT_HELPER_WAIT_FOR_IDLE_TIMEOUT_MS = 25;
16
16
 
17
17
  /**
18
18
  * Runs device-scoped adb arguments after the device serial has already been selected.
@@ -103,6 +103,8 @@ export declare type AndroidSnapshotBackendMetadata = {
103
103
  backend: 'android-helper' | 'uiautomator-dump';
104
104
  helperVersion?: string;
105
105
  helperApiVersion?: string;
106
+ helperTransport?: 'instrumentation' | 'persistent-session';
107
+ helperSessionReused?: boolean;
106
108
  fallbackReason?: string;
107
109
  installReason?: 'missing' | 'outdated' | 'forced' | 'current' | 'skipped';
108
110
  waitForIdleTimeoutMs?: number;
@@ -125,6 +127,10 @@ export declare type AndroidSnapshotHelperArtifact = {
125
127
 
126
128
  export declare type AndroidSnapshotHelperCaptureOptions = {
127
129
  adb: AndroidAdbExecutor;
130
+ adbProvider?: AndroidAdbProvider;
131
+ deviceKey?: string;
132
+ helperVersion?: string;
133
+ helperVersionCode?: number;
128
134
  packageName?: string;
129
135
  instrumentationRunner?: string;
130
136
  waitForIdleTimeoutMs?: number;
@@ -134,6 +140,7 @@ export declare type AndroidSnapshotHelperCaptureOptions = {
134
140
  maxDepth?: number;
135
141
  maxNodes?: number;
136
142
  outputPath?: string;
143
+ emitChunks?: boolean;
137
144
  };
138
145
 
139
146
  export declare type AndroidSnapshotHelperInstallPolicy = 'missing-or-outdated' | 'always' | 'never';
@@ -178,6 +185,8 @@ export declare type AndroidSnapshotHelperMetadata = {
178
185
  nodeCount?: number;
179
186
  truncated?: boolean;
180
187
  elapsedMs?: number;
188
+ transport?: 'instrumentation' | 'persistent-session';
189
+ sessionReused?: boolean;
181
190
  };
182
191
 
183
192
  export declare type AndroidSnapshotHelperOutput = {
@@ -1 +1 @@
1
- var _=500;export{ANDROID_SNAPSHOT_HELPER_NAME,ANDROID_SNAPSHOT_HELPER_OUTPUT_FORMAT,ANDROID_SNAPSHOT_HELPER_PACKAGE,ANDROID_SNAPSHOT_HELPER_PROTOCOL,ANDROID_SNAPSHOT_HELPER_RUNNER,captureAndroidSnapshotWithHelper,ensureAndroidSnapshotHelper,parseAndroidSnapshotHelperManifest,parseAndroidSnapshotHelperOutput,parseAndroidSnapshotHelperXml,prepareAndroidSnapshotHelperArtifactFromManifestUrl,verifyAndroidSnapshotHelperArtifact}from"./221.js";export{_ as ANDROID_SNAPSHOT_HELPER_WAIT_FOR_IDLE_TIMEOUT_MS};
1
+ var _=25;export{ANDROID_SNAPSHOT_HELPER_NAME,ANDROID_SNAPSHOT_HELPER_OUTPUT_FORMAT,ANDROID_SNAPSHOT_HELPER_PACKAGE,ANDROID_SNAPSHOT_HELPER_PROTOCOL,ANDROID_SNAPSHOT_HELPER_RUNNER,captureAndroidSnapshotWithHelper,ensureAndroidSnapshotHelper,parseAndroidSnapshotHelperManifest,parseAndroidSnapshotHelperOutput,parseAndroidSnapshotHelperXml,prepareAndroidSnapshotHelperArtifactFromManifestUrl,verifyAndroidSnapshotHelperArtifact}from"./221.js";export{_ as ANDROID_SNAPSHOT_HELPER_WAIT_FOR_IDLE_TIMEOUT_MS};
@@ -96,6 +96,7 @@ declare type DaemonRequestMeta = {
96
96
  materializationId?: string;
97
97
  lockPolicy?: DaemonLockPolicy;
98
98
  lockPlatform?: 'ios' | 'macos' | 'android' | 'linux' | 'apple';
99
+ requestProgress?: 'replay-test';
99
100
  };
100
101
 
101
102
  declare type DaemonResponse = {