agent-device 0.21.9 → 0.21.11

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 (46) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.9.apk → agent-device-android-ime-helper-0.21.11.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.11.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.9.manifest.json → agent-device-android-ime-helper-0.21.11.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.9.apk → agent-device-android-snapshot-helper-0.21.11.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.11.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.9.manifest.json → agent-device-android-snapshot-helper-0.21.11.manifest.json} +6 -6
  7. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -0
  8. package/dist/src/agent-browser-provider.js +1 -1
  9. package/dist/src/agent-device-client.js +2 -2
  10. package/dist/src/app-launch.js +1 -1
  11. package/dist/src/app-lifecycle.js +1 -1
  12. package/dist/src/app-resolution.js +1 -1
  13. package/dist/src/application-lifecycle-interaction.js +1 -1
  14. package/dist/src/cli.js +2 -2
  15. package/dist/src/command-tools.js +1 -1
  16. package/dist/src/debug-symbols-facade.js +1 -1
  17. package/dist/src/device-claim-rule.js +2 -2
  18. package/dist/src/device-session.js +1 -1
  19. package/dist/src/interaction2.js +1 -1
  20. package/dist/src/interactor.js +1 -1
  21. package/dist/src/interactor2.js +1 -1
  22. package/dist/src/internal/bin.js +1 -1
  23. package/dist/src/lease-context.js +1 -1
  24. package/dist/src/lease-scope.js +1 -1
  25. package/dist/src/mechanics.js +1 -1
  26. package/dist/src/open-target-resolution.js +1 -1
  27. package/dist/src/perf-facade.js +1 -1
  28. package/dist/src/platform-runtime-open-target.js +1 -1
  29. package/dist/src/react-native.js +1 -1
  30. package/dist/src/record-runtime.js +1 -1
  31. package/dist/src/registry.js +23 -23
  32. package/dist/src/replay.js +1 -1
  33. package/dist/src/runner-client.js +1 -1
  34. package/dist/src/runtime4.js +1 -1
  35. package/dist/src/screenshot-result.js +1 -1
  36. package/dist/src/script.js +1 -1
  37. package/dist/src/sdk-batch-runner.js +2 -2
  38. package/dist/src/semantic-index.js +1 -1
  39. package/dist/src/session-store.js +1 -1
  40. package/dist/src/session2.js +1 -1
  41. package/dist/src/snapshot-diagnostics.js +1 -1
  42. package/dist/src/stop-sequence.js +1 -1
  43. package/package.json +1 -1
  44. package/server.json +2 -2
  45. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.9.apk.sha256 +0 -1
  46. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.9.apk.sha256 +0 -1
@@ -1,3 +1,3 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t}from"./sdk-batch-runner.js";import{fn as n,ln as r}from"./sdk-batch.js";import{n as i,r as a}from"./script.js";import{n as o}from"./path-resolution.js";import"./file.js";import"./gesture-plan.js";import{i as s,s as c}from"./src8.js";import{t as l}from"./compatibility-policy.js";import{t as u}from"./shared.js";import d from"node:path";import f from"node:fs";function p(e,t){return`${e},${t}`}const m={open:h,back:()=>({kind:`commands`,commands:[`back`]}),home:()=>({kind:`commands`,commands:[{pressKey:`Home`}]}),keyboard:v};function h(e){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`open requires an app id or URL`};if(t(n))return{kind:`commands`,commands:[{openLink:n}]};let i=g(e,n);return r&&t(r)?{kind:`config`,appId:n,commands:[i,{openLink:r}]}:r?{kind:`unsupported`,message:`open with a non-URL second argument is unsupported`}:{kind:`config`,appId:n,commands:[i]}}function g(e,t){return{launchApp:{appId:t,..._(e)}}}function _(e){let t=e.flags?.launchArgs,n={};return e.flags?.relaunch===!0&&(n.stopApp=!0),e.flags?.clearAppState===!0&&(n.clearState=!0),Array.isArray(t)&&t.length>0&&(n.launchArguments=t),n}function v(e){let[t]=e.positionals;return t===`dismiss`?{kind:`commands`,commands:[`hideKeyboard`]}:t===`enter`||t===`return`?{kind:`commands`,commands:[{pressKey:`Enter`}]}:{kind:`unsupported`,message:`keyboard ${t??``}`.trim()}}var y=c();function b(e){return`${e.map(e=>(0,y.stringify)(e).trimEnd()).join(`
1
+ import{D as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{fn as n,ln as r}from"./sdk-batch.js";import{n as i,r as a}from"./script.js";import{n as o}from"./path-resolution.js";import"./file.js";import"./gesture-plan.js";import{i as s,s as c}from"./src8.js";import{t as l}from"./compatibility-policy.js";import{t as u}from"./shared.js";import d from"node:path";import f from"node:fs";function p(e,t){return`${e},${t}`}const m={open:h,back:()=>({kind:`commands`,commands:[`back`]}),home:()=>({kind:`commands`,commands:[{pressKey:`Home`}]}),keyboard:v};function h(e){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`open requires an app id or URL`};if(t(n))return{kind:`commands`,commands:[{openLink:n}]};let i=g(e,n);return r&&t(r)?{kind:`config`,appId:n,commands:[i,{openLink:r}]}:r?{kind:`unsupported`,message:`open with a non-URL second argument is unsupported`}:{kind:`config`,appId:n,commands:[i]}}function g(e,t){return{launchApp:{appId:t,..._(e)}}}function _(e){let t=e.flags?.launchArgs,n={};return e.flags?.relaunch===!0&&(n.stopApp=!0),e.flags?.clearAppState===!0&&(n.clearState=!0),Array.isArray(t)&&t.length>0&&(n.launchArguments=t),n}function v(e){let[t]=e.positionals;return t===`dismiss`?{kind:`commands`,commands:[`hideKeyboard`]}:t===`enter`||t===`return`?{kind:`commands`,commands:[{pressKey:`Enter`}]}:{kind:`unsupported`,message:`keyboard ${t??``}`.trim()}}var y=c();function b(e){return`${e.map(e=>(0,y.stringify)(e).trimEnd()).join(`
2
2
  ---
3
3
  `)}\n`}function x(t,n){let r={config:S(n.metadata),warnings:[],unsupported:[]},i=[];for(let[e,a]of t.entries()){let t=n.actionLines?.[e]??e+1,o=w(a,n.resolveSelector);switch(o.kind){case`commands`:i.push(...o.commands),K(r,o.warnings,a,t);break;case`config`:r.config.appId??=o.appId,i.push(...o.commands),K(r,o.warnings,a,t);break;case`unsupported`:r.unsupported.push({line:t,action:X(a),message:o.message})}}if(r.unsupported.length>0)throw new e(`INVALID_ARGS`,`Cannot export replay to Maestro YAML: unsupported .ad action ${Y(r.unsupported)}.`,{unsupported:r.unsupported});return{yaml:J(r.config,i),warnings:r.warnings}}function S(e){return e?.env&&Object.keys(e.env).length>0?{env:e.env}:{}}const C={...m,click:T,press:T,longpress:E,fill:A,type:j,wait:M,find:P,screenshot:F,scroll:I,swipe:L};function w(e,t){return C[e.command]?.(e,t)??{kind:`unsupported`,message:`${e.command} has no Maestro equivalent`}}function T(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`${e.command} requires a target`};let i=B(n,r,t);if(!i)return{kind:`unsupported`,message:`tap target is not Maestro-compatible`};let a=V(e);return a.ok?e.flags?.doubleTap===!0?{kind:`commands`,commands:[{doubleTapOn:i}],warnings:[...N(n),...k(e,`doubleTapOn`)]}:typeof e.flags?.holdMs==`number`?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),O(e.flags.holdMs),...k(e,`longPressOn`)]}:{kind:`commands`,commands:[W(i,a.options)],warnings:N(n)}:{kind:`unsupported`,message:a.message}}function E(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`longpress requires a target`};let i=B(n,r,t);return i?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),...D(e).map(O)]}:{kind:`unsupported`,message:`longpress target is not Maestro-compatible`}}function D(e){let[t,n,r]=e.positionals,i=Z(t)&&Z(n)?r:n;return i&&Z(i)?[Number(i)]:[]}function O(e){return`long-press duration exports as Maestro longPressOn; Maestro uses its default long-press duration instead of ${e}ms`}function k(e,t){let n=[];return typeof e.flags?.count==`number`&&e.flags.count>1&&n.push(`tap --count ${e.flags.count} is not represented by Maestro ${t}`),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&n.push(`tap --interval-ms ${e.flags.intervalMs} is not represented by Maestro ${t}`),n}function A(e,t){let[n,r]=e.positionals;if(!n||r===void 0)return{kind:`unsupported`,message:`fill requires a target and text`};let i=B(n,void 0,t);return i?r.length===0?{kind:`commands`,commands:[{tapOn:i},`eraseText`],warnings:[...N(n),`fill "" exports as tapOn + eraseText; Maestro erases at most its 50-character default`]}:{kind:`commands`,commands:[{tapOn:i},{inputText:r}],warnings:[...N(n),`fill exports as tapOn + inputText; Maestro may append text instead of replacing existing field contents`]}:{kind:`unsupported`,message:`fill target is not Maestro-compatible`}}function j(e){let[t]=e.positionals;if(t===void 0)return{kind:`unsupported`,message:`type requires text`};let n=G(t);return n===null?{kind:`commands`,commands:[{inputText:t}]}:{kind:`commands`,commands:[{eraseText:n}]}}function M(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`wait requires a target or duration`};if(Z(n))return{kind:`commands`,commands:[{waitForAnimationToEnd:{timeout:Number(n)}}],warnings:[`wait <ms> exports as waitForAnimationToEnd and may return before the full duration`]};if(n===`absent`)return{kind:`unsupported`,message:`strict wait absent requires zero selector matches and is unsupported by Maestro`};if(n===`text`&&r)return{kind:`commands`,commands:[{extendedWaitUntil:{visible:r,timeout:q(e,l.extendedWaitUntilTimeoutMs)}}]};let i=t(n);return i?{kind:`commands`,commands:[{extendedWaitUntil:{visible:i,timeout:q(e,l.extendedWaitUntilTimeoutMs)}}],warnings:N(n)}:{kind:`unsupported`,message:`wait selector is not Maestro-compatible`}}function N(e){return n(e,`label`)?[`label= selectors export as Maestro text; Maestro text matching is broader than agent-device label-only matching`]:[]}function P(e){let[t,n,r]=e.positionals;return t!==`text`||!n||!r?{kind:`unsupported`,message:`only find text <query> exists|missing exports to Maestro`}:r===`exists`?{kind:`commands`,commands:[{assertVisible:n}]}:r===`missing`||r===`not-exists`?{kind:`commands`,commands:[{assertNotVisible:n}]}:{kind:`unsupported`,message:`find text assertion "${r}" is unsupported`}}function F(e){let[t]=e.positionals;return t?{kind:`commands`,commands:[{takeScreenshot:t}]}:{kind:`unsupported`,message:`screenshot requires an output path`}}function I(e){let[t]=e.positionals;return!t||t===`down`?{kind:`commands`,commands:[`scroll`]}:{kind:`unsupported`,message:`scroll ${t} is not exported yet`}}function L(e){let t=R(e);if(!t)return{kind:`unsupported`,message:`only coordinate swipe exports to Maestro`};let n=z(e);if(n===null)return{kind:`unsupported`,message:`swipe count must be a positive integer`};let r=ee(e);return r?{kind:`unsupported`,message:r}:{kind:`commands`,commands:Array.from({length:n},()=>({swipe:t}))}}function R(e){let[t,n,r,i]=e.positionals;if(!(!Z(t)||!Z(n)||!Z(r)||!Z(i)))return{start:p(t,n),end:p(r,i),duration:100}}function z(e){let t=e.flags?.count??1;return Number.isInteger(t)&&t>=1?t:null}function ee(e){if(e.flags?.pauseMs!==void 0)return`swipe --pause-ms has no Maestro equivalent`;if(e.flags?.pattern&&e.flags.pattern!==`one-way`)return`swipe ping-pong pattern has no Maestro equivalent`}function B(e,t,n){return Z(e)&&Z(t)?{point:p(e,t)}:e.startsWith(`@`)?null:n(e)}function V(e){let t=U(e);return t?{ok:!1,message:t}:{ok:!0,options:H(e)}}function H(e){let t={};return typeof e.flags?.count==`number`&&e.flags.count>1&&(t.repeat=e.flags.count),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&(t.delay=e.flags.intervalMs),t}function U(e){if(e.flags?.jitterPx!==void 0)return`tap --jitter-px has no Maestro equivalent`;if(e.flags?.clickButton&&e.flags.clickButton!==`primary`)return`tap --button ${e.flags.clickButton} has no Maestro equivalent`}function W(e,t){return Object.keys(t).length===0?{tapOn:e}:typeof e==`string`?{tapOn:{text:e,...t}}:e&&typeof e==`object`&&!Array.isArray(e)?{tapOn:{...e,...t}}:{tapOn:e}}function G(e){return e.length===0||![...e].every(e=>e===`\b`)?null:e.length}function K(e,t,n,r){for(let i of t??[])e.warnings.push({line:r,action:X(n),message:i})}function q(e,t){let n=e.positionals.at(-1);return n&&Z(n)?Number(n):t}function J(e,t){return b(Object.keys(e).length>0?[e,t]:[t])}function Y(e){return e.map(e=>`line ${e.line} (${e.action}): ${e.message}`).join(`; `)}function X(e){return[e.command,...e.positionals??[]].join(` `).trim()}function Z(e){return e!==void 0&&Number.isFinite(Number(e))}const Q=async e=>{let{positionals:t}=e;return t[0]===`export`?await te(e):$(e)};function $({positionals:t,flags:n}){if(t.length>1)throw new e(`INVALID_ARGS`,`replay accepts exactly one input path: replay <path>`);if(n.out!==void 0)throw new e(`INVALID_ARGS`,`replay --out is only supported with replay export.`);return!1}async function te({positionals:t,flags:n}){ne(t,n);let c=t[1];if(!c)throw new e(`INVALID_ARGS`,`replay export requires an input path.`);let l=o(c),p=f.readFileSync(l,`utf8`),m=i(p),h=x(m.actions,{actionLines:m.actionLines,metadata:a(p),resolveSelector:e=>r(e,s)}),g=typeof n.out==`string`?o(n.out):void 0;g&&(f.mkdirSync(d.dirname(g),{recursive:!0}),f.writeFileSync(g,h.yaml));for(let e of h.warnings)process.stderr.write(`Warning: line ${e.line}: ${e.message}\n`);return await u(n,{format:`maestro`,sourcePath:l,...g?{path:g}:{yaml:h.yaml},warnings:h.warnings},()=>g??h.yaml),!0}function ne(t,n){if(t.length>2)throw new e(`INVALID_ARGS`,`replay export accepts exactly one input path: replay export <file.ad>`);if(n.replayUpdate)throw new e(`INVALID_ARGS`,`replay export does not support --update.`);if(n.replayMaestro)throw new e(`INVALID_ARGS`,`replay export reads .ad files; omit --maestro.`);if(n.replayEnv?.length)throw new e(`INVALID_ARGS`,`replay export does not evaluate --env substitutions.`)}export{Q as replayCommand};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t,F as n,O as r,k as i}from"./sdk-contracts.js";import{g as a}from"./sdk-batch-runner.js";import{d as o,l as s}from"./sdk-device.js";import{o as c}from"./sdk-remote-config.js";import{c as l,r as u}from"./diagnostics.js";import{D as d,S as f,m as p,p as m,t as h,x as g,y as ee}from"./owner-identity.js";import{a as _,f as v,l as te,m as ne,p as re,r as ie}from"./exec.js";import{n as ae,t as oe}from"./file.js";import"./diagnostics2.js";import"./command.js";import{o as se}from"./device-shell.js";import{i as ce,n as le,r as ue}from"./retry.js";import{n as de,r as fe}from"./version.js";import{t as pe}from"./ttl-memo.js";import"./process.js";import{n as me,t as he}from"./boot-diagnostics.js";import{t as ge}from"./keyed-lock.js";import{i as _e,r as ve}from"./request-cancel.js";import{t as ye}from"./request.js";import{r as be}from"./device-isolation.js";import{a as xe,o as Se,r as Ce}from"./tool-provider.js";import{t as we}from"./simctl.js";import{t as Te}from"./physical-device-control.js";import{a as Ee,i as De,o as Oe}from"./runner.js";import{A as ke,B as Ae,F as je,M as Me,V as Ne,a as Pe,g as Fe,k as Ie,l as y,r as Le,t as Re,u as ze,x as Be}from"./host.js";import{a as Ve,o as He}from"./apple-runner-platform.js";import{c as Ue,d as We,i as b,o as Ge,s as Ke,t as qe,u as Je}from"./runner-cache-metadata.js";import{A as Ye,B as Xe,C as Ze,D as Qe,E as x,F as $e,H as et,I as tt,L as nt,M as rt,N as it,O as at,P as ot,R as st,S as ct,T as lt,U as ut,V as dt,_ as ft,a as pt,b as mt,c as ht,d as gt,f as _t,g as vt,h as yt,i as bt,j as xt,k as St,l as Ct,m as wt,n as Tt,o as Et,p as Dt,r as Ot,t as S,u as kt,v as At,w as jt,x as Mt,y as Nt,z as Pt}from"./runner-disposal.js";import{_ as Ft,a as It,b as Lt,c as Rt,d as zt,f as C,g as w,h as Bt,l as Vt,m as Ht,n as T,o as Ut,u as E,v as Wt,x as D,y as Gt}from"./runner-contract.js";import{t as Kt}from"./plist-xml.js";import{n as qt,t as Jt}from"./runner-owner-state.js";import Yt from"node:path";import O from"node:fs";import Xt from"node:fs/promises";const Zt={tap:`preflightSkippableTouchMutation`,mouseClick:`default`,longPress:`preflightSkippableTouchMutation`,drag:`preflightSkippableTouchMutation`,remotePress:`default`,type:`default`,swipe:`preflightSkippableTouchMutation`,scroll:`preflightSkippableTouchMutation`,desktopScroll:`preflightSkippableTouchMutation`,findText:`readOnly`,querySelector:`readOnly`,readText:`readOnly`,snapshot:`readOnly`,screenshot:`readOnly`,back:`default`,backInApp:`default`,backSystem:`default`,home:`default`,rotate:`default`,gesture:`preflightSkippableTouchMutation`,gestureViewport:`readOnly`,appSwitcher:`default`,actionButton:`default`,keyboardDismiss:`default`,keyboardReturn:`default`,alert:`alertAction`,sequence:`preflightSkippableTouchMutation`,recordStart:`default`,recordStop:`default`,status:`readOnlyReadinessProbe`,uptime:`readOnlyReadinessProbe`,activate:`readinessPreflightExemptMutation`,terminate:`readinessPreflightExemptMutation`,targetReset:`readinessPreflightExemptMutation`,shutdown:`default`},k={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},Qt={...k,readinessPreflightExempt:!0},$t={...k,readOnly:!0},en={...$t,readinessProbe:!0},tn={...k,readinessPreflightSkipEligibleAfterHealthyMutation:!0};function A(e){return j(e).readOnly}function nn(e){return j(e).readinessProbe}function rn(e){return j(e).readinessPreflightExempt}function an(e){return j(e).readinessPreflightSkipEligibleAfterHealthyMutation}function j(e){switch(Zt[e.command]){case`default`:return k;case`readinessPreflightExemptMutation`:return Qt;case`readOnly`:return $t;case`alertAction`:return(e.action??`get`).toLowerCase()===`get`?$t:k;case`readOnlyReadinessProbe`:return en;case`preflightSkippableTouchMutation`:return tn}}function on(e=process.env){return Be(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function sn(e,t){if(!on())return null;let n=He(e),r=(t,r)=>(y({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null),i=cn(e,n);if(`refusal`in i)return r(i.refusal);let a=Mt(e.id);if(a.type===`absent`)return r(`lease_absent`);if(a.type===`refused`)return r(a.reason,a.lease);let o=a.lease,s=ln(o,t.expectedRunnerSessionId);if(`refusal`in s)return r(s.refusal,o);let c=un(e,o,t.budget);if(`refusal`in c)return r(c.refusal,o);let l=s.value,u=c.value,d=await dn(e,o.port,i.value,t.budget);if(d!==`answered`)return r(d,o);if(!Nt(o,l))return r(`runner_pid_recycled`,o);let f=mn(e,o,l,u,t);try{x(f.lease)}catch{return r(`lease_write_failed`,o)}return y({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:i.value,sessionId:f.sessionId,runnerPid:l,port:o.port,previousOwnerPid:o.ownerPid}}),f}function cn(e,t){return t.handoff?t.lane===`simulator`&&Ie(e.simulatorSetPath)?{refusal:`simulator_set_redirect`}:{value:t.lane}:{refusal:t.reason}}function ln(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?Fe(n)?jt(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function un(e,t,n){let r=pn(e,n);return r?t.xctestrunPath.startsWith(`${r}${Yt.sep}`)?{value:r}:{refusal:`artifact_fingerprint_mismatch`}:{refusal:`expected_derived_unresolved`}}async function dn(e,t,r,i){let a=r===`physical_coredevice`?5e3:500,o=fn(i,a);if(o<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await tt(e,t,D({command:`uptime`}),o,i?.signal);return c=C(Rt(await n.text())),c?`answered`:`probe_failed`}catch(e){if(n(e))throw e;return`probe_failed`}finally{y({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t,lane:r,budgetCapMs:a,timeoutMs:o,answered:c}})}}function fn(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function pn(e,t){try{return Je(e,Ke(e,void 0,t))}catch(e){if(n(e))throw e;return null}}function mn(e,t,n,r,i){let a=t.sessionId,o={xctestrunPath:t.xctestrunPath,derived:r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:s,wait:c}=hn(n);return{sessionId:a,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:o,jsonPath:t.jsonPath,testPromise:c,child:s,runnerLogPath:t.runnerLogPath,state:`ready`,inFlightCommands:0,hasAbandonedCommands:!1,startupTimeoutMs:Dt(Ge(i.budget,`runner_session_adoption`)),lease:ft({deviceId:e.id,sessionId:a,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function hn(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{Fe(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}const gn=2e3;async function _n(e,t={}){if(e){try{await st(e,{timeoutMs:Math.min(gn,t.timeoutMs??gn),signal:t.signal})}catch{return}try{return{logPath:e,byteOffset:(await Xt.stat(e)).size}}catch{return{logPath:e,byteOffset:0}}}}async function vn(e){let n=await yn(e.logSince)??xn(e.error);return n?new t(n.code??e.error.code,e.error.message,{...e.error.details??{},hint:typeof e.error.details?.hint==`string`?`${e.error.details.hint} ${n.hint}`:n.hint,runnerFailureReason:n.reason},e.error):e.error}async function yn(e){if(!e)return;let t=await Tn(e,65536);if(t)return bn(t)}function bn(e){let t=e.toLowerCase();if(Sn(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_axruntime_coretext_crash`,hint:`The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`};if(Cn(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_crash`,hint:`The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`}}function xn(e){if(wn(e.message))return{reason:`runner_main_thread_execution_timeout`,hint:`XCTest timed out waiting for main-thread work on the current iOS screen. The app may still be visually responsive, especially on focused React Native overlays or animating screens. Use screenshot as visual truth, use coordinate presses only to prove or leave the state, and retry snapshot -i after the UI settles or after navigating away.`}}function Sn(e){return e.includes(`axruntime`)&&e.includes(`coretext`)&&(e.includes(`attributesforelement`)||e.includes(`axuielementcopymultipleattributevalues`)||e.includes(`reconstitutedsmuggledctfontfromdictionary`)||e.includes(`reconstitutedsmuggledattributedstringfromdictionary`))}function Cn(e){return e.includes(`process crashed`)||e.includes(`the application under test`)||e.includes(`terminated unexpectedly`)||e.includes(`exception type:`)&&e.includes(`thread 0 crashed`)}function wn(e){return e.toLowerCase().includes(`main thread execution timed out`)}async function Tn(e,t){let n;try{let r=await Xt.stat(e.logPath),i=Math.max(e.byteOffset,r.size-t),a=r.size-i;if(a<=0)return;n=await Xt.open(e.logPath,`r`);let o=Buffer.alloc(a);return await n.read(o,0,a,i),o.toString(`utf8`)}catch{return}finally{await n?.close().catch(()=>{})}}function En(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function Dn(e){let t=e.logPath;O.mkdirSync(Yt.dirname(t),{recursive:!0});let n=O.openSync(t,`a`),r=nt(t,n),i=On(()=>{try{O.closeSync(n)}catch{}}),a=En();try{let t=Me(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,We(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,`-destination`,Ve(e.device)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(e.port)},detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=ut({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&Xe(t,void 0,e.traceLogPath,e.verbose)}}),s=On(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>dt(r,e)}}catch(e){throw i(),e}}function On(e){let t=!1;return()=>{t||(t=!0,e())}}const M=new Map,kn=new Map,N=new Map,An=1e4;function P(e,t){return Ne(kn,e,t)}async function F(e,t){return z(e.id),await P(e.id,async()=>{let n=b(t.startupTimeoutMs,w(t)),r=M.get(e.id);if(r){Nn(r,t.expectedRunnerSessionId);let i=await In(e,r,n);if(i)return i}return await lt(e.id,async()=>await Mn(e,t,n))})}const jn=1e4;async function Mn(e,t,n){let r={},a=n.signal,o=hr(t.runnerLeaseContext,e.id);y({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:o}});let s=await U(r,`adopt_detached_runner`,async()=>await sn(e,{budget:n,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(s)return s.startupTimings=r,s.logicalLeaseContext=o,M.set(e.id,s),s;Pn(t.expectedRunnerSessionId),await U(r,`cleanup_stale_xcodebuild`,async()=>{await mt(e,Et,o)}),await U(r,`ensure_booted`,async()=>{await Xn(e)});let c=await U(r,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(jn,n.deadline?.remainingMs()??jn),signal:a}));await U(r,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await U(r,`cleanup_stale_bundles`,async()=>{await Ln(e)}):(r.cleanup_stale_bundles=0,y({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let l=Ge(n,`runner_session_startup`),u,d,f,p,m,h=et(t.logPath,e.id),g;try{u=await U(r,`ensure_xctestrun`,async()=>await Qe(e,{...t,budget:b(t.buildTimeoutMs,a)})),r.build_xctestrun=u.buildMs,d=await U(r,`allocate_port`,async()=>await Pt()),{xctestrunPath:f,jsonPath:p}=await U(r,`prepare_xctestrun_env`,async()=>await St(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${Ze()}-${d}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await U(r,`simulator_set_redirect`,async()=>await rt(e)),u.buildMs>0&&ze({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),g=await U(r,`launch_xcodebuild`,async()=>(await st(h).catch(()=>{}),await Dn({device:e,port:d,xctestrunPath:f,derivedPath:u.derived,signal:a,logPath:h,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw await m?.releaseBestEffort(),Vt(e,c)}let ee=kt(e.id,d),_=ft({deviceId:e.id,sessionId:ee,runnerPid:g.child.pid,port:d,xctestrunPath:f,jsonPath:p,runnerLogPath:h}),v={sessionId:ee,device:e,deviceId:e.id,port:d,xctestrunPath:f,xctestrunArtifact:u,jsonPath:p,runnerLogPath:h,testPromise:g.wait,child:g.child,endOutputObservation:g.endOutputObservation,readLogTail:g.readLogTail,state:`starting`,inFlightCommands:0,hasAbandonedCommands:!1,startupRetryWake:g.startupRetryWake,startupTimeoutMs:Dt(l),startupTimings:r,startupDeviceStates:c,logicalLeaseContext:o,simulatorSetRedirect:m??void 0,lease:_,speculative:t.speculative===!0};if(a?.aborted)throw await bt(v,{graceful:!1,waitTimeoutMs:S,leaseLockHeld:!0}),i();try{x(_)}catch(t){throw await R(e.id,v,{graceful:!1,waitTimeoutMs:S,leaseLockHeld:!0}),t}return M.set(e.id,v),v}function Nn(e,t){if(t!==void 0&&e.sessionId!==t)throw Fn()}function Pn(e){if(e!==void 0)throw Fn()}function Fn(){return new t(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function In(e,t,n){let r=Bn(t);if(r===`gone`)return await U({},`stop_stale_session`,async()=>{await R(e.id,t,{graceful:!1,waitTimeoutMs:S})}),null;if(r!==`starting`&&r!==`ready`)return null;let i=t.xctestrunArtifact;if(i?.cache===`external`)return y({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:i.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let a=Je(e,Ke(e,void 0,n));return i?.derived===a?(y({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t):(y({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:i?.derived,expectedDerived:a}}),await U({},`stop_stale_artifact_session`,async()=>{await R(e.id,t)}),null)}async function Ln(e){e.kind===`simulator`&&await Promise.allSettled(qe.map(async t=>{let n=await Rn(e,t);!n||zn(n)}))}async function Rn(e,t){try{return await je(Pe(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:An})}catch(n){y({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:An,error:n instanceof Error?n.message:String(n)}});return}}function zn(e){if(e.exitCode===0)return!0;let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`not installed`)||t.includes(`found nothing`)||t.includes(`no such file`)||t.includes(`invalid device`)||t.includes(`could not find`)}function I(e){let t=M.get(e);return t?{sessionId:t.sessionId,liveness:Bn(t)}:null}function Bn(e){return yt({state:e.state,processRunning:pt(e.child.pid)})}async function L(e,t){await P(e.deviceId,async()=>{M.get(e.deviceId)===e&&gt(e)&&(y({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await R(e.deviceId,e,{graceful:!1,waitTimeoutMs:S}))})}async function R(e,t,n={}){let r=t??M.get(e);r&&gt(r)&&(await bt(r,n),M.get(e)===r&&M.delete(e))}function Vn(e){z(e);let t=Hn();if(t<=0||!M.has(e))return;let n=setTimeout(()=>{N.delete(e),y({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),B(e).catch(t=>{y({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),N.set(e,n),y({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function z(e){let t=N.get(e);t&&(clearTimeout(t),N.delete(e))}function Hn(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Un(e,t){e.speculative&&!nn(t)&&(e.speculative=!1)}async function Wn(e){return await P(e,async()=>{let t=M.get(e);return t?.speculative?(y({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await B(e),!0):!1})}async function B(e){z(e),await P(e,async()=>{await lt(e,async()=>{await R(e,void 0,{leaseLockHeld:!0}),await Ot(e)})})}async function Gn(e,t){let n=M.get(e);if(t.retain&&!_t(n)){Vn(e);return}t.retain&&y({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}}),await B(e)}async function Kn(){let e=Array.from(M.values());await Tt(e);for(let t of e)M.get(t.deviceId)===t&&M.delete(t.deviceId)}async function qn(){if(!on())return 0;let e=0;for(let[t,n]of M){let r=Jn(t,n);if(!r.detached){y({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:t,sessionId:n.sessionId,lane:r.lane,reason:r.reason}});continue}e+=1,y({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:t,lane:r.lane,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port,runnerLogPath:n.runnerLogPath}})}return e}function Jn(e,t){let n=He(t.device);if(!n.handoff)return{detached:!1,lane:void 0,reason:n.reason};let r=n.lane;if(t.simulatorSetRedirect)return{detached:!1,lane:r,reason:`simulator_set_redirect`};let i=wt(t);if(!i.detach)return{detached:!1,lane:r,reason:i.reason};let a=t.lease;if(!a)return{detached:!1,lane:r,reason:`lease_absent`};if(!pt(t.child.pid))return{detached:!1,lane:r,reason:`runner_process_dead`};try{x(vt(a))}catch{return{detached:!1,lane:r,reason:`lease_write_failed`}}return t.endOutputObservation?.(),M.delete(e),z(e),Ct(t,`stopped`),{detached:!0,lane:r}}async function Yn(){await Kn();let e=Array.from(M.keys());await Promise.allSettled(e.map(async e=>{await B(e)})),await ht()}function Xn(e){return e.kind===`simulator`?e.booted?(y({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):Zn(e):Promise.resolve()}async function Zn(e){await je(Pe(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:it})}function Qn(e){if(!s(e.platform))throw new t(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new t(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function V(e,t,n,r,i,a){mr(t,n.command);let o=await _n(r,{timeoutMs:i,signal:a}),s=D(n),c=A(s),l=Re.fromTimeoutMs(i),u=ur(t,s);u.action===`run`?await ar({device:e,session:t,runnerCommand:s,logAttempt:o,deadline:l,signal:a,decision:u}):or(s,t,u);let d;try{d=await tr({device:e,session:t,runnerCommand:s,logPath:r,deadline:l,timeoutMs:i,signal:a,readOnlyCommand:c})}catch(e){throw er(e,t,u)}try{let e=await sr(d,t,o);nr(t);let n=$n(e);n!==void 0&&(t.runnerMainThreadBusy=n);let r=lr(e);return r?(t.lastHealthyMutation=void 0,await L(t,r)):an(s)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:s.appBundleId}),e}catch(e){ir(t,e),zt(e)?t.runnerMainThreadBusy=!0:H(e)&&(t.runnerMainThreadBusy=!1);let n=Bt(e);throw n?(t.lastHealthyMutation=void 0,await L(t,n),e):H(e)?e:er(e,t,u)}}function $n(e){return typeof e.runnerMainThreadBusy==`boolean`?e.runnerMainThreadBusy:void 0}function H(e){return e instanceof t&&e.details?.runner!==void 0}function er(e,t,n){return n.action!==`skip`||n.reason!==`recent_healthy_mutation`?e:(t.lastHealthyMutation=void 0,fr(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:n.reason,runnerReadinessPreflightSkippedAgeMs:n.lastHealthyMutationAgeMs}))}async function tr(e){let{device:n,session:r,runnerCommand:i,logPath:a,deadline:o,timeoutMs:s,signal:c,readOnlyCommand:l}=e,u=o.remainingMs();if(u<=0)throw new t(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:s});let d=l?{command:i.command,commandId:i.commandId,readOnly:!0,sessionReady:r.state===`ready`,timeoutMs:u}:{command:i.command,commandId:i.commandId};r.inFlightCommands+=1;try{return await Ae(`ios_runner_command_send`,async()=>l?await ot(n,r.port,i,a,u,r,c):await tt(n,r.port,i,u,c),d)}catch(e){throw rr(r),e}}function nr(e){let t=+!!e.hasAbandonedCommands;e.inFlightCommands=Math.max(0,e.inFlightCommands-1-t),e.hasAbandonedCommands=!1}function rr(e){e.hasAbandonedCommands=!0}function ir(e,t){H(t)?nr(e):rr(e)}async function ar(e){let{device:t,session:n,runnerCommand:r,logAttempt:i,deadline:a,signal:o,decision:s}=e,c=i?.logPath,l=n.state===`ready`?Math.min(1e3,a.remainingMs()):Math.min(pr(n),a.remainingMs());try{await sr(await Ae(`ios_runner_readiness_preflight`,async()=>await ot(t,n.port,D({command:`uptime`}),c,l,n,o),{command:r.command,commandId:r.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:n.state===`ready`,timeoutMs:l}),n,i)}catch(e){throw dr(e)}}function or(e,t,n){y({level:`debug`,phase:`ios_runner_readiness_preflight_skipped`,data:{command:e.command,commandId:e.commandId,reason:n.reason,lastHealthyMutationAgeMs:n.reason===`recent_healthy_mutation`?n.lastHealthyMutationAgeMs:void 0,sessionReady:t.state===`ready`}})}async function sr(e,t,n){let r=Rt(await e.text());if(!C(r))throw await vn({error:It(r,n?.logPath),logSince:n});Ct(t,`ready`);let i=Ht(r);return cr(i),i}function cr(e){let t=e.gestureFallback;typeof t==`string`&&t.length!==0&&y({level:`debug`,phase:`ios_runner_gesture_fallback`,data:{fallback:t,message:typeof e.gestureFallbackMessage==`string`?e.gestureFallbackMessage:void 0,hint:typeof e.gestureFallbackHint==`string`?e.gestureFallbackHint:void 0}})}function lr(e){if(e.runnerFatal===!0)return typeof e.runnerFatalReason==`string`&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:`runner_reported_fatal_response`}function ur(e,t){let n=A(t);if(rn(t))return{action:`skip`,reason:`preflight_exempt_command`};if(e.state!==`ready`)return n?{action:`skip`,reason:`read_only_startup_command`}:{action:`run`,reason:`startup`};if(nn(t))return{action:`skip`,reason:`readiness_probe_command`};if(!an(t))return{action:`run`,reason:`conservative_command`};let r=e.lastHealthyMutation;if(!r)return{action:`run`,reason:`no_recent_healthy_mutation`};if(t.appBundleId!==r.appBundleId)return{action:`run`,reason:`app_activation_uncertain`};let i=Date.now()-r.atMs;return i>5e3?{action:`run`,reason:`healthy_mutation_stale`,lastHealthyMutationAgeMs:i}:{action:`skip`,reason:`recent_healthy_mutation`,lastHealthyMutationAgeMs:i}}function dr(e){return fr(e,{runnerReadinessPreflightFailed:!0})}function fr(e,n){let r=e instanceof t?e:new t(`COMMAND_FAILED`,e instanceof Error?e.message:String(e),void 0,e);return new t(r.code,r.message,{...r.details??{},...n},r.cause??e)}function pr(e){return e.startupTimeoutMs??45e3}async function U(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,y({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function mr(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);y({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function hr(e,t){if(!e)return;let n={leaseId:W(e.leaseId),clientId:W(e.clientId),tenantId:W(e.tenantId),runId:W(e.runId),leaseProvider:W(e.leaseProvider),deviceKey:W(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function W(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function gr(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await _r(await xr(t,n,r,i,a,o),{command:r,session:n,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function _r(e,t){if(!e)return await br(t,`status_recovery_unavailable`);if(e.type===`recovered`)return vr(e,t);if(e.type===`skipInvalidation`)throw yr(e,t);return await br(t,e.reason,e.lifecycleState,e.error)}function vr(e,t){return q({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function yr(e,t){return q({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.error}async function br(e,t,n,r){throw q({command:e.command,session:e.session,transportError:e.transportError,decision:`retained`,reason:t,lifecycleState:n}),await e.invalidateSession(e.session,e.invalidationReason),r??e.transportError}async function xr(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return;let o=K(r),s;try{s=await V(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return y({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``;return y({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o}}),Sr(s,c,n,r,i)}function Sr(e,n,r,i,a){return n===`completed`?Cr(e,r,i,a):n===`failed`?{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:n,error:wr(e,r,i,a)}:n===`accepted`||n===`started`?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:n,error:Tr(n,r,i,a)}:{type:`retainInvalidation`,reason:n?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:n,error:new t(`COMMAND_FAILED`,`Runner command "${r.command}" lost its transport response and lifecycle status was ${n?`"${n}"`:`missing`}, so agent-device invalidated the runner session instead of replaying the command.`,{command:r.command,commandId:r.commandId,lifecycleState:n,recovery:`lifecycle_state_not_recoverable`,hint:Nr(r.command),logPath:a.logPath,transportError:i.message},i)}}function Cr(e,n,r,i){let a=Er(e.lifecycleResponseJson);if(a)return{type:`recovered`,data:a,reason:`completed_with_retained_response`,lifecycleState:`completed`};if(A(n))return{type:`skipInvalidation`,error:r,reason:`read_only_completed_without_retained_response`,lifecycleState:`completed`};let o=K(r);return{type:`skipInvalidation`,reason:`completed_without_retained_response`,lifecycleState:`completed`,error:new t(`COMMAND_FAILED`,`Runner command "${n.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:n.command,commandId:n.commandId,lifecycleState:`completed`,recovery:`completed_without_retained_response`,...o,hint:Dr(n.command,o),logPath:i.logPath,transportError:r.message},r)}}function wr(e,n,r,i){let a=typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0,o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=K(r),l=Ut(a);return new t(l.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...l.details,...c,hint:s??Or(n.command,c),logPath:i.logPath,transportError:r.message},r)}function Tr(e,n,r,i){if(A(n))return r;let a=K(r);return new t(`COMMAND_FAILED`,`Runner command "${n.command}" is still ${e} after the transport response was lost.`,{command:n.command,commandId:n.commandId,lifecycleState:e,recovery:`command_still_in_flight`,...a,hint:kr(n.command,e,a),logPath:i.logPath,transportError:r.message},r)}function Er(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=Rt(e)}catch{return}return C(t)?Ht(t):void 0}function Dr(e,t){return`${G(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function Or(e,t){return`${G(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function kr(e,t,n){return`${G(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function G(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function Ar(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function jr(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function Mr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function K(e){let t={},n=Ar(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=jr(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=Mr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function Nr(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function q(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;y({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const J=new Map;function Pr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function Fr(e){if(!e)return;let t=Y(e);t.touchedSession=!0,X(e,t)}function Ir(e){return e?J.get(e)?.touchedSession===!0:!1}function Lr(e){if(!e)return!0;let t=Y(e);return t.recycles>=1?(X(e,t),!1):(X(e,t),!0)}function Rr(e){if(!e)return;let t=Y(e);t.recycles+=1,X(e,t)}function zr(e,n){return y({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:n.requestId,maxRecycles:1}}),new t(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:n.logPath})}function Y(e){return Br(),J.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function X(e,t){t.lastAtMs=Date.now(),J.delete(e),J.set(e,t)}function Br(){let e=Date.now()-6e5;for(let[t,n]of J)n.lastAtMs<e&&J.delete(t);for(;J.size>512;){let e=J.keys().next().value;if(e===void 0)break;J.delete(e)}}async function Vr(e,n){T(n.requestId);let r=w(n),i=D({command:`uptime`}),a;for(let t=1;t<=2;t+=1){let o=await Hr({device:e,command:i,options:n,signal:r,attempt:t,recoveryReason:a});if(o.kind===`prepared`)return o.result;a=o.recoveryReason}throw new t(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function Hr(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await F(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...Xr(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:ti(t,await Yr(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Ur({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Ur(e){let{device:t,session:i,command:a,options:o,signal:s,attempt:c,error:l}=e,u=r(l,`COMMAND_FAILED`);if(n(u))throw await Z(i,`prepare_runner_request_canceled`),l;if(c===1&&Qr(u,i))return{kind:`prepared`,result:await Wr({device:t,session:i,command:a,options:o,signal:s,error:u})};if(!Gr(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await Z(i,`prepare_runner_health_failed`),l;return T(o.requestId),await L(i,`prepare_runner_health_retry`),y({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function Wr(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await L(n,`prepare_cached_runner_health_failed`),await xt(n.xctestrunArtifact,s);let c=Date.now(),l=await F(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Xr(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await Yr(t,l,r,i,a,u,{recoveryReason:s});return y({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),ti(t,e)}catch(e){await Z(l,`prepare_rebuilt_runner_health_failed`);let n=$r(e,l,s);throw ni(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function Z(e,t){try{await L(e,t)}catch{}}function Gr(e){return n(e)?!1:E(e)||Lt(e)}async function Kr(e,t,i){T(i.requestId);let a=w(i),o=Pr(i,t),s,c=!1;try{let n=I(e.id)?.liveness??`gone`;if((n===`gone`||n===`stopped`)&&Ir(o)){if(!Lr(o))throw zr(t,i);c=!0}s=await F(e,i),Nn(s,i.expectedRunnerSessionId),Un(s,t),c&&Rr(o),Fr(o);let r=s.state===`ready`?$e:pr(s);return await V(e,s,t,i.logPath,r,a)}catch(o){if(i.expectedRunnerSessionId!==void 0)throw o;let c=r(o,`COMMAND_FAILED`);if(s&&s.state===`starting`&&n(c))throw await Z(s,`runner_startup_request_canceled`),o;if(Gt(c)&&s)return T(i.requestId),await qr({device:e,session:s,command:t,options:i,signal:a,restartReason:`runner_connect_failed_before_command_send`});if(s&&Wt(c))return T(i.requestId),await qr({device:e,session:s,command:t,options:i,signal:a,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`});if(s&&E(c))return await gr({device:e,session:s,command:t,transportError:c,options:i,signal:a,invalidationReason:`transport_error_after_command_send`,invalidateSession:L});throw o}}async function qr(e){let{device:t,command:n,options:i,signal:a,restartReason:o}=e,s=Pr(i,n);if(!Lr(s))throw zr(n,i);await L(e.session,o);let c=await F(t,{...i,cleanStaleBundles:!0}).catch(t=>{throw Jr(t,e)});Rr(s);try{let r=await V(t,c,n,i.logPath,it,a);return e.recoveredDiagnosticPhase&&y({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:n.command,commandId:n.commandId,recovery:`session_restarted`,sessionId:c.sessionId}}),r}catch(o){let s=r(o,`COMMAND_FAILED`);if(E(s))try{return await gr({device:t,session:c,command:n,transportError:s,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:L})}catch(t){throw Jr(t,e,c)}throw Jr(o,e,c)}}function Jr(e,n,r){return e instanceof t?new t(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:n.restartReason,runnerRestartCommand:n.command.command,...n.command.commandId?{runnerRestartCommandId:n.command.commandId}:{},runnerInvalidatedSessionId:n.session.sessionId,...r?{runnerRestartSessionId:r.sessionId}:{},...e.details?.logPath===void 0&&n.options.logPath?{logPath:n.options.logPath}:{}},e.cause??e):e}async function Yr(e,t,n,r,i,a,o){let s=Date.now(),c=Zr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return ei(await V(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Xr(e,t){if(!e.prepareDeadline)return{};let n=Zr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Zr(e,n,r){if(!e)return n??45e3;let i=Math.floor(e.remainingMs());if(i<=0)throw new t(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:r,reason:`prepare_deadline_expired`});return i}function Qr(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:Ft(e)}function $r(e,n,i){let a=r(e,`COMMAND_FAILED`);return new t(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:i,xctestrunPath:n.xctestrunArtifact?.xctestrunPath,artifact:n.xctestrunArtifact?.artifact,cache:n.xctestrunArtifact?.cache,reason:a.message},a)}function ei(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function ti(e,t){return ni(e,t),t}function ni(e,t){y({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function ri(e,t,n={}){Qn(e),T(n.requestId);let r=D(t),i=Q(e,n);return A(r)?ke(()=>(T(n.requestId),i.runCommand(e,r,n)),{shouldRetry:e=>(T(n.requestId),E(e))}):i.runCommand(e,r,n)}async function ii(e,t={}){if(o(e))try{await ri(e,{command:`targetReset`},t)}catch(t){y({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await B(e.id)}}function ai(e,t={}){if(o(e))return si({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await Qe(e,{...t,budget:b(t.buildTimeoutMs,t.signal)})}})}function oi(e,t={}){if(!o(e))return;let n=Q(e,t).prewarm;if(!n){y({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return si({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function si(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(y({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function ci(e,t){Qn(e),T(t.requestId);let n=D({command:`uptime`}),r=Q(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function Q(e,t){return Oe(e,di,void 0,{requestId:t.requestId})}function li(e,t={}){return o(e)?Q(e,t).hasLiveSession(e):!1}async function ui(e,t={}){if(!o(e))return!1;let n=Q(e,t).releaseSpeculativeSession;return n?await n(e):!1}const di=Ee(Kr,{prepare:Vr,hasLiveSession:e=>I(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Wn(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await F(e,{...r,speculative:!0});return}await Vr(e,{...r,speculative:!0,healthTimeoutMs:$e})}});function fi(e){return Le(e),{runAppleRunnerCommand:ri,notifyIosRunnerAppRelaunched:ii,hasLiveIosRunnerSession:li,releaseSpeculativeIosRunnerSessionFor:ui,prewarmAppleRunnerCache:ai,prewarmIosRunnerSession:oi,prepareIosRunner:ci,resolveRunnerAppBundleId:Ue,hasCachedAppleRunnerArtifact:at,detachIosRunnerSessionsForShutdown:qn,readRunnerSessionLiveness:I,releaseIosRunnerOnClose:Gn,stopIosRunnerSession:B,stopAllIosRunnerSessions:Yn,runApplePressSeries:De,cleanupRunnerLeasesForOwner:At,readStaleRunnerLease:ct,verifyLeaseRunnerPidIdentity:jt,runnerLeaseCleanupAdapter:Et,applyXctestRunnerAppIconFromDerivedPath:Ye}}const pi={runCmdStreaming:v,runCmdSync:re,runCmdBackground:te,requireExecSuccess:_,isCommandTimeoutError:ie,shellQuote:se,emitDiagnostic:u,withDiagnosticTimer:l,retryWithPolicy:ce,isEnvTruthy:ue,deadlineFromTimeoutMs:(e,t)=>le.fromTimeoutMs(e,t),isProcessAlive:m,isProcessGroupAlive:p,readProcessStartTime:g,readProcessCommand:ee,signalPidsBestEffort:f,signalProcessGroupBestEffort:ne,findProjectRoot:de,readVersion:fe,acquireProcessLock:oe,withProcessLock:ae,withKeyedLock:ge,publishFileSync:d,classifyOwnerLiveness:h,createTtlMemo:pe,parseBooleanLiteral:c,isRecord:a,resolveIosSimulatorDeviceSetPath:be,emitRequestProgress:ye,getRequestSignal:ve,isRequestCanceled:_e,classifyBootFailure:me,bootFailureHint:he,runAppleToolCommand:xe,runXcrun:Se,readApplePlistJson:Ce,buildSimctlArgsForDevice:we,resolveIosPhysicalDeviceControl:Te,visitXmlPlistEntries:Kt,leaseOwnerStateDir:qt,hasDeviceClaimAuthority:e=>Jt()?.(e)??!1};var mi=e({applyXctestRunnerAppIconFromDerivedPath:()=>Ni,cleanupRunnerLeasesForOwner:()=>Ai,detachIosRunnerSessionsForShutdown:()=>wi,hasCachedAppleRunnerArtifact:()=>Ci,hasLiveIosRunnerSession:()=>_i,notifyIosRunnerAppRelaunched:()=>gi,prepareIosRunner:()=>xi,prewarmAppleRunnerCache:()=>yi,prewarmIosRunnerSession:()=>bi,readRunnerSessionLiveness:()=>Ti,readStaleRunnerLease:()=>ji,releaseIosRunnerOnClose:()=>Ei,releaseSpeculativeIosRunnerSessionFor:()=>vi,resolveRunnerAppBundleId:()=>Si,runApplePressSeries:()=>ki,runAppleRunnerCommand:()=>hi,stopAllIosRunnerSessions:()=>Oi,stopIosRunnerSession:()=>Di,verifyLeaseRunnerPidIdentity:()=>Mi});const $=fi(pi),hi=$.runAppleRunnerCommand,gi=$.notifyIosRunnerAppRelaunched,_i=$.hasLiveIosRunnerSession,vi=$.releaseSpeculativeIosRunnerSessionFor,yi=$.prewarmAppleRunnerCache,bi=$.prewarmIosRunnerSession,xi=$.prepareIosRunner,Si=$.resolveRunnerAppBundleId,Ci=$.hasCachedAppleRunnerArtifact,wi=$.detachIosRunnerSessionsForShutdown,Ti=$.readRunnerSessionLiveness,Ei=$.releaseIosRunnerOnClose,Di=$.stopIosRunnerSession,Oi=$.stopAllIosRunnerSessions,ki=$.runApplePressSeries,Ai=$.cleanupRunnerLeasesForOwner,ji=$.readStaleRunnerLease,Mi=$.verifyLeaseRunnerPidIdentity,Ni=$.applyXctestRunnerAppIconFromDerivedPath;export{Oi as _,gi as a,bi as c,Ei as d,vi as f,mi as g,hi as h,_i as i,Ti as l,ki as m,wi as n,xi as o,Si as p,Ci as r,yi as s,Ni as t,ji as u,Di as v,Mi as y};
1
+ import{r as e}from"./rolldown-runtime.js";import{D as t,F as n,O as r,k as i}from"./sdk-contracts.js";import{_ as a}from"./sdk-batch-runner.js";import{d as o,l as s}from"./sdk-device.js";import{o as c}from"./sdk-remote-config.js";import{c as l,r as u}from"./diagnostics.js";import{D as d,S as f,m as p,p as m,t as h,x as g,y as ee}from"./owner-identity.js";import{a as _,f as v,l as te,m as ne,p as re,r as ie}from"./exec.js";import{n as ae,t as oe}from"./file.js";import"./diagnostics2.js";import"./command.js";import{o as se}from"./device-shell.js";import{i as ce,n as le,r as ue}from"./retry.js";import{n as de,r as fe}from"./version.js";import{t as pe}from"./ttl-memo.js";import"./process.js";import{n as me,t as he}from"./boot-diagnostics.js";import{t as ge}from"./keyed-lock.js";import{i as _e,r as ve}from"./request-cancel.js";import{t as ye}from"./request.js";import{r as be}from"./device-isolation.js";import{a as xe,o as Se,r as Ce}from"./tool-provider.js";import{t as we}from"./simctl.js";import{t as Te}from"./physical-device-control.js";import{a as Ee,i as De,o as Oe}from"./runner.js";import{A as ke,B as Ae,F as je,M as Me,V as Ne,a as Pe,g as Fe,k as Ie,l as y,r as Le,t as Re,u as ze,x as Be}from"./host.js";import{a as Ve,o as He}from"./apple-runner-platform.js";import{c as Ue,d as We,i as b,o as Ge,s as Ke,t as qe,u as Je}from"./runner-cache-metadata.js";import{A as Ye,B as Xe,C as Ze,D as Qe,E as x,F as $e,H as et,I as tt,L as nt,M as rt,N as it,O as at,P as ot,R as st,S as ct,T as lt,U as ut,V as dt,_ as ft,a as pt,b as mt,c as ht,d as gt,f as _t,g as vt,h as yt,i as bt,j as xt,k as St,l as Ct,m as wt,n as Tt,o as Et,p as Dt,r as Ot,t as S,u as kt,v as At,w as jt,x as Mt,y as Nt,z as Pt}from"./runner-disposal.js";import{_ as Ft,a as It,b as Lt,c as Rt,d as zt,f as C,g as w,h as Bt,l as Vt,m as Ht,n as T,o as Ut,u as E,v as Wt,x as D,y as Gt}from"./runner-contract.js";import{t as Kt}from"./plist-xml.js";import{n as qt,t as Jt}from"./runner-owner-state.js";import Yt from"node:path";import O from"node:fs";import Xt from"node:fs/promises";const Zt={tap:`preflightSkippableTouchMutation`,mouseClick:`default`,longPress:`preflightSkippableTouchMutation`,drag:`preflightSkippableTouchMutation`,remotePress:`default`,type:`default`,swipe:`preflightSkippableTouchMutation`,scroll:`preflightSkippableTouchMutation`,desktopScroll:`preflightSkippableTouchMutation`,findText:`readOnly`,querySelector:`readOnly`,readText:`readOnly`,snapshot:`readOnly`,screenshot:`readOnly`,back:`default`,backInApp:`default`,backSystem:`default`,home:`default`,rotate:`default`,gesture:`preflightSkippableTouchMutation`,gestureViewport:`readOnly`,appSwitcher:`default`,actionButton:`default`,keyboardDismiss:`default`,keyboardReturn:`default`,alert:`alertAction`,sequence:`preflightSkippableTouchMutation`,recordStart:`default`,recordStop:`default`,status:`readOnlyReadinessProbe`,uptime:`readOnlyReadinessProbe`,activate:`readinessPreflightExemptMutation`,terminate:`readinessPreflightExemptMutation`,targetReset:`readinessPreflightExemptMutation`,shutdown:`default`},k={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},Qt={...k,readinessPreflightExempt:!0},$t={...k,readOnly:!0},en={...$t,readinessProbe:!0},tn={...k,readinessPreflightSkipEligibleAfterHealthyMutation:!0};function A(e){return j(e).readOnly}function nn(e){return j(e).readinessProbe}function rn(e){return j(e).readinessPreflightExempt}function an(e){return j(e).readinessPreflightSkipEligibleAfterHealthyMutation}function j(e){switch(Zt[e.command]){case`default`:return k;case`readinessPreflightExemptMutation`:return Qt;case`readOnly`:return $t;case`alertAction`:return(e.action??`get`).toLowerCase()===`get`?$t:k;case`readOnlyReadinessProbe`:return en;case`preflightSkippableTouchMutation`:return tn}}function on(e=process.env){return Be(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function sn(e,t){if(!on())return null;let n=He(e),r=(t,r)=>(y({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null),i=cn(e,n);if(`refusal`in i)return r(i.refusal);let a=Mt(e.id);if(a.type===`absent`)return r(`lease_absent`);if(a.type===`refused`)return r(a.reason,a.lease);let o=a.lease,s=ln(o,t.expectedRunnerSessionId);if(`refusal`in s)return r(s.refusal,o);let c=un(e,o,t.budget);if(`refusal`in c)return r(c.refusal,o);let l=s.value,u=c.value,d=await dn(e,o.port,i.value,t.budget);if(d!==`answered`)return r(d,o);if(!Nt(o,l))return r(`runner_pid_recycled`,o);let f=mn(e,o,l,u,t);try{x(f.lease)}catch{return r(`lease_write_failed`,o)}return y({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:i.value,sessionId:f.sessionId,runnerPid:l,port:o.port,previousOwnerPid:o.ownerPid}}),f}function cn(e,t){return t.handoff?t.lane===`simulator`&&Ie(e.simulatorSetPath)?{refusal:`simulator_set_redirect`}:{value:t.lane}:{refusal:t.reason}}function ln(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?Fe(n)?jt(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function un(e,t,n){let r=pn(e,n);return r?t.xctestrunPath.startsWith(`${r}${Yt.sep}`)?{value:r}:{refusal:`artifact_fingerprint_mismatch`}:{refusal:`expected_derived_unresolved`}}async function dn(e,t,r,i){let a=r===`physical_coredevice`?5e3:500,o=fn(i,a);if(o<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await tt(e,t,D({command:`uptime`}),o,i?.signal);return c=C(Rt(await n.text())),c?`answered`:`probe_failed`}catch(e){if(n(e))throw e;return`probe_failed`}finally{y({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t,lane:r,budgetCapMs:a,timeoutMs:o,answered:c}})}}function fn(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function pn(e,t){try{return Je(e,Ke(e,void 0,t))}catch(e){if(n(e))throw e;return null}}function mn(e,t,n,r,i){let a=t.sessionId,o={xctestrunPath:t.xctestrunPath,derived:r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:s,wait:c}=hn(n);return{sessionId:a,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:o,jsonPath:t.jsonPath,testPromise:c,child:s,runnerLogPath:t.runnerLogPath,state:`ready`,inFlightCommands:0,hasAbandonedCommands:!1,startupTimeoutMs:Dt(Ge(i.budget,`runner_session_adoption`)),lease:ft({deviceId:e.id,sessionId:a,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function hn(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{Fe(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}const gn=2e3;async function _n(e,t={}){if(e){try{await st(e,{timeoutMs:Math.min(gn,t.timeoutMs??gn),signal:t.signal})}catch{return}try{return{logPath:e,byteOffset:(await Xt.stat(e)).size}}catch{return{logPath:e,byteOffset:0}}}}async function vn(e){let n=await yn(e.logSince)??xn(e.error);return n?new t(n.code??e.error.code,e.error.message,{...e.error.details??{},hint:typeof e.error.details?.hint==`string`?`${e.error.details.hint} ${n.hint}`:n.hint,runnerFailureReason:n.reason},e.error):e.error}async function yn(e){if(!e)return;let t=await Tn(e,65536);if(t)return bn(t)}function bn(e){let t=e.toLowerCase();if(Sn(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_axruntime_coretext_crash`,hint:`The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`};if(Cn(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_crash`,hint:`The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`}}function xn(e){if(wn(e.message))return{reason:`runner_main_thread_execution_timeout`,hint:`XCTest timed out waiting for main-thread work on the current iOS screen. The app may still be visually responsive, especially on focused React Native overlays or animating screens. Use screenshot as visual truth, use coordinate presses only to prove or leave the state, and retry snapshot -i after the UI settles or after navigating away.`}}function Sn(e){return e.includes(`axruntime`)&&e.includes(`coretext`)&&(e.includes(`attributesforelement`)||e.includes(`axuielementcopymultipleattributevalues`)||e.includes(`reconstitutedsmuggledctfontfromdictionary`)||e.includes(`reconstitutedsmuggledattributedstringfromdictionary`))}function Cn(e){return e.includes(`process crashed`)||e.includes(`the application under test`)||e.includes(`terminated unexpectedly`)||e.includes(`exception type:`)&&e.includes(`thread 0 crashed`)}function wn(e){return e.toLowerCase().includes(`main thread execution timed out`)}async function Tn(e,t){let n;try{let r=await Xt.stat(e.logPath),i=Math.max(e.byteOffset,r.size-t),a=r.size-i;if(a<=0)return;n=await Xt.open(e.logPath,`r`);let o=Buffer.alloc(a);return await n.read(o,0,a,i),o.toString(`utf8`)}catch{return}finally{await n?.close().catch(()=>{})}}function En(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function Dn(e){let t=e.logPath;O.mkdirSync(Yt.dirname(t),{recursive:!0});let n=O.openSync(t,`a`),r=nt(t,n),i=On(()=>{try{O.closeSync(n)}catch{}}),a=En();try{let t=Me(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,We(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,`-destination`,Ve(e.device)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(e.port)},detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=ut({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&Xe(t,void 0,e.traceLogPath,e.verbose)}}),s=On(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>dt(r,e)}}catch(e){throw i(),e}}function On(e){let t=!1;return()=>{t||(t=!0,e())}}const M=new Map,kn=new Map,N=new Map,An=1e4;function P(e,t){return Ne(kn,e,t)}async function F(e,t){return z(e.id),await P(e.id,async()=>{let n=b(t.startupTimeoutMs,w(t)),r=M.get(e.id);if(r){Nn(r,t.expectedRunnerSessionId);let i=await In(e,r,n);if(i)return i}return await lt(e.id,async()=>await Mn(e,t,n))})}const jn=1e4;async function Mn(e,t,n){let r={},a=n.signal,o=hr(t.runnerLeaseContext,e.id);y({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:o}});let s=await U(r,`adopt_detached_runner`,async()=>await sn(e,{budget:n,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(s)return s.startupTimings=r,s.logicalLeaseContext=o,M.set(e.id,s),s;Pn(t.expectedRunnerSessionId),await U(r,`cleanup_stale_xcodebuild`,async()=>{await mt(e,Et,o)}),await U(r,`ensure_booted`,async()=>{await Xn(e)});let c=await U(r,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(jn,n.deadline?.remainingMs()??jn),signal:a}));await U(r,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await U(r,`cleanup_stale_bundles`,async()=>{await Ln(e)}):(r.cleanup_stale_bundles=0,y({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let l=Ge(n,`runner_session_startup`),u,d,f,p,m,h=et(t.logPath,e.id),g;try{u=await U(r,`ensure_xctestrun`,async()=>await Qe(e,{...t,budget:b(t.buildTimeoutMs,a)})),r.build_xctestrun=u.buildMs,d=await U(r,`allocate_port`,async()=>await Pt()),{xctestrunPath:f,jsonPath:p}=await U(r,`prepare_xctestrun_env`,async()=>await St(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${Ze()}-${d}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await U(r,`simulator_set_redirect`,async()=>await rt(e)),u.buildMs>0&&ze({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),g=await U(r,`launch_xcodebuild`,async()=>(await st(h).catch(()=>{}),await Dn({device:e,port:d,xctestrunPath:f,derivedPath:u.derived,signal:a,logPath:h,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw await m?.releaseBestEffort(),Vt(e,c)}let ee=kt(e.id,d),_=ft({deviceId:e.id,sessionId:ee,runnerPid:g.child.pid,port:d,xctestrunPath:f,jsonPath:p,runnerLogPath:h}),v={sessionId:ee,device:e,deviceId:e.id,port:d,xctestrunPath:f,xctestrunArtifact:u,jsonPath:p,runnerLogPath:h,testPromise:g.wait,child:g.child,endOutputObservation:g.endOutputObservation,readLogTail:g.readLogTail,state:`starting`,inFlightCommands:0,hasAbandonedCommands:!1,startupRetryWake:g.startupRetryWake,startupTimeoutMs:Dt(l),startupTimings:r,startupDeviceStates:c,logicalLeaseContext:o,simulatorSetRedirect:m??void 0,lease:_,speculative:t.speculative===!0};if(a?.aborted)throw await bt(v,{graceful:!1,waitTimeoutMs:S,leaseLockHeld:!0}),i();try{x(_)}catch(t){throw await R(e.id,v,{graceful:!1,waitTimeoutMs:S,leaseLockHeld:!0}),t}return M.set(e.id,v),v}function Nn(e,t){if(t!==void 0&&e.sessionId!==t)throw Fn()}function Pn(e){if(e!==void 0)throw Fn()}function Fn(){return new t(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function In(e,t,n){let r=Bn(t);if(r===`gone`)return await U({},`stop_stale_session`,async()=>{await R(e.id,t,{graceful:!1,waitTimeoutMs:S})}),null;if(r!==`starting`&&r!==`ready`)return null;let i=t.xctestrunArtifact;if(i?.cache===`external`)return y({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:i.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let a=Je(e,Ke(e,void 0,n));return i?.derived===a?(y({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t):(y({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:i?.derived,expectedDerived:a}}),await U({},`stop_stale_artifact_session`,async()=>{await R(e.id,t)}),null)}async function Ln(e){e.kind===`simulator`&&await Promise.allSettled(qe.map(async t=>{let n=await Rn(e,t);!n||zn(n)}))}async function Rn(e,t){try{return await je(Pe(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:An})}catch(n){y({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:An,error:n instanceof Error?n.message:String(n)}});return}}function zn(e){if(e.exitCode===0)return!0;let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`not installed`)||t.includes(`found nothing`)||t.includes(`no such file`)||t.includes(`invalid device`)||t.includes(`could not find`)}function I(e){let t=M.get(e);return t?{sessionId:t.sessionId,liveness:Bn(t)}:null}function Bn(e){return yt({state:e.state,processRunning:pt(e.child.pid)})}async function L(e,t){await P(e.deviceId,async()=>{M.get(e.deviceId)===e&&gt(e)&&(y({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await R(e.deviceId,e,{graceful:!1,waitTimeoutMs:S}))})}async function R(e,t,n={}){let r=t??M.get(e);r&&gt(r)&&(await bt(r,n),M.get(e)===r&&M.delete(e))}function Vn(e){z(e);let t=Hn();if(t<=0||!M.has(e))return;let n=setTimeout(()=>{N.delete(e),y({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),B(e).catch(t=>{y({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),N.set(e,n),y({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function z(e){let t=N.get(e);t&&(clearTimeout(t),N.delete(e))}function Hn(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Un(e,t){e.speculative&&!nn(t)&&(e.speculative=!1)}async function Wn(e){return await P(e,async()=>{let t=M.get(e);return t?.speculative?(y({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await B(e),!0):!1})}async function B(e){z(e),await P(e,async()=>{await lt(e,async()=>{await R(e,void 0,{leaseLockHeld:!0}),await Ot(e)})})}async function Gn(e,t){let n=M.get(e);if(t.retain&&!_t(n)){Vn(e);return}t.retain&&y({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}}),await B(e)}async function Kn(){let e=Array.from(M.values());await Tt(e);for(let t of e)M.get(t.deviceId)===t&&M.delete(t.deviceId)}async function qn(){if(!on())return 0;let e=0;for(let[t,n]of M){let r=Jn(t,n);if(!r.detached){y({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:t,sessionId:n.sessionId,lane:r.lane,reason:r.reason}});continue}e+=1,y({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:t,lane:r.lane,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port,runnerLogPath:n.runnerLogPath}})}return e}function Jn(e,t){let n=He(t.device);if(!n.handoff)return{detached:!1,lane:void 0,reason:n.reason};let r=n.lane;if(t.simulatorSetRedirect)return{detached:!1,lane:r,reason:`simulator_set_redirect`};let i=wt(t);if(!i.detach)return{detached:!1,lane:r,reason:i.reason};let a=t.lease;if(!a)return{detached:!1,lane:r,reason:`lease_absent`};if(!pt(t.child.pid))return{detached:!1,lane:r,reason:`runner_process_dead`};try{x(vt(a))}catch{return{detached:!1,lane:r,reason:`lease_write_failed`}}return t.endOutputObservation?.(),M.delete(e),z(e),Ct(t,`stopped`),{detached:!0,lane:r}}async function Yn(){await Kn();let e=Array.from(M.keys());await Promise.allSettled(e.map(async e=>{await B(e)})),await ht()}function Xn(e){return e.kind===`simulator`?e.booted?(y({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):Zn(e):Promise.resolve()}async function Zn(e){await je(Pe(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:it})}function Qn(e){if(!s(e.platform))throw new t(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new t(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function V(e,t,n,r,i,a){mr(t,n.command);let o=await _n(r,{timeoutMs:i,signal:a}),s=D(n),c=A(s),l=Re.fromTimeoutMs(i),u=ur(t,s);u.action===`run`?await ar({device:e,session:t,runnerCommand:s,logAttempt:o,deadline:l,signal:a,decision:u}):or(s,t,u);let d;try{d=await tr({device:e,session:t,runnerCommand:s,logPath:r,deadline:l,timeoutMs:i,signal:a,readOnlyCommand:c})}catch(e){throw er(e,t,u)}try{let e=await sr(d,t,o);nr(t);let n=$n(e);n!==void 0&&(t.runnerMainThreadBusy=n);let r=lr(e);return r?(t.lastHealthyMutation=void 0,await L(t,r)):an(s)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:s.appBundleId}),e}catch(e){ir(t,e),zt(e)?t.runnerMainThreadBusy=!0:H(e)&&(t.runnerMainThreadBusy=!1);let n=Bt(e);throw n?(t.lastHealthyMutation=void 0,await L(t,n),e):H(e)?e:er(e,t,u)}}function $n(e){return typeof e.runnerMainThreadBusy==`boolean`?e.runnerMainThreadBusy:void 0}function H(e){return e instanceof t&&e.details?.runner!==void 0}function er(e,t,n){return n.action!==`skip`||n.reason!==`recent_healthy_mutation`?e:(t.lastHealthyMutation=void 0,fr(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:n.reason,runnerReadinessPreflightSkippedAgeMs:n.lastHealthyMutationAgeMs}))}async function tr(e){let{device:n,session:r,runnerCommand:i,logPath:a,deadline:o,timeoutMs:s,signal:c,readOnlyCommand:l}=e,u=o.remainingMs();if(u<=0)throw new t(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:s});let d=l?{command:i.command,commandId:i.commandId,readOnly:!0,sessionReady:r.state===`ready`,timeoutMs:u}:{command:i.command,commandId:i.commandId};r.inFlightCommands+=1;try{return await Ae(`ios_runner_command_send`,async()=>l?await ot(n,r.port,i,a,u,r,c):await tt(n,r.port,i,u,c),d)}catch(e){throw rr(r),e}}function nr(e){let t=+!!e.hasAbandonedCommands;e.inFlightCommands=Math.max(0,e.inFlightCommands-1-t),e.hasAbandonedCommands=!1}function rr(e){e.hasAbandonedCommands=!0}function ir(e,t){H(t)?nr(e):rr(e)}async function ar(e){let{device:t,session:n,runnerCommand:r,logAttempt:i,deadline:a,signal:o,decision:s}=e,c=i?.logPath,l=n.state===`ready`?Math.min(1e3,a.remainingMs()):Math.min(pr(n),a.remainingMs());try{await sr(await Ae(`ios_runner_readiness_preflight`,async()=>await ot(t,n.port,D({command:`uptime`}),c,l,n,o),{command:r.command,commandId:r.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:n.state===`ready`,timeoutMs:l}),n,i)}catch(e){throw dr(e)}}function or(e,t,n){y({level:`debug`,phase:`ios_runner_readiness_preflight_skipped`,data:{command:e.command,commandId:e.commandId,reason:n.reason,lastHealthyMutationAgeMs:n.reason===`recent_healthy_mutation`?n.lastHealthyMutationAgeMs:void 0,sessionReady:t.state===`ready`}})}async function sr(e,t,n){let r=Rt(await e.text());if(!C(r))throw await vn({error:It(r,n?.logPath),logSince:n});Ct(t,`ready`);let i=Ht(r);return cr(i),i}function cr(e){let t=e.gestureFallback;typeof t==`string`&&t.length!==0&&y({level:`debug`,phase:`ios_runner_gesture_fallback`,data:{fallback:t,message:typeof e.gestureFallbackMessage==`string`?e.gestureFallbackMessage:void 0,hint:typeof e.gestureFallbackHint==`string`?e.gestureFallbackHint:void 0}})}function lr(e){if(e.runnerFatal===!0)return typeof e.runnerFatalReason==`string`&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:`runner_reported_fatal_response`}function ur(e,t){let n=A(t);if(rn(t))return{action:`skip`,reason:`preflight_exempt_command`};if(e.state!==`ready`)return n?{action:`skip`,reason:`read_only_startup_command`}:{action:`run`,reason:`startup`};if(nn(t))return{action:`skip`,reason:`readiness_probe_command`};if(!an(t))return{action:`run`,reason:`conservative_command`};let r=e.lastHealthyMutation;if(!r)return{action:`run`,reason:`no_recent_healthy_mutation`};if(t.appBundleId!==r.appBundleId)return{action:`run`,reason:`app_activation_uncertain`};let i=Date.now()-r.atMs;return i>5e3?{action:`run`,reason:`healthy_mutation_stale`,lastHealthyMutationAgeMs:i}:{action:`skip`,reason:`recent_healthy_mutation`,lastHealthyMutationAgeMs:i}}function dr(e){return fr(e,{runnerReadinessPreflightFailed:!0})}function fr(e,n){let r=e instanceof t?e:new t(`COMMAND_FAILED`,e instanceof Error?e.message:String(e),void 0,e);return new t(r.code,r.message,{...r.details??{},...n},r.cause??e)}function pr(e){return e.startupTimeoutMs??45e3}async function U(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,y({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function mr(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);y({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function hr(e,t){if(!e)return;let n={leaseId:W(e.leaseId),clientId:W(e.clientId),tenantId:W(e.tenantId),runId:W(e.runId),leaseProvider:W(e.leaseProvider),deviceKey:W(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function W(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function gr(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await _r(await xr(t,n,r,i,a,o),{command:r,session:n,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function _r(e,t){if(!e)return await br(t,`status_recovery_unavailable`);if(e.type===`recovered`)return vr(e,t);if(e.type===`skipInvalidation`)throw yr(e,t);return await br(t,e.reason,e.lifecycleState,e.error)}function vr(e,t){return q({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function yr(e,t){return q({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.error}async function br(e,t,n,r){throw q({command:e.command,session:e.session,transportError:e.transportError,decision:`retained`,reason:t,lifecycleState:n}),await e.invalidateSession(e.session,e.invalidationReason),r??e.transportError}async function xr(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return;let o=K(r),s;try{s=await V(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return y({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``;return y({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o}}),Sr(s,c,n,r,i)}function Sr(e,n,r,i,a){return n===`completed`?Cr(e,r,i,a):n===`failed`?{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:n,error:wr(e,r,i,a)}:n===`accepted`||n===`started`?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:n,error:Tr(n,r,i,a)}:{type:`retainInvalidation`,reason:n?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:n,error:new t(`COMMAND_FAILED`,`Runner command "${r.command}" lost its transport response and lifecycle status was ${n?`"${n}"`:`missing`}, so agent-device invalidated the runner session instead of replaying the command.`,{command:r.command,commandId:r.commandId,lifecycleState:n,recovery:`lifecycle_state_not_recoverable`,hint:Nr(r.command),logPath:a.logPath,transportError:i.message},i)}}function Cr(e,n,r,i){let a=Er(e.lifecycleResponseJson);if(a)return{type:`recovered`,data:a,reason:`completed_with_retained_response`,lifecycleState:`completed`};if(A(n))return{type:`skipInvalidation`,error:r,reason:`read_only_completed_without_retained_response`,lifecycleState:`completed`};let o=K(r);return{type:`skipInvalidation`,reason:`completed_without_retained_response`,lifecycleState:`completed`,error:new t(`COMMAND_FAILED`,`Runner command "${n.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:n.command,commandId:n.commandId,lifecycleState:`completed`,recovery:`completed_without_retained_response`,...o,hint:Dr(n.command,o),logPath:i.logPath,transportError:r.message},r)}}function wr(e,n,r,i){let a=typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0,o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=K(r),l=Ut(a);return new t(l.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...l.details,...c,hint:s??Or(n.command,c),logPath:i.logPath,transportError:r.message},r)}function Tr(e,n,r,i){if(A(n))return r;let a=K(r);return new t(`COMMAND_FAILED`,`Runner command "${n.command}" is still ${e} after the transport response was lost.`,{command:n.command,commandId:n.commandId,lifecycleState:e,recovery:`command_still_in_flight`,...a,hint:kr(n.command,e,a),logPath:i.logPath,transportError:r.message},r)}function Er(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=Rt(e)}catch{return}return C(t)?Ht(t):void 0}function Dr(e,t){return`${G(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function Or(e,t){return`${G(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function kr(e,t,n){return`${G(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function G(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function Ar(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function jr(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function Mr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function K(e){let t={},n=Ar(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=jr(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=Mr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function Nr(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function q(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;y({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const J=new Map;function Pr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function Fr(e){if(!e)return;let t=Y(e);t.touchedSession=!0,X(e,t)}function Ir(e){return e?J.get(e)?.touchedSession===!0:!1}function Lr(e){if(!e)return!0;let t=Y(e);return t.recycles>=1?(X(e,t),!1):(X(e,t),!0)}function Rr(e){if(!e)return;let t=Y(e);t.recycles+=1,X(e,t)}function zr(e,n){return y({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:n.requestId,maxRecycles:1}}),new t(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:n.logPath})}function Y(e){return Br(),J.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function X(e,t){t.lastAtMs=Date.now(),J.delete(e),J.set(e,t)}function Br(){let e=Date.now()-6e5;for(let[t,n]of J)n.lastAtMs<e&&J.delete(t);for(;J.size>512;){let e=J.keys().next().value;if(e===void 0)break;J.delete(e)}}async function Vr(e,n){T(n.requestId);let r=w(n),i=D({command:`uptime`}),a;for(let t=1;t<=2;t+=1){let o=await Hr({device:e,command:i,options:n,signal:r,attempt:t,recoveryReason:a});if(o.kind===`prepared`)return o.result;a=o.recoveryReason}throw new t(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function Hr(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await F(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...Xr(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:ti(t,await Yr(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Ur({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Ur(e){let{device:t,session:i,command:a,options:o,signal:s,attempt:c,error:l}=e,u=r(l,`COMMAND_FAILED`);if(n(u))throw await Z(i,`prepare_runner_request_canceled`),l;if(c===1&&Qr(u,i))return{kind:`prepared`,result:await Wr({device:t,session:i,command:a,options:o,signal:s,error:u})};if(!Gr(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await Z(i,`prepare_runner_health_failed`),l;return T(o.requestId),await L(i,`prepare_runner_health_retry`),y({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function Wr(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await L(n,`prepare_cached_runner_health_failed`),await xt(n.xctestrunArtifact,s);let c=Date.now(),l=await F(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Xr(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await Yr(t,l,r,i,a,u,{recoveryReason:s});return y({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),ti(t,e)}catch(e){await Z(l,`prepare_rebuilt_runner_health_failed`);let n=$r(e,l,s);throw ni(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function Z(e,t){try{await L(e,t)}catch{}}function Gr(e){return n(e)?!1:E(e)||Lt(e)}async function Kr(e,t,i){T(i.requestId);let a=w(i),o=Pr(i,t),s,c=!1;try{let n=I(e.id)?.liveness??`gone`;if((n===`gone`||n===`stopped`)&&Ir(o)){if(!Lr(o))throw zr(t,i);c=!0}s=await F(e,i),Nn(s,i.expectedRunnerSessionId),Un(s,t),c&&Rr(o),Fr(o);let r=s.state===`ready`?$e:pr(s);return await V(e,s,t,i.logPath,r,a)}catch(o){if(i.expectedRunnerSessionId!==void 0)throw o;let c=r(o,`COMMAND_FAILED`);if(s&&s.state===`starting`&&n(c))throw await Z(s,`runner_startup_request_canceled`),o;if(Gt(c)&&s)return T(i.requestId),await qr({device:e,session:s,command:t,options:i,signal:a,restartReason:`runner_connect_failed_before_command_send`});if(s&&Wt(c))return T(i.requestId),await qr({device:e,session:s,command:t,options:i,signal:a,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`});if(s&&E(c))return await gr({device:e,session:s,command:t,transportError:c,options:i,signal:a,invalidationReason:`transport_error_after_command_send`,invalidateSession:L});throw o}}async function qr(e){let{device:t,command:n,options:i,signal:a,restartReason:o}=e,s=Pr(i,n);if(!Lr(s))throw zr(n,i);await L(e.session,o);let c=await F(t,{...i,cleanStaleBundles:!0}).catch(t=>{throw Jr(t,e)});Rr(s);try{let r=await V(t,c,n,i.logPath,it,a);return e.recoveredDiagnosticPhase&&y({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:n.command,commandId:n.commandId,recovery:`session_restarted`,sessionId:c.sessionId}}),r}catch(o){let s=r(o,`COMMAND_FAILED`);if(E(s))try{return await gr({device:t,session:c,command:n,transportError:s,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:L})}catch(t){throw Jr(t,e,c)}throw Jr(o,e,c)}}function Jr(e,n,r){return e instanceof t?new t(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:n.restartReason,runnerRestartCommand:n.command.command,...n.command.commandId?{runnerRestartCommandId:n.command.commandId}:{},runnerInvalidatedSessionId:n.session.sessionId,...r?{runnerRestartSessionId:r.sessionId}:{},...e.details?.logPath===void 0&&n.options.logPath?{logPath:n.options.logPath}:{}},e.cause??e):e}async function Yr(e,t,n,r,i,a,o){let s=Date.now(),c=Zr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return ei(await V(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Xr(e,t){if(!e.prepareDeadline)return{};let n=Zr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Zr(e,n,r){if(!e)return n??45e3;let i=Math.floor(e.remainingMs());if(i<=0)throw new t(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:r,reason:`prepare_deadline_expired`});return i}function Qr(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:Ft(e)}function $r(e,n,i){let a=r(e,`COMMAND_FAILED`);return new t(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:i,xctestrunPath:n.xctestrunArtifact?.xctestrunPath,artifact:n.xctestrunArtifact?.artifact,cache:n.xctestrunArtifact?.cache,reason:a.message},a)}function ei(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function ti(e,t){return ni(e,t),t}function ni(e,t){y({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function ri(e,t,n={}){Qn(e),T(n.requestId);let r=D(t),i=Q(e,n);return A(r)?ke(()=>(T(n.requestId),i.runCommand(e,r,n)),{shouldRetry:e=>(T(n.requestId),E(e))}):i.runCommand(e,r,n)}async function ii(e,t={}){if(o(e))try{await ri(e,{command:`targetReset`},t)}catch(t){y({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await B(e.id)}}function ai(e,t={}){if(o(e))return si({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await Qe(e,{...t,budget:b(t.buildTimeoutMs,t.signal)})}})}function oi(e,t={}){if(!o(e))return;let n=Q(e,t).prewarm;if(!n){y({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return si({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function si(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(y({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function ci(e,t){Qn(e),T(t.requestId);let n=D({command:`uptime`}),r=Q(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function Q(e,t){return Oe(e,di,void 0,{requestId:t.requestId})}function li(e,t={}){return o(e)?Q(e,t).hasLiveSession(e):!1}async function ui(e,t={}){if(!o(e))return!1;let n=Q(e,t).releaseSpeculativeSession;return n?await n(e):!1}const di=Ee(Kr,{prepare:Vr,hasLiveSession:e=>I(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Wn(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await F(e,{...r,speculative:!0});return}await Vr(e,{...r,speculative:!0,healthTimeoutMs:$e})}});function fi(e){return Le(e),{runAppleRunnerCommand:ri,notifyIosRunnerAppRelaunched:ii,hasLiveIosRunnerSession:li,releaseSpeculativeIosRunnerSessionFor:ui,prewarmAppleRunnerCache:ai,prewarmIosRunnerSession:oi,prepareIosRunner:ci,resolveRunnerAppBundleId:Ue,hasCachedAppleRunnerArtifact:at,detachIosRunnerSessionsForShutdown:qn,readRunnerSessionLiveness:I,releaseIosRunnerOnClose:Gn,stopIosRunnerSession:B,stopAllIosRunnerSessions:Yn,runApplePressSeries:De,cleanupRunnerLeasesForOwner:At,readStaleRunnerLease:ct,verifyLeaseRunnerPidIdentity:jt,runnerLeaseCleanupAdapter:Et,applyXctestRunnerAppIconFromDerivedPath:Ye}}const pi={runCmdStreaming:v,runCmdSync:re,runCmdBackground:te,requireExecSuccess:_,isCommandTimeoutError:ie,shellQuote:se,emitDiagnostic:u,withDiagnosticTimer:l,retryWithPolicy:ce,isEnvTruthy:ue,deadlineFromTimeoutMs:(e,t)=>le.fromTimeoutMs(e,t),isProcessAlive:m,isProcessGroupAlive:p,readProcessStartTime:g,readProcessCommand:ee,signalPidsBestEffort:f,signalProcessGroupBestEffort:ne,findProjectRoot:de,readVersion:fe,acquireProcessLock:oe,withProcessLock:ae,withKeyedLock:ge,publishFileSync:d,classifyOwnerLiveness:h,createTtlMemo:pe,parseBooleanLiteral:c,isRecord:a,resolveIosSimulatorDeviceSetPath:be,emitRequestProgress:ye,getRequestSignal:ve,isRequestCanceled:_e,classifyBootFailure:me,bootFailureHint:he,runAppleToolCommand:xe,runXcrun:Se,readApplePlistJson:Ce,buildSimctlArgsForDevice:we,resolveIosPhysicalDeviceControl:Te,visitXmlPlistEntries:Kt,leaseOwnerStateDir:qt,hasDeviceClaimAuthority:e=>Jt()?.(e)??!1};var mi=e({applyXctestRunnerAppIconFromDerivedPath:()=>Ni,cleanupRunnerLeasesForOwner:()=>Ai,detachIosRunnerSessionsForShutdown:()=>wi,hasCachedAppleRunnerArtifact:()=>Ci,hasLiveIosRunnerSession:()=>_i,notifyIosRunnerAppRelaunched:()=>gi,prepareIosRunner:()=>xi,prewarmAppleRunnerCache:()=>yi,prewarmIosRunnerSession:()=>bi,readRunnerSessionLiveness:()=>Ti,readStaleRunnerLease:()=>ji,releaseIosRunnerOnClose:()=>Ei,releaseSpeculativeIosRunnerSessionFor:()=>vi,resolveRunnerAppBundleId:()=>Si,runApplePressSeries:()=>ki,runAppleRunnerCommand:()=>hi,stopAllIosRunnerSessions:()=>Oi,stopIosRunnerSession:()=>Di,verifyLeaseRunnerPidIdentity:()=>Mi});const $=fi(pi),hi=$.runAppleRunnerCommand,gi=$.notifyIosRunnerAppRelaunched,_i=$.hasLiveIosRunnerSession,vi=$.releaseSpeculativeIosRunnerSessionFor,yi=$.prewarmAppleRunnerCache,bi=$.prewarmIosRunnerSession,xi=$.prepareIosRunner,Si=$.resolveRunnerAppBundleId,Ci=$.hasCachedAppleRunnerArtifact,wi=$.detachIosRunnerSessionsForShutdown,Ti=$.readRunnerSessionLiveness,Ei=$.releaseIosRunnerOnClose,Di=$.stopIosRunnerSession,Oi=$.stopAllIosRunnerSessions,ki=$.runApplePressSeries,Ai=$.cleanupRunnerLeasesForOwner,ji=$.readStaleRunnerLease,Mi=$.verifyLeaseRunnerPidIdentity,Ni=$.applyXctestRunnerAppIconFromDerivedPath;export{Oi as _,gi as a,bi as c,Ei as d,vi as f,mi as g,hi as h,_i as i,Ti as l,ki as m,wi as n,xi as o,Si as p,Ci as r,yi as s,Ni as t,ji as u,Di as v,Mi as y};
@@ -1,4 +1,4 @@
1
- import{D as e,O as t}from"./sdk-contracts.js";import{g as n,r}from"./sdk-batch-runner.js";import{E as i,_ as a,d as o,f as s,l as c,o as l,u,w as d}from"./sdk-device.js";import{Yt as f,en as p,tn as m}from"./sdk-batch.js";import"./device.js";import{s as h}from"./device-rotation.js";import{c as ee,r as g}from"./diagnostics.js";import{n as te}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{n as ne}from"./scoped-provider.js";import{i as re,n as ie,r as ae}from"./ios-snapshot-planning.js";import{n as oe,t as se}from"./fold-runtime.js";import{t as ce}from"./request.js";import{n as le,r as ue,t as de}from"./application-lifecycle-runtime.js";import{A as fe,C as pe,D as me,G as he,H as ge,I as _e,L as ve,N as ye,O as be,P as xe,R as Se,T as Ce,U as we,V as Te,a as Ee,b as De,g as Oe,j as ke,o as Ae,p as je,t as Me,u as Ne,v as Pe,w as Fe,x as Ie,z as Le}from"./alert-runtime.js";import{n as Re}from"./audio-probe-runtime.js";import{n as ze}from"./perf-runtime.js";import{i as Be,t as Ve}from"./touch-runtime.js";import{a as He,n as Ue}from"./durable-resource.js";import{n as We,t as Ge}from"./async-lifecycle.js";import{a as Ke,c as qe,d as Je,f as Ye,l as Xe,n as Ze,o as Qe,s as $e,t as et,u as tt}from"./src7.js";import{n as nt,t as rt}from"./screen-recording-completion.js";import{a as it,i as at,n as ot,o as st,r as ct,s as lt,t as ut}from"./stop-sequence.js";import{n as dt}from"./screen-recording-runtime.js";import{t as ft}from"./ios-system-surface.js";import{i as pt,r as mt}from"./gesture-admission.js";import{t as ht}from"./interactor-operation-catalog.js";import{a as gt,i as _t,n as vt,r as yt,t as bt}from"./perf-runtime-operation-builder.js";import{t as xt}from"./app-log-runtime.js";import{n as St}from"./artifact-paths.js";import{i as Ct,r as wt}from"./managed-device-scope.js";import{a as Tt,n as Et,o as Dt}from"./application-lifecycle-interaction.js";import{o as Ot,s as kt}from"./config.js";import{a as At,o as jt}from"./tool-provider.js";import{n as Mt}from"./apps-simctl.js";import{i as Nt,o as Pt,r as Ft}from"./simulator.js";import{a as It}from"./helper.js";import{r as Lt}from"./display-inventory.js";import{t as Rt}from"./multitouch-support.js";import{n as _,t as zt}from"./simulator-state.js";import{n as Bt,r as Vt,t as Ht}from"./snapshot-process.js";import Ut from"node:path";import{randomUUID as Wt}from"node:crypto";function Gt(e){let t=Ct();return Object.freeze(t?{...ne({...e},e=>Pt(t,e))}:e)}function Kt(e){return it(e)?Object.freeze({available:!0}):s(e)||o(e)&&e.kind===`simulator`?Object.freeze({available:!1,reason:`unsupported-device-backend`,hint:`audio probe capture requires a macOS host.`}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`audio is supported for macOS sessions and iOS simulators on macOS hosts; physical iOS devices expose no host audio tap.`})}function qt(e){let{resolveHost:t,device:n,owner:r}=e;return Object.freeze({...bt({platform:`Apple`,expectedProfileKind:`xctrace`,start:async e=>await t().start(n,r,e),reattach:async e=>await t().reattach(n,e),cleanup:async e=>await t().cleanup(n,e),writeProfileReport:async e=>await t().writeProfileReport(e)}),perfFrames:async({appId:e})=>({metric:e?await _t(t().sampleFrames(n,e)):vt(`Apple`,`bundle ID`),sampling:await t().frameSampling(n)}),perfMemorySample:async({appId:e})=>({metric:e?await _t(t().sampleMemory(n,e)):vt(`Apple`,`bundle ID`),sampling:await t().memorySampling(n)}),perfMemorySnapshot:async({appId:e,kind:r,outPath:i,artifactsDir:a})=>{let o=r??`memgraph`,s={...await t().memorySnapshotSupport(n),androidHprof:!1,heapprofd:!1};if(o!==`memgraph`)return gt(`Apple`,o,s,`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`);if(!e)throw yt();let c=i??Ut.join(a,`memory-memgraph-${Jt()}.memgraph`);return{artifact:await t().captureMemorySnapshot(n,e,c),support:s,sampling:{method:`xcrun memgraph`,description:`Native Apple memory graph captured for offline inspection.`,defaultKind:`memgraph`,artifactOnly:!0}}}})}function Jt(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}const v=Object.freeze({available:!0}),y=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),b=Qt(`Gestures are supported only for Apple simulators and devices.`),Yt=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:mt}),Xt=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:pt}),Zt=Qt(`scroll is supported only for Apple simulators and devices.`);function Qt(e){return Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:e})}function $t(e){return{...ye({unsupported:en(e),plan:tn(e),directionalFling:tn(e),multiTouch:nn(e),targetAuthoredDrag:rn(e),viewport:an(e)}),...fe({scroll:on(e)})}}function en(e){return e.appleOs===`watchos`||e.appleOs===`visionos`?y:b}function tn(e){return e.appleOs===`watchos`||e.appleOs===`visionos`?y:x(e)?v:b}function nn(e){if(e.appleOs===`watchos`)return y;if(!x(e))return b;let t=d(e);if(t!==`ios`&&t!==`ipados`){let e=Rt[t];return Object.freeze({available:!1,reason:`unsupported-platform-leaf`,...e===void 0?{}:{hint:e}})}return e.kind===`simulator`?v:Yt}function rn(e){return x(e)?(e.appleOs===void 0?e.target!==`desktop`&&e.target!==`tv`:e.appleOs===`ios`||e.appleOs===`ipados`)?v:Xt:b}function an(e){return e.appleOs===`watchos`?y:x(e)?v:b}function on(e){return x(e)?v:Zt}function x(e){return e.kind===`simulator`||e.kind===`device`}const S=`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`;function C(e){return s(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`}const sn=Object.freeze({resourceKind:xt,version:1,encode:e=>({...e}),decode:e=>!ln(e.transport)||!un(e.backend)||!mn(e.outputPath)||!fn(e.pidPath)||!dn(e.transport,e.backend)?cn():{status:`decoded`,descriptor:Object.freeze({transport:e.transport,backend:e.backend,outputPath:e.outputPath,...e.pidPath===void 0?{}:{pidPath:e.pidPath}})}});function cn(){return{status:`invalid`,message:`Invalid Apple app-log descriptor`}}function ln(e){return e===`apple-log-stream`||e===`coredevice-console`}function un(e){return e===`ios-simulator`||e===`ios-device`||e===`macos`}function dn(e,t){return e===`coredevice-console`?t===`ios-device`:t!==`ios-device`}function fn(e){return e===void 0||mn(e)}function pn(e){if(!e.device.appleOs)throw TypeError(`Apple app-log persistence requires an explicit appleOs identity`);return Ue({resourceKind:xt,sessionId:e.sessionId,device:{id:e.device.id,family:`apple`,appleOs:e.device.appleOs,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:He(sn,e.descriptor)})}function mn(e){return typeof e==`string`&&e.trim().length>0}const hn={message:`iOS physical-device app console capture is not supported by the installed devicectl.`,hint:`This devicectl does not expose process launch --console. Markers can still be written to app.log, but app output is not being captured. Use an iOS simulator for agent-device app logs or inspect physical-device logs in Console.app/Xcode until this Xcode toolchain exposes scriptable console capture.`},gn={message:`Could not verify iOS physical-device app console capture support.`,hint:`Retry logs clear --restart. If the probe keeps failing, run logs doctor and inspect the request diagnostics for the devicectl help command.`};async function _n(e,t){try{let n=await e.appleTools.run({tool:`devicectl`,args:[`device`,`process`,`launch`,`--help`],allowFailure:!0,timeoutMs:5e3},t),r=n.stderr.trim()||void 0;if(n.exitCode!==0)return{supported:!1,reason:`probe-failed`,stderr:r};let i=`${n.stdout}\n${n.stderr}`;return/\bUSAGE:\s+devicectl device process launch\b/i.test(i)&&/--console\b/.test(i)&&/--terminate-existing\b/.test(i)?{supported:!0,...r?{stderr:r}:{}}:{supported:!1,reason:`unsupported`,...r?{stderr:r}:{}}}catch(e){if(t?.aborted)throw t.reason;return{supported:!1,reason:`probe-failed`,...e instanceof Error?{stderr:e.message}:{}}}}async function vn(e,t,n,r){let i={},a=n?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`];if(s(t))i.logAvailable=!!await e.commands.which(`log`);else if(t.kind===`simulator`)i.simctlAvailable=await lt(async()=>st(await e.appleTools.run({tool:`simctl`,args:[`help`],allowFailure:!0},r)),r);else if(t.iosPhysicalDeviceBackend===`xctest`)i.devicectlAvailable=!1,i.devicectlConsoleCapture=!1,a.push(S);else{i.devicectlAvailable=await lt(async()=>st(await e.appleTools.run({tool:`devicectl`,args:[`--version`],allowFailure:!0},r)),r);let t=await _n(e,r);if(i.devicectlConsoleCapture=t.supported,!t.supported){let e=t.reason===`unsupported`?hn:gn;a.push(`${e.message} ${e.hint}`)}}return{backend:C(t),checks:i,notes:a}}function yn(e,t){let n=Sn(e),r=[`subsystem == "${n}"`,`subsystem CONTAINS "${n}"`,`processImagePath ENDSWITH[c] "/${n}"`,`senderImagePath ENDSWITH[c] "/${n}"`];if(t){let e=Sn(t);r.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return r.join(` OR `)}function bn(e){return[...e.simulatorSetPath?[`simctl`,`--set`,e.simulatorSetPath]:[`simctl`],`spawn`,e.deviceId,`log`,`stream`,`--style`,`compact`,`--level`,`info`,`--predicate`,yn(e.appBundleId,e.executableName)]}function xn(e,t){return[`devicectl`,`device`,`process`,`launch`,`--device`,e,`--console`,`--terminate-existing`,t]}function Sn(e){return e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}async function Cn(e,t,n,r,i){wn(t),Qe(e,n);let a=C(t),o=await En(e,t,n.appBundleId,i),s=new Ge,c=!1;try{let l=await e.outputs.openAppend(n.outputPath);s.defer(async()=>{c||await l[Symbol.asyncDispose]()}),i?.throwIfAborted();let u=await Tn(e,t,o,l,n.pidPath,i);s.defer(async()=>{c||await u[Symbol.asyncDispose]()});let d=On(e,u,l,a,n.outputPath),f={transport:a===`ios-device`?`coredevice-console`:`apple-log-stream`,backend:a,outputPath:n.outputPath,...n.pidPath===void 0?{}:{pidPath:n.pidPath}},p=Ye(d,pn({sessionId:n.sessionId,device:t,owner:r,fence:n.fence,descriptor:f}));return c=!0,p}finally{await s[Symbol.asyncDispose]()}}function wn(t){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS app logs are not supported`);if(o(t)&&t.kind===`device`&&t.iosPhysicalDeviceBackend===`xctest`)throw new e(`UNSUPPORTED_OPERATION`,S,{hint:S})}async function Tn(t,n,r,i,a,s){if(o(n)&&n.kind===`device`){let n=await _n(t,s);if(!n.supported){let t=n.reason===`unsupported`?hn:gn;throw new e(n.reason===`unsupported`?`UNSUPPORTED_OPERATION`:`COMMAND_FAILED`,t.message,{backend:`ios-device`,hint:t.hint,stderr:n.stderr})}}return s?.throwIfAborted(),await t.processes.start({command:{kind:`host`,request:r},output:i,...a?{markerPath:a}:{}})}async function En(e,t,n,r){if(s(t))return{executable:`log`,args:[`stream`,`--style`,`compact`,`--predicate`,yn(n)],allowFailure:!0};if(t.kind===`device`)return{executable:`xcrun`,args:xn(t.id,n),allowFailure:!0};let i=await Dn(e,t,n,r);return{executable:`xcrun`,args:bn({deviceId:t.id,appBundleId:n,executableName:i,simulatorSetPath:t.simulatorSetPath}),allowFailure:!0}}async function Dn(e,t,n,r){let i=t.simulatorSetPath?[`--set`,t.simulatorSetPath]:[],a=await e.appleTools.run({tool:`simctl`,args:[...i,`get_app_container`,t.id,n,`app`],allowFailure:!0,timeoutMs:4e3},r),o=a.exitCode===0?a.stdout.trim():``;if(!o)return;let s=await e.commands.run({executable:`plutil`,args:[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,Ut.join(o,`Info.plist`)],allowFailure:!0,timeoutMs:4e3},r);return s.exitCode===0&&s.stdout.trim()||void 0}function On(e,t,n,r,i){let a=e.clock.now(),o=`active`;t.wait.then(e=>{o=e.exitCode===0?`ended`:`failed`},()=>{o=`failed`});let s;return tt({inspect:()=>({backend:r,state:o,startedAt:a}),finish:async()=>s??=(async()=>(await kn([async()=>await t.terminate(),async()=>await t.wait.then(()=>void 0),async()=>await t[Symbol.asyncDispose](),async()=>await n[Symbol.asyncDispose]()])).length>0?(o=`failed`,{status:`cleanup-pending`,reason:`transport-failed`,message:`Apple app-log cleanup did not settle every owned resource`}):(o=`ended`,{status:`completed`,result:{backend:r,outputPath:i,completedAt:e.clock.now()}}))()})}async function kn(e){let t=[];for(let n of e)try{await n()}catch(e){t.push(e)}return t}const w=f(`apple`),T=Object.freeze({available:!0});function An(t){return Object.freeze({owner:w,ownsDevice:e=>e.platform===`apple`,inspectFacts:async e=>Mn(e),bind:async n=>{if(n.intent.kind===`exact-owner`&&!p(n.intent.owner,w))throw new e(`UNSUPPORTED_OPERATION`,`Apple app-log owner identity does not match`);return jn(t,n.device,n.scope.signal)},shutdown:async()=>void 0})}function jn(t,n,r){if(n.platform!==`apple`)throw new e(`UNSUPPORTED_PLATFORM`,`Apple app-log owner cannot bind ${n.platform}`);let i=Je({codec:sn,reattach:async(e,r)=>e.backend!==C(n)||!Ke(t,r.sessionId,e)?{status:`unreattachable`,reason:`descriptor-invalid`,message:`Apple app-log descriptor does not match the bound device or owning session`}:await qe(t,e.pidPath),cleanup:async(e,r)=>e.backend===C(n)&&Ke(t,r.sessionId,e)?await $e(t,e.pidPath):{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`Apple app-log descriptor does not match the bound device or owning session`}}),a=Object.freeze({appLogInspect:async()=>({backend:C(n)}),appLogDoctor:async({appBundleId:e})=>await vn(t,n,e,r),appLogStart:async e=>await Cn(t,n,e,w,r),...i});return Object.freeze({device:n,owner:w,facts:Mn(n),operations:a,[Symbol.asyncDispose]:async()=>void 0})}function Mn(e){if(e.appleOs===`watchos`)return Nn(e);let t=o(e)&&e.kind===`device`&&e.iosPhysicalDeviceBackend===`xctest`?{available:!1,reason:`unsupported-device-backend`,hint:S}:T;return Object.freeze({device:{family:`apple`,appleOs:e.appleOs,kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend},providerMode:`local`},operations:{appLogInspect:t,appLogDoctor:t,appLogStart:t,appLogReattach:T,appLogCleanup:T}})}function Nn(e){let t=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`watchOS app logs are not supported.`});return Object.freeze({device:{family:`apple`,appleOs:`watchos`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:`local`},operations:{appLogInspect:t,appLogDoctor:t,appLogStart:t,appLogReattach:t,appLogCleanup:t}})}async function Pn(e,t,n,r){let i=C(t),a=await e.appLogs.readRecent(n.sessionId,n.maxScanLines),o=Ze(a.text,{...n,path:a.path,exists:a.exists,lineNumberOffset:a.skippedLines,backend:i}),s=[];if(In(t,n,o.dump)){let i=await Ln(e,t,n,a.path,r);i&&(o=Fn(s,o,i,n.maxEntries))}return Bn(s,t,n),zn(s,o.dump),o.dump.entries.length===0&&s.push(Vn(t)),Object.freeze({source:`app-log`,backend:i,dump:o.dump,notes:Object.freeze(s)})}function Fn(e,t,n,r){let i=n.scan.dump.entries.length;return i===0&&(n.scan.dump.unnamedRequests??0)===0?(n.lineCount>0&&e.push(`Recovered ${n.lineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`),t):(i>0&&e.push(`Recovered ${i} iOS simulator HTTP entr${i===1?`y`:`ies`} from simctl log show (${n.lineCount} app log lines scanned).`),et(n.scan,t,r))}function In(e,t,n){return o(e)&&e.kind===`simulator`&&!!t.appBundleId&&n.entries.length===0}async function Ln(e,t,n,r,i){let a=[...t.simulatorSetPath?[`--set`,t.simulatorSetPath]:[],`spawn`,t.id,`log`,`show`,`--style`,`compact`,`--info`,`--predicate`,Rn(n.appBundleId)],o=n.appLogSnapshot?.startedAt;a.push(...typeof o==`number`&&Number.isFinite(o)&&o>0?[`--start`,`@${Math.floor(o/1e3)}`]:[`--last`,`5m`]);let s=await e.appleTools.run({tool:`simctl`,args:a,allowFailure:!0,timeoutMs:4e3},i);if(s.exitCode!==0||!s.stdout.trim())return;let c=s.stdout.split(`
1
+ import{D as e,O as t}from"./sdk-contracts.js";import{_ as n,i as r}from"./sdk-batch-runner.js";import{E as i,_ as a,d as o,f as s,l as c,o as l,u,w as d}from"./sdk-device.js";import{Yt as f,en as p,tn as m}from"./sdk-batch.js";import"./device.js";import{s as h}from"./device-rotation.js";import{c as ee,r as g}from"./diagnostics.js";import{n as te}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{n as ne}from"./scoped-provider.js";import{i as re,n as ie,r as ae}from"./ios-snapshot-planning.js";import{n as oe,t as se}from"./fold-runtime.js";import{t as ce}from"./request.js";import{n as le,r as ue,t as de}from"./application-lifecycle-runtime.js";import{A as fe,C as pe,D as me,G as he,H as ge,I as _e,L as ve,N as ye,O as be,P as xe,R as Se,T as Ce,U as we,V as Te,a as Ee,b as De,g as Oe,j as ke,o as Ae,p as je,t as Me,u as Ne,v as Pe,w as Fe,x as Ie,z as Le}from"./alert-runtime.js";import{n as Re}from"./audio-probe-runtime.js";import{n as ze}from"./perf-runtime.js";import{i as Be,t as Ve}from"./touch-runtime.js";import{a as He,n as Ue}from"./durable-resource.js";import{n as We,t as Ge}from"./async-lifecycle.js";import{a as Ke,c as qe,d as Je,f as Ye,l as Xe,n as Ze,o as Qe,s as $e,t as et,u as tt}from"./src7.js";import{n as nt,t as rt}from"./screen-recording-completion.js";import{a as it,i as at,n as ot,o as st,r as ct,s as lt,t as ut}from"./stop-sequence.js";import{n as dt}from"./screen-recording-runtime.js";import{t as ft}from"./ios-system-surface.js";import{i as pt,r as mt}from"./gesture-admission.js";import{t as ht}from"./interactor-operation-catalog.js";import{a as gt,i as _t,n as vt,r as yt,t as bt}from"./perf-runtime-operation-builder.js";import{t as xt}from"./app-log-runtime.js";import{n as St}from"./artifact-paths.js";import{i as Ct,r as wt}from"./managed-device-scope.js";import{a as Tt,n as Et,o as Dt}from"./application-lifecycle-interaction.js";import{o as Ot,s as kt}from"./config.js";import{a as At,o as jt}from"./tool-provider.js";import{n as Mt}from"./apps-simctl.js";import{i as Nt,o as Pt,r as Ft}from"./simulator.js";import{a as It}from"./helper.js";import{r as Lt}from"./display-inventory.js";import{t as Rt}from"./multitouch-support.js";import{n as _,t as zt}from"./simulator-state.js";import{n as Bt,r as Vt,t as Ht}from"./snapshot-process.js";import Ut from"node:path";import{randomUUID as Wt}from"node:crypto";function Gt(e){let t=Ct();return Object.freeze(t?{...ne({...e},e=>Pt(t,e))}:e)}function Kt(e){return it(e)?Object.freeze({available:!0}):s(e)||o(e)&&e.kind===`simulator`?Object.freeze({available:!1,reason:`unsupported-device-backend`,hint:`audio probe capture requires a macOS host.`}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`audio is supported for macOS sessions and iOS simulators on macOS hosts; physical iOS devices expose no host audio tap.`})}function qt(e){let{resolveHost:t,device:n,owner:r}=e;return Object.freeze({...bt({platform:`Apple`,expectedProfileKind:`xctrace`,start:async e=>await t().start(n,r,e),reattach:async e=>await t().reattach(n,e),cleanup:async e=>await t().cleanup(n,e),writeProfileReport:async e=>await t().writeProfileReport(e)}),perfFrames:async({appId:e})=>({metric:e?await _t(t().sampleFrames(n,e)):vt(`Apple`,`bundle ID`),sampling:await t().frameSampling(n)}),perfMemorySample:async({appId:e})=>({metric:e?await _t(t().sampleMemory(n,e)):vt(`Apple`,`bundle ID`),sampling:await t().memorySampling(n)}),perfMemorySnapshot:async({appId:e,kind:r,outPath:i,artifactsDir:a})=>{let o=r??`memgraph`,s={...await t().memorySnapshotSupport(n),androidHprof:!1,heapprofd:!1};if(o!==`memgraph`)return gt(`Apple`,o,s,`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`);if(!e)throw yt();let c=i??Ut.join(a,`memory-memgraph-${Jt()}.memgraph`);return{artifact:await t().captureMemorySnapshot(n,e,c),support:s,sampling:{method:`xcrun memgraph`,description:`Native Apple memory graph captured for offline inspection.`,defaultKind:`memgraph`,artifactOnly:!0}}}})}function Jt(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}const v=Object.freeze({available:!0}),y=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),b=Qt(`Gestures are supported only for Apple simulators and devices.`),Yt=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:mt}),Xt=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:pt}),Zt=Qt(`scroll is supported only for Apple simulators and devices.`);function Qt(e){return Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:e})}function $t(e){return{...ye({unsupported:en(e),plan:tn(e),directionalFling:tn(e),multiTouch:nn(e),targetAuthoredDrag:rn(e),viewport:an(e)}),...fe({scroll:on(e)})}}function en(e){return e.appleOs===`watchos`||e.appleOs===`visionos`?y:b}function tn(e){return e.appleOs===`watchos`||e.appleOs===`visionos`?y:x(e)?v:b}function nn(e){if(e.appleOs===`watchos`)return y;if(!x(e))return b;let t=d(e);if(t!==`ios`&&t!==`ipados`){let e=Rt[t];return Object.freeze({available:!1,reason:`unsupported-platform-leaf`,...e===void 0?{}:{hint:e}})}return e.kind===`simulator`?v:Yt}function rn(e){return x(e)?(e.appleOs===void 0?e.target!==`desktop`&&e.target!==`tv`:e.appleOs===`ios`||e.appleOs===`ipados`)?v:Xt:b}function an(e){return e.appleOs===`watchos`?y:x(e)?v:b}function on(e){return x(e)?v:Zt}function x(e){return e.kind===`simulator`||e.kind===`device`}const S=`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`;function C(e){return s(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`}const sn=Object.freeze({resourceKind:xt,version:1,encode:e=>({...e}),decode:e=>!ln(e.transport)||!un(e.backend)||!mn(e.outputPath)||!fn(e.pidPath)||!dn(e.transport,e.backend)?cn():{status:`decoded`,descriptor:Object.freeze({transport:e.transport,backend:e.backend,outputPath:e.outputPath,...e.pidPath===void 0?{}:{pidPath:e.pidPath}})}});function cn(){return{status:`invalid`,message:`Invalid Apple app-log descriptor`}}function ln(e){return e===`apple-log-stream`||e===`coredevice-console`}function un(e){return e===`ios-simulator`||e===`ios-device`||e===`macos`}function dn(e,t){return e===`coredevice-console`?t===`ios-device`:t!==`ios-device`}function fn(e){return e===void 0||mn(e)}function pn(e){if(!e.device.appleOs)throw TypeError(`Apple app-log persistence requires an explicit appleOs identity`);return Ue({resourceKind:xt,sessionId:e.sessionId,device:{id:e.device.id,family:`apple`,appleOs:e.device.appleOs,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:He(sn,e.descriptor)})}function mn(e){return typeof e==`string`&&e.trim().length>0}const hn={message:`iOS physical-device app console capture is not supported by the installed devicectl.`,hint:`This devicectl does not expose process launch --console. Markers can still be written to app.log, but app output is not being captured. Use an iOS simulator for agent-device app logs or inspect physical-device logs in Console.app/Xcode until this Xcode toolchain exposes scriptable console capture.`},gn={message:`Could not verify iOS physical-device app console capture support.`,hint:`Retry logs clear --restart. If the probe keeps failing, run logs doctor and inspect the request diagnostics for the devicectl help command.`};async function _n(e,t){try{let n=await e.appleTools.run({tool:`devicectl`,args:[`device`,`process`,`launch`,`--help`],allowFailure:!0,timeoutMs:5e3},t),r=n.stderr.trim()||void 0;if(n.exitCode!==0)return{supported:!1,reason:`probe-failed`,stderr:r};let i=`${n.stdout}\n${n.stderr}`;return/\bUSAGE:\s+devicectl device process launch\b/i.test(i)&&/--console\b/.test(i)&&/--terminate-existing\b/.test(i)?{supported:!0,...r?{stderr:r}:{}}:{supported:!1,reason:`unsupported`,...r?{stderr:r}:{}}}catch(e){if(t?.aborted)throw t.reason;return{supported:!1,reason:`probe-failed`,...e instanceof Error?{stderr:e.message}:{}}}}async function vn(e,t,n,r){let i={},a=n?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`];if(s(t))i.logAvailable=!!await e.commands.which(`log`);else if(t.kind===`simulator`)i.simctlAvailable=await lt(async()=>st(await e.appleTools.run({tool:`simctl`,args:[`help`],allowFailure:!0},r)),r);else if(t.iosPhysicalDeviceBackend===`xctest`)i.devicectlAvailable=!1,i.devicectlConsoleCapture=!1,a.push(S);else{i.devicectlAvailable=await lt(async()=>st(await e.appleTools.run({tool:`devicectl`,args:[`--version`],allowFailure:!0},r)),r);let t=await _n(e,r);if(i.devicectlConsoleCapture=t.supported,!t.supported){let e=t.reason===`unsupported`?hn:gn;a.push(`${e.message} ${e.hint}`)}}return{backend:C(t),checks:i,notes:a}}function yn(e,t){let n=Sn(e),r=[`subsystem == "${n}"`,`subsystem CONTAINS "${n}"`,`processImagePath ENDSWITH[c] "/${n}"`,`senderImagePath ENDSWITH[c] "/${n}"`];if(t){let e=Sn(t);r.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return r.join(` OR `)}function bn(e){return[...e.simulatorSetPath?[`simctl`,`--set`,e.simulatorSetPath]:[`simctl`],`spawn`,e.deviceId,`log`,`stream`,`--style`,`compact`,`--level`,`info`,`--predicate`,yn(e.appBundleId,e.executableName)]}function xn(e,t){return[`devicectl`,`device`,`process`,`launch`,`--device`,e,`--console`,`--terminate-existing`,t]}function Sn(e){return e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}async function Cn(e,t,n,r,i){wn(t),Qe(e,n);let a=C(t),o=await En(e,t,n.appBundleId,i),s=new Ge,c=!1;try{let l=await e.outputs.openAppend(n.outputPath);s.defer(async()=>{c||await l[Symbol.asyncDispose]()}),i?.throwIfAborted();let u=await Tn(e,t,o,l,n.pidPath,i);s.defer(async()=>{c||await u[Symbol.asyncDispose]()});let d=On(e,u,l,a,n.outputPath),f={transport:a===`ios-device`?`coredevice-console`:`apple-log-stream`,backend:a,outputPath:n.outputPath,...n.pidPath===void 0?{}:{pidPath:n.pidPath}},p=Ye(d,pn({sessionId:n.sessionId,device:t,owner:r,fence:n.fence,descriptor:f}));return c=!0,p}finally{await s[Symbol.asyncDispose]()}}function wn(t){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS app logs are not supported`);if(o(t)&&t.kind===`device`&&t.iosPhysicalDeviceBackend===`xctest`)throw new e(`UNSUPPORTED_OPERATION`,S,{hint:S})}async function Tn(t,n,r,i,a,s){if(o(n)&&n.kind===`device`){let n=await _n(t,s);if(!n.supported){let t=n.reason===`unsupported`?hn:gn;throw new e(n.reason===`unsupported`?`UNSUPPORTED_OPERATION`:`COMMAND_FAILED`,t.message,{backend:`ios-device`,hint:t.hint,stderr:n.stderr})}}return s?.throwIfAborted(),await t.processes.start({command:{kind:`host`,request:r},output:i,...a?{markerPath:a}:{}})}async function En(e,t,n,r){if(s(t))return{executable:`log`,args:[`stream`,`--style`,`compact`,`--predicate`,yn(n)],allowFailure:!0};if(t.kind===`device`)return{executable:`xcrun`,args:xn(t.id,n),allowFailure:!0};let i=await Dn(e,t,n,r);return{executable:`xcrun`,args:bn({deviceId:t.id,appBundleId:n,executableName:i,simulatorSetPath:t.simulatorSetPath}),allowFailure:!0}}async function Dn(e,t,n,r){let i=t.simulatorSetPath?[`--set`,t.simulatorSetPath]:[],a=await e.appleTools.run({tool:`simctl`,args:[...i,`get_app_container`,t.id,n,`app`],allowFailure:!0,timeoutMs:4e3},r),o=a.exitCode===0?a.stdout.trim():``;if(!o)return;let s=await e.commands.run({executable:`plutil`,args:[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,Ut.join(o,`Info.plist`)],allowFailure:!0,timeoutMs:4e3},r);return s.exitCode===0&&s.stdout.trim()||void 0}function On(e,t,n,r,i){let a=e.clock.now(),o=`active`;t.wait.then(e=>{o=e.exitCode===0?`ended`:`failed`},()=>{o=`failed`});let s;return tt({inspect:()=>({backend:r,state:o,startedAt:a}),finish:async()=>s??=(async()=>(await kn([async()=>await t.terminate(),async()=>await t.wait.then(()=>void 0),async()=>await t[Symbol.asyncDispose](),async()=>await n[Symbol.asyncDispose]()])).length>0?(o=`failed`,{status:`cleanup-pending`,reason:`transport-failed`,message:`Apple app-log cleanup did not settle every owned resource`}):(o=`ended`,{status:`completed`,result:{backend:r,outputPath:i,completedAt:e.clock.now()}}))()})}async function kn(e){let t=[];for(let n of e)try{await n()}catch(e){t.push(e)}return t}const w=f(`apple`),T=Object.freeze({available:!0});function An(t){return Object.freeze({owner:w,ownsDevice:e=>e.platform===`apple`,inspectFacts:async e=>Mn(e),bind:async n=>{if(n.intent.kind===`exact-owner`&&!p(n.intent.owner,w))throw new e(`UNSUPPORTED_OPERATION`,`Apple app-log owner identity does not match`);return jn(t,n.device,n.scope.signal)},shutdown:async()=>void 0})}function jn(t,n,r){if(n.platform!==`apple`)throw new e(`UNSUPPORTED_PLATFORM`,`Apple app-log owner cannot bind ${n.platform}`);let i=Je({codec:sn,reattach:async(e,r)=>e.backend!==C(n)||!Ke(t,r.sessionId,e)?{status:`unreattachable`,reason:`descriptor-invalid`,message:`Apple app-log descriptor does not match the bound device or owning session`}:await qe(t,e.pidPath),cleanup:async(e,r)=>e.backend===C(n)&&Ke(t,r.sessionId,e)?await $e(t,e.pidPath):{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`Apple app-log descriptor does not match the bound device or owning session`}}),a=Object.freeze({appLogInspect:async()=>({backend:C(n)}),appLogDoctor:async({appBundleId:e})=>await vn(t,n,e,r),appLogStart:async e=>await Cn(t,n,e,w,r),...i});return Object.freeze({device:n,owner:w,facts:Mn(n),operations:a,[Symbol.asyncDispose]:async()=>void 0})}function Mn(e){if(e.appleOs===`watchos`)return Nn(e);let t=o(e)&&e.kind===`device`&&e.iosPhysicalDeviceBackend===`xctest`?{available:!1,reason:`unsupported-device-backend`,hint:S}:T;return Object.freeze({device:{family:`apple`,appleOs:e.appleOs,kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend},providerMode:`local`},operations:{appLogInspect:t,appLogDoctor:t,appLogStart:t,appLogReattach:T,appLogCleanup:T}})}function Nn(e){let t=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`watchOS app logs are not supported.`});return Object.freeze({device:{family:`apple`,appleOs:`watchos`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:`local`},operations:{appLogInspect:t,appLogDoctor:t,appLogStart:t,appLogReattach:t,appLogCleanup:t}})}async function Pn(e,t,n,r){let i=C(t),a=await e.appLogs.readRecent(n.sessionId,n.maxScanLines),o=Ze(a.text,{...n,path:a.path,exists:a.exists,lineNumberOffset:a.skippedLines,backend:i}),s=[];if(In(t,n,o.dump)){let i=await Ln(e,t,n,a.path,r);i&&(o=Fn(s,o,i,n.maxEntries))}return Bn(s,t,n),zn(s,o.dump),o.dump.entries.length===0&&s.push(Vn(t)),Object.freeze({source:`app-log`,backend:i,dump:o.dump,notes:Object.freeze(s)})}function Fn(e,t,n,r){let i=n.scan.dump.entries.length;return i===0&&(n.scan.dump.unnamedRequests??0)===0?(n.lineCount>0&&e.push(`Recovered ${n.lineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`),t):(i>0&&e.push(`Recovered ${i} iOS simulator HTTP entr${i===1?`y`:`ies`} from simctl log show (${n.lineCount} app log lines scanned).`),et(n.scan,t,r))}function In(e,t,n){return o(e)&&e.kind===`simulator`&&!!t.appBundleId&&n.entries.length===0}async function Ln(e,t,n,r,i){let a=[...t.simulatorSetPath?[`--set`,t.simulatorSetPath]:[],`spawn`,t.id,`log`,`show`,`--style`,`compact`,`--info`,`--predicate`,Rn(n.appBundleId)],o=n.appLogSnapshot?.startedAt;a.push(...typeof o==`number`&&Number.isFinite(o)&&o>0?[`--start`,`@${Math.floor(o/1e3)}`]:[`--last`,`5m`]);let s=await e.appleTools.run({tool:`simctl`,args:a,allowFailure:!0,timeoutMs:4e3},i);if(s.exitCode!==0||!s.stdout.trim())return;let c=s.stdout.split(`
2
2
  `).map(e=>e.trimEnd()).filter(e=>e.trim()&&!e.trim().startsWith(`Timestamp Ty Process[PID:TID]`));if(c.length!==0)return{scan:Ze(`${c.join(`
3
3
  `)}\n`,{...n,path:`${r} (simctl log show recovery)`,exists:!0,backend:`ios-simulator`}),lineCount:c.length}}function Rn(e){let t=e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`);return[`subsystem == "${t}"`,`subsystem CONTAINS "${t}"`,`processImagePath ENDSWITH[c] "/${t}"`,`senderImagePath ENDSWITH[c] "/${t}"`].join(` OR `)}function zn(e,t){let n=t.entries.filter(e=>e.pathUnavailable).length,r=t.unnamedRequests??0,i=n+r;if(i===0)return;let a=[`${i} request${i===1?``:`s`} reused a keep-alive connection, so CFNetwork logged no request URL.`];n>0&&a.push(`${n} listed against the origin the connection was opened for, without a path.`),r>0&&a.push(`${r} opened before this scan window and are missing from the entries entirely; scan more lines, or run logs clear --restart before the repro.`),a.push(`Absence of an endpoint in this dump does not prove it was not called.`),e.push(a.join(` `))}function Bn(e,t,n){n.appLogSnapshot?n.appLogSnapshot.state!==`active`&&e.length===0&&e.push(o(t)&&t.kind===`simulator`?`Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop.`:`Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.`):e.push(`Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests.`)}function Vn(e){return o(e)&&e.kind===`simulator`?`No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.`:o(e)?`No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.`:`No HTTP(s) entries were found in recent session app logs.`}async function Hn(e){let{host:n,snapshot:r,targetLabel:i,recorderWarning:a,nativePathDisposition:o}=e,s=r.invalidatedReason?{recorder:`lost`,why:`owner-session-lost`}:e.stopObservation;if(r.invalidatedReason&&!r.showTouches)throw Error(`recording invalidated: ${r.invalidatedReason}`);let c;try{c=await n.screenRecording.finalize.complete({outputPath:r.outPath,showTouches:!r.invalidatedReason&&r.showTouches,gestureEvents:r.gestureEvents,exportQuality:r.exportQuality??`medium`,targetLabel:i})}catch(e){throw t(e,`COMMAND_FAILED`)}let l=[...c.warning?[c.warning]:[],...a?[a]:[]];return rt(r,{...c,...l.length>0?{warning:l.join(` `)}:{},...r.invalidatedReason?{overlayWarning:`overlay unavailable: ${r.invalidatedReason}`}:{}},{stopObservation:s,...o===void 0?{}:{nativePathDisposition:o}})}async function Un(e){let{host:t,snapshot:n,targetLabel:r,collectedPath:i,exportPath:a,nativePath:o}=e;if(n.invalidatedReason&&!n.showTouches)throw Error(`recording invalidated: ${n.invalidatedReason}`);let s=e.overlayUnavailable??n.invalidatedReason,c;try{await t.screenRecording.outputs.copy({from:i,to:a}),c=await Wn(()=>t.screenRecording.finalize.complete({outputPath:a,showTouches:s===void 0&&n.showTouches,gestureEvents:n.gestureEvents,exportQuality:n.exportQuality??`medium`,targetLabel:r}))}catch(e){throw await t.screenRecording.outputs.remove(a),e}return{...c,...s===void 0?{}:{overlayWarning:`overlay unavailable: ${s}`},nativePathDisposition:await t.screenRecording.outputs.remove(o)===`removed`?`retired`:`retirable`}}async function Wn(e){try{return await e()}catch(e){throw t(e,`COMMAND_FAILED`)}}const Gn=[`outPath`,`startedAt`,`clientOutPath`,...ct],E=Object.freeze({resourceKind:dt,version:1,encode:e=>e.backend===`simctl`?{backend:e.backend,outputPath:e.outputPath,processes:e.processes.map(e=>({...e})),...e.recording===void 0?{}:{recording:{...e.recording}}}:{backend:e.backend,outputPath:e.outputPath,appBundleId:e.appBundleId,runnerSessionId:e.runnerSessionId,runnerAuthority:e.runnerAuthority,...e.remotePath===void 0?{}:{remotePath:e.remotePath}},decode:e=>rr(e)});function Kn(e){let{device:t,owner:n,input:r,descriptor:a}=e;return Ue({resourceKind:dt,sessionId:r.sessionId,device:i(t),owner:n,fence:r.fence,lifecycle:`open`,descriptor:He(E,a)})}function qn(e){let t={};for(let n of Gn)e[n]!==void 0&&Object.assign(t,{[n]:e[n]});return t}async function Jn(e,t,n,r){let i=E.decode(n);return i.status!==`decoded`||!pr(t,i.descriptor)?{status:`cleanup-pending`,reason:`manual-recovery-required`}:i.descriptor.backend===`simctl`?await Yn(e,i.descriptor.processes,r):await Zn(e,t,i.descriptor)}async function Yn(e,t,n){let r=await Promise.all(t.map(async t=>await e.screenRecording.apple.inspectProcess(t)));if(r.includes(`ownership-lost`))return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(r.every(e=>e===`missing`))return n!==void 0&&e.screenRecording.ownedProcesses.clear(Xn(n)),{status:`already-missing`};let i=await Promise.all(t.flatMap((t,n)=>r[n]===`owned-alive`?[e.screenRecording.apple.terminateProcess(t)]:[]));return i.includes(`ownership-lost`)?{status:`cleanup-pending`,reason:`ownership-fence-lost`}:(n!==void 0&&e.screenRecording.ownedProcesses.clear(Xn(n)),i.every(e=>e===`already-missing`)?{status:`already-missing`}:{status:`cleaned`})}function Xn(e){return{kind:`session`,sessionId:e}}async function Zn(e,t,n){try{let r=await e.screenRecording.apple.inspectRunner(t,n.runnerSessionId,n.runnerAuthority);return r===`missing`?{status:`already-missing`}:r===`ownership-lost`?{status:`cleanup-pending`,reason:`ownership-fence-lost`}:(await e.screenRecording.apple.runRunner(t,{kind:`stop`,appBundleId:n.appBundleId,runnerSessionId:n.runnerSessionId,runnerAuthority:n.runnerAuthority}),{status:`cleaned`})}catch(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:`Apple recording cleanup failed`}}}async function Qn(e){let{host:t,device:n,envelope:r}=e,i=E.decode(r.descriptor.body);return i.status===`decoded`?pr(n,i.descriptor)?i.descriptor.backend===`simctl`?await $n(e,i.descriptor):await tr(t,n,i.descriptor):D(`descriptor-invalid`,`Apple screen-recording descriptor does not match the bound device.`):D(`descriptor-invalid`,i.message)}async function $n(e,t){let n=await Promise.all(t.processes.map(async t=>await e.host.screenRecording.apple.inspectProcess(t)));if(!n.every(e=>e===`missing`))return D(`transport-not-reattachable`,n.includes(`ownership-lost`)?`Apple recording ownership no longer matches the durable descriptor.`:`Apple screen recordings require exact cleanup after daemon restart.`);let{recording:r}=t,i=er(ot(e.envelope.metadata),t.outputPath);return r===void 0||i!==void 0&&!await nr(e.host,i)?{status:`missing`}:{status:`restore-export`,recording:r,nativePath:t.outputPath,cleanup:async()=>await Yn(e.host,t.processes,e.envelope.sessionId)}}function er(e,t){if(e.finalization===void 0)return e.collectedPath??t}async function tr(e,t,n){let r=await e.screenRecording.apple.inspectRunner(t,n.runnerSessionId,n.runnerAuthority);return r===`missing`?{status:`missing`}:D(`transport-not-reattachable`,r===`ownership-lost`?`Apple recording ownership no longer matches the durable descriptor.`:`Apple screen recordings require exact cleanup after daemon restart.`)}async function nr(e,t){try{return await e.screenRecording.finalize.sniff({outputPath:t}),!0}catch{return!1}}function D(e,t){return{status:`unreattachable`,reason:e,message:t}}function rr(e){return typeof e.outputPath!=`string`||e.outputPath.length===0?k():e.backend===`simctl`?ir(e,e.outputPath):e.backend===`runner`?sr(e,e.outputPath):k()}function ir(e,t){let n=mr(e.processes),r=ar(e.recording);return!n||r===`invalid`?k():{status:`decoded`,descriptor:Object.freeze({backend:`simctl`,outputPath:t,processes:n,...r===void 0?{}:{recording:r}})}}function ar(e){if(e!==void 0)return n(e)&&or(e)?Object.freeze(e):`invalid`}function or(e){return O(e.outPath)&&lr(e.startedAt)&&cr(e.clientOutPath)&&at(e)}function sr(e,t){return!O(e.appBundleId)||!O(e.runnerSessionId)||!ur(e.runnerAuthority)||!dr(e.remotePath)?k():{status:`decoded`,descriptor:Object.freeze({backend:`runner`,outputPath:t,appBundleId:e.appBundleId,runnerSessionId:e.runnerSessionId,runnerAuthority:e.runnerAuthority,...e.remotePath===void 0?{}:{remotePath:e.remotePath}})}}function O(e){return typeof e==`string`&&e.length>0}function cr(e){return e===void 0||O(e)}function lr(e){return typeof e==`number`&&Number.isFinite(e)}function ur(e){return e===`local-lease`||e===`scoped-provider`}function dr(e){return e===void 0||fr(e)}function fr(e){return typeof e==`string`&&/^tmp\/agent-device-recording-\d+\.mp4$/.test(e)}function pr(e,t){return e.kind===`simulator`?t.backend===`simctl`:t.backend===`runner`?e.appleOs===`macos`?t.remotePath===void 0:o(e)?t.remotePath!==void 0&&fr(t.remotePath):t.remotePath===void 0:!1}function mr(e){if(!Array.isArray(e)||e.length===0)return;let t=e.filter(e=>typeof e==`object`&&!!e&&Number.isInteger(e.pid)&&(e.pid??0)>0&&typeof e.startTime==`string`&&e.startTime.length>0&&typeof e.command==`string`&&e.command.length>0);return t.length===e.length?Object.freeze([...t]):void 0}function k(){return{status:`invalid`,message:`Invalid Apple screen-recording descriptor`}}async function hr(e,t,n){if(e.kind!==`simulator`||t.scope!==`app`)return;let r=t.activeSessionApp?.bundleId;if(!r)throw TypeError(`App-scoped recording requires an active app session; open the app under test before recording.`);if(await n(r))throw TypeError(`App-scoped recording requires a real application session; open the app under test before recording.`)}const gr=`iOS recording`,_r=`simctl recordVideo`;function vr(e){return e.appleOs===`watchos`?Mr(`unsupported-platform-leaf`,`watchOS recording is not supported.`):o(e)&&e.kind===`device`&&e.iosPhysicalDeviceBackend===`xctest`?Mr(`unsupported-device-backend`,`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`):Object.freeze({available:!0})}function yr(e){let{host:t,device:n,owner:r,signal:i}=e;return Object.freeze({screenRecordingStart:async e=>await br({host:t,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async e=>{let r=await Qn({host:t,device:n,envelope:e.envelope});return r.status===`restore-export`?{status:`active`,handle:Sr({host:t,restored:r})}:r},screenRecordingCleanup:async e=>await Jn(t,n,e.envelope.descriptor.body,e.envelope.sessionId)})}async function br(e){return e.signal.throwIfAborted(),e.device.kind===`simulator`?await xr(e):await wr(e)}async function xr(e){let{host:t,device:n,owner:r,input:i,signal:a}=e;await hr(n,i,t.screenRecording.apple.isRunnerBundleId);let o=i.activeSessionApp?await t.screenRecording.apple.captureClockAnchor(n,i.activeSessionApp.bundleId,a):void 0,s=St(i.outputPath);await t.screenRecording.outputs.prepare(s);let c=await t.screenRecording.apple.startSimulator(n,s,a),l=c.markers;if(!l||l.length===0)throw await A(c).catch(()=>{}),Error(`simctl recordVideo did not expose durable process identity`);try{a.throwIfAborted(),t.screenRecording.ownedProcesses.replace({kind:`session`,sessionId:i.sessionId},l.map(e=>({...e,purpose:`simctl-screen-recording`})))}catch(e){try{t.screenRecording.ownedProcesses.clear({kind:`session`,sessionId:i.sessionId})}catch{}throw await A(c).catch(()=>{}),e}let u,d,f=async()=>{await c.terminate();let e=await c.wait;return d=e,u=Er(e),t.screenRecording.ownedProcesses.clear({kind:`session`,sessionId:i.sessionId}),{observation:{recorder:`confirmed`},...u===void 0?{}:{warning:`${u} before record stop; the video covers only what the recorder wrote before it stopped.`}}},p=jr(i,_r,{},o);return Ar({device:n,owner:r,input:i,descriptor:{backend:`simctl`,outputPath:s,processes:l,recording:qn(p)},snapshot:p,finish:(e,n)=>ut({snapshot:e,progress:n,steps:{stop:f,collect:async e=>{try{await Cr(t,s,e)}catch(e){throw Dr(e,u,d)}},finalize:async({collectedPath:n,exportPath:r})=>{try{return await Un({host:t,snapshot:e,targetLabel:gr,collectedPath:n,exportPath:r,nativePath:s})}catch(e){throw Dr(e,u,d)}},discard:async e=>{await t.screenRecording.outputs.remove(e)}}}),cleanup:async()=>{let e=await kr(c);return(e.status===`cleaned`||e.status===`already-missing`)&&t.screenRecording.ownedProcesses.clear({kind:`session`,sessionId:i.sessionId}),e}})}function Sr(e){let{host:t,restored:{recording:n,nativePath:r,cleanup:i}}=e,a=Object.freeze({...n,backend:_r,gestureEvents:[]});return nt(a,{finish:(e,i)=>ut({snapshot:e,progress:i,steps:{stop:async()=>({observation:{recorder:`confirmed`},warning:`simctl recordVideo had already ended when record stop reattached to it; the video covers only what the recorder wrote before it stopped.`}),collect:async e=>{await Cr(t,r,e)},finalize:async({collectedPath:i,exportPath:a})=>await Un({host:t,snapshot:e,targetLabel:gr,collectedPath:i,exportPath:a,nativePath:r,...n.showTouches?{overlayUnavailable:`the daemon that held the touch events ended before record stop`}:{}}),discard:async e=>{await t.screenRecording.outputs.remove(e)}}}),forceCleanup:async()=>await i()})}async function Cr(e,t,n){await e.screenRecording.outputs.copy({from:t,to:n}),await e.screenRecording.finalize.sniff({outputPath:n})}async function wr(e){let{host:t,device:n,owner:r,input:i,signal:a}=e,o=i.activeSessionApp?.bundleId;if(!o)throw TypeError(`Apple runner recording requires an active app session identity`);await t.screenRecording.outputs.prepare(i.outputPath);let s=await t.screenRecording.apple.runRunner(n,{kind:`start`,appBundleId:o,outputPath:i.outputPath,...i.fps===void 0?{}:{fps:i.fps}},a);if(!s.runnerSessionId||!s.runnerAuthority)throw Error(`Apple runner recording did not expose durable session ownership`);let c={runnerSessionId:s.runnerSessionId,runnerAuthority:s.runnerAuthority},l,u=()=>(l??=Tr(()=>t.screenRecording.apple.runRunner(n,{kind:`stop`,appBundleId:o,...c}).then(()=>void 0)).catch(e=>{throw l=void 0,e}),l);if(!Or(n,s.remotePath))throw await u().catch(()=>{}),Error(`Apple runner recording did not expose coherent durable media ownership`);try{a.throwIfAborted()}catch(e){throw await u().catch(()=>{}),e}return Ar({device:n,owner:r,input:i,descriptor:{backend:`runner`,outputPath:i.outputPath,appBundleId:o,...c,...s.remotePath===void 0?{}:{remotePath:s.remotePath}},snapshot:jr(i,`runner AVAssetWriter`,s),finish:async e=>(await u(),s.remotePath!==void 0&&await t.screenRecording.apple.retrieveRunnerRecording(n,s.remotePath,e.outPath),await Hn({host:t,snapshot:e,targetLabel:n.appleOs===`macos`?`macOS recording`:`iOS recording`,stopObservation:{recorder:`confirmed`},...s.remotePath===void 0?{}:{nativePathDisposition:`retirable`}})),cleanup:async()=>(await u(),{status:`cleaned`})})}async function Tr(e){try{return await e()}catch(e){throw t(e,`COMMAND_FAILED`)}}function Er(e){if(e.exitCode!==0)return e.signal?`simctl recordVideo was killed by ${e.signal}`:`simctl recordVideo exited with code ${e.exitCode}`}function Dr(n,r,i){let a=t(n,`COMMAND_FAILED`);return r===void 0||i===void 0||a.details?.reason!==`recording-output-unplayable`?n:new e(a.code,`${a.message}; ${r}`,te(i,{...a.details??{},...i.signal===void 0?{}:{signal:i.signal},retriable:!1,hint:`The recorder exited before record stop, so the next record stop reads the same file. Close this session to release the device, then record again.`}))}function Or(e,t){return e.appleOs===`macos`||!o(e)?t===void 0:t!==void 0&&/^tmp\/agent-device-recording-\d+\.mp4$/.test(t)}async function A(e){return await e.terminate(),await e.wait}async function kr(e){try{return await A(e),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:`Apple simulator cleanup failed`}}}function Ar(e){let{device:t,owner:n,input:r,descriptor:i,snapshot:a,finish:o,cleanup:s}=e,c=nt(a,{finish:o,forceCleanup:s});return Object.freeze({pendingHandle:new We(c),envelope:Kn({device:t,owner:n,input:r,descriptor:i})})}function jr(e,t,n={},r){let i=Date.now();return Object.freeze({backend:t,outPath:e.outputPath,...e.clientOutputPath===void 0?{}:{clientOutPath:e.clientOutputPath},startedAt:i,scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},...e.exportQuality===void 0?{}:{exportQuality:e.exportQuality},gestureEvents:[],...r===void 0?{}:{gestureClockOriginAtMs:r.wallClockAtMs,gestureClockOriginUptimeMs:r.uptimeMs},...n.recorderStartUptimeMs===void 0?{}:{gestureClockOriginAtMs:i,gestureClockOriginUptimeMs:n.recorderStartUptimeMs,runnerStartedAtUptimeMs:n.recorderStartUptimeMs},...n.runnerSessionId===void 0?{}:{runnerSessionId:n.runnerSessionId}})}function Mr(e,t){return Object.freeze({available:!1,reason:e,hint:t})}const Nr=15e3;async function j(e,t,n,r={}){return n.throwIfAborted(),await wt(t)||s(t)?{...t,booted:!0}:t.kind===`device`?(await e.deviceReadiness.applePhysical.ensureConnected(t,n),{...t,booted:!0}):t.kind===`simulator`?((await Pr(e,t)?`Booted`:await Rr(e,t,n))!==`Booted`&&(r.onColdBootStart?.(),e.deviceReadiness.appleAutomation.keepHot(t),await Fr(e,t,n,r.deadlineAtMs),await zr(e,n)),e.deviceReadiness.appleAutomation.keepHot(t),e.deviceReadiness.appleAutomation.markBooted(t),{...t,booted:!0}):{...t,booted:!0}}async function Pr(e,t){try{return await e.deviceReadiness.appleAutomation.wasRecentlyObservedBooted(t)}catch{return!1}}async function Fr(e,t,n,r=Date.now()+12e4){let i=!1;try{i=await Ir(e,t,n,r),await Lr(e,t,n,r)}catch(a){throw i&&n.aborted&&Br(e,t),n.throwIfAborted(),Date.now()>=r?N(t,a):a}}async function Ir(t,n,r,i){let a=await t.appleTools.run({tool:`simctl`,args:_(n,[`boot`,n.id]),allowFailure:!0,timeoutMs:M(i,n)},r),o=`${a.stdout}\n${a.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(a.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode});return!s}async function Lr(t,n,r,i){ce({type:`command`,status:`progress`,message:`Waiting for the Simulator to finish booting...`});let a=await t.appleTools.run({tool:`simctl`,args:_(n,[`bootstatus`,n.id,`-b`]),allowFailure:!0,timeoutMs:M(i,n)},r);if(a.exitCode!==0)throw new e(`COMMAND_FAILED`,`simctl bootstatus failed`,{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode});if(await zt(t.appleTools,n,r,Math.min(Nr,M(i,n)))!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{deviceId:n.id});if(Date.now()>=i)throw N(n)}function M(e,t){let n=e-Date.now();if(n<=0)throw N(t);return n}function N(t,n){return new e(`COMMAND_FAILED`,`Simulator did not finish booting within the startup budget`,{reason:`boot_timeout`,deviceId:t.id,hint:`The Simulator keeps booting in the background; a first boot can take several minutes. Retry once it is up, or pass a larger --timeout.`},n instanceof Error?n:void 0)}async function Rr(e,t,n){return await zt(e.appleTools,t,n,Nr)}async function zr(e,t){await e.commands.run({executable:`open`,args:[`-a`,`Simulator`],allowFailure:!0,timeoutMs:1e4},t)}function Br(e,t){e.appleTools.run({tool:`simctl`,args:_(t,[`shutdown`,t.id]),allowFailure:!0}).catch(()=>{})}const Vr=Object.freeze({resolveOpenTarget:`simulator`,prepareApplicationOpen:`simulator`,openApplication:`simulator`,applyRuntimeHints:`simulator`,clearRuntimeHints:`simulator`,closeApplication:`simulator`,finalizeApplicationClose:`simulator`,prepareAppleRunner:`runner`,configureProviderPortReverse:`simulator`,ensureReady:`simulator`,bootTarget:`simulator`,bootTargetHeadless:`simulator`,shutdownTarget:`simulator`,listApps:`simulator`,deployApp:`simulator`,materializeAppSource:`simulator`,deployMaterializedApp:`simulator`,sendPushNotification:`simulator`,appState:`simulator`,appLogStart:`simulator`,appLogInspect:`simulator`,appLogDoctor:`simulator`,appLogReattach:`simulator`,appLogCleanup:`simulator`,networkDump:`simulator`,audioProbeStart:`simulator`,audioProbeQuery:`simulator`,audioProbeReattach:`simulator`,audioProbeCleanup:`simulator`,readClipboard:`simulator`,writeClipboard:`simulator`,setSetting:`simulator`,readSetting:`simulator`,setFoldPose:`simulator`,captureSnapshot:`simulator`,captureSnapshotWithoutActiveApp:`simulator`,captureSnapshotWithCustomActions:`runner`,captureScreenshot:`simulator`,findText:`runner`,readTextAtPoint:`runner`,tapPoint:`runner`,tapRef:`runner`,tapElementSelector:`runner`,fillPoint:`runner`,fillRef:`runner`,longPressPoint:`runner`,hoverPoint:`runner`,hoverRef:`runner`,focusPoint:`runner`,typeText:`runner`,scrollDirection:`runner`,performGesturePlan:`runner`,performMultiTouchGesturePlan:`runner`,performTargetAuthoredDrag:`runner`,performDirectionalFlingPlan:`runner`,gestureViewport:`runner`,setViewport:`runner`,back:`runner`,home:`runner`,setOrientation:`runner`,appSwitcher:`runner`,actionButton:`runner`,tvRemote:`runner`,keyboardDismiss:`runner`,keyboardEnter:`runner`,keyboardStatus:`runner`,triggerAppEvent:`runner`,readAlert:`runner`,awaitAlert:`runner`,acceptAlert:`runner`,dismissAlert:`runner`,perfFrames:`runner`,perfMemorySample:`runner`,perfMemorySnapshot:`runner`,perfNativeCaptureStart:`runner`,perfNativeCaptureReattach:`runner`,perfNativeCaptureCleanup:`runner`,perfProfileReport:`runner`,screenRecordingStart:`runner`,screenRecordingReattach:`runner`,screenRecordingCleanup:`runner`});function Hr(e){return e===void 0?`possible`:e.some(e=>Vr[e]===`runner`)?`required`:`none`}const Ur=new Map([[`application-element-missing`,5e3],[`application-server-unavailable`,5e3],[`foreground-owner-unverified`,1e3],[`foreground-owner-changed`,1e3]]);function P(e){return e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`}function Wr(e){let t=re(ae({depth:1,interactiveOnly:!0}));return Object.freeze({awaitObservable:async(n,r,i)=>{if(!P(n))return`not-eligible`;let a;for(;;){let o=await e.resolveTarget(n,r,i).catch(()=>void 0);if(i.throwIfAborted(),!o)return`unobservable`;if(e.isBridgeDisabled(o))return g({level:`debug`,phase:`ios_launch_observation_skipped`,data:{reason:`circuit-disabled`,deviceId:n.id,generation:o.generation}}),`unobservable`;let s=await e.source.acquire({target:o,hint:t,signal:i});if(s.stage!==`failed`)return`observable`;i.throwIfAborted();let c=Ur.get(s.failure.code);if(c===void 0)return`unobservable`;let l=e.clock.now();if(a=Math.min(a??1/0,l+c),l>=a)return`unobservable`;await e.clock.sleep(Math.min(150,a-l),i)}}})}function Gr(e,t,n){let r=n&&P(e),i=r?Hr(t.execution.plannedOperations):void 0,a=o(e)&&t.surface===`app`&&t.positionals.length>0&&!!t.appBundleId&&i!==`none`;return{...i?{runnerDemand:i}:{},shouldPrewarmRunner:a,awaitPrewarmAfterOpen:t.relaunch&&!r}}function Kr(e,t,n,r){r.runnerDemand===`none`&&e.appleApplications.releaseSpeculativeRunner(t.device,n.execution).catch(()=>{})}async function qr(e,t,n,r,i,a){let o=Date.now();r&&P(t.device)&&i&&n.appBundleId&&(a.postOpenObservation=await i.awaitObservable(t.device,n.appBundleId,t.signal)),r&&a.postOpenObservation!==`observable`&&await e.clock.sleep(300,t.signal),a.postOpenSettleDurationMs=Math.max(0,Date.now()-o)}function Jr(e){let t=Et({device:e.device,signal:e.signal,resolveInteractor:e.host.localInteractors.resolve});return Object.freeze({resolveOpenTarget:async t=>await e.host.appleApplications.resolveOpenTarget(e.device,t),prepareApplicationOpen:async t=>{await j(e.host,e.device,e.signal,{deadlineAtMs:t.execution.startupDeadlineAtMs,onColdBootStart:t.prewarmRunnerOnColdBoot?()=>{e.host.appleApplications.prewarmRunnerCache(e.device,t.execution,e.signal).catch(()=>{})}:void 0})},openApplication:async n=>await Yr(e.host,t,n,e.observation),applyRuntimeHints:async t=>await e.host.appleApplications.applyRuntimeHints(e.device,t),clearRuntimeHints:async t=>await e.host.appleApplications.clearRuntimeHints(e.device,t),closeApplication:async n=>await ai(e.host,t,n),finalizeApplicationClose:async t=>await oi(e.host,e.device,e.signal,t),prepareAppleRunner:async t=>await si(e.host,e.device,e.signal,t),configureProviderPortReverse:fi})}async function Yr(e,t,n,r){let i={},a=F(t.device),o=ci(e,t,n,i),s=Gr(t.device,n,a);s.runnerDemand&&(i.runnerDemand=s.runnerDemand),Kr(e,t,n,s);let{shouldPrewarmRunner:c}=s,l=ii(t.device,n,a);a&&c&&!n.prewarmRunnerBeforeOpen&&o.schedule();try{await Xr(e,t,n,a,l,i),await Zr(n,i),await Qr(o,c,n.prewarmRunnerBeforeOpen);let u=o.wasAwaited();return await $r(t,n,a,i),await ti(o,c,s.awaitPrewarmAfterOpen),await ni(e,t,n,a,u,l),await qr(e,t,n,a,r,i),{appBundleId:n.appBundleId,timing:i}}catch(n){throw l&&await e.appleApplications.stopRunnerSession(t.device.id).catch(()=>{}),n}}async function Xr(e,t,n,r,i,a){if(!ri(n,r)||!n.target)return;let o=Date.now();c(t.device.platform)&&!r&&!i&&await e.appleApplications.stopRunnerSession(t.device.id),await Tt({device:t.device,interactor:await t.resolveInteractor(n.execution,n.appBundleId),positionals:[n.appBundleId??n.target]}),r&&await e.clock.sleep(300,t.signal),a.relaunchCloseDurationMs=I(o)}async function Zr(t,n){if(!ue(t.runtimeHints))return;if(!t.applyRuntimeHints)throw new e(`COMMAND_FAILED`,`Runtime hint operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});let r=Date.now();await t.applyRuntimeHints({appId:t.appBundleId,values:t.runtimeHints}),n.runtimeHintsDurationMs=I(r)}async function Qr(e,t,n){!t||!n||(e.schedule(!0),await e.wait())}async function $r(e,t,n,r){let i=ui(t,n),a=Date.now();await Dt({device:e.device,interactor:await e.resolveInteractor(t.execution,t.appBundleId),positionals:i.positionals,appBundleId:t.appBundleId,execution:t.execution,...n&&t.relaunch&&!t.execution.clearAppState?{terminateRunningApp:!0}:{}}),r.openDispatchDurationMs=I(a),await ei(e,t,i.followUpUrl,r)}async function ei(e,t,n,r){if(!n){r.launchUrlDurationMs=0;return}let i={...t.execution,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0},a=Date.now();await Dt({device:e.device,interactor:await e.resolveInteractor(i,t.appBundleId),positionals:[n],appBundleId:t.appBundleId,execution:i}),r.launchUrlDurationMs=I(a)}async function ti(e,t,n){t&&!e.wasScheduled()&&e.schedule(),n?await e.wait():e.recordUnawaited()}async function ni(e,t,n,r,i,a){!o(t.device)||!r&&!a||!n.relaunch&&!i||r&&!i&&!await e.appleApplications.hasLiveRunnerSession(t.device,n.execution)||await e.appleApplications.notifyRunnerAppRelaunched(t.device,n.execution,t.signal)}function ri(e,t){return!!(e.relaunch&&e.target)&&!(t&&!e.execution.clearAppState)}function ii(e,t,n){return e.kind===`device`&&e.appleOs===`ios`&&ri(t,n)}async function ai(e,t,n){n.ensureReady&&await j(e,t.device,t.signal),c(t.device.platform)&&!F(t.device)&&await e.appleApplications.stopRunnerSession(t.device.id),await Tt({device:t.device,interactor:await t.resolveInteractor(n.execution,n.appBundleId),positionals:n.positionals}),F(t.device)&&await e.clock.sleep(300,t.signal)}async function oi(e,t,n,r){r.daemonShutdown||await e.appleApplications.releaseRunnerOnClose(t.id,{retain:r.retainRunner}),await e.appleApplications.dismissCloseAlerts(t,r).catch(()=>{});let i=r.shutdownTarget&&F(t)?await e.deviceShutdown.apple.shutdownTarget(t,n):void 0;return i===void 0?{}:{shutdown:i}}async function si(e,t,n,r){let i=Date.now()+r.timeoutMs;await j(e,t,n,{deadlineAtMs:i});let a=Math.max(1,i-Date.now());return await e.appleApplications.prepareRunner(t,{...r,timeoutMs:a},n)}function ci(e,t,n,r){let i,a=!1,o=li(t.device,n)?{healthCheck:!1}:void 0;return{schedule:(a=!1)=>{i||=(r.runnerPrewarmKind=`session`,r.runnerPrewarmScheduled=!0,o?e.appleApplications.prewarmRunnerSession(t.device,n.execution,t.signal,a,o):e.appleApplications.prewarmRunnerSession(t.device,n.execution,t.signal,a))},wait:async()=>{if(!i||a)return;a=!0;let e=Date.now();await i,r.runnerPrewarmWaited=!0,r.runnerPrewarmDurationMs=I(e)},wasAwaited:()=>a,wasScheduled:()=>i!==void 0,recordUnawaited:()=>{i&&!a&&(r.runnerPrewarmWaited=!1)}}}function li(e,t){return e.kind===`device`&&e.appleOs===`ios`&&!t.hasExistingSession&&!t.relaunch&&!t.prewarmRunnerBeforeOpen}function ui(e,t){let n=e.runtimeLaunchUrl?.trim(),i=e.positionals.length===1?e.positionals[0]?.trim():void 0;return!n||!i||r(i)?{positionals:e.positionals}:t&&!di(e)?{positionals:[i,n]}:{positionals:e.positionals,followUpUrl:n}}function di(e){return e.execution.clearAppState===!0||!!e.execution.launchConsole?.trim()||!!e.execution.launchArgs?.length}function F(e){return o(e)&&e.kind===`simulator`}function I(e){return Math.max(0,Date.now()-e)}async function fi(){throw new e(`UNSUPPORTED_OPERATION`,`This lifecycle operation is unavailable for Apple.`)}const pi=Object.freeze({available:!0}),mi=Object.freeze({available:!1,reason:`unsupported-device-backend`,hint:`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}),hi=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`Push notifications are supported on Apple simulators only.`}),gi=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),_i=Object.freeze({available:!1,reason:`unsupported-device-kind`});function vi(e){let t=Ei(e);return Object.freeze({deployApp:t,materializeAppSource:t,deployMaterializedApp:t,sendPushNotification:Di(e)})}function yi(e){let{host:t,device:n,signal:r}=e,i=vi(n);return Object.freeze({...i.deployApp.available?{deployApp:async e=>await bi(t,n,e,r),materializeAppSource:async e=>await t.appleDeployment.prepareArtifact(e,{signal:r}),deployMaterializedApp:async e=>await xi(t,n,e,r)}:{},...i.sendPushNotification.available?{sendPushNotification:async e=>(await wi(t,n,e,r),{})}:{}})}async function bi(e,t,n,r){if(n.replaceExisting)return await e.appleDeployment.withInvalidatedAppResolutionCache(t,async()=>{let i=await e.appleDeployment.resolveAppBundleId(t,n.app);await Ci(e,t,i,r);let a=await e.appleDeployment.prepareArtifact({source:{kind:`path`,path:n.appPath}},{appIdentifierHint:n.app,signal:r});try{return await Si(e,t,a.installablePath,r),{bundleId:i,launchTarget:i}}finally{await a.cleanup()}});let i=await e.appleDeployment.prepareArtifact({source:{kind:`path`,path:n.appPath}},{appIdentifierHint:n.app,signal:r});try{return await xi(e,t,{artifact:i},r)}finally{await i.cleanup()}}async function xi(e,t,n,r){return await Si(e,t,n.artifact.installablePath,r),{...n.artifact.bundleId?{bundleId:n.artifact.bundleId}:{},...n.artifact.appName?{appName:n.artifact.appName}:{},...n.artifact.bundleId?{launchTarget:n.artifact.bundleId}:{}}}async function Si(e,t,n,r){await j(e,t,r),L(await e.appleTools.run(t.kind===`simulator`?{tool:`simctl`,args:_(t,[`install`,t.id,n])}:{tool:`devicectl`,args:[`device`,`install`,`app`,`--device`,t.id,n],timeoutMs:12e4},r),`Apple app install failed`)}async function Ci(e,t,n,r){await j(e,t,r);let i=await e.appleTools.run(t.kind===`simulator`?{tool:`simctl`,args:_(t,[`uninstall`,t.id,n]),allowFailure:!0}:{tool:`devicectl`,args:[`device`,`uninstall`,`app`,`--device`,t.id,n],allowFailure:!0},r);i.exitCode===0||Ti(`${i.stdout}\n${i.stderr}`)||L(i,`Apple app uninstall failed for ${n}`)}async function wi(t,n,r,i){if(n.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Apple push notifications require a simulator`);await j(t,n,i);let a=await t.temporaryFiles.create({prefix:`agent-device-ios-push-`,suffix:`.apns`});try{await a.writeText(`${JSON.stringify(r.payload)}\n`),L(await t.appleTools.run({tool:`simctl`,args:_(n,[`push`,n.id,r.appId,a.path])},i),`Apple push notification failed`)}finally{await a[Symbol.asyncDispose]()}}function Ti(e){let t=e.toLowerCase();return t.includes(`not installed`)||t.includes(`not found`)||t.includes(`no such file`)}function L(t,n){if(t.exitCode!==0)throw new e(`COMMAND_FAILED`,n,{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode})}function Ei(e){return Oi(e)?e.kind!==`simulator`&&e.kind!==`device`?_i:e.kind===`device`&&e.iosPhysicalDeviceBackend===`xctest`?mi:pi:gi}function Di(e){return Oi(e)?e.kind===`simulator`?pi:hi:gi}function Oi(e){return o(e)&&e.appleOs!==`watchos`}const R=Object.freeze({available:!0}),ki=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`back is supported on Apple simulators and physical devices.`}),Ai=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function ji(e){return e.kind!==`simulator`&&e.kind!==`device`?ki:d(e)===`watchos`?Ai:R}const Mi=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`home is supported on Apple simulators and physical devices.`}),Ni=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),Pi=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`app-switcher is supported on Apple simulators and physical devices.`});function Fi(e,t){if(e.kind!==`simulator`&&e.kind!==`device`)return t;let n=d(e);return n===`macos`||n===`watchos`?Ni:R}function z(e){if(e.kind!==`simulator`&&e.kind!==`device`)return!1;let t=d(e);return t!==`tvos`&&t!==`macos`&&t!==`watchos`}const Ii=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`orientation is supported on Apple simulators and physical devices.`}),Li=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function Ri(e){return e.kind!==`simulator`&&e.kind!==`device`?Ii:z(e)?R:Li}const zi=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`tv-remote is supported only on tvOS devices.`});function Bi(e){return(e.kind===`simulator`||e.kind===`device`)&&a(e)?R:zi}const B=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),Vi=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`});function Hi(e){return z(e)?Vi:B}function Ui(e){return z(e)?R:B}function Wi(e){return z(e)?R:B}const Gi=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`No Apple leaf carries this system button.`}),Ki=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`action-button is supported on iPhone and iPad simulators and physical devices.`}),qi=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`The Action Button is iPhone and iPad hardware; tvOS, macOS, watchOS and visionOS have no such control.`});function Ji(e){return e.kind!==`simulator`&&e.kind!==`device`?Ki:l(e)?R:qi}function Yi(e){return Object.freeze({...Ie({back:ji(e)}),...Ne({unsupported:Gi,home:Fi(e,Mi),appSwitcher:Fi(e,Pi),actionButton:Ji(e)}),...De({orientation:Ri(e)}),...Pe({tvRemote:Bi(e)}),...Oe({unsupported:B,status:Hi(e),dismiss:Ui(e),enter:Wi(e)})})}function Xi(e){let{host:t,device:n,signal:r}=e;return ht({device:n,signal:r,resolveInteractor:t.localInteractors.resolve,facts:Yi(n)})}const V=Object.freeze({available:!0}),Zi=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`clipboard is supported on Apple simulators and the macOS host.`}),Qi=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`settings is supported on Apple simulators and the macOS host.`}),$i=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`settings is supported on Apple simulators and the macOS host, not on physical devices of this OS.`}),ea=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:"Apple targets answer a settings read only on iPhone and iPad simulators, where `simctl ui` reports the value the device holds."}),ta=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`clipboard is supported on Apple simulators and the macOS host, not on physical devices of this OS.`}),H=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function na(e,t,n){if(e.kind!==`simulator`&&e.kind!==`device`)return t;let r=d(e);return r===`watchos`?H:e.kind===`simulator`||r===`macos`?V:n}function ra(e){return na(e,Zi,ta)}const ia=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`trigger-app-event is supported on Apple simulators and physical devices.`}),aa=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`alert is supported on Apple simulators and physical devices.`}),oa=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`alert is supported on Apple simulators, the macOS host, and physical iOS devices.`});function sa(e){if(e.kind!==`simulator`&&e.kind!==`device`)return aa;let t=d(e);return t===`watchos`?H:e.kind===`simulator`||t===`ios`||t===`macos`?V:oa}function ca(e){return e.kind!==`simulator`&&e.kind!==`device`?ia:d(e)===`watchos`?H:V}function la(e){let t=ra(e);return t.available?ta:t}function ua(e){return e.kind!==`simulator`&&e.kind!==`device`?Qi:d(e)===`watchos`?H:u(e)?V:ea}function da(e){let t=ra(e),n=sa(e);return Object.freeze({...je({unsupported:la(e),read:t,write:t}),...Me({read:n,wait:n,accept:n,dismiss:n}),...Ae({triggerAppEvent:ca(e)}),...Ee({setSetting:na(e,Qi,$i),readSetting:ua(e)})})}function fa(e){let{host:t,device:n,signal:r}=e;return ht({device:n,signal:r,resolveInteractor:t.localInteractors.resolve,facts:da(n)})}const pa=/Angle:\s*(-?\d+(?:[.,]\d+)?)\s*°/g;async function ma(t,n={}){let r=[`devicectl`,`device`,`motion`,`hinge-angle`,`--device`,t.id,`--session-timeout`,`1`,`--timeout`,`5`],i=await jt(r,{allowFailure:!0,signal:n.signal,timeoutMs:kt}),a=ha(i.stdout)??ha(i.stderr);if(a!==void 0)return a;throw new e(`COMMAND_FAILED`,`CoreDevice reported no hinge angle sample`,te(i,{cmd:`xcrun`,args:r,stdout:i.stdout,stderr:i.stderr,deviceId:t.id,hint:`This Xcode/CoreDevice toolchain does not stream 'devicectl device motion hinge-angle' for this device. Foldable poses can be verified only through that stream; update Xcode to a version that ships it.`}))}function ha(e){let t;for(let n of e.matchAll(pa)){let e=Number.parseFloat(n[1].replace(`,`,`.`));Number.isFinite(e)&&(t=e)}return t}const ga={closed:`closed`,"half-open":`book`,open:`open`};async function _a(e,t,n={}){Nt(e,`fold`),va(e,await Lt(e,{signal:n.signal})),await Ft({deviceHub:!0,background:!0,signal:n.signal});let r=await It({udid:e.id,deviceName:e.name,pose:ga[t],signal:n.signal});g({level:`info`,phase:`apple_fold_pose_pressed`,data:{deviceId:e.id,pose:t,control:r.control,windowTitle:r.windowTitle,reopened:r.reopened,selected:r.selected}});let i=await ya(e,t,n.signal),a=await wa(e,n.signal);return{pose:t,hingeAngleDegrees:i,...a?{screen:Ta(a)}:{}}}function va(t,n){if(n.unresolved)throw new e(`COMMAND_FAILED`,`CoreDevice reported no display table for this simulator`,{deviceId:t.id,hint:`fold needs 'devicectl device info displays' to tell a foldable from a single-panel simulator; update Xcode to a version that ships the display-information feature.`});if(!n.multiScreen)throw new e(`UNSUPPORTED_OPERATION`,`${t.name} is not a foldable simulator: fold requires more than one integrated panel`,{deviceId:t.id,reason:`single-panel-device`,hint:`fold drives the pose controls Xcode Device Hub shows for a foldable simulator such as iPhone Duo; this simulator reports one integrated panel, so it has no hinge to pose.`})}async function ya(e,t,n){let r,i;for(let a=1;a<=4;a+=1)if(n?.throwIfAborted(),i=r,r=await ma(e,{signal:n}),h(r)===t&&(t!==`half-open`||i!==void 0&&ba(r,i)))return r;throw r!==void 0&&t===`half-open`&&h(r)===t?Ca(e,r,i):Sa(e,t,r)}function ba(e,t){return h(e)===`half-open`&&h(t)===`half-open`&&Math.abs(e-t)<=.5}function xa(e,t,n){return{deviceId:e.id,requestedPose:t,observedPose:n===void 0?void 0:h(n),hingeAngleDegrees:n}}function Sa(t,n,r){return new e(`COMMAND_FAILED`,`${t.name} did not reach the ${n} pose: CoreDevice still reports a hinge angle of ${r}°`,{...xa(t,n,r),reason:`fold-pose-unverified`,hint:`The Device Hub pose control was pressed, but the hinge did not follow. If several Device Hub windows are titled with this device name, close the ones for other simulators so the press reaches this one, then retry.`})}function Ca(t,n,r){return new e(`COMMAND_FAILED`,`${t.name} was observed half-open at ${n}° but did not settle: 4 hinge reads never held two consecutive half-open angles within ${Ot}° of each other`,{...xa(t,`half-open`,n),reason:`fold-pose-unsettled`,...r===void 0?{}:{previousHingeAngleDegrees:r},hint:`The hinge reached the requested pose and was still moving when the read budget ended. Retry the fold, then read the angle directly with xcrun devicectl device motion hinge-angle --device <udid> --session-timeout 1 --timeout 5 to see whether the simulator holds the pose.`})}async function wa(e,t){let n=await Lt(e,{signal:t});if(!(n.unresolved||n.ambiguous))return n.activeDisplay}function Ta(e){return{display:e.name,coordinateSpace:se,widthPt:Math.round(e.widthPx/e.pointScale),heightPt:Math.round(e.heightPx/e.pointScale)}}const Ea=Object.freeze({available:!0}),Da=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`fold is supported on foldable iPhone simulators driven by Xcode Device Hub; a physical device is folded by hand.`}),Oa=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`fold poses the hinge of a foldable iPhone; tvOS, macOS, watchOS and visionOS simulators have no hinge.`});function ka(e){if(e.kind!==`simulator`)return Da;let t=d(e);return t===`ios`||t===`ipados`?Ea:Oa}function Aa(e){return oe({fold:ka(e)})}function ja(e){let{device:t,signal:n}=e;return m(Aa(t).setFoldPose,()=>({setFoldPose:async e=>(n.throwIfAborted(),await _a(t,e.pose,{signal:n}))}))}function Ma(e,t,n){let r=Le({device:t.device,signal:t.signal,resolveInteractor:e.localInteractors.resolve}),i=async i=>{if(s(t.device)&&i.options?.surface!==void 0&&i.options.surface!==`app`)return await e.snapshot.captureSurface(t.device,i.options,Te(t.signal,i));if(!n)return await r.captureSnapshot(i);let a=Te(t.signal,i);return await n.capture(t.device,i,a,async e=>await r.captureSnapshot(e))};return Object.freeze({captureSnapshot:i,captureSnapshotWithCustomActions:i,captureSnapshotWithoutActiveApp:i})}function Na(e,t){return Object.freeze({findText:async n=>{let r=await Pa(e,t,n);if(!r)return{found:!1};let i=await e.localInteractors.resolve(t.device,{...n.execution,...r});return i.findText?await i.findText(n.text,r):{found:!1}}})}async function Pa(e,t,n){let r=n.options?.appBundleId;if(r===void 0)return;let i=n.options?.surface;if(s(t.device)&&i!==void 0&&i!==`app`)return;let a=n.signal?AbortSignal.any([t.signal,n.signal]):t.signal;if(a.throwIfAborted(),await Fa(e,t.device,n.execution))return{appBundleId:r,signal:a}}async function Fa(e,t,n){return!P(t)||await e.appleApplications.hasLiveRunnerSession(t,n??{})}function Ia(){let e,t=!1,n=async()=>(e??=import(`./adapter.js`).then(({createSimulatorSnapshotSource:e})=>e()),await e);return{acquire:async e=>t?{stage:`failed`,failure:{kind:`unsupported`,code:`source-closed`}}:await(await n()).acquire(e),close:async()=>{t=!0,e&&await(await e).close()}}}const La=3e3;function Ra(){let e=new Map,t=new Map,n=Bt({waitMs:1500});return async(r,i,a,o)=>{a.throwIfAborted();let s=`${r.id}:${i}`,c=e.get(s);return c&&o!==`refresh`&&await Ht(c.pid,{signal:a,timeoutMs:La})===c.processStartTime?c:(e.delete(s),await n.value(s,{start:async()=>{let n=await za(r,i,t);return e.set(s,n),n},wait:(e,t)=>Vt({waitMs:e,signal:a,stop:t,cancelled:()=>a.reason}),pending:()=>W(`simulator-target-discovery-pending`,r,i)}))}}async function za(e,t,n){let r=Date.now()+15e3,[i,a]=await Promise.allSettled([Mt(e,[`spawn`,e.id,`launchctl`,`list`],{allowFailure:!0,timeoutMs:U(r)}),Ba(e,n,r)]);if(i.status===`rejected`)throw i.reason;if(a.status===`rejected`)throw a.reason;let o=i.value,s=a.value;if(o.exitCode!==0)throw W(`simulator-target-probe-failed`,e,t);let c=Va(o.stdout,t);if(!c)throw W(`simulator-target-unavailable`,e,t);let l=await Ht(c.pid,{timeoutMs:Math.min(La,U(r))});if(!l)throw W(`simulator-target-identity-unavailable`,e,t);return Object.freeze({udid:e.id,runtime:s,pid:c.pid,generation:`${c.pid}:${c.label}:${l}`,targetId:`${e.id}:${t}`,processStartTime:l})}async function Ba(e,t,n){let r=t.get(e.id);if(r)return await r;let i=Mt(e,[`list`,`devices`,`-j`],{allowFailure:!0,timeoutMs:U(n)}).then(t=>{if(t.exitCode!==0)throw W(`simulator-runtime-probe-failed`,e,``);let n=JSON.parse(t.stdout),r=Object.entries(n.devices??{}).find(([,t])=>t.some(t=>t.udid===e.id))?.[0];if(!r)throw W(`simulator-runtime-unavailable`,e,``);return r});t.set(e.id,i);try{return await i}catch(n){throw t.delete(e.id),n}}function Va(e,t){for(let n of e.split(`
4
4
  `)){let[e,,r]=n.trim().split(/\s+/);if(!e||!r||!r.startsWith(`UIKitApplication:${t}[`))continue;let i=Number(e);if(Number.isSafeInteger(i)&&i>0)return{pid:i,label:r}}}function U(e){return Math.max(1,e-Date.now())}function W(t,n,r){return new e(`COMMAND_FAILED`,`Unable to resolve the running iOS Simulator app (${t}).`,{reason:t,deviceId:n.id,appBundleId:r})}function Ha(e=Date.now){let t=new Map;return async(n,r)=>{if(n.kind!==`simulator`)return`absent`;let i=t.get(n.id);if(i!==void 0&&e()-i.at<1e3)return{kind:`present`,host:i.host};t.delete(n.id);let a=await Ua(n,r);return a!==`absent`&&a!==`unknown`&&t.set(n.id,{at:e(),host:a.host}),a}}async function Ua(e,t){let n=!1;for(let r of ft){let i=await Wa(r.processExecutable,t);if(i===`unknown`){n=!0;continue}for(let a of i){let i=await Ga(a,e.id,t);if(i===`unknown`)n=!0;else if(i)return{kind:`present`,host:r}}}return n?`unknown`:`absent`}async function Wa(e,t){let n=await Ka(`pgrep`,[`-f`,e],t);return n===`unknown`?`unknown`:n.exitCode===1?[]:n.exitCode===0?n.stdout.split(`
@@ -1 +1 @@
1
- import{T as e,_ as t,g as n,v as r}from"./sdk-batch-runner.js";import{n as i}from"./success-text.js";function a(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function o(t,n){let r=s(t);return{path:e(t,`path`),width:r?.width,height:r?.height,logicalWidth:r?.logicalWidth,logicalHeight:r?.logicalHeight,pixelDensity:r?.pixelDensity,overlayRefs:r?.overlayRefs,...r?.warnings?{warnings:r.warnings}:{},identifiers:{session:n}}}function s(e){if(!n(e))return;let t=d(e);return a({path:l(e,`path`),width:c(e,`width`),height:c(e,`height`),logicalWidth:c(e,`logicalWidth`),logicalHeight:c(e,`logicalHeight`),pixelDensity:c(e,`pixelDensity`),overlayRefs:u(e.overlayRefs),...t===void 0?{}:{warnings:t}})}function c(e,t){let n=e[t];return typeof n==`number`?n:void 0}function l(e,t){let n=e[t];return typeof n==`string`?n:void 0}function u(e){if(Array.isArray(e))return e.filter(h).flatMap(e=>{let t=f(e);return t?[t]:[]})}function d(e){if(Array.isArray(e.warnings))return i(e).filter(e=>e.length>0)}function f(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=p(e);if(t)return{ref:e.ref,...m(e),...t}}function p(e){let n=r(e.rect);if(!n)return;let i=r(e.overlayRect);if(!i)return;let a=t(e.center);return a?{rect:n,overlayRect:i,center:a}:void 0}function m(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function h(e){return n(e)}export{a as n,o as t};
1
+ import{E as e,_ as t,v as n,y as r}from"./sdk-batch-runner.js";import{n as i}from"./success-text.js";function a(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function o(t,n){let r=s(t);return{path:e(t,`path`),width:r?.width,height:r?.height,logicalWidth:r?.logicalWidth,logicalHeight:r?.logicalHeight,pixelDensity:r?.pixelDensity,overlayRefs:r?.overlayRefs,...r?.warnings?{warnings:r.warnings}:{},identifiers:{session:n}}}function s(e){if(!t(e))return;let n=d(e);return a({path:l(e,`path`),width:c(e,`width`),height:c(e,`height`),logicalWidth:c(e,`logicalWidth`),logicalHeight:c(e,`logicalHeight`),pixelDensity:c(e,`pixelDensity`),overlayRefs:u(e.overlayRefs),...n===void 0?{}:{warnings:n}})}function c(e,t){let n=e[t];return typeof n==`number`?n:void 0}function l(e,t){let n=e[t];return typeof n==`string`?n:void 0}function u(e){if(Array.isArray(e))return e.filter(h).flatMap(e=>{let t=f(e);return t?[t]:[]})}function d(e){if(Array.isArray(e.warnings))return i(e).filter(e=>e.length>0)}function f(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=p(e);if(t)return{ref:e.ref,...m(e),...t}}function p(e){let t=r(e.rect);if(!t)return;let i=r(e.overlayRect);if(!i)return;let a=n(e.center);return a?{rect:t,overlayRect:i,center:a}:void 0}function m(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function h(e){return t(e)}export{a as n,o as t};
@@ -1 +1 @@
1
- import{D as e,T as t}from"./sdk-contracts.js";import{o as n,s as r,t as i}from"./capture.js";import{f as a}from"./sdk-batch-runner.js";import{r as o}from"./sdk-device.js";import{er as s,tr as c}from"./sdk-batch.js";import{i as l}from"./recording-export-quality.js";import{n as u,s as d}from"./scroll-gesture.js";import{t as f}from"./gesture-plan-types.js";const p=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function m(t){let n=g(t),r=x(n,`kind`,p);if(r===`pan`)return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),pointerCount:a(n,`pointerCount`,{min:1,max:2}),durationMs:h(n)};if(r===`drag`)return ee(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:x(n,`direction`,u),origin:_(n,`origin`),distance:a(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:x(n,`preset`,d)}}if(r===`pinch`)return{kind:r,scale:y(n,`scale`),origin:v(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:y(n,`degrees`),origin:v(n,`origin`)}}return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),scale:y(n,`scale`),degrees:y(n,`degrees`),durationMs:h(n)}}function ee(t){let n=a(t,`sourceHoldMs`,{min:1,max:1e4}),r=a(t,`moveMs`,{min:16,max:1e4}),i=a(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${f}`);return{kind:`drag`,source:b(t,`source`),destination:b(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function h(t){let n=a(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${f}.`);return n}}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function _(e,t){let n=g(e[t]);return{x:y(n,`x`),y:y(n,`y`)}}function v(e,t){return e[t]===void 0?void 0:_(e,t)}function y(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function b(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function x(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const S={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:te}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function te(e,t){let[n,r,i,a,o]=e,s=C(n,i),c=C(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function C(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function w(e,t){let n=S[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!T(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function T(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ne(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function E(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function D(t,n){let r=w(t,n);if(r)throw new e(`INVALID_ARGS`,E(r))}function re(e,t,n){let r=ie(e,t);return r?E(r,n):void 0}function ie(e,t){if(e===`swipe`)return w(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(S,n))return w(n,t.slice(1))}function O(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function k(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{D(`gesture pan`,r);let{origin:e,delta:i}=O(r);return m({kind:n,origin:e,delta:i,pointerCount:t,durationMs:A(r[4])})}case`fling`:return D(`gesture fling`,r),m({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:A(r[3])});case`swipe`:return D(`gesture swipe`,r),m({kind:n,preset:r[0]});case`pinch`:return D(`gesture pinch`,r),m({kind:n,scale:Number(r[0]),origin:j(r[1],r[2])});case`rotate`:return D(`gesture rotate`,r),m({kind:n,degrees:Number(r[0]),origin:j(r[1],r[2])});case`transform`:{D(`gesture transform`,r);let{origin:e,delta:t}=O(r);return m({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:A(r[6])})}case`drag`:return D(`gesture drag`,r),m({kind:n,source:r[0],destination:r[1],sourceHoldMs:A(r[2]),moveMs:A(r[3]),destinationHoldMs:A(r[4])});default:return m({kind:n})}}function ae(e){if(e[0]!==`drag`)return;let t=k(e);return t.kind===`drag`?t:void 0}function oe(e){switch(e.kind){case`pan`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return M([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return M([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?M([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function se(e,t={}){return D(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function ce(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function le(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:ce(e).gesture}function ue(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function A(e){return e===void 0?void 0:Number(e)}function j(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function M(e){return e.filter(e=>e!==void 0).map(String)}const de={ios:!0,android:!0,harmonyos:!0};function N(e){return typeof e==`string`&&Object.hasOwn(de,e)}function P(e){return e.startsWith(`@`)?t(e)?.base??e:e}const F=/^-?\d+(\.\d+)?$/,fe=/^[^\s"\\]+$/,pe=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),me=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),he=new Map([[`--pointer-count`,`pointerCount`]]),ge=new Map([[`--delay-ms`,`delayMs`]]);function I(e){return e===`click`||e===`press`}function L(e){return I(e)||e===`longpress`||e===`hover`}function R(e){return e===`type`||e===`fill`}function z(e){return H(e,_e)}function B(e){return JSON.stringify(e)}function V(e){return H(e,U)}function H(e,t){return t(e)?e:B(e)}function _e(e){return U(e)&&e.startsWith(`@`)||F.test(e)}function U(e){return fe.test(e)}const ve=new Set([`fill`,`type`]);function ye(e){if(!ve.has(e.command)){let t=(e.positionals??[]).map(e=>z(e));return[e.command,...t].join(` `)}let t=be(e).map(e=>z(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function be(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&F.test(n)&&F.test(t[1]??``)?[n,t[1]]:[n]}function W(e,t){let n=t.flags??{};if(I(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}R(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function G(e,t){t&&(N(t.platform)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,V(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,V(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,V(t.launchUrl)))}function xe(e,t){let[n,...r]=t.positionals??[];n&&e.push(V(n));for(let t of r)e.push(z(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Se(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,z(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Ce(e,t){for(let n of t.positionals??[])e.push(z(n));let r=t.flags?.screenshotCropOn;typeof r==`string`&&r.length>0&&e.push(`--crop-on`,V(r)),n(e,t.flags)}function we(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(V(t));G(e,t.flags)}function Te(e,t){for(let n of t.positionals??[])e.push(z(t.command===`wait`?P(n):n));W(e,t)}function K(e,t){let n=[],r={},i=I(e)?pe:e===`swipe`?me:e===`gesture`?he:R(e)?ge:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(I(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(I(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=J(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function q(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;N(e)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=J(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function J(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function Ee(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function De(e,t){for(let n of t.positionals??[])e.push(z(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),G(e,t.runtime)}function Oe(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=q(t);return{positionals:r.positionals,flags:n,runtime:ke(r.flags)?r.flags:void 0}}function ke(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const Y=/^[A-Z_][A-Z0-9_]*$/,Ae=new Set(o.filter(e=>e!==`web`)),je=new Set([`mobile`,`tv`,`desktop`]);function Me(t){let n=[],r=[],i=t.split(/\r?\n/),a=!1,o,l=(t,n,r)=>{let i=t.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${i} annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,u]of i.entries()){let i=u.trim();if(i.length===0){o&&l(o,t,`is blank`);continue}if(i.startsWith(`#`)){let e=s(i);if(e.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`multiple`,evidence:e.evidence,line:t+1};continue}let n=c(i);if(n.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:t+1};continue}o&&l(o,t,`is a comment`);continue}if(X(i)){if(o&&l(o,t,`is an env directive`),a)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let d=Le(u);if(!d){o&&l(o,t,`did not parse as an action`);continue}let f=re(d.command,d.positionals??[],`line ${t+1}`);if(f)throw new e(`INVALID_ARGS`,f);o&&=(o.kind===`single`?d.targetEvidence=o.evidence:d.targetEvidences=o.evidence,void 0),n.push(d),r.push(t+1),a=!0}if(o){let t=o.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${t} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`)}return{actions:n,actionLines:r}}function Ne(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(X(t)){Ie(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Ae.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&je.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function X(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Pe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!Y.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Fe(r.slice(i+1),n)}}function Fe(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function Ie(t,n,r){let{key:i,value:a}=Pe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0){let t=i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`;throw new e(`INVALID_ARGS`,t)}t[n]=r}function Le(t){let n=t.trim();if(n.length===0||n.startsWith(`#`))return null;let[a,...o]=Re(n);if(a===void 0||a===`context`)return null;let s={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){s.positionals=[];for(let e=0;e<o.length;e+=1){let t=o[e];if(t===`-i`){s.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){s.flags.snapshotRaw=!0;continue}if(t===`--force-full`){s.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<o.length){let t=Number(o[e+1]);Number.isFinite(t)&&t>=0&&(s.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<o.length){s.flags.snapshotScope=o[e+1],e+=1;continue}if(t===`--backend`&&e+1<o.length){e+=1;continue}}}return s}if(a===`open`){let e=Oe(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s.runtime=e.runtime,s}if(a===`runtime`){let e=q(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s}if(I(a)){let e=K(a,o);Object.assign(s.flags,e.flags);let t=e.positionals[0];if(t===void 0)return s;if(t.startsWith(`@`))return s.positionals=[P(t)],e.positionals[1]&&(s.result={refLabel:e.positionals[1]}),s;let n=e.positionals[0],r=e.positionals[1];return $(n)&&$(r)&&e.positionals.length>=2?(s.positionals=[n,r],s):(s.positionals=[e.positionals.join(` `)],s)}if(a===`fill`){let e=K(a,o);if(Object.assign(s.flags,e.flags),!Q(e.positionals))return s.positionals=e.positionals,s;let[t,n,...r]=e.positionals;if($(t)&&$(n))return s.positionals=[t,n,r.join(` `)],s;let[i,c,...l]=e.positionals;if(i.startsWith(`@`)){let e=P(i);return l.length>0?(s.positionals=[e,l.join(` `)],s.result={refLabel:c},s):(s.positionals=[e,c],s)}return s.positionals=[i,[c,...l].join(` `)],s}if(a===`get`){let e=o[0],t=o[1];return e===void 0||t===void 0?(s.positionals=o,s):t.startsWith(`@`)?(s.positionals=[e,P(t)],o[2]&&(s.result={refLabel:o[2]}),s):(s.positionals=[e,o.slice(1).join(` `)],s)}if(a===`swipe`||a===`type`||a===`gesture`){let e=K(a,o);return Object.assign(s.flags,e.flags),s.positionals=e.positionals,s}if(a===`record`){let t=[];for(let n=0;n<o.length;n+=1){let r=o[n];if(r===i.cliToken)throw new e(`INVALID_ARGS`,i.migration.record);if(r===`--hide-touches`){s.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<o.length){let e=Number(o[n+1]);Number.isFinite(e)&&(s.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<o.length){let e=o[n+1],t=l(e);t!==void 0&&(s.flags.quality=t),n+=1;continue}t.push(r)}return s.positionals=t,s}if(a===`screenshot`){let e=[];for(let t=0;t<o.length;t+=1){let n=o[t],i=r({args:o,index:t,flags:s.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return s.positionals=e,s}return s.positionals=a===`wait`||a===`longpress`||a===`hover`?o.map(e=>P(e)):o,s}function Q(e){return e.length>=2}function $(e){return e?!Number.isNaN(Number(e)):!1}function Re(e){let t=[],n=0;for(;n<e.length&&(n=ze(e,n),!(n>=e.length));){let r=e[n]===`"`?Be(e,n):Ve(e,n);t.push(r.value),n=r.nextCursor}return t}function ze(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Be(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function Ve(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}export{ue as C,m as E,le as S,p as T,P as _,Ee as a,k as b,we as c,Se as d,ye as f,L as g,I as h,De as i,Ce as l,B as m,Me as n,Te as o,z as p,Ne as r,xe as s,Y as t,W as u,ne as v,se as w,oe as x,ae as y};
1
+ import{D as e,T as t}from"./sdk-contracts.js";import{o as n,s as r,t as i}from"./capture.js";import{p as a}from"./sdk-batch-runner.js";import{r as o}from"./sdk-device.js";import{er as s,tr as c}from"./sdk-batch.js";import{i as l}from"./recording-export-quality.js";import{n as u,s as d}from"./scroll-gesture.js";import{t as f}from"./gesture-plan-types.js";const p=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function m(t){let n=g(t),r=x(n,`kind`,p);if(r===`pan`)return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),pointerCount:a(n,`pointerCount`,{min:1,max:2}),durationMs:h(n)};if(r===`drag`)return ee(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:x(n,`direction`,u),origin:_(n,`origin`),distance:a(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:x(n,`preset`,d)}}if(r===`pinch`)return{kind:r,scale:y(n,`scale`),origin:v(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:y(n,`degrees`),origin:v(n,`origin`)}}return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),scale:y(n,`scale`),degrees:y(n,`degrees`),durationMs:h(n)}}function ee(t){let n=a(t,`sourceHoldMs`,{min:1,max:1e4}),r=a(t,`moveMs`,{min:16,max:1e4}),i=a(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${f}`);return{kind:`drag`,source:b(t,`source`),destination:b(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function h(t){let n=a(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${f}.`);return n}}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function _(e,t){let n=g(e[t]);return{x:y(n,`x`),y:y(n,`y`)}}function v(e,t){return e[t]===void 0?void 0:_(e,t)}function y(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function b(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function x(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const S={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:te}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function te(e,t){let[n,r,i,a,o]=e,s=C(n,i),c=C(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function C(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function w(e,t){let n=S[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!T(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function T(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ne(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function E(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function D(t,n){let r=w(t,n);if(r)throw new e(`INVALID_ARGS`,E(r))}function re(e,t,n){let r=ie(e,t);return r?E(r,n):void 0}function ie(e,t){if(e===`swipe`)return w(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(S,n))return w(n,t.slice(1))}function O(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function k(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{D(`gesture pan`,r);let{origin:e,delta:i}=O(r);return m({kind:n,origin:e,delta:i,pointerCount:t,durationMs:A(r[4])})}case`fling`:return D(`gesture fling`,r),m({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:A(r[3])});case`swipe`:return D(`gesture swipe`,r),m({kind:n,preset:r[0]});case`pinch`:return D(`gesture pinch`,r),m({kind:n,scale:Number(r[0]),origin:j(r[1],r[2])});case`rotate`:return D(`gesture rotate`,r),m({kind:n,degrees:Number(r[0]),origin:j(r[1],r[2])});case`transform`:{D(`gesture transform`,r);let{origin:e,delta:t}=O(r);return m({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:A(r[6])})}case`drag`:return D(`gesture drag`,r),m({kind:n,source:r[0],destination:r[1],sourceHoldMs:A(r[2]),moveMs:A(r[3]),destinationHoldMs:A(r[4])});default:return m({kind:n})}}function ae(e){if(e[0]!==`drag`)return;let t=k(e);return t.kind===`drag`?t:void 0}function oe(e){switch(e.kind){case`pan`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return M([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return M([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?M([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function se(e,t={}){return D(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function ce(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function le(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:ce(e).gesture}function ue(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function A(e){return e===void 0?void 0:Number(e)}function j(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function M(e){return e.filter(e=>e!==void 0).map(String)}const de={ios:!0,android:!0,harmonyos:!0};function N(e){return typeof e==`string`&&Object.hasOwn(de,e)}function P(e){return e.startsWith(`@`)?t(e)?.base??e:e}const F=/^-?\d+(\.\d+)?$/,fe=/^[^\s"\\]+$/,pe=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),me=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),he=new Map([[`--pointer-count`,`pointerCount`]]),ge=new Map([[`--delay-ms`,`delayMs`]]);function I(e){return e===`click`||e===`press`}function L(e){return I(e)||e===`longpress`||e===`hover`}function R(e){return e===`type`||e===`fill`}function z(e){return H(e,_e)}function B(e){return JSON.stringify(e)}function V(e){return H(e,U)}function H(e,t){return t(e)?e:B(e)}function _e(e){return U(e)&&e.startsWith(`@`)||F.test(e)}function U(e){return fe.test(e)}const ve=new Set([`fill`,`type`]);function ye(e){if(!ve.has(e.command)){let t=(e.positionals??[]).map(e=>z(e));return[e.command,...t].join(` `)}let t=be(e).map(e=>z(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function be(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&F.test(n)&&F.test(t[1]??``)?[n,t[1]]:[n]}function W(e,t){let n=t.flags??{};if(I(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}R(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function G(e,t){t&&(N(t.platform)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,V(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,V(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,V(t.launchUrl)))}function xe(e,t){let[n,...r]=t.positionals??[];n&&e.push(V(n));for(let t of r)e.push(z(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Se(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,z(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Ce(e,t){for(let n of t.positionals??[])e.push(z(n));let r=t.flags?.screenshotCropOn;typeof r==`string`&&r.length>0&&e.push(`--crop-on`,V(r)),n(e,t.flags)}function we(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(V(t));G(e,t.flags)}function Te(e,t){for(let n of t.positionals??[])e.push(z(t.command===`wait`?P(n):n));W(e,t)}function K(e,t){let n=[],r={},i=I(e)?pe:e===`swipe`?me:e===`gesture`?he:R(e)?ge:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(I(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(I(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=J(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function q(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;N(e)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=J(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function J(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function Ee(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function De(e,t){for(let n of t.positionals??[])e.push(z(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),G(e,t.runtime)}function Oe(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=q(t);return{positionals:r.positionals,flags:n,runtime:ke(r.flags)?r.flags:void 0}}function ke(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const Y=/^[A-Z_][A-Z0-9_]*$/,Ae=new Set(o.filter(e=>e!==`web`)),je=new Set([`mobile`,`tv`,`desktop`]);function Me(t){let n=[],r=[],i=t.split(/\r?\n/),a=!1,o,l=(t,n,r)=>{let i=t.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${i} annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,u]of i.entries()){let i=u.trim();if(i.length===0){o&&l(o,t,`is blank`);continue}if(i.startsWith(`#`)){let e=s(i);if(e.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`multiple`,evidence:e.evidence,line:t+1};continue}let n=c(i);if(n.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:t+1};continue}o&&l(o,t,`is a comment`);continue}if(X(i)){if(o&&l(o,t,`is an env directive`),a)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let d=Le(u);if(!d){o&&l(o,t,`did not parse as an action`);continue}let f=re(d.command,d.positionals??[],`line ${t+1}`);if(f)throw new e(`INVALID_ARGS`,f);o&&=(o.kind===`single`?d.targetEvidence=o.evidence:d.targetEvidences=o.evidence,void 0),n.push(d),r.push(t+1),a=!0}if(o){let t=o.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${t} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`)}return{actions:n,actionLines:r}}function Ne(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(X(t)){Ie(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Ae.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&je.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function X(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Pe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!Y.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Fe(r.slice(i+1),n)}}function Fe(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function Ie(t,n,r){let{key:i,value:a}=Pe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0){let t=i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`;throw new e(`INVALID_ARGS`,t)}t[n]=r}function Le(t){let n=t.trim();if(n.length===0||n.startsWith(`#`))return null;let[a,...o]=Re(n);if(a===void 0||a===`context`)return null;let s={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){s.positionals=[];for(let e=0;e<o.length;e+=1){let t=o[e];if(t===`-i`){s.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){s.flags.snapshotRaw=!0;continue}if(t===`--force-full`){s.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<o.length){let t=Number(o[e+1]);Number.isFinite(t)&&t>=0&&(s.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<o.length){s.flags.snapshotScope=o[e+1],e+=1;continue}if(t===`--backend`&&e+1<o.length){e+=1;continue}}}return s}if(a===`open`){let e=Oe(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s.runtime=e.runtime,s}if(a===`runtime`){let e=q(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s}if(I(a)){let e=K(a,o);Object.assign(s.flags,e.flags);let t=e.positionals[0];if(t===void 0)return s;if(t.startsWith(`@`))return s.positionals=[P(t)],e.positionals[1]&&(s.result={refLabel:e.positionals[1]}),s;let n=e.positionals[0],r=e.positionals[1];return $(n)&&$(r)&&e.positionals.length>=2?(s.positionals=[n,r],s):(s.positionals=[e.positionals.join(` `)],s)}if(a===`fill`){let e=K(a,o);if(Object.assign(s.flags,e.flags),!Q(e.positionals))return s.positionals=e.positionals,s;let[t,n,...r]=e.positionals;if($(t)&&$(n))return s.positionals=[t,n,r.join(` `)],s;let[i,c,...l]=e.positionals;if(i.startsWith(`@`)){let e=P(i);return l.length>0?(s.positionals=[e,l.join(` `)],s.result={refLabel:c},s):(s.positionals=[e,c],s)}return s.positionals=[i,[c,...l].join(` `)],s}if(a===`get`){let e=o[0],t=o[1];return e===void 0||t===void 0?(s.positionals=o,s):t.startsWith(`@`)?(s.positionals=[e,P(t)],o[2]&&(s.result={refLabel:o[2]}),s):(s.positionals=[e,o.slice(1).join(` `)],s)}if(a===`swipe`||a===`type`||a===`gesture`){let e=K(a,o);return Object.assign(s.flags,e.flags),s.positionals=e.positionals,s}if(a===`record`){let t=[];for(let n=0;n<o.length;n+=1){let r=o[n];if(r===i.cliToken)throw new e(`INVALID_ARGS`,i.migration.record);if(r===`--hide-touches`){s.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<o.length){let e=Number(o[n+1]);Number.isFinite(e)&&(s.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<o.length){let e=o[n+1],t=l(e);t!==void 0&&(s.flags.quality=t),n+=1;continue}t.push(r)}return s.positionals=t,s}if(a===`screenshot`){let e=[];for(let t=0;t<o.length;t+=1){let n=o[t],i=r({args:o,index:t,flags:s.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return s.positionals=e,s}return s.positionals=a===`wait`||a===`longpress`||a===`hover`?o.map(e=>P(e)):o,s}function Q(e){return e.length>=2}function $(e){return e?!Number.isNaN(Number(e)):!1}function Re(e){let t=[],n=0;for(;n<e.length&&(n=ze(e,n),!(n>=e.length));){let r=e[n]===`"`?Be(e,n):Ve(e,n);t.push(r.value),n=r.nextCursor}return t}function ze(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Be(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function Ve(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}export{ue as C,m as E,le as S,p as T,P as _,Ee as a,k as b,we as c,Se as d,ye as f,L as g,I as h,De as i,Ce as l,B as m,Me as n,Te as o,z as p,Ne as r,xe as s,Y as t,W as u,ne as v,se as w,oe as x,ae as y};
@@ -1,2 +1,2 @@
1
- import{D as e,O as t,a as n,s as r}from"./sdk-contracts.js";import{a as i,n as a,o,r as s}from"./sdk-batch.js";function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function u(e,t,n){return n(e[t])}function d(e,t,n){let r=e[t];return r===null?null:n(r)}function f(e,t){return l(e,t,C,`Daemon response is missing "${t}".`)}function p(e,t){return u(e,t,C)}function m(e,t){return d(e,t,C)}function h(e,t){return l(e,t,w,`Daemon response is missing numeric "${t}".`)}function g(e,t){return l(e,t,T,`Daemon response has invalid "${t}".`)}function _(e,t){return l(e,t,E,`Daemon response has invalid "${t}".`)}function v(e,t){return u(e,t,D)??`mobile`}function y(e){if(!k(e))return;let t=S(e,`x`),n=S(e,`y`),r=S(e,`width`),i=S(e,`height`);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:t,y:n,width:r,height:i}}function b(e){if(e!==void 0){if(!k(e))return{kind:`unmeasurable`,reason:`malformed-fact`};if(e.kind===`absent`)return{kind:`absent`};if(e.kind===`unmeasurable`)return typeof e.reason==`string`&&e.reason.trim().length>0?{kind:`unmeasurable`,reason:e.reason}:{kind:`unmeasurable`,reason:`unreported-reason`};if(e.kind===`visible`){let t=y(e.frame);return t!==void 0&&[t.x,t.y,t.width,t.height].every(Number.isFinite)&&t.width>0&&t.height>0?{kind:`visible`,frame:t}:{kind:`unmeasurable`,reason:`invalid-visible-frame`}}return{kind:`unmeasurable`,reason:`unrecognized-kind`}}}function x(e){if(!k(e))return;let t=S(e,`x`),n=S(e,`y`);if(t!==void 0&&n!==void 0)return{x:t,y:n}}function S(e,t){let n=e[t];return typeof n==`number`?n:void 0}function C(e){return typeof e==`string`&&e.length>0?e:void 0}function w(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function T(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`harmonyos`||e===`vega`||e===`linux`||e===`web`?e:void 0}function E(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function D(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function O(t){if(!k(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e){return k(e)?e:void 0}function j(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function M(e){return e.split(`
2
- `).map(e=>e.trim()).filter(e=>e.length>0)}function N(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function P(t,n,r={}){let i=t[n];if(i!==void 0){if(typeof i!=`number`||!Number.isFinite(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);if(r.min!==void 0&&i<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&i>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return i}}function F(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function I(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}const L=`Each batch step is {"command":"<name>","input":{...}}, where input is that command's own structured input object, keyed by field name. There is no positional step form: args, argv, positionals, and flags are not step fields.`;function R(t,n,r=L){if(!c(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`,{hint:r});return t}function z(t,n,r=L){let i=t.input;if(!c(i))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`,{hint:r});return i}function B(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function V(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function H(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}function U(e,t){let n=e?.trim();if(n)return n;if(H(t))return`com.apple.mobilesafari`}const W=new Set(a);async function G(e,n,r){let i=Q(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return $(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!F(o))return $(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let t=K(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of t.entries()){let o=await Z(e,n,a,r,{stepNumber:i+1,totalSteps:t.length,remainingSteps:t.slice(i+1).map(e=>({command:e.command,positionals:e.positionals,flags:e.flags,...e.input===void 0?{}:{input:e.input}}))});if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,...o.error.retriable===void 0?{}:{retriable:o.error.retriable},...o.error.supportedOn===void 0?{}:{supportedOn:o.error.supportedOn},details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:t.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:t.length,executed:t.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let n=t(e);return $(n.code,n.message,n.details)}}function K(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);I(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let a=t[n];if(!k(a))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let s=Object.keys(a).filter(e=>!W.has(e));if(s.length>0){let t=s.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let c=o(a.command);if(!c)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(i(c,n+1),a.positionals!==void 0&&!Array.isArray(a.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let l=a.positionals??[];if(l.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(a.flags!==void 0&&!k(a.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(a.input!==void 0&&!k(a.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:c,positionals:l,input:a.input,flags:a.flags??{},runtime:B(a.runtime,n+1)})}return r}function q(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return J(Q(e),a)}function J(e,t){let n=Q(e)??{},r=t;for(let e of s)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function Y(e,t){return r(e)?t?e:`digest`:e}function X(e,t){let n=e?.responseLevel,r=Y(n,t);return r===n?e:{...e,responseLevel:r}}async function Z(e,t,n,r,i){let{stepNumber:a,totalSteps:o}=i,s=a===o,c=Date.now(),l=q(e.flags,n.flags);l.session===void 0&&(l.session=t);let u=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:l,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:X(e.meta,s)},i),d=Date.now()-c;return u.ok?{ok:!0,step:a,result:{step:a,command:n.command,ok:!0,data:u.data??{},durationMs:d}}:{ok:!1,step:a,error:u.error}}function Q(e){return e}function $(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{h as C,M as D,b as E,j as O,_ as S,f as T,x as _,U as a,m as b,F as c,R as d,N as f,k as g,O as h,H as i,c as k,B as l,A as m,G as n,L as o,P as p,V as r,I as s,J as t,z as u,y as v,g as w,p as x,v as y};
1
+ import{D as e,O as t,a as n,s as r}from"./sdk-contracts.js";import{a as i,n as a,o,r as s}from"./sdk-batch.js";function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function u(e,t,n){return n(e[t])}function d(e,t,n){let r=e[t];return r===null?null:n(r)}function f(e,t){return l(e,t,S,`Daemon response is missing "${t}".`)}function p(e,t){return u(e,t,S)}function m(e,t){return d(e,t,S)}function h(e,t){return l(e,t,C,`Daemon response is missing numeric "${t}".`)}function g(e,t){return l(e,t,w,`Daemon response has invalid "${t}".`)}function ee(e,t){return l(e,t,T,`Daemon response has invalid "${t}".`)}function _(e,t){return u(e,t,E)??`mobile`}function v(e){if(!O(e))return;let t=x(e,`x`),n=x(e,`y`),r=x(e,`width`),i=x(e,`height`);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:t,y:n,width:r,height:i}}function y(e){if(e!==void 0){if(!O(e))return{kind:`unmeasurable`,reason:`malformed-fact`};if(e.kind===`absent`)return{kind:`absent`};if(e.kind===`unmeasurable`)return typeof e.reason==`string`&&e.reason.trim().length>0?{kind:`unmeasurable`,reason:e.reason}:{kind:`unmeasurable`,reason:`unreported-reason`};if(e.kind===`visible`){let t=v(e.frame);return t!==void 0&&[t.x,t.y,t.width,t.height].every(Number.isFinite)&&t.width>0&&t.height>0?{kind:`visible`,frame:t}:{kind:`unmeasurable`,reason:`invalid-visible-frame`}}return{kind:`unmeasurable`,reason:`unrecognized-kind`}}}function b(e){if(!O(e))return;let t=x(e,`x`),n=x(e,`y`);if(t!==void 0&&n!==void 0)return{x:t,y:n}}function x(e,t){let n=e[t];return typeof n==`number`?n:void 0}function S(e){return typeof e==`string`&&e.length>0?e:void 0}function C(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function w(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`harmonyos`||e===`vega`||e===`linux`||e===`web`?e:void 0}function T(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function E(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function D(t){if(!O(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e){return O(e)?e:void 0}function A(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function j(e){return e.split(`
2
+ `).map(e=>e.trim()).filter(e=>e.length>0)}function M(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function N(t,n,r={}){let i=t[n];if(i!==void 0){if(typeof i!=`number`||!Number.isFinite(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);if(r.min!==void 0&&i<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&i>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return i}}function P(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function F(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}const I=`Each batch step is {"command":"<name>","input":{...}}, where input is that command's own structured input object, keyed by field name. There is no positional step form: args, argv, positionals, and flags are not step fields.`;function L(t,n,r=I){if(!c(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`,{hint:r});return t}function R(t,n,r=I){let i=t.input;if(!c(i))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`,{hint:r});return i}function z(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function B(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function V(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}const H=`com.apple.mobilesafari`;function U(e,t){let n=e?.trim();if(n)return n;if(V(t))return H}const W=new Set(a);async function G(e,n,r){let i=Q(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return $(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!P(o))return $(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let t=K(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of t.entries()){let o=await Z(e,n,a,r,{stepNumber:i+1,totalSteps:t.length,remainingSteps:t.slice(i+1).map(e=>({command:e.command,positionals:e.positionals,flags:e.flags,...e.input===void 0?{}:{input:e.input}}))});if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,...o.error.retriable===void 0?{}:{retriable:o.error.retriable},...o.error.supportedOn===void 0?{}:{supportedOn:o.error.supportedOn},details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:t.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:t.length,executed:t.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let n=t(e);return $(n.code,n.message,n.details)}}function K(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);F(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let a=t[n];if(!O(a))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let s=Object.keys(a).filter(e=>!W.has(e));if(s.length>0){let t=s.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let c=o(a.command);if(!c)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(i(c,n+1),a.positionals!==void 0&&!Array.isArray(a.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let l=a.positionals??[];if(l.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(a.flags!==void 0&&!O(a.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(a.input!==void 0&&!O(a.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:c,positionals:l,input:a.input,flags:a.flags??{},runtime:z(a.runtime,n+1)})}return r}function q(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return J(Q(e),a)}function J(e,t){let n=Q(e)??{},r=t;for(let e of s)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function Y(e,t){return r(e)?t?e:`digest`:e}function X(e,t){let n=e?.responseLevel,r=Y(n,t);return r===n?e:{...e,responseLevel:r}}async function Z(e,t,n,r,i){let{stepNumber:a,totalSteps:o}=i,s=a===o,c=Date.now(),l=q(e.flags,n.flags);l.session===void 0&&(l.session=t);let u=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:l,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:X(e.meta,s)},i),d=Date.now()-c;return u.ok?{ok:!0,step:a,result:{step:a,command:n.command,ok:!0,data:u.data??{},durationMs:d}}:{ok:!1,step:a,error:u.error}}function Q(e){return e}function $(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{c as A,ee as C,y as D,f as E,j as O,p as S,g as T,O as _,V as a,_ as b,F as c,R as d,L as f,D as g,k as h,B as i,A as k,P as l,N as m,G as n,U as o,M as p,H as r,I as s,J as t,z as u,b as v,h as w,m as x,v as y};