@kaeawc/auto-mobile 0.0.92 → 0.0.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +12 -12
- package/dist/schemas/test-plan.schema.json +370 -52
- package/dist/src/{chunk-jhnbfj19.js → chunk-00167wan.js} +5 -5
- package/dist/src/chunk-0jrrsnc9.js +6 -0
- package/dist/src/chunk-0n6swkwg.js +5 -0
- package/dist/src/chunk-0qsy1qsx.js +57 -0
- package/dist/src/chunk-11m8wj8j.js +237 -0
- package/dist/src/{chunk-4pfftt07.js → chunk-1p7xf5kb.js} +3 -3
- package/dist/src/chunk-23p5f095.js +4 -0
- package/dist/src/{chunk-a4k9rt7z.js → chunk-26k317v5.js} +3 -3
- package/dist/src/chunk-284ptqa4.js +7 -0
- package/dist/src/chunk-28re4xrg.js +4 -0
- package/dist/src/chunk-2f9rkmhx.js +5 -0
- package/dist/src/chunk-2fxdh48t.js +4 -0
- package/dist/src/chunk-2tbdrbt6.js +4 -0
- package/dist/src/chunk-2tqzq5qh.js +971 -0
- package/dist/src/chunk-32gvv9b4.js +21 -0
- package/dist/src/chunk-3f3t1x97.js +8 -0
- package/dist/src/chunk-3fspkbc7.js +4 -0
- package/dist/src/chunk-3qwrzxh0.js +11 -0
- package/dist/src/chunk-3sy6ahhz.js +26 -0
- package/dist/src/chunk-3vg455e6.js +4 -0
- package/dist/src/chunk-3xkpk44w.js +5 -0
- package/dist/src/chunk-3y6eykz9.js +4 -0
- package/dist/src/chunk-49bsqdx3.js +4 -0
- package/dist/src/chunk-4hw3665t.js +42 -0
- package/dist/src/chunk-58wzr3mt.js +5 -0
- package/dist/src/chunk-5d2hft6c.js +5 -0
- package/dist/src/chunk-5snsn9cf.js +4 -0
- package/dist/src/chunk-5tm9mn47.js +54 -0
- package/dist/src/chunk-5zc77a5t.js +4 -0
- package/dist/src/chunk-64j0majr.js +19 -0
- package/dist/src/chunk-65y8v4td.js +17 -0
- package/dist/src/chunk-6awz7vhq.js +5 -0
- package/dist/src/{chunk-stfzjr9y.js → chunk-6bznss4t.js} +5 -5
- package/dist/src/chunk-6ep7f5ge.js +4 -0
- package/dist/src/{chunk-0dfnyfkh.js → chunk-6wt9rgjf.js} +3 -3
- package/dist/src/chunk-6xmss8er.js +8 -0
- package/dist/src/chunk-710rxz9y.js +5 -0
- package/dist/src/chunk-7cs2da62.js +5 -0
- package/dist/src/chunk-7g103b54.js +4 -0
- package/dist/src/chunk-7j5vj4pa.js +4 -0
- package/dist/src/chunk-7rz9898k.js +5 -0
- package/dist/src/chunk-7tw8x05v.js +4 -0
- package/dist/src/chunk-7zy586cb.js +4 -0
- package/dist/src/{chunk-r0f1q783.js → chunk-8037tzzj.js} +3 -3
- package/dist/src/chunk-84nanf8s.js +5 -0
- package/dist/src/{chunk-950qcq1e.js → chunk-8g1922rp.js} +4 -4
- package/dist/src/chunk-8gvwcv2p.js +4 -0
- package/dist/src/{chunk-sz1a7p43.js → chunk-8ph29g99.js} +1 -1
- package/dist/src/chunk-8thrmfat.js +4 -0
- package/dist/src/chunk-8zgzzs7k.js +78 -0
- package/dist/src/chunk-97b1zmaq.js +4 -0
- package/dist/src/chunk-9fth9ayh.js +4 -0
- package/dist/src/chunk-9j6anhjr.js +4 -0
- package/dist/src/{chunk-w7zsh13a.js → chunk-aabchzxk.js} +4 -4
- package/dist/src/{chunk-wry6skrm.js → chunk-ayp07wbb.js} +1 -1
- package/dist/src/chunk-bfjwqk8q.js +4 -0
- package/dist/src/{chunk-jdqvcq0a.js → chunk-bfw6125s.js} +3 -3
- package/dist/src/chunk-bnhscm2n.js +4 -0
- package/dist/src/chunk-bxmsax22.js +5 -0
- package/dist/src/chunk-c1vs4g1n.js +4 -0
- package/dist/src/chunk-ct3e7yng.js +4 -0
- package/dist/src/{chunk-8en08r7q.js → chunk-cyy71ggq.js} +3 -3
- package/dist/src/chunk-ddzkz92z.js +4 -0
- package/dist/src/chunk-dgrbdpb7.js +9 -0
- package/dist/src/chunk-drdz8hee.js +5 -0
- package/dist/src/chunk-e98dqnc9.js +145 -0
- package/dist/src/chunk-eersndy7.js +5 -0
- package/dist/src/chunk-eggq53ks.js +4 -0
- package/dist/src/chunk-f2dya7cs.js +4 -0
- package/dist/src/chunk-fbakd6cw.js +4 -0
- package/dist/src/chunk-fgb98zjj.js +5 -0
- package/dist/src/chunk-fmpad823.js +5 -0
- package/dist/src/{chunk-v90es00d.js → chunk-g04bwyj3.js} +2 -2
- package/dist/src/chunk-g0xr8zw0.js +4 -0
- package/dist/src/chunk-g3rjs80x.js +4 -0
- package/dist/src/chunk-g78rtrfv.js +4 -0
- package/dist/src/{chunk-r20pe1nv.js → chunk-g7tmjbkt.js} +3 -3
- package/dist/src/chunk-gabgv3y5.js +4 -0
- package/dist/src/chunk-gmr45m8f.js +4 -0
- package/dist/src/chunk-gsyfebqj.js +4 -0
- package/dist/src/chunk-h5rpn9wr.js +247 -0
- package/dist/src/chunk-hb1x7v55.js +4 -0
- package/dist/src/chunk-hrfytkxh.js +168 -0
- package/dist/src/chunk-j4yjzbak.js +4 -0
- package/dist/src/chunk-jd6a5v6p.js +5 -0
- package/dist/src/chunk-jh6vhqzx.js +5 -0
- package/dist/src/chunk-kn5spq15.js +4 -0
- package/dist/src/{chunk-w2mwa0jk.js → chunk-m94qs0f0.js} +2 -2
- package/dist/src/chunk-mjrps0ac.js +7 -0
- package/dist/src/chunk-n03dmn5q.js +5 -0
- package/dist/src/chunk-n72qhwd9.js +4 -0
- package/dist/src/{chunk-km0dy5vc.js → chunk-ndt1ccxm.js} +9 -9
- package/dist/src/chunk-nr6y0n4y.js +5 -0
- package/dist/src/chunk-pcsen2vs.js +4 -0
- package/dist/src/chunk-ppfr0b8h.js +4 -0
- package/dist/src/chunk-q10bdnat.js +4 -0
- package/dist/src/chunk-q9xmq595.js +4 -0
- package/dist/src/{chunk-2v7tw1nj.js → chunk-qcxzr2my.js} +3 -3
- package/dist/src/chunk-qf6nynk6.js +7 -0
- package/dist/src/chunk-qyqypn28.js +5 -0
- package/dist/src/chunk-r2epb56s.js +4 -0
- package/dist/src/chunk-r5bxavdx.js +311 -0
- package/dist/src/{chunk-r14wwk37.js → chunk-r6z1eztj.js} +12 -12
- package/dist/src/{chunk-d57432wq.js → chunk-r7bpkgff.js} +2 -2
- package/dist/src/chunk-r8jf3d92.js +4 -0
- package/dist/src/{chunk-9rkfyt6q.js → chunk-rbpdk7m0.js} +3 -3
- package/dist/src/chunk-rc0dbypm.js +4 -0
- package/dist/src/chunk-rhcty4ms.js +4 -0
- package/dist/src/chunk-rpvckv3p.js +4 -0
- package/dist/src/{chunk-s1zq65ny.js → chunk-rqc9ap3x.js} +2 -2
- package/dist/src/chunk-rvvy1bte.js +7 -0
- package/dist/src/chunk-ry0mz41y.js +4 -0
- package/dist/src/{chunk-34zxqcmq.js → chunk-s3jc6cwp.js} +3 -3
- package/dist/src/chunk-sfv61xjb.js +6 -0
- package/dist/src/chunk-t6bfvfkg.js +4 -0
- package/dist/src/chunk-t6c8akcm.js +5 -0
- package/dist/src/chunk-t7w8rctc.js +4 -0
- package/dist/src/chunk-thbh3jew.js +5 -0
- package/dist/src/chunk-v2wd4n3e.js +5 -0
- package/dist/src/{chunk-zg67wjkh.js → chunk-v6pya0dm.js} +3 -3
- package/dist/src/chunk-vy3bwm1d.js +17 -0
- package/dist/src/chunk-w3vs79ex.js +27 -0
- package/dist/src/chunk-w4zga19f.js +4 -0
- package/dist/src/chunk-w5b2jwk3.js +14 -0
- package/dist/src/chunk-w7hkv422.js +5 -0
- package/dist/src/{chunk-qv2918jt.js → chunk-waqwcjyn.js} +2 -2
- package/dist/src/{chunk-b4cxdzwy.js → chunk-wbh8spm5.js} +7 -7
- package/dist/src/{chunk-ajsrz473.js → chunk-wyrkw6hw.js} +3 -3
- package/dist/src/chunk-xa73x2cx.js +5 -0
- package/dist/src/{chunk-eka89q3k.js → chunk-xgan0qqp.js} +1 -1
- package/dist/src/chunk-y2vs6jwg.js +4 -0
- package/dist/src/chunk-yattm52s.js +4 -0
- package/dist/src/{chunk-9y5bcy28.js → chunk-yb97j25b.js} +4 -4
- package/dist/src/{chunk-c9nk1r78.js → chunk-ybbtagbt.js} +3 -3
- package/dist/src/chunk-ycaj2sgf.js +9 -0
- package/dist/src/chunk-yf7ympyz.js +325 -0
- package/dist/src/chunk-yjawdzk8.js +4 -0
- package/dist/src/chunk-z637nqg8.js +11 -0
- package/dist/src/{chunk-0w1spptt.js → chunk-zgja5f3p.js} +4 -4
- package/dist/src/chunk-zs1sghs9.js +4 -0
- package/dist/src/daemon/processEntry.js +2 -2
- package/dist/src/index.js +4 -4
- package/dist/src/runtime/bunRuntimeGuard.js +2 -2
- package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
- package/ios/CameraPosterInjection/Injection/CameraPosterInjection.m +466 -0
- package/package.json +3 -2
- package/schemas/test-plan.schema.json +370 -52
- package/dist/src/chunk-09442h7v.js +0 -4
- package/dist/src/chunk-0e4gm1kj.js +0 -5
- package/dist/src/chunk-0eb8576f.js +0 -4
- package/dist/src/chunk-0rjm4nx7.js +0 -5
- package/dist/src/chunk-1zmh2eak.js +0 -4
- package/dist/src/chunk-28k63ha3.js +0 -5
- package/dist/src/chunk-2d4wmp8b.js +0 -4
- package/dist/src/chunk-2e6s75qv.js +0 -78
- package/dist/src/chunk-32jpxz2y.js +0 -323
- package/dist/src/chunk-3jmvqygr.js +0 -238
- package/dist/src/chunk-3swvfhqt.js +0 -5
- package/dist/src/chunk-44bt78m9.js +0 -5
- package/dist/src/chunk-488vt2bp.js +0 -4
- package/dist/src/chunk-4fgdhcwx.js +0 -5
- package/dist/src/chunk-4jp2se4w.js +0 -4
- package/dist/src/chunk-4vhr9e4t.js +0 -4
- package/dist/src/chunk-4xd6zs3y.js +0 -15
- package/dist/src/chunk-51567pg8.js +0 -4
- package/dist/src/chunk-5agqsfev.js +0 -4
- package/dist/src/chunk-5d706gmr.js +0 -4
- package/dist/src/chunk-5kd4rqk7.js +0 -5
- package/dist/src/chunk-61t538bm.js +0 -4
- package/dist/src/chunk-6d3mmqxt.js +0 -54
- package/dist/src/chunk-6hyt398x.js +0 -5
- package/dist/src/chunk-6mnr8kpm.js +0 -4
- package/dist/src/chunk-79q5xsdc.js +0 -42
- package/dist/src/chunk-7bdgand3.js +0 -4
- package/dist/src/chunk-84cp9dw5.js +0 -4
- package/dist/src/chunk-86f2h5ww.js +0 -5
- package/dist/src/chunk-8cghfzb2.js +0 -19
- package/dist/src/chunk-9tf2p9y9.js +0 -5
- package/dist/src/chunk-a2sc4jm0.js +0 -5
- package/dist/src/chunk-aa5ng3d1.js +0 -4
- package/dist/src/chunk-b3h0a6ca.js +0 -4
- package/dist/src/chunk-b6a737qt.js +0 -4
- package/dist/src/chunk-bn64x5z5.js +0 -5
- package/dist/src/chunk-bvh649za.js +0 -12
- package/dist/src/chunk-c9tyfg4j.js +0 -26
- package/dist/src/chunk-cfsdfqnm.js +0 -4
- package/dist/src/chunk-cxyf04jc.js +0 -7
- package/dist/src/chunk-da08tx5v.js +0 -4
- package/dist/src/chunk-f2tc08m2.js +0 -4
- package/dist/src/chunk-f8tnk179.js +0 -5
- package/dist/src/chunk-f9s1kkhx.js +0 -5
- package/dist/src/chunk-fbp8a4rx.js +0 -4
- package/dist/src/chunk-fd2z0sze.js +0 -4
- package/dist/src/chunk-fk927f4q.js +0 -54
- package/dist/src/chunk-fxmr3a0f.js +0 -4
- package/dist/src/chunk-gaqwhd44.js +0 -4
- package/dist/src/chunk-ggtd5x5a.js +0 -5
- package/dist/src/chunk-gndcfrm7.js +0 -4
- package/dist/src/chunk-h3n4adc6.js +0 -310
- package/dist/src/chunk-h5pjbb83.js +0 -4
- package/dist/src/chunk-hgnnh302.js +0 -4
- package/dist/src/chunk-hmke8nhx.js +0 -5
- package/dist/src/chunk-j2bx12hn.js +0 -4
- package/dist/src/chunk-j70y1a2g.js +0 -4
- package/dist/src/chunk-js1jpyxp.js +0 -6
- package/dist/src/chunk-kbjq0qvb.js +0 -4
- package/dist/src/chunk-kfwx57xd.js +0 -4
- package/dist/src/chunk-kzwctna2.js +0 -4
- package/dist/src/chunk-m9ehyehy.js +0 -4
- package/dist/src/chunk-mct91p1f.js +0 -4
- package/dist/src/chunk-mf9spd4g.js +0 -5
- package/dist/src/chunk-mgrcansb.js +0 -4
- package/dist/src/chunk-mqc1d0eb.js +0 -6
- package/dist/src/chunk-n1zmpk0z.js +0 -4
- package/dist/src/chunk-ncyjf63g.js +0 -4
- package/dist/src/chunk-nr64d21q.js +0 -973
- package/dist/src/chunk-nwm2pq5v.js +0 -168
- package/dist/src/chunk-pm06b05d.js +0 -9
- package/dist/src/chunk-q50s00ry.js +0 -4
- package/dist/src/chunk-qwye1958.js +0 -14
- package/dist/src/chunk-r8z9pfve.js +0 -5
- package/dist/src/chunk-rdpgkjf6.js +0 -4
- package/dist/src/chunk-rkr0dks9.js +0 -5
- package/dist/src/chunk-rn84t3sf.js +0 -11
- package/dist/src/chunk-s123kn7n.js +0 -4
- package/dist/src/chunk-s73qn3fx.js +0 -4
- package/dist/src/chunk-sjn0nj4p.js +0 -5
- package/dist/src/chunk-sns0c35v.js +0 -7
- package/dist/src/chunk-t4dr5c8v.js +0 -8
- package/dist/src/chunk-tc8k9c1j.js +0 -4
- package/dist/src/chunk-teznhase.js +0 -4
- package/dist/src/chunk-ty9xgmz4.js +0 -4
- package/dist/src/chunk-tyazf3sk.js +0 -145
- package/dist/src/chunk-v6npjrjm.js +0 -5
- package/dist/src/chunk-vbvtzkwz.js +0 -5
- package/dist/src/chunk-vefd8qee.js +0 -8
- package/dist/src/chunk-vs9r72ta.js +0 -17
- package/dist/src/chunk-w88k0bgr.js +0 -4
- package/dist/src/chunk-wzdt0enk.js +0 -4
- package/dist/src/chunk-xhhv854c.js +0 -4
- package/dist/src/chunk-y58270hd.js +0 -4
- package/dist/src/chunk-yk0hmbex.js +0 -4
- package/dist/src/chunk-ympy4fdz.js +0 -28
- package/dist/src/chunk-yw436axy.js +0 -4
- package/dist/src/chunk-z04jrpjy.js +0 -5
- package/dist/src/chunk-z2xznczw.js +0 -4
- package/dist/src/chunk-z4xnrgps.js +0 -4
- package/dist/src/chunk-z7csyszv.js +0 -4
- package/dist/src/chunk-z8t0v07j.js +0 -11
- package/dist/src/chunk-z916af47.js +0 -228
- package/dist/src/chunk-zcr8he8q.js +0 -5
- package/dist/src/chunk-zd9vmkzn.js +0 -9
- package/dist/src/chunk-zj939v0h.js +0 -5
- package/dist/src/chunk-zkdjwtc1.js +0 -4
- package/dist/src/chunk-zkv5kzt6.js +0 -4
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{i,qk,ioe,Se,Ft,l,e}from"./chunk-z8t0v07j.js";import{sr,Yd,OF,mV,fV,MF,K4,NF,vo}from"./chunk-6d3mmqxt.js";import{Ji,Cr,Y,Qr,Un,ti,o,R,xv,Cv,VT,cp,Ot,mr,_e,ir,Br,Jv,bD,_,k,Bs}from"./chunk-h3n4adc6.js";import{L}from"./chunk-32jpxz2y.js";import{OR,MR}from"./chunk-79q5xsdc.js";import{x4,tQ,rQ,nQ,iQ,yh,qS,VS,Gy}from"./chunk-0e4gm1kj.js";import{zd,De}from"./chunk-4fgdhcwx.js";import{ba,gh,Ni,ts}from"./chunk-bn64x5z5.js";import{Lo,TV,aC,dc,X4,Ra,Pa,kh,iT,Aa,GS,Z4,Q4,Eh,Ih,fn,YS,JS,XS,rv,OQ}from"./chunk-sns0c35v.js";import{r,t,u,yt}from"./chunk-9rkfyt6q.js";class X{dependencies;constructor(n){this.dependencies=n}async resolveState(n,s){o(n);let{talkBack:a,unconfirmed:d}=await R(gh(this.dependencies.accessibilityDetector,this.dependencies.target.device.deviceId,this.dependencies.target.adb,this.dependencies.featureFlags),n);if(o(n),d)s?.([ba]);return a===!0}async dispatchTap(n,s,a,{signal:d,context:c}){let p={assertCurrent:()=>{o(d),c.assertCurrent()}},m=this.dependencies.talkBackDriverFactory.createDriver(this.dependencies.target.device),h={requestTraversalOrder:m.requestTraversalOrder.bind(m),requestCurrentFocus:m.requestCurrentFocus.bind(m),requestAction:m.requestAction.bind(m),requestNodeAction:m.requestNodeAction.bind(m),supportsNodeActionSelectors:m.supportsNodeActionSelectors.bind(m),requestTapCoordinates:async(y)=>{let{x:b,y:T,duration:v=10,onDispatch:g}=y;p.assertCurrent();let S=()=>{c.onDispatched?.(),g?.()},A=this.dependencies.useContextualFocusTap?await this.requestContextualTalkBackFocus({x:b,y:T},v,a,{signal:d,fence:p,onDispatch:S}):await m.requestTapCoordinates({x:b,y:T,duration:v,onDispatch:S});if(A.success)c.onTapDelivered();return o(d),{...A,totalTimeMs:0}},requestDoubleTapCoordinates:async(y,b,T)=>{p.assertCurrent();let v=await m.requestDoubleTapCoordinates(y,b,()=>{c.onDispatched?.(),T?.()});if(v.success)c.onTapDelivered(),c.onTapDelivered();return o(d),v}},f=await R(n.action==="longPress"?this.dependencies.talkBackStrategy.executeCoordinateFallback({x:s.x,y:s.y},"longPress",GS(n,"android"),{driver:h,fenceOptions:{displayFence:p}}):this.dependencies.talkBackStrategy.executePreciseTap(s.x,s.y,h,p),d);if(c.onActivationWarnings?.(f.warnings),!f.success)throw new t(`TalkBack coordinate tap failed: ${f.error??"activation was not confirmed"}${f.focusCompleted?" Focus touch was delivered; activation failed. Do not retry automatically.":""}`);o(d)}async requestContextualTalkBackFocus(n,s,a,d){let{signal:c,fence:p,onDispatch:m}=d,h=!1;try{let f=await this.dependencies.androidClient.requestTapCoordinates({x:n.x,y:n.y,duration:s,timeoutMs:Jv(s),frameContext:a,onDispatch:()=>{h=!0},signal:c,beforeSend:p.assertCurrent});if(h&&!Aa(f.error))m();return f}catch(f){if(h)throw m(),fn(r(f));throw u(f,"TalkBack focus tap failed before dispatch")}}}class J{dependencies;constructor(n){this.dependencies=n}async dispatchAndroidTaps(n,s,a,d){let{transitionRevision:c}=d,p=await this.dispatchAndroidTapWithOneFreshRetry(n,s,a,d);if(!d.talkBackEnabled)await this.dispatchSecondAndroidTap(n,s,c,{...d,firstTap:p})}async dispatchAndroidTapWithOneFreshRetry(n,s,a,d){let{signal:c,transitionRevision:p,perf:m}=d,h=a.viewHierarchy?.frameContext,f=!1,y=!1,b=()=>{f=!0,d.onTapDelivered()};try{if(d.talkBackEnabled)return await this.dependencies.androidTalkBack.dispatchTap(n,s,h,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:b,onDispatched:()=>{y=!0},onActivationWarnings:d.onActivationWarnings}}),{doubleTapDelivered:!1,startedAt:this.dependencies.timer.now()};return await this.dispatchAndroidFirstTap(n,s,h,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:d.onTapDelivered}})}catch(T){o(c);let v=u(T,"Failed to dispatch Android coordinate tap");if(f||y||h===void 0||!Aa(v.message))throw v;o(c);let g=await this.dependencies.host.observeScreen.execute({freshness:this.dependencies.host.retryFreshness(n),signal:c,perf:m});this.dependencies.host.assertDisplayRevisionCurrent(p),this.dependencies.host.assertSnapshotCurrent(n,g);let S=this.dependencies.host.resolveFreshFrameRetry(n,s,a,g);if(!S)throw v;if(d.talkBackEnabled)return await this.dependencies.androidTalkBack.dispatchTap(n,S.point,S.frameContext,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:b,onDispatched:()=>{y=!0},onActivationWarnings:d.onActivationWarnings}}),{doubleTapDelivered:!1,startedAt:this.dependencies.timer.now()};return await this.dispatchAndroidFirstTap(n,S.point,S.frameContext,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:d.onTapDelivered}})}}async dispatchAndroidFirstTap(n,s,a,{signal:d,context:c}){let p=this.dependencies.timer.now();if(n.action==="doubleTap"&&await Q4(this.dependencies.androidClient,{...s,frameContext:a,signal:d,assertCurrent:c.assertCurrent,onTapDelivered:c.onTapDelivered}))return{doubleTapDelivered:!0,startedAt:p};return await this.dispatchAndroidTap(s,GS(n,"android"),a,{signal:d,context:c}),{doubleTapDelivered:!1,startedAt:p}}async dispatchSecondAndroidTap(n,s,a,d){let{signal:c}=d;if(n.action!=="doubleTap"||d.firstTap.doubleTapDelivered)return;await Z4(this.dependencies.timer,d.firstTap.startedAt,{signal:c,onWarning:(p)=>d.onActivationWarnings([p])}),this.dependencies.host.assertDisplayRevisionCurrent(a),await this.dispatchAndroidTap(s,GS(n,"android"),void 0,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(a),onTapDelivered:d.onTapDelivered}})}async dispatchAndroidTap(n,s,a,{signal:d,context:c}){let p=nQ(c.onTapDelivered);await this.dependencies.androidCoordinateTap(this.dependencies.androidClient,this.dependencies.host.adb,n,{durationMs:s,options:{frameContext:a,signal:d,assertCurrent:c.assertCurrent,onTapDelivered:p}}),p(),o(d)}}import{createHash as le}from"crypto";import{isDeepStrictEqual as Qe}from"util";var Ze=300000,et=128,tt=new Set(["extras","view-id","occlusionState","occludedBy","occludedByViewId"]);function V(n){if(Array.isArray(n))return n.map(V);if(!n||typeof n!=="object")return n;return Object.fromEntries(Object.entries(n).filter(([s])=>!tt.has(s)).map(([s,a])=>[s,V(a)]))}function ye(n){return Boolean(Cv(n.truncationReasons).length||Cv(n.viewHierarchy?.truncationReasons).length)}function be(n){return Boolean(n.truncationReasons?.some(xv)||n.viewHierarchy?.truncationReasons?.some(xv)||n.viewHierarchy?.windows?.some((s)=>s.truncationReasons?.some(xv)))}function ve(n){return ye(n)||be(n)&&(!n.viewHierarchy||!VT(n.viewHierarchy))||Boolean(n.viewHierarchy?.windows?.some((s)=>Cv(s.truncationReasons??void 0).length>0))}function me(n){let s=n.rotation??n.viewHierarchy?.rotation;if(!Number.isInteger(s)||!n.viewHierarchy||ye(n))return null;let a=n.viewHierarchy;return{screenSize:{width:n.screenSize?.width,height:n.screenSize?.height},rotation:s,systemInsets:n.systemInsets,insets:n.insets,activeWindow:{appId:n.activeWindow?.appId,activityName:n.activeWindow?.activityName},screenIdentity:n.screenIdentity?{platform:n.screenIdentity.platform,source:n.screenIdentity.source,key:n.screenIdentity.key}:void 0,hierarchy:{tree:V(a.hierarchy),windows:V(a.windows),packageName:a.packageName,foregroundActivity:a.foregroundActivity,screenWidth:a.screenWidth,screenHeight:a.screenHeight,pixelWidth:a.pixelWidth,pixelHeight:a.pixelHeight,nativeScale:a.nativeScale,rotation:a.rotation,systemInsets:a.systemInsets,insets:a.insets}}}function Te(n,s){let a=me(n),d=me(s);return a!==null&&d!==null&&Qe(a,d)}function rt(n){return Number.isFinite(n.width)&&Number.isFinite(n.height)&&n.width>0&&n.height>0}function nt(n){return typeof n==="number"&&Number.isFinite(n)&&n>0}function it(n){return/^([0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}):\d+(?::[0-9a-f]+)?$/i.exec(n)?.[1]?.toLowerCase()}function ge(n){let s=[];if(!n.display?.key)s.push("display");if(!rt(n.screenSize))s.push("screenSize");let a=n.rotation??n.viewHierarchy?.rotation;if(!Number.isInteger(a))s.push("rotation");if(!nt(n.viewHierarchy?.nativeScale))s.push("nativeScale");if(!n.viewHierarchy?.frameContext)s.push("frameContext");if(ve(n))s.push("completeHierarchy");return s}function ot(n){let s=n.viewHierarchy?.windows?.find((d)=>d.isFocused),a=s?.bounds;return{focusedWindowPresent:s!==void 0,focusedWindowId:s?.id,focusedWindowType:s?.type,focusedWindowPackage:s?.packageName,focusedWindowBounds:a?JSON.stringify([a.left,a.top,a.right,a.bottom]):void 0}}function he(n,s){if(ge(s).length>0)return;let{width:a,height:d}=s.screenSize;return{deviceId:n,incarnation:Ji(n),displayKey:s.display.key,displayRole:s.display.role,displayPosture:s.display.posture,width:a,height:d,rotation:s.rotation??s.viewHierarchy?.rotation,nativeScale:s.viewHierarchy.nativeScale,runnerEpoch:it(s.viewHierarchy.frameContext),appId:s.activeWindow?.appId||s.viewHierarchy?.packageName,hierarchyPackage:s.viewHierarchy?.packageName,activityName:s.activeWindow?.activityName??"",windowType:s.activeWindow?.type,...ot(s)}}function st(n,s,a){if(a==="runnerEpoch"||a==="focusedWindowPresent")return!1;if((a==="activityName"||a==="windowType")&&(!n[a]||!s[a]))return!1;if(a.startsWith("focusedWindow")&&(!n.focusedWindowPresent||!s.focusedWindowPresent))return!1;return n[a]!==s[a]}function xe(n){if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return[s.left,s.top,s.right,s.bottom]}return n}function z(n,s){if(Array.isArray(s)){for(let c of s)z(n,c);return}if(!s||typeof s!=="object")return;let a=s,d={...a,...Se(a)};if(bD(d["resource-id"]))return;n.update("["),n.update(JSON.stringify([d.className??d.class??d.type,d.role,xe(Ft(a)),d.clickable,d.enabled,d["visible-to-user"],d.scrollable,d["resource-id"],Array.isArray(d.actions)?[...d.actions].sort():d.actions])),z(n,a.node),n.update("]")}function fe(n){let s=n.viewHierarchy,a=be(n)?VT(s):s,d=le("sha256");d.update(Cr([n.systemInsets,n.insets,s.screenWidth,s.screenHeight,s.pixelWidth,s.pixelHeight,s.nativeScale,s.rotation,s.systemInsets,s.insets])),z(d,a.hierarchy);let c;if(a.windows!==void 0){let p=le("sha256");for(let m of a.windows)p.update(JSON.stringify([m.id,m.type,m.isActive,m.isFocused,xe(m.bounds),m.windowLayer,m.packageName])),z(p,m.hierarchy);c=p.digest("hex")}return{tree:d.digest("hex"),windows:c}}function at(n,s){return n.tree===s.tree&&(n.windows===void 0||s.windows===void 0||n.windows===s.windows)}class Ae{timer;ids;entries=new Map;constructor(n=i,s=L){this.timer=n;this.ids=s}capture(n,s){let a=he(n,s);if(!a)return{status:"unavailable",missing:ge(s)};this.cleanup();while(this.entries.size>=et)this.entries.delete(this.entries.keys().next().value);let d={snapshotId:this.ids.next(),expiresAt:this.timer.now()+Ze};return this.entries.set(d.snapshotId,{...a,...d,layout:fe(s)}),{status:"captured",reference:d}}staleReason(n,s,a){let d=this.entries.get(n);if(!d)return"Snapshot reference is unknown or evicted; re-observe.";if(this.timer.now()>=d.expiresAt)return this.entries.delete(n),"Snapshot reference expired; re-observe.";if(ve(a))return"Snapshot layout is unavailable. The hierarchy capture was incomplete; observe again, or use a selector or coordinates without a snapshotId.";let c=he(s,a);if(!c)return"Snapshot geometry or frame context is unavailable; re-observe.";if(d.runnerEpoch!==c.runnerEpoch)return"Snapshot reference is stale (runner restarted); re-observe.";for(let m of Object.keys(c))if(st(d,c,m))return`Snapshot reference is stale (${m} changed); re-observe.`;let p=fe(a);if(!at(d.layout,p))return"Snapshot reference is stale (tap-targeting layout changed); re-observe.";return}get size(){return this.entries.size}cleanup(){for(let[n,s]of this.entries)if(this.timer.now()>=s.expiresAt)this.entries.delete(n)}}var Lu=new Ae;var B=31,ut=5000;function Q(n){return`shell input stylus ${n}`}function k4(n){let{pointer:s,platform:a,gesture:d,display:c}=n;if(s===void 0)return;if(s.toolType!=="stylus"&&s.toolType!=="eraser")return`pointer.toolType "${String(s.toolType)}" is not supported; only "stylus" or "eraser" can be injected`;if(a!=="android")return`pointer.toolType "${s.toolType}" is Android-only; omit pointer on iOS`;if(d==="doubleTap")return"stylus pointer does not support doubleTap yet; use tap or longPress";if(c!==void 0)return"stylus pointer does not support display selection yet; omit display";return}async function dt(n,s){let a=await Ot(n,ut,void 0,s);if(a===null)return`could not read the device's Android API level, so stylus input is refused (it needs API ${B} or newer)`;if(a<B)return`stylus input needs Android API ${B} or newer (this device reports API ${a}): older releases build the injected event without a stylus tool type`;return}async function ct(n,s){let a=await dt(n,s);if(a)throw new t(a)}function Pe(n,s){return k4({pointer:s.pointer,platform:n,gesture:s.action??"tap",display:s.display})}function we(n,s,a="tap"){return{success:!1,x:s.x,y:s.y,action:a,error:n}}class Ky extends t{}function pt(n,s){let{command:a,dispatched:d,holdMs:c,signal:p}=s;if(n instanceof _e||n instanceof TV)return n;try{aC(a,Qr(n))}catch(h){return h}if(!d)return n;let m=c===void 0?void 0:x4(n,c,p);return new Ky(m??r(n),{cause:n})}async function Re(n,{command:s,timeoutMs:a,holdMs:d},c){await ct(n,c.signal);let p=!1;try{await X4(n,s,{...c,timeoutMs:a,onDispatch:()=>{p=!0,c.onDispatch?.()}})}catch(m){throw pt(m,{command:s,dispatched:p,holdMs:d,signal:c.signal})}}async function Ce(n,s,a,d={}){let{x:c,y:p}=s,m=a.durationMs??iT,h=a.action==="longPress";try{await Re(n,h?{command:Q(`swipe ${c} ${p} ${c} ${p} ${Lo(m)}`),timeoutMs:Br(m),holdMs:m}:{command:Q(`tap ${c} ${p}`)},d)}catch(f){throw f instanceof Ky?fn(f.message):f}}function Z7(n,s,a={}){let{from:d,to:c,duration:p}=s;return Re(n,{command:Q(`swipe ${d.x} ${d.y} ${c.x} ${c.y} ${Lo(p)}`),timeoutMs:Br(p)},a)}var Ie=new Map;function H(n){let s=Ie.get(n);if(!s)s=new Un,Ie.set(n,s);return s}var lt="dev.jasonpearson.automobile.ctrlproxy/.pointer.PointerInstrumentation",Z=31,mt=1,Ee=200,ht=15000;function E4(n){return n*2+ht}class Wd extends t{}function ft(n){return n.points.slice(1).reduce((s,a)=>s+(a.durationMs??Ee),0)}function bt(n){let s={version:mt,tool:n.features.toolType,hover:n.features.hover===!0,buttons:n.buttons??0,displayId:n.displayId??0,points:n.points.map((a,d)=>({x:a.x,y:a.y,...d===0?{}:{durationMs:a.durationMs??Ee},...a.distance===void 0?{}:{distance:a.distance},...a.pressure===void 0?{}:{pressure:a.pressure},...a.tilt===void 0?{}:{tilt:a.tilt},...a.orientation===void 0?{}:{orientation:a.orientation}}))};return Buffer.from(JSON.stringify(s),"utf8").toString("base64")}function vt(n){return`shell am instrument -w -r --no-restart -e request ${bt(n)} ${lt}`}function Tt(n){let s=new Map;for(let c of n.split(/\r?\n/)){let p=/^INSTRUMENTATION_RESULT: ([A-Za-z]+)=(.*)$/.exec(c);if(p)s.set(p[1],p[2])}let a=s.get("success");if(a!=="true"&&a!=="false")return;let d=s.get("error");return{success:a==="true",...d?{error:d}:{},injected:Number(s.get("injected")??0),elapsedMs:Number(s.get("elapsedMs")??0)}}async function gt(n,s){if(/Unable to find instrumentation|INSTRUMENTATION_FAILED|does not exist/i.test(n))return new Wd("The connected CtrlProxy does not include the pointer instrumentation; update CtrlProxy. No input was sent.");if(/Unknown option|--no-restart/i.test(n))return new Wd("This Android version's `am instrument` has no --no-restart, which keeps the injection from restarting CtrlProxy; hover and stylus injection need Android 12 or newer. No input was sent.");if(/Process crashed|INSTRUMENTATION_RESULT: shortMsg=/i.test(n)){let a="";try{a=(await s.executeCommand("shell settings get secure enabled_accessibility_services",{timeoutMs:5000})).stdout.includes("dev.jasonpearson.automobile.ctrlproxy")?" CtrlProxy's accessibility service is still enabled.":" CtrlProxy's accessibility service is not enabled; re-enable it before retrying."}catch(d){e.warn(`Could not read accessibility services after pointer crash: ${r(d)}`,d)}return new t("The pointer instrumentation crashed before reporting a result; the hover or stroke may have partially run. Verify state with observe before retrying."+a)}return new t("The pointer instrumentation did not report a result; the hover or stroke may have partially run. Verify state with observe before retrying.")}function Nq(n,s){let a=H(s);return async(d,c)=>{o(c),await a.runExclusive(async()=>{o(c);let p=async()=>{let h=await n.executeCommand(vt(d),{timeoutMs:E4(ft(d)),signal:c}),f=[h.stdout,h.stderr].filter(Boolean).join(`
|
|
3
|
-
`),y=Tt(f);if(!y)throw await gt(f,n);return y},m=await p();if(!m.success&&m.injected===0&&/refused/i.test(m.error??"")){o(c);let h=d.points[0];try{await n.executeCommand(`shell input stylus motionevent CANCEL ${Math.round(h.x)} ${Math.round(h.y)}`,{timeoutMs:5000,signal:c})}catch(f){e.warn(`Could not cancel refused pointer input: ${r(f)}`,f)}o(c),m=await p()}if(!m.success)throw new t(`The pointer instrumentation failed after ${m.injected} event${m.injected===1?"":"s"}: ${m.error??"unknown error"}`)})}}function St(n,s){let a=s.width-1,d=s.height-1,c=Math.round(n.x),p=Math.round(n.y),m=s.rotation===1?{x:a-p,y:c}:s.rotation===2?{x:a-c,y:d-p}:s.rotation===3?{x:p,y:d-c}:{x:c,y:p};return{x:re(m.x,a),y:re(m.y,d)}}function xt(n,s){switch(s){case 1:return n+Math.PI/2;case 2:return n+Math.PI;case 3:return n-Math.PI/2;default:return n}}function re(n,s){return Math.min(Math.max(n,0),s)}function At(n,s){let a=Math.sin(n)**2,d=Math.sin(s)*Math.cos(s),c=Math.sqrt(Math.max(0,1-4*d*d*a)),p=d===0?a:2*a/(1+c),m=Math.sqrt(p),h=(f)=>Math.max(-90,Math.min(90,Math.round(Math.asin(Math.max(-1,Math.min(1,f)))*180/Math.PI)))||0;return{x:h(-m*Math.sin(s)),y:h(m*Math.cos(s))}}function Pt(n){let s=n.features.hover===!0,a=n.points[0],d=a.pressure??(s?0:1),c=a.distance??(s?0.5:0),m=n.points.some((b)=>b.tilt!==void 0||b.orientation!==void 0)?a.tilt??0:void 0,h=a.orientation??0,f=[{atMs:0,x:a.x,y:a.y,pressure:d,distance:c,tilt:m,orientation:h}],y=0;return n.points.slice(1).forEach((b,T)=>{let v=n.points[T],g=b.durationMs??200,S=Math.max(1,Math.ceil(g/16)),A={pressure:d,distance:c,tilt:m,orientation:h};for(let I=1;I<=S;I++){let P=I/S;d=N(A.pressure,b.pressure??A.pressure,P),c=N(A.distance,b.distance??A.distance,P),m=A.tilt===void 0?void 0:N(A.tilt,b.tilt??A.tilt,P),h=N(A.orientation,b.orientation??A.orientation,P),f.push({atMs:y+Math.floor(g*I/S),x:I===S?b.x:N(v.x,b.x,P),y:I===S?b.y:N(v.y,b.y,P),pressure:d,distance:c,tilt:m,orientation:h})}y+=g}),f}function N(n,s,a){return n+(s-n)*a}function E(n,s){return[3,n,s]}function Oe(n,s){return Math.round(re(n,1)*s)}function ne(n,s,a){let d=St(n,s),c=!a&&n.tilt!==void 0?At(n.tilt,xt(n.orientation,s.rotation)):void 0;return[...E(0,d.x),...E(1,d.y),...a?E(25,Oe(n.distance,255)):E(24,Oe(n.pressure,4095)),...c?[...E(26,c.x),...E(27,c.y)]:[]]}var F=[0,0,0];function ke(n){return n.features.toolType==="eraser"?321:320}function Be(n,s){return[...n&32?[1,331,s]:[],...n&64?[1,332,s]:[]]}function wt(n,s,a,d){let c=[1,ke(d),1];return a?[...c,...ne(n,s,!0),...E(24,0),...F]:[...c,1,330,1,...ne(n,s,!1),...E(25,0),...Be(d.buttons??0,1),...F]}function Rt(n,s,a){let d=[1,s,0,...F];return n?d:[...Be(a,0),1,330,0,...E(24,0),...F,...d]}function M(n,s,a){return{code:n,info:{value:0,minimum:s,maximum:a,fuzz:0,flat:0,resolution:0}}}function Ct(n){return{id:1,command:"register",name:"automobile-pen",vid:6353,pid:19985,bus:"usb",configuration:[{type:100,data:[0,1,3]},{type:101,data:[320,321,330,331,332]},{type:103,data:[0,1,24,25,26,27]},{type:110,data:[1]}],abs_info:[M(0,0,n.width-1),M(1,0,n.height-1),M(24,0,4095),M(25,0,255),M(26,-90,90),M(27,-90,90)]}}var ee=(n)=>({id:1,command:"inject",events:n}),te=(n)=>({id:1,command:"delay",duration:n});function Ne(n,s){let a=n.features.hover===!0,[d,...c]=Pt(n),p=[Ct(s),te(4000),ee(wt(d,s,a,n))],m=0;for(let h of c){if(h.atMs>m)p.push(te(h.atMs-m)),m=h.atMs;p.push(ee([...ne(h,s,a),...F]))}return p.push(ee(Rt(a,ke(n),n.buttons??0)),te(50)),`${p.map((h)=>JSON.stringify(h)).join(`
|
|
4
|
-
`)}
|
|
5
|
-
`}var I4=4050;function Me(n){return I4+n.slice(1).reduce((s,a)=>s+(a.durationMs??200),0)}var Fe=5000,It=1e4,Et=1e5,q="automobile-uinput-exit=",Ue=97;async function Dt(n,s){let{stdout:a}=await n.executeCommand(VS(0),{timeoutMs:Fe,noRetry:!0,signal:s}),d=qS(a),c=d?Gy(d):void 0;if(!c)throw Error(`Could not parse the display size from wm size output: ${a.trim()}`);let p=await Yd(n,{timeoutMs:Fe,signal:s});if(p===null)throw Error("WindowManager did not report the display rotation");return{...c,rotation:p}}async function _t(n,s,a,d){let c=Buffer.from(s,"utf8").toString("base64"),p=await n.execute(["shell",`s=$(echo ${c} | base64 -d) || { echo ${q}${Ue}; exit 0; }; printf '%s\\n' "$s" | uinput - 2>&1; echo ${q}$?`],{timeoutMs:a,noRetry:!0,signal:d}),m=`${p.stdout}
|
|
6
|
-
${p.stderr}`,h=new RegExp(`${q}(\\d+)`).exec(m);return{exitCode:h?Number(h[1]):null,stderr:m.replace(new RegExp(`${q}\\d+`),"").trim()}}function kt(n){let s=n.stderr||`exit ${n.exitCode??"unknown"}`;if(n.exitCode===Ue)return new Wd("The device could not decode the uinput script (base64 -d failed). No input was sent.");if(n.exitCode===127||/not found/i.test(n.stderr))return new Wd(`This device has no uinput tool, so the uinput route cannot inject a stylus: ${s}. No input was sent.`);if(/permission denied|eacces/i.test(n.stderr))return new Wd(`/dev/uinput is not writable; run adb root on an emulator or userdebug build: ${s}. No input was sent.`);return new t(`The uinput pen failed and may have played part of the stroke or hover: ${s}. Verify state with observe before retrying.`)}function Fq(n,s,a={readGeometry:(d)=>Dt(n,d),runScript:(d,c,p)=>_t(n,d,c,p)}){let d=H(s);return async(c,p)=>{if(o(p),(c.displayId??0)!==0)throw new Wd(`display ${c.displayId} is not supported; the uinput route injects on the default display. No input was sent.`);await d.runExclusive(async()=>{o(p);let m=await a.readGeometry(p).catch((y)=>{throw p?.aborted?y:new Wd(`Could not read the display geometry for the uinput pen: ${r(y)}. No input was sent.`)}),h=Ne(c,m);if(Buffer.byteLength(h,"utf8")*1.3333333333333333>Et)throw new Wd("The stroke is too long for one uinput script; split it into shorter gestures. No input was sent.");o(p);let f=await a.runScript(h,Me(c.points)+It,p).catch((y)=>{throw p?.aborted?y:new t(`The uinput pen run failed and may have played part of the stroke or hover: ${r(y)}. Verify state with observe before retrying.`,{cause:y})});if(f.exitCode!==0)throw kt(f)})}}var O={supported:!0};function w(n,s){return s?{supported:!1,reason:n,missingCapability:s}:{supported:!1,reason:n}}class D{dispatch;constructor(n){this.dispatch=n}inject(n,s){return this.dispatch(n,s)}}class ie extends D{route="adb-input-source";supports(n,s){if(s.platform!=="android"||n.toolType!=="stylus")return w("adb input stylus injects a stylus on Android only");if(n.hover||n.variablePressure||n.extendedAxes||n.path)return w("adb input stylus injects a constant-pressure tap or straight swipe; it cannot hover, vary pressure, tilt, press buttons or draw a path");if(s.apiLevel===void 0)return w("the device's Android API level could not be read");return s.apiLevel>=B?O:w(`adb input stylus needs Android API ${B} or newer (this device reports API ${s.apiLevel})`)}}function Le(n){return n.toolType==="finger"&&n.hover!==!0&&n.variablePressure!==!0&&n.extendedAxes!==!0&&n.path!==!0}function U(n){let s=[n.toolType];if(n.hover)s.push("hover");if(n.variablePressure)s.push("variable pressure");if(n.extendedAxes)s.push("tilt, orientation or buttons");if(n.path)s.push("path");return s.join(" ")}function $e(n){if(n.hover)return Bt(n);if((n.variablePressure||n.extendedAxes||n.path)&&n.toolType!=="stylus"&&n.toolType!=="eraser")return`${n.toolType} input has no variable pressure, tilt, buttons or stroke; only a stylus or eraser does`;if(n.toolType==="mouse")return"mouse input is supported for hover only";return}function Bt(n){if(n.toolType==="finger")return"a finger does not hover; hover comes from a stylus or a mouse";if(n.variablePressure)return"hover has no contact, so it has no pressure";if(n.extendedAxes||n.path)return"tilt, orientation, buttons and strokes describe a stylus in contact; a hover carries only a position and distance";return}class oe extends D{route="ctrlproxy-a11y";supports(n,s){if(s.platform!=="android")return w("accessibility gestures are an Android route");return Le(n)?O:w(`accessibility dispatchGesture only produces a finger touch, not ${U(n)}`)}}class se extends D{route="instrumentation";supports(n,s){if(s.platform!=="android")return w("instrumentation injection is an Android route");if(n.toolType==="finger")return w("finger touches use the accessibility route");if(n.toolType==="eraser")return w("the instrumentation runner does not inject an eraser");let a=n.hover?MR:OR;if(s.capabilities.has(a))return O;let d=s.apiLevel!==void 0&&s.apiLevel<Z?`: this device runs Android API ${s.apiLevel} and the route needs Android 12 (API ${Z})`:"";return w(`the connected runner does not advertise ${a}${d}`,a)}}class ae extends D{route="uinput";supports(n,s){if(s.platform!=="android")return w("uinput injection is an Android route");if(n.toolType!=="stylus"&&n.toolType!=="eraser")return w("the uinput route injects a stylus or eraser only");if(s.rootShell!==!0)return w("uinput injection needs a root adb shell (run adb root on an emulator or userdebug build)");return O}}function Lq(n){return[new oe(n.a11y),new ie(n.adbInputSource),new se(n.instrumentation),new ae(n.uinput)]}function _4(n,s,a){let d=$e(n);if(d)return{selected:null,missingCapabilities:[],refusal:`${U(n)} is not a valid pointer request: ${d}.`};let c=[],p=new Set;for(let f of a){let y=f.supports(n,s);if(y.supported)return{selected:f};if(c.push(`${f.route}: ${y.reason}`),y.missingCapability)p.add(y.missingCapability)}let m=[...p],h=m.length>0?` Use a device whose runner advertises ${m.join(" and ")}.`:"";return{selected:null,missingCapabilities:m,refusal:`${U(n)} input cannot be injected on this device, and a finger touch is never substituted. ${c.join("; ")}.${h}`}}function Ge(n,s,a){let d=_4(n,s,a);if(d.selected===null)throw new t(d.refusal);return d.selected}function je(n){return new Set([OR,MR].filter((s)=>n(s)))}var Nt=5000,Mt=5000;function Ut(n,s){return s==="eraser"||!n.has(OR)||!n.has(MR)}async function Lt(n,s){try{let{stdout:a}=await n.executeCommand("shell id -u",{timeoutMs:Mt,noRetry:!0,signal:s});return a.trim()==="0"}catch(a){if(s?.aborted)throw a;return e.warn(`[pointer] could not read the adb shell uid: ${r(a)}`,a),!1}}async function Bq(n,s,a,d){let c=k.getExistingInstance(n.deviceId),p=new Set;try{for(let h of[MR,OR])if(c&&await c.supportsCommand(h))p.add(h)}catch(h){if(a?.aborted)throw h;e.warn(`[pointer] could not read the runner's capabilities: ${r(h)}`,h)}return{platform:"android",apiLevel:await Ot(s,Nt,void 0,a).catch((h)=>{if(a?.aborted)throw h;return e.warn(`[pointer] could not read the Android API level: ${r(h)}`,h),null})??void 0,capabilities:je((h)=>p.has(h)),...Ut(p,d)?{rootShell:await Lt(s,a)}:{}}}var $t=40;function jx(n,s,a={}){let d=s.map((p)=>{let m=p.pressure??n.pressure,h=p.tilt??n.tilt,f=p.orientation??n.orientation;return{x:p.x,y:p.y,...p.durationMs===void 0?{}:{durationMs:p.durationMs},...m===void 0?{}:{pressure:m},...h===void 0?{}:{tilt:h},...f===void 0?{}:{orientation:f}}}),c=ioe(n.buttons);return{features:{toolType:n.toolType,...d.some((p)=>p.pressure!==void 0&&p.pressure!==1)?{variablePressure:!0}:{},...c!==0||d.some((p)=>p.tilt!==void 0||p.orientation!==void 0)?{extendedAxes:!0}:{},...a.path?{path:!0}:{}},points:d,buttons:c}}function Ve(n,s){return[n,{...n,durationMs:s??$t}]}async function Kx(n,s,a,d={}){let c=await(d.readEnvironment??((h)=>Bq(n,s,h,a.features.toolType)))(d.signal),p=d.injectors??Lq({a11y:We,adbInputSource:We,instrumentation:Nq(s,n.deviceId),uinput:Fq(s,n.deviceId)}),m=Ge(a.features,c,p);d.assertCurrent?.(),d.onDispatch?.();try{await m.inject(a,d.signal)}catch(h){if(h instanceof Wd||d.signal?.aborted)throw h;throw new Ky(r(h),{cause:h})}}async function We(){throw new t("This route cannot inject a stylus with pressure, tilt or buttons.")}class G extends t{}function ue(n,s){return n===1?s*(1-Number.EPSILON):n*s}function j(n,s,a){let d=s+ue(n,a-s);return d>=a?Math.max(s,a-Math.max(Math.abs(a),a-s)*Number.EPSILON):d}var W=["left","top","right","bottom"];function x(n){throw new t(`tapAt image ${n}. Observe again and pass metadata from the same image.`)}function de(n){return!!n&&[n.width,n.height].every((s)=>Number.isFinite(s)&&s>0)}function ze(n){return de(n)&&Number.isInteger(n.width)&&Number.isInteger(n.height)}function ce(n){return!!n&&W.every((s)=>Number.isFinite(n[s]))&&n.right>n.left&&n.bottom>n.top}function Gt(n,s){let a="crop"in n?n.crop:n.screenshot,d="crop"in n?n.rotation:n.screenshot.rotation;if(d!==void 0&&(!Number.isInteger(d)||d<0||d>3))x("rotation must be 0, 1, 2, or 3");if(a.screenshotOrientation==="display")return 0;if(a.screenshotOrientation!=="native")x("requires screenshotOrientation (display or native)");if(d===void 0)x("with native screenshotOrientation requires observe.rotation");if(s==="android"&&d!==0)x("Android requires display-aligned orientation");return d}function He(n,s){if(![n.x,n.y].every((a)=>Number.isFinite(a)&&a>0)||Math.abs(n.x-n.y)>OF)x("has missing or inconsistent pixelsPerNativeUnit / aspect ratio");if(s==="android"&&(n.x!==1||n.y!==1))x("Android pixels require scale 1")}function jt(n){let{screenSize:s,clippedBounds:a,requestedBounds:d}=n;if(!ce(a)||!ce(d))x("requires finite nonempty crop bounds");let c={left:Math.max(0,d.left),top:Math.max(0,d.top),right:Math.min(s.width,d.right),bottom:Math.min(s.height,d.bottom)};if(W.some((p)=>a[p]!==c[p])||n.clipped!==W.some((p)=>a[p]!==d[p]))x("has inconsistent clippedBounds / requestedBounds")}function Wt(n,s){let{screenSize:a,imageSize:d,pixelsPerNativeUnit:c,rasterBounds:p}=n;if(!ce(p))x("requires finite nonempty rasterBounds");let m=fV(a,s),h=NF(MF(n.clippedBounds,a,s),c,{width:m.width*c.x,height:m.height*c.y}),f=p.right-p.left,y=p.bottom-p.top,b=n.screenshotOrientation==="display"&&(s===1||s===3);return!W.some((T)=>!Number.isInteger(p[T])||Math.abs(h[T]-p[T])>0.0000001)&&d.width===(b?y:f)&&d.height===(b?f:y)}function Vt(n,s,a){let d=n.crop,c=[a];if(s==="ios"&&d.screenshotOrientation==="display"&&n.rotation!==void 0&&(n.rotation===2||(n.rotation===1||n.rotation===3)&&d.screenSize.width>d.screenSize.height))c.push(n.rotation);let p=c.filter((m)=>Wt(d,m));if(p.length===0)x("has inconsistent rasterBounds, imageSize, scale, or clippedBounds");return p}function zt(n,s,a){let d=n.crop;if(d.unit!==(s==="android"?"pixels":"points"))x("crop unit does not match the platform");if(!ze(d.imageSize))x("requires positive integer crop imageSize");if(!d.pixelsPerNativeUnit)x("requires pixelsPerNativeUnit");if(He(d.pixelsPerNativeUnit,s),d.scaleProvenance!=="raster-dimensions"&&d.scaleProvenance!=="native-scale-confirmed")x("requires scaleProvenance");return jt(d),Vt(n,s,a)}function Ht(n,s,a){let{nativeScale:d,imageSize:c}=n.screenshot;if(d!==void 0&&(!Number.isFinite(d)||d<=0))x("requires positive finite nativeScale provenance");if(c===void 0)return;if(!ze(c))x("requires positive integer imageSize");He({x:c.width/s.width,y:c.height/s.height},a)}function qt(n,s){if(n.unit!=="normalized"&&n.unit!=="pixels")x("unit must be normalized or pixels");let a=n.unit==="normalized"?{width:1,height:1}:s;if(!a)x("pixels requires imageSize with the real file dimensions");let d=n.unit==="normalized";for(let[c,p]of[[n.x,a.width],[n.y,a.height]])if(!Number.isFinite(c)||c<0||(d?c>p:c>=p))x(`${n.unit} coordinates must be in [0, ${a.width}${d?"]":")"} x [0, ${a.height}${d?"]":")"}`)}function qe(n,s){return[n.x,n.y].every(Number.isFinite)&&n.x>=0&&n.y>=0&&n.x<s.width&&n.y<s.height}function Yt(n,s){if(n.x===s.right)n.x=j(1,s.left,s.right);if(n.y===s.bottom)n.y=j(1,s.top,s.bottom)}function Kt(n,s,a){let{crop:d}=s,{pixelsPerNativeUnit:c,rasterBounds:p,screenSize:m}=d,h=a.map((b)=>({bounds:K4({left:p.left/c.x,top:p.top/c.y,right:p.right/c.x,bottom:p.bottom/c.y},m,b),scale:b===1||b===3?{x:c.y,y:c.x}:c})),f=h[0];if(h.some((b)=>W.some((T)=>Math.abs(b.bounds[T]-f.bounds[T])>0.0000001)||b.scale.x!==f.scale.x||b.scale.y!==f.scale.y))x("crop pixel padding is ambiguous between source orientations");let y={x:(f.bounds.left*f.scale.x+n.x)/f.scale.x,y:(f.bounds.top*f.scale.y+n.y)/f.scale.y};if(!qe(y,m))x("pixels resolve outside native screen bounds");return y}function Xt(n,s,a,d){let{source:c}=n;if("crop"in c&&c.crop.screenshotOrientation==="display")return Kt(n,c,d);let p=fV(s,a),m="crop"in c?c.crop.pixelsPerNativeUnit:{x:c.screenshot.imageSize.width/p.width,y:c.screenshot.imageSize.height/p.height},h="crop"in c?c.crop.rasterBounds:{left:0,top:0},f=mV({x:(h.left+n.x)/m.x,y:(h.top+n.y)/m.y},s,a),y="crop"in c?c.crop.imageSize:c.screenshot.imageSize,b=K4({left:h.left/m.x,top:h.top/m.y,right:(h.left+y.width)/m.x,bottom:(h.top+y.height)/m.y},s,a);if(Yt(f,b),!qe(f,s))x("pixels resolve outside native screen bounds");return f}function Ye(n,s,a){let d=n.source,c="crop"in d?d.crop:d.screenshot,{screenSize:p,imageSize:m}=c;if(!de(p)||!de(a))x("requires positive finite screenSize");if(p.width!==a.width||p.height!==a.height)x("source screenSize changed; observe again");let h=Gt(d,s),f=[];if("crop"in d)f=zt(d,s,h);else Ht(d,fV(p,h),s);if(qt(n,m),n.unit==="pixels")return Xt(n,p,h,f);let y="crop"in d?d.crop.clippedBounds:{left:0,top:0,right:p.width,bottom:p.height},b=mV(n,{width:1,height:1},h);return{x:j(b.x,y.left,y.right),y:j(b.y,y.top,y.bottom)}}function Jt(n){let{durationMs:s}=n,a=n.action??"tap";if(a!=="tap"&&a!=="longPress"&&a!=="doubleTap")return"tapAt action is unsupported";if(s!==void 0&&(a!=="longPress"||!Number.isInteger(s)||s<Pa||s>kh))return`tapAt durationMs requires longPress and must be ${Pa}\u2013${kh} ms`;return}function C(n){return n.image??{x:n.x,y:n.y}}function Xe(n,s){let a=C(n);return s==="android"&&!n.image?{x:Math.round(a.x),y:Math.round(a.y)}:a}function Qt(n,s){return n.x!==void 0||n.y!==void 0||n.coordinateSpace!==void 0?`${s} image is mutually exclusive with x, y, and coordinateSpace`:void 0}function Zt(n,s){if(n.image!==void 0)return Qt(n,s);let{x:a,y:d}=n,c=n.coordinateSpace??"absolute";if(c!=="absolute"&&c!=="normalized"&&c!=="percent")return`${s} coordinateSpace is unsupported`;if(!Number.isFinite(a)||!Number.isFinite(d))return`${s} requires finite x and y coordinates`;let p=c==="normalized"?1:c==="percent"?100:void 0;if(p!==void 0&&!er(a,d,p))return`${s} ${c} coordinates must be between 0 and ${p}`;return}function er(n,s,a){return n>=0&&n<=a&&s>=0&&s<=a}function Ke(n,s,a){let d=a==="normalized"?1:a==="percent"?100:void 0;if(d===void 0)return n;return ue(n/d,s)}function tr(n){if(!n)return!1;return Number.isFinite(n.width)&&Number.isFinite(n.height)&&n.width>0&&n.height>0}function rr(n,s){return n.x<0||n.x>=s.width||n.y<0||n.y>=s.height}function nr(n,s){let a=n.image?.source;return a&&"crop"in a?{width:a.crop.rasterBounds.right,height:a.crop.rasterBounds.bottom}:s}function Lc(n,s,a,d="tapAt"){let{x:c,y:p}=C(n),m=Zt(n,d);if(m)return{x:c,y:p,error:m};let h=n.coordinateSpace??"absolute",f=s.screenSize;if(!tr(f))return{x:c,y:p,error:`${d} requires a positive screenSize from a fresh observation`};let y=n.image?Ye(n.image,a==="ios"?"ios":"android",f):{x:Ke(c,f.width,h),y:Ke(p,f.height,h)},{x:b,y:T}=y;if(rr({x:b,y:T},f))return{x:c,y:p,error:`${d} coordinates (${c}, ${p}) are outside screen bounds [0, ${f.width}) x [0, ${f.height})`};let v=nr(n,f),g=a==="android"?Math.min(Math.round(b),Math.ceil(v.width)-1):b,S=a==="android"?Math.min(Math.round(T),Math.ceil(v.height)-1):T;return{x:g,y:S}}function or(n,s,a){let d=n.action??"tap",c=d==="longPress"?"long press":d==="doubleTap"?"double tap":"tap";return cp(s.viewHierarchy,n.layer,[a],c)}function K(n,s,a){ar(n,s,a);let d=Jt(n);if(d)return{x:C(n).x,y:C(n).y,error:d};let c=Lc(n,s,a);if("error"in c)return c;let p=or(n,s,c);if(p)return{...c,error:p};if(n.planContext)dr(n.planContext,s,c,a);return c}function ar(n,s,a){let d=n.planContext?.geometry;if(!d)return;let c=s.rotation??s.viewHierarchy?.rotation,m=[["platform",d.platform===a],["dimensions",d.deviceWidth===s.screenSize.width&&d.deviceHeight===s.screenSize.height],["orientation",Number.isInteger(c)&&d.orientation===c],["point",ur(n,d,a)]].find(([,h])=>!h)?.[0];if(m)throw new G(`tapAt replay ${m} mismatch: recorded ${JSON.stringify(d)}, current ${a} ${s.screenSize?.width}x${s.screenSize?.height} orientation ${c}. Replay on compatible geometry or record this step again.`)}function ur(n,s,a){if(n.image||(n.coordinateSpace??"absolute")!=="absolute")return!1;if(n.x!==s.x||n.y!==s.y)return!1;return a!=="android"||Number.isInteger(s.x)&&Number.isInteger(s.y)}function dr(n,s,a,d){let c=s.rotation??s.viewHierarchy?.rotation;if((d==="android"||d==="ios")&&Number.isInteger(c)&&c!==void 0&&c>=0&&c<=3)n.recordedGeometry={platform:d,deviceWidth:s.screenSize.width,deviceHeight:s.screenSize.height,orientation:c,x:a.x,y:a.y}}function cr(n,s,a){let d=n.talkBackDriverFactory??a;return{featureFlags:n.featureFlags??sr.getInstance(),accessibilityDetector:n.accessibilityDetector??ti,talkBackDriverFactory:d,talkBackStrategy:n.talkBackStrategy??new rv({timer:s,driverFactory:d}),useContextualFocusTap:n.talkBackDriverFactory===void 0}}var Je=1000;function pr(n,{detector:s,stateClient:a,featureFlags:d,timer:c}){return()=>{let p=new AbortController;return l(()=>s.isVoiceOverEnabled(n.deviceId,a(),{featureFlags:d,timeoutMs:Je,signal:p.signal}),{timer:c,timeoutMs:Je,label:"tapAt VoiceOver probe",onTimeout:()=>p.abort()})}}class Gx extends De{androidClient;iosDoubleTap;iosClient;iosCoordinateTap;invalidateIosCache;isIosVoiceOverOn;lastRenderedObservation;stylusRoutes;snapshotReferences;androidTalkBack;androidDispatcher;constructor(n,s=null,a={}){super(n,{adb:s,timer:a.timer,displayFence:a});ts(n.platform,"tapAt"),this.androidClient=a.androidClient??Bs(n,this.adbFactory);let d=()=>_.getInstance(n);this.iosClient=a.iosClient??d(),this.iosDoubleTap=a.dispatchIosDoubleTap??XS,this.iosCoordinateTap=a.dispatchIosCoordinateTap??JS,this.invalidateIosCache=a.invalidateIosCache??(()=>_.getExistingInstance(this.device.deviceId)?.invalidateCache()),this.lastRenderedObservation=a.lastRenderedObservation,this.stylusRoutes=a.stylus??{},this.snapshotReferences=a.snapshotReferences??Lu;let c=cr(a,this.timer,new yh(this.adbFactory));this.isIosVoiceOverOn=pr(n,{detector:a.iosVoiceOverDetector??vo,stateClient:()=>a.iosVoiceOverStateClient??d(),featureFlags:c.featureFlags,timer:this.timer}),this.androidTalkBack=new X({target:this,androidClient:this.androidClient,...c});let p=this;this.androidDispatcher=new J({host:{get adb(){return p.adb},get observeScreen(){return p.observeScreen},assertDisplayRevisionCurrent:(m)=>this.assertDisplayRevisionCurrent(m),assertSnapshotCurrent:(m,h)=>this.assertSnapshotCurrent(m,h),resolveFreshFrameRetry:(m,h,f,y)=>this.resolveFreshFrameRetry(m,h,f,y),retryFreshness:(m)=>this.retryFreshness(m)},androidClient:this.androidClient,androidCoordinateTap:a.dispatchAndroidCoordinateTap??YS,androidTalkBack:this.androidTalkBack,timer:this.timer})}async executeOnDisplay(n,s,a){let{onTapDelivered:d,signal:c,onDispatchCompleted:p,onActivationWarnings:m}=a,h=n.action??"tap",{observation:f,displayId:y,assertCurrent:b}=await Ni(this.device,s,this.observeScreen,{adb:this.adb,lastRenderedObservation:this.lastRenderedObservation,signal:c,transitions:this.displayTransitionReader}),T=this.staleSnapshotReason(n,f);if(T)return{success:!1,x:C(n).x,y:C(n).y,action:h,error:T};let v=K(n,f,this.device.platform);if("error"in v)return{success:!1,x:v.x,y:v.y,action:h,error:v.error};return this.observedInteraction(async()=>{if(b(),this.device.platform==="android"&&await this.androidTalkBack.resolveState(c,m)){let S=Ih(y);if(S)throw S;await this.dispatchDisplayTalkBackTapWithOneFreshRetry(n,v,f,{signal:c,assertCurrent:b,onTapDelivered:()=>d(!0),onActivationWarnings:m})}else await this.dispatchGesture(n,v,f,{signal:c,displayId:y,assertCurrent:b,onTapDelivered:d,onWarning:(S)=>m?.([S])});return p?.(),{success:!0,x:v.x,y:v.y,action:h}},{changeExpected:!1,display:f.display.key,previousObservation:f,signal:c})}async execute(n,s,a,d){ts(this.device.platform,"tapAt");let{progress:c,signal:p,planContext:m}=OQ(s,a,d),h=Pe(this.device.platform,n);if(h)return we(h,C(n),n.action);return this.executeTap(n,c,p,m)}async dispatchStylusTapAt(n,s,a,d){let c={signal:d,assertCurrent:()=>this.assertDisplayRevisionCurrent(a)};if(!qk(n.pointer)){await Ce(this.adb,s,n,c);return}let p=n.action==="longPress"?n.durationMs??iT:void 0;try{await Kx(this.device,this.adb,jx(n.pointer,Ve(s,p)),{...c,...this.stylusRoutes})}catch(m){throw m instanceof Ky?fn(m.message):m}}async executeTap(n,s,a,d){n={...n,planContext:d};let c=n.action??"tap",p=Y();p.serial("tapAt");let m,h,f={tapsDelivered:0,talkBack:!1,displayCompleted:!1},y=new Set,b=tQ(y),T=(g=!1)=>{f.talkBack||=g,f.tapsDelivered++},v=this.captureTransitionRevision();try{if(o(a),n.display!==void 0)return{...await this.executeOnDisplay(n,n.display,{onTapDelivered:T,signal:a,onDispatchCompleted:()=>{f.displayCompleted=!0},onActivationWarnings:b}),...y.size?{warnings:[...y]}:{}};if(this.hasStaleCallerRevision(this.displayTransitionReader.revision(this.device.deviceId)))return ir({success:!1,x:C(n).x,y:C(n).y,action:c},this.staleDisplay(v.observedGeneration));let g=null,S=await this.observedInteraction(async()=>{let A=await this.observeScreen.execute({freshness:"cached-ok",signal:a,perf:p});if(g=A,this.currentActionRevision()!==v.revision)return ir({success:!1,x:C(n).x,y:C(n).y,action:c},this.staleDisplay(v.observedGeneration));let I=this.staleSnapshotReason(n,A);if(I)return{success:!1,x:C(n).x,y:C(n).y,action:c,error:I};let P=K(n,A,this.device.platform);if("error"in P)return{success:!1,x:P.x,y:P.y,action:c,error:P.error};switch(m=P,this.assertDisplayRevisionCurrent(v),o(a),this.device.platform){case"android":{if(n.pointer){await this.dispatchStylusTapAt(n,P,v,a),T();break}let pe=await this.androidTalkBack.resolveState(a,b);f.talkBack=pe,await this.androidDispatcher.dispatchAndroidTaps(n,P,A,{transitionRevision:v,perf:p,signal:a,onTapDelivered:T,talkBackEnabled:pe,onActivationWarnings:b});break}case"ios":h=await this.dispatchIosTapsWithOneFreshRetry(n,P,A,{transitionRevision:v,onTapDelivered:T,signal:a});break;default:throw yt(this.device.platform,"tap at coordinates")}return{success:!0,x:P.x,y:P.y,action:c}},{changeExpected:!1,progress:s,perf:p,signal:a,skipPreviousObserve:!0,observationTimestampProvider:()=>h,predictionContext:{toolName:"tapAt",toolArgs:{...n,action:c,platform:this.device.platform}}});return this.annotateDeviceLock(S,g),{...S,...y.size?{warnings:[...y]}:{}}}catch(g){if(g instanceof G)throw g;return this.rethrowObservationAbort(g,a,f.displayCompleted),this.createDispatchFailure(g,n,m,f)}finally{p.end()}}captureTransitionRevision(){return{revision:this.currentActionRevision(),observedGeneration:this.renderedDisplayGeneration(this.device.deviceId)??this.displayTransitionReader.identityRevision(this.device.deviceId)}}createDispatchFailure(n,s,a,d){let c=s.action??"tap",{tapsDelivered:p,talkBack:m}=d;e.warn(`tapAt dispatch failed: ${r(n)}`,n);let h=a??Xe(s,this.device.platform),f=ir({success:!1,x:h.x,y:h.y,error:`Failed to tap at coordinates: ${r(n)}`,action:c},n);if(m&&c!=="longPress"){if(n instanceof mr&&p===3)f.error+=" A TalkBack focus touch and an activation double tap were delivered."}else f.error+=n instanceof mr?` ${p} ${p===1?"tap was":"taps were"} delivered.`:rQ(c,p);return f}async dispatchIosTapsWithOneFreshRetry(n,s,a,d){let{transitionRevision:c,signal:p}=d,m=a.viewHierarchy?.frameContext;try{return await this.dispatchIosTaps(n,s,m,d)}catch(h){o(p);let f=u(h,"Failed to dispatch iOS coordinate tap");if(m===void 0||!Aa(f.message))throw f;let y=await this.observeScreen.execute({freshness:"fresh",signal:p});this.assertDisplayRevisionCurrent(c),this.assertSnapshotCurrent(n,y);let b=this.resolveFreshFrameRetry(n,s,a,y);if(!b||!zd(a,y,!0))throw f;return await this.dispatchIosTaps(n,b.point,b.frameContext,d)}}async dispatchIosTaps(n,s,a,d){let{transitionRevision:c,onTapDelivered:p,signal:m}=d;this.assertDisplayRevisionCurrent(c),await this.dispatchIosCoordinateTap(n.action,s,{durationMs:GS(n,"ios"),frameContext:a,signal:m});try{if(p(),n.action==="doubleTap")p();return o(m),this.timer.now()}finally{this.invalidateIosCacheSafely()}}async dispatchIosCoordinateTap(n,s,a){let{durationMs:d,frameContext:c,signal:p}=a,m=n==="doubleTap"?this.iosDoubleTap:this.iosCoordinateTap;await iQ(()=>m(this.iosClient,s,{durationMs:d,frameContext:c,options:{signal:p}}),this.isIosVoiceOverOn)}invalidateIosCacheSafely(){try{this.invalidateIosCache()}catch(n){e.warn(`tapAt iOS cache invalidation failed: ${r(n)}`,n)}}async dispatchDisplayTalkBackTapWithOneFreshRetry(n,s,a,d){let{signal:c,assertCurrent:p}=d,m=a.viewHierarchy?.frameContext,h=!1,f=!1,y={assertCurrent:p,onTapDelivered:()=>{h=!0,d.onTapDelivered()},onDispatched:()=>{f=!0},onActivationWarnings:d.onActivationWarnings};try{await this.androidTalkBack.dispatchTap(n,s,m,{signal:c,context:y})}catch(b){o(c);let T=u(b,"Failed to dispatch Android coordinate tap");if(h||f||m===void 0||!Aa(T.message))throw T;let v=await this.observeScreen.execute({display:a.display.key,freshness:this.retryFreshness(n),signal:c});p(),this.assertSnapshotCurrent(n,v);let g=this.resolveFreshFrameRetry(n,s,a,v);if(v.display.key!==a.display.key||!g)throw T;await this.androidTalkBack.dispatchTap(n,g.point,g.frameContext,{signal:c,context:y})}}resolveFreshFrameRetry(n,s,a,d){let c=K(n,d,this.device.platform),p=d.viewHierarchy?.frameContext;if("error"in c||c.x!==s.x||c.y!==s.y||!p||this.device.platform!=="ios"&&p===a.viewHierarchy?.frameContext)return;if(!n.snapshotId&&!Te(a,d))throw new t("Stale frame context: screen layout changed since the last observation. Observe again and recompute coordinates, or pass a fresh snapshotId.");return{point:c,frameContext:p}}assertDisplayRevisionCurrent(n){if(this.currentActionRevision()!==n.revision)throw this.staleDisplay(n.observedGeneration)}currentActionRevision(){return this.device.platform==="ios"?this.displayTransitionReader.identityRevision(this.device.deviceId):this.displayTransitionReader.revision(this.device.deviceId)}staleSnapshotReason(n,s){return n.snapshotId?this.snapshotReferences.staleReason(n.snapshotId,this.device.deviceId,s):void 0}assertSnapshotCurrent(n,s){let a=this.staleSnapshotReason(n,s);if(a)throw new t(a)}retryFreshness(n){return n.snapshotId?"fresh":"cached-ok"}hasStaleCallerRevision(n){let s=this.renderedDisplayRevision(this.device.deviceId);if(s===void 0)return!1;return this.device.platform==="ios"?!this.displayTransitionReader.sameIdentitySince(this.device.deviceId,s):s!==n}async dispatchAndroidDisplayGesture(n,s,a,d){let{displayId:c,signal:p}=d;if(await Ra(this.androidClient,c)){o(p),d.assertCurrent();let m=!1,h=()=>{m=!0},f=await this.androidClient.requestTapCoordinates({x:n.x,y:n.y,duration:s,timeoutMs:Jv(s),onDispatch:h,signal:p,displayId:c===0?void 0:c,beforeSend:d.assertCurrent});if(f.success)d.onTapDelivered();if(o(p),f.success)return;if(m)throw fn(f.error);if(Aa(f.error))throw new t(f.error??"Stale frame context");e.warn(`[TapAtCoordinate] dispatchGesture tap failed (${f.error}), falling back to ADB input`)}o(p),d.assertCurrent(),await dc(this.adb,a,c,{signal:p,assertCurrent:d.assertCurrent,timeoutMs:s>=Pa?Br(s):void 0}),d.onTapDelivered(),o(p)}async dispatchGesture(n,s,a,d){let{signal:c,displayId:p}=d,m=n.action??"tap",h=GS(n,this.device.platform),f=async()=>{if(o(c),d.assertCurrent(),this.device.platform==="android"){let y=m==="longPress"?`swipe ${s.x} ${s.y} ${s.x} ${s.y} ${h}`:`tap ${s.x} ${s.y}`;await this.dispatchAndroidDisplayGesture(s,h,y,d)}else if(this.device.platform==="ios"){if(await this.dispatchIosCoordinateTap(m,s,{durationMs:h,frameContext:a.viewHierarchy?.frameContext,signal:c}),d.onTapDelivered(),m==="doubleTap")d.onTapDelivered()}else throw yt(this.device.platform,"tapAt gesture")};if(this.device.platform==="android"&&m==="doubleTap"){await Eh({client:await Ra(this.androidClient,p)?this.androidClient:void 0,point:s,displayId:p===0?void 0:p,timer:this.timer,signal:c,assertCurrent:d.assertCurrent,onTapDelivered:d.onTapDelivered,onWarning:d.onWarning,tap:()=>f()});return}if(await f(),this.device.platform==="ios"){try{o(c)}finally{this.invalidateIosCacheSafely()}return}}}
|
|
7
|
-
export{Lu,k4,Ky,Z7,E4,Wd,Nq,I4,Fq,Lq,_4,Bq,jx,Kx,Lc,Gx};
|
|
8
|
-
|
|
9
|
-
//# debugId=D068B0E45153285164756E2164756E21
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{ui,Fl,Oo,Fp}from"./chunk-nwm2pq5v.js";import{Nr,e}from"./chunk-z8t0v07j.js";import{w,$u,Qn,is,TT,ct,Kc,Xu,Zu,ou,Sn,yc}from"./chunk-h3n4adc6.js";import{Hl}from"./chunk-a2sc4jm0.js";import{t}from"./chunk-9rkfyt6q.js";var D={success:"boolean",error:"string"};function Tu(n,i,o){if(n.hasStructured)n.envelope.structuredContent=i;if(n.textPart)n.textPart.text=o??yc(i);E(n.envelope,i)}function E(n,i){let o=n;for(let[s,r]of Object.entries(D)){if(!(s in o))continue;if(typeof i[s]===r)o[s]=i[s];else delete o[s]}}var WE=["getAndroid","getApple","startDevice","provisionDevice"],Nb=`Call ${$u.length>2?`${$u.slice(0,-1).join(", ")}, or ${$u[$u.length-1]}`:$u.join(" or ")} to acquire a new device session.`;function P(n,i){if(!i||i.releaseReason!=="heartbeat-timeout"&&i.releaseReason!=="missing-first-heartbeat")return n;let{ageMs:o,timeoutMs:s}=i.heartbeat,r=i.releaseReason==="heartbeat-timeout"?s+is:s;return`${n} No heartbeat for ${o} ms (limit ${r} ms; set AUTOMOBILE_SESSION_HEARTBEAT_TIMEOUT_MS to change).`}function RM(n){return{error:{code:"no_active_device_session",message:n.message,reason:n.reason,...ui(n.reason),...v()}}}function v(n){return{retryable:!1,nextAction:Qn,...n===void 0?{}:{ownerPid:n},recovery:{action:"acquire_replacement_session",tools:[...$u]}}}function zE(n){if(!pG(n))return;let i=Sn(n)?.payload,o=i?.error,s=o!==null&&typeof o==="object"&&!Array.isArray(o)?o:i,{sessionUuid:r,reason:a}=s??{};return{...typeof r==="string"&&r.length>0?{sessionUuid:r}:{},...typeof a==="string"&&a.length>0?{reason:a}:{}}}function RP({message:n,sessionUuid:i,reason:o,release:s,idleTimeoutMs:r}){return{error:{code:Oo,message:P(n,s),sessionUuid:i,reason:o,...ui(o),...Fl(o,r??s?.cliIdleTimeoutMs),...v(s?.ownerPid),...s?{release:s}:{}}}}function PM(n){let i=Fp(n);if(!i)return;return RP({message:i.message,sessionUuid:i.sessionUuid,reason:i.releaseReason,idleTimeoutMs:i.details.idleTimeoutMs})}function jE(n){if(!(n instanceof Error)||n.name!=="SessionRecoveryIdentityLossError")return;let i=(u)=>Reflect.get(n,u),o=i("sessionUuid"),s=i("terminalReleaseReason"),r=i("reason");if(typeof o!=="string"||typeof s!=="string"||typeof r!=="string")return;let a=i("target"),c=a!==null&&typeof a==="object"?Reflect.get(a,"deviceId"):void 0,d=i("deviceId")??c,l=i("ownerPid");return{message:n.message,sessionUuid:o,reason:s,recoveryReason:r,...typeof d==="string"?{deviceId:d}:{},...typeof l==="number"?{ownerPid:l}:{}}}function lG(n){return{sessionUuid:n.sessionUuid,reason:n.reason,...ui(n.reason),recoveryReason:n.recoveryReason,...n.deviceId===void 0?{}:{deviceId:n.deviceId},...n.ownerPid===void 0?{}:{ownerPid:n.ownerPid}}}function x8(n){let{error:i}=RP({message:n.message,sessionUuid:n.sessionUuid,reason:n.reason});return{error:{...i,...v(n.ownerPid),...lG(n)}}}function Fr(n){return WE.includes(n)}function AM(n){let i=Sn(n)?.payload,o=i?.runtime,s=o&&typeof o==="object"?o.session:void 0,a=(s&&typeof s==="object"?s.sessionUuid:void 0)??i?.sessionId;return typeof a==="string"&&a.trim().length>0?a:void 0}function S(n){let i=Sn(n)?.payload;if(!i||"platform"in i||"runtime"in i)return i;let o=i.device;if(o&&typeof o==="object"&&!Array.isArray(o))return o;return}function C8(n){let i=S(n)?.runtime;if(!i||typeof i!=="object"||!("deviceId"in i))return;let{deviceId:o}=i;return typeof o==="string"&&o.trim().length>0?o:void 0}function TM(n){let i=Sn(n)?.payload,o=i?.sessionUuid;if(typeof o!=="string"||o.trim().length===0)return;let s=i?.deviceId;return typeof s==="string"&&s.trim().length>0?{sessionUuid:o,deviceId:s}:{sessionUuid:o}}function D8(n){let i=S(n)?.platform;return i==="android"||i==="ios"?i:void 0}function uG(n){if(!n||typeof n!=="object"||!("isError"in n)||n.isError!==!0)return!1;let i=Sn(n)?.payload?.error;return i!==null&&typeof i==="object"&&"code"in i&&i.code===Hl}function ry(n){return n==="setActiveDevice"||Fr(n)}function O8(n){if(!n||typeof n!=="object"||!("isError"in n)||n.isError!==!0)return;let i=Sn(n)?.payload;if(!i||i.code!==Kc&&i.code!==Xu)return;let{retryAfterMs:o}=i;return typeof o==="number"&&Number.isFinite(o)&&o>=0?{retryAfterMs:o}:{}}function M8(n){if(!uG(n))return;let i=Sn(n)?.payload?.error;if(!i||typeof i!=="object"||!("sessionUuid"in i)||typeof i.sessionUuid!=="string"||!("remainingMs"in i)||typeof i.remainingMs!=="number"||!Number.isFinite(i.remainingMs))return;return{sessionUuid:i.sessionUuid,remainingMs:i.remainingMs}}var I=["session_ownership_lost","no_active_device_session",Zu];function h(n){return typeof n.code==="string"&&I.includes(n.code)||n.nextAction===Qn}function pG(n){if(!n||typeof n!=="object"||n.isError!==!0)return!1;let i=n.content;if(!n.structuredContent&&!Array.isArray(i))return!1;let s=Sn(n,(a)=>{e.debug("[MCP] Session-invalid probe: error result was not JSON",{error:a})})?.payload;if(!s)return!1;if(h(s))return!0;let r=s.error;return r!==null&&typeof r==="object"&&!Array.isArray(r)&&h(r)}function x(n){return typeof n==="object"&&n!==null}function Di(n,i){let o=n.params;if(o&&typeof o==="object"&&Object.hasOwn(o,i))return o[i];return x(n)?n[i]:void 0}var R=(n)=>typeof n==="object"&&n!==null&&!Array.isArray(n),ny=(n)=>{let i=[],o=[],s=!1,r=!1;if(!n)return{labels:i,definitions:o,hasDefinitions:s,hasLabels:r};for(let a of n){if(typeof a==="string"){i.push(a),r=!0;continue}if(R(a)){i.push(a.label),o.push(a),s=!0;continue}}return{labels:i,definitions:o,hasDefinitions:s,hasLabels:r}},N8=(n)=>ny(n).labels,F8=(n,i)=>ny(n).definitions.find((o)=>o.label===i)?.platform;function p(n){return`${n.positions.join(",")}|${n.arrived.map((i)=>i?1:0).join("")}`}function f(n,i,o){return n[o].events[i.positions[o]]}function L(n,i){return n.every((o,s)=>i.positions[s]>=o.events.length)}function b(n,i,o){let s=[];for(let r=0;r<n.length;r++)if(i.arrived[r]&&f(n,i,r)?.lock===o)s.push(r);return s}function _(n,i,o){let s=f(n,i,o),r=[...i.positions],a=[...i.arrived],c=[...b(n,i,s.lock),o];if(c.length<s.deviceCount)return a[o]=!0,{state:{positions:r,arrived:a}};for(let l of c)r[l]+=1,a[l]=!1;let d=c.map((l)=>n[l].device).sort().join(", ");return{state:{positions:r,arrived:a},release:`"${s.lock}" {${d}}`}}function A(n,i){let o=[];for(let s=0;s<n.length;s++)if(!i.arrived[s]&&f(n,i,s)!==void 0)o.push(_(n,i,s));return o}function O(n){return n.positions.reduce((i,o)=>i+o,0)}function T(n,i){let o=[],s=i;while(s!==void 0){let r=n.get(s);if(r?.release)o.push(r.release);s=r?.parent}return o.reverse()}function U(n,i,o){let{state:s}=o,r=[],a=[];for(let c=0;c<n.length;c++){let d=f(n,s,c);if(d===void 0){a.push(n[c].device);continue}let l=b(n,s,d.lock).map((u)=>n[u].device);r.push({device:n[c].device,event:d,waitingWith:l})}return{stalled:r,finished:a,releasedGenerations:T(i,o.key)}}function g(n,i){let o=i;while(n.get(o)!==o)o=n.get(o);return o}function M(n){let i=new Map,o=(r,a)=>{let c=`${r}:${a}`;if(!i.has(c))i.set(c,c);return c};for(let r of n){let a=o("device",r.device);for(let c of r.events)i.set(g(i,o("lock",c.lock)),g(i,a))}let s=new Map;for(let r of n){let a=g(i,`device:${r.device}`);s.set(a,[...s.get(a)??[],r])}return Array.from(s.values())}function y(n,i=1e4){for(let o of M(n)){let r=o.some((a)=>a.events.some((c)=>c.unmodeled===!0))?null:N(o,i);if(r!==null)return r}return null}function N(n,i){let o={positions:n.map(()=>0),arrived:n.map(()=>!1)},s=new Map([[p(o),{}]]),r=[o],a;while(r.length>0){let c=r.pop();if(L(n,c))return null;let d=p(c),l=A(n,c);if(l.length===0){let u=O(c);if(a===void 0||u>a.progress)a={key:d,state:c,progress:u};continue}for(let u of l){let m=p(u.state);if(s.has(m))continue;if(s.size>=i)return null;s.set(m,{parent:d,release:u.release}),r.push(u.state)}}return a===void 0?null:U(n,s,a)}function j(n){let{device:i,event:o,waitingWith:s}=n;return`device "${i}" waits at ${o.tool} lock "${o.lock}" (step ${o.stepIndex}; ${s.length}/${o.deviceCount} arrived: ${s.join(", ")})`}function C(n){let i=Array.from(new Set(n.stalled.map((r)=>`"${r.event.lock}"`))),o=n.releasedGenerations.length>0?n.releasedGenerations.join(" -> "):"none",s=n.finished.length>0?` Tracks already finished (cannot arrive again): ${n.finished.join(", ")}.`:"";return`barrier/criticalSection coordination can never complete: under every possible arrival order at least one device track deadlocks. One reachable stall: ${n.stalled.map(j).join("; ")}. Locks involved: ${i.join(", ")}. Generations released before the stall: ${o}.${s} Each device's track runs sequentially, so a device blocked at one lock never reaches the later lock its peers are waiting at. Reorder the coordination steps so devices visit shared locks in a consistent order, or add the arrivals the stalled locks are missing.`}var B=new Set(["barrier","criticalSection"]);function iy(n){return B.has(n)}function k(n){return typeof n==="string"&&n.length>0}function F(n){return typeof n==="number"&&Number.isInteger(n)&&n>=1}function V(n){return typeof n==="object"&&n!==null}var G=new Set(["android","ios","tvos"]);class Rf{static validate(n){if(!n.name||typeof n.name!=="string")throw new t("Plan must have a valid name");if(!n.steps||!Array.isArray(n.steps))throw new t("Plan must have a steps array");if(this.validateMultiDeviceRequirements(n),n.devices!==void 0)this.validateDevicesField(n),this.validateDeviceLabelsPresent(n);this.validateCoordinationLocks(n)}static validateUntrusted(n){if(!V(n))throw new t("Plan must have a valid name");this.validate(n)}static validateDevicesField(n){if(!Array.isArray(n.devices))throw new t("Plan 'devices' field must be an array of device labels");if(n.devices.length===0)throw new t("Plan 'devices' array cannot be empty. Remove the field or specify at least one device.");let{labels:i,definitions:o,hasDefinitions:s,hasLabels:r}=ny(n.devices);if(s&&r)throw new t("Plan 'devices' must be a list of labels or a list of objects with label/platform (do not mix formats).");if(s)for(let c of o)this.validateDeviceDefinition(c);if(i.length!==n.devices.length)throw new t("Plan 'devices' entries must be strings or objects with label/platform.");if(new Set(i).size!==i.length)throw new t(`Plan 'devices' array contains duplicate labels: [${i.join(", ")}]`);for(let c of i)if(typeof c!=="string"||c.trim()==="")throw new t(`Invalid device label: ${JSON.stringify(c)}. Device labels must be non-empty strings.`)}static validateDeviceDefinition(n){if(!n.label||n.label.trim()==="")throw new t(`Invalid device label: ${JSON.stringify(n.label)}. Device labels must be non-empty strings.`);if(!n.platform||!G.has(n.platform))throw new t(`Invalid device platform for ${n.label}: ${JSON.stringify(n.platform)}.`)}static validateDeviceLabelsPresent(n){if(!n.devices||n.devices.length===0)return;let i=new Set(ny(n.devices).labels),o={mismatchedInCriticalSection:[],missingLabels:[],invalidLabels:[],missingInCriticalSection:[],invalidInCriticalSection:[]};for(let l=0;l<n.steps.length;l++){let u=n.steps[l];if(this.recordStepDeviceLabel(u,l,i,o),u.tool==="criticalSection")this.recordCriticalSectionDeviceLabels(u,l,i,o)}let{missingLabels:s,invalidLabels:r,missingInCriticalSection:a,invalidInCriticalSection:c}=o,d=[...o.mismatchedInCriticalSection];if(s.length>0){let l=s.map((u)=>`step ${u.index} (${u.tool})`).join(", ");d.push(`Plan declares 'devices' field but the following steps are missing 'device' parameter: ${l}`)}if(r.length>0){let l=r.map((u)=>`step ${u.index} (${u.tool}): device="${u.device}"`).join(", ");d.push(`Plan declares devices [${Array.from(i).join(", ")}] but the following steps use invalid device labels: ${l}`)}if(a.length>0){let l=a.map((u)=>`step ${u.parentIndex}.steps[${u.subIndex}] (${u.tool})`).join(", ");d.push(`Every step inside a criticalSection must declare a 'device' parameter, but the following sub-steps are missing it: ${l}`)}if(c.length>0){let l=c.map((u)=>`step ${u.parentIndex}.steps[${u.subIndex}] (${u.tool}): device="${u.device}"`).join(", ");d.push(`Plan declares devices [${Array.from(i).join(", ")}] but the following criticalSection sub-steps use invalid device labels: ${l}`)}if(d.length>0)throw new t(d.join(`
|
|
3
|
-
`))}static recordStepDeviceLabel(n,i,o,s){let r=Di(n,"device");if(r===void 0||r===null||r==="")s.missingLabels.push({index:i,tool:n.tool});else if(typeof r!=="string"||!o.has(r))s.invalidLabels.push({index:i,tool:n.tool,device:String(r)})}static recordCriticalSectionDeviceLabels(n,i,o,s){let r=n.params?.steps;if(!Array.isArray(r))return;let a=Di(n,"device"),c=typeof a==="string"&&o.has(a)?a:void 0;for(let d=0;d<r.length;d++)this.recordCriticalSectionSubstepLabel(r[d],i,d,{labelErrors:s,deviceSet:o,ownerDevice:c})}static recordCriticalSectionSubstepLabel(n,i,o,{labelErrors:s,deviceSet:r,ownerDevice:a}){if(!n||typeof n!=="object")return;let d=n.params?.device,l=String(n.tool??"unknown");if(d===void 0||d===null||d==="")s.missingInCriticalSection.push({parentIndex:i,subIndex:o,tool:l});else if(typeof d!=="string"||!r.has(d))s.invalidInCriticalSection.push({parentIndex:i,subIndex:o,tool:l,device:String(d)});else if(a!==void 0&&d!==a)s.mismatchedInCriticalSection.push(`step ${i}.steps[${o}] (${l}): device="${d}" differs from criticalSection owner device="${a}". Put it in its own step for that device or use a separate criticalSection step.`)}static validateCoordinationLocks(n){this.validateNoAuthoredLockNamespace(n),this.validateCriticalSectionLocks(n),this.validateBarrierParams(n),this.validateCoordinationTimeouts(n),this.validateNoCrossToolLockSharing(n),this.validateBarrierConsistentDeviceCount(n),this.validateBarrierDistinctDeviceCounts(n),this.validateBarrierGenerationCompleteness(n),this.validateBarrierExcessDeviceArrivals(n),this.validateCoordinationScheduleFeasibility(n)}static validateCoordinationScheduleFeasibility(n){let i=this.collectCoordinationTracks(n);if(i===null||i.length<2)return;let o=y(i);if(o!==null)throw new t(C(o))}static collectCoordinationTracks(n){let i=new Map;for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(!iy(s.tool))continue;let r=this.resolveCoordinationEvent(s,o);if(r===null)return null;let a=i.get(r.device)??{device:r.device,events:[]};a.events.push(r.event),i.set(r.device,a)}return Array.from(i.values())}static resolveCoordinationEvent(n,i){let o=Di(n,"device"),s=Di(n,"lock"),r=Di(n,"deviceCount");if(!k(o)||!k(s)||!F(r))return null;let a=n.optional===!0||this.hasNestedCoordination(n);return{device:o,event:{tool:n.tool,lock:s,deviceCount:r,stepIndex:i,unmodeled:a}}}static hasNestedCoordination(n){let i=Di(n,"steps");if(!Array.isArray(i))return!1;return i.some((o)=>typeof o==="object"&&o!==null&&("tool"in o)&&iy(String(o.tool)))}static validateCoordinationTimeouts(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="criticalSection"&&s.tool!=="barrier")continue;let r=Di(s,"timeout");if(r===void 0)continue;if(typeof r!=="number"||!Number.isInteger(r)||r<1||r>Nr)i.push(`${s.tool} step ${o} declares 'timeout' of ${JSON.stringify(r)}, which must be a positive integer no greater than setTimeout's usable range (${Nr}ms, ~24.8 days) -- Node/Bun clamp larger delays to 1ms instead of honoring them.`)}if(i.length>0)throw new t(i.join(`
|
|
4
|
-
`))}static validateNoAuthoredLockNamespace(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(Di(s,"__lockNamespace")!==void 0)i.push(`step ${o} (${s.tool}) sets '__lockNamespace', which is a reserved field injected internally by the plan executor. Authored plans must not set it.`)}if(i.length>0)throw new t(i.join(`
|
|
5
|
-
`))}static validateNoCrossToolLockSharing(n){let i=new Set,o=new Set;for(let r of n.steps){if(r.tool!=="criticalSection"&&r.tool!=="barrier")continue;let a=Di(r,"lock");if(typeof a!=="string"||a.length===0)continue;(r.tool==="criticalSection"?i:o).add(a)}let s=Array.from(i).filter((r)=>o.has(r));if(s.length>0)throw new t(`lock name${s.length===1?"":"s"} ${s.map((r)=>`"${r}"`).join(", ")} ${s.length===1?"is":"are"} used by both a criticalSection step and a barrier step. Both tools share the runtime coordinator's lock namespace and expected-count state, so mixing tool types on the same lock name is racy and can pair mismatched participants or overwrite the expected count. Use a distinct lock name per tool type.`)}static validateCriticalSectionLocks(n){let i=this.collectCriticalSectionLockUsage(n),o=[];for(let[s,r]of i.entries())this.validateCriticalSectionLock(s,r,o);if(o.length>0)throw new t(o.join(`
|
|
6
|
-
`))}static collectCriticalSectionLockUsage(n){let i=new Map;for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="criticalSection")continue;let r=Di(s,"lock");if(typeof r!=="string"||r.length===0)continue;let a=i.get(r)??[];a.push({stepIndex:o,device:Di(s,"device"),deviceCount:Di(s,"deviceCount")}),i.set(r,a)}return i}static validateCriticalSectionLock(n,i,o){let s=new Set(i.map((a)=>a.deviceCount).filter((a)=>typeof a==="number"));if(s.size>1){let a=i.map((c)=>`step ${c.stepIndex} deviceCount=${String(c.deviceCount)}`).join(", ");o.push(`criticalSection lock "${n}" has inconsistent deviceCount values: ${a}. All steps sharing a lock must declare the same deviceCount.`);return}let r=s.size===1?s.values().next().value:void 0;if(r!==void 0&&i.length!==r)o.push(`criticalSection lock "${n}" declares deviceCount=${r} but ${i.length} step${i.length===1?"":"s"} reference${i.length===1?"s":""} it. Every participating device needs its own criticalSection step with this lock.`);this.validateCriticalSectionDevices(n,i,o)}static validateCriticalSectionDevices(n,i,o){let s=new Map;for(let r of i){if(typeof r.device!=="string"||r.device.length===0)continue;let a=s.get(r.device)??[];a.push(r.stepIndex),s.set(r.device,a)}for(let[r,a]of s.entries())if(a.length>1)o.push(`criticalSection lock "${n}" is entered twice by device "${r}" (steps ${a.join(", ")}). Each device can participate in a given lock at most once.`)}static validateBarrierParams(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="barrier")continue;let r=Di(s,"lock");if(typeof r!=="string"||r.length===0)i.push(`barrier step ${o} is missing a non-empty 'lock' parameter.`);let a=Di(s,"deviceCount");if(typeof a!=="number"||!Number.isInteger(a)||a<1)i.push(`barrier step ${o} must declare a positive integer 'deviceCount', got ${JSON.stringify(a)}.`)}if(i.length>0)throw new t(i.join(`
|
|
7
|
-
`))}static validateBarrierDistinctDeviceCounts(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries())for(let a of r.deviceCounts)if(r.devices.size<a){let c=Array.from(r.devices).join(", ")||"none";o.push(`barrier lock "${s}" declares deviceCount=${a} but only ${r.devices.size} distinct device${r.devices.size===1?"":"s"} (${c}) ever target it in this plan. No round can ever complete.`)}if(o.length>0)throw new t(o.join(`
|
|
8
|
-
`))}static validateBarrierConsistentDeviceCount(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size<=1)continue;let a=Array.from(r.deviceCounts).sort((c,d)=>c-d).join(", ");o.push(`barrier lock "${s}" is reused with inconsistent deviceCount values (${a}). The runtime coordinator keeps a single shared expected count per lock name, so mixed-count reuse is racy and can deadlock depending on arrival order. Use a distinct lock name for each deviceCount instead.`)}if(o.length>0)throw new t(o.join(`
|
|
9
|
-
`))}static validateBarrierGenerationCompleteness(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size!==1)continue;let a=r.deviceCounts.values().next().value;if(a<1||r.arrivals%a===0)continue;o.push(`barrier lock "${s}" has ${r.arrivals} total arrival${r.arrivals===1?"":"s"} across the plan, which is not a multiple of its deviceCount=${a}. At least one generation is necessarily incomplete and would deadlock waiting for a device that never arrives.`)}if(o.length>0)throw new t(o.join(`
|
|
10
|
-
`))}static validateBarrierExcessDeviceArrivals(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size!==1)continue;let a=r.deviceCounts.values().next().value;if(a<1||r.arrivals%a!==0)continue;let c=r.arrivals/a;for(let[d,l]of r.deviceOccurrences.entries()){if(l<=c)continue;o.push(`barrier lock "${s}" has ${c} generation${c===1?"":"s"} available (deviceCount=${a}, ${r.arrivals} total arrivals), but device "${d}" arrives ${l} times. A device can participate in a lock at most once per generation, since each device's track executes sequentially, so this device would deadlock waiting for a generation that never admits it again.`)}}if(o.length>0)throw new t(o.join(`
|
|
11
|
-
`))}static collectBarrierLockUsage(n){let i=new Map;for(let o of n.steps)if(o.tool==="barrier")this.recordBarrierLockUsage(i,o);return i}static recordBarrierLockUsage(n,i){let o=Di(i,"lock");if(typeof o!=="string"||o.length===0)return;let s=n.get(o)??{devices:new Set,deviceCounts:new Set,arrivals:0,deviceOccurrences:new Map};s.arrivals+=1;let r=Di(i,"device");if(typeof r==="string"&&r.length>0)s.devices.add(r),s.deviceOccurrences.set(r,(s.deviceOccurrences.get(r)??0)+1);let a=Di(i,"deviceCount");if(typeof a==="number"&&Number.isInteger(a)&&a>=1)s.deviceCounts.add(a);n.set(o,s)}static hasMultiDeviceFeatures(n){if(n.devices&&n.devices.length>0)return!0;for(let i of n.steps){if(i.tool==="criticalSection"||i.tool==="barrier")return!0;if(i.params?.device!==void 0)return!0}return!1}static validateMultiDeviceRequirements(n){if(this.hasMultiDeviceFeatures(n)&&(!n.devices||n.devices.length===0))throw new t("Plan uses multi-device features (device labels or criticalSection/barrier) but does not declare 'devices' field. Add a 'devices' array at the top level of your plan.")}}function xp(n,i){return Math.round(Math.min(1,Math.max(0,n/i))*1e4)/1e4}function kM(n,i,o=!1){let s=w.sessionManager();if(!s)return;let r=n?s.getSessionForDevice(n)??void 0:void 0;if(!r&&o){let{error:a}=RM({message:(n?`deviceGestureRecording start refused: no session of yours holds device '${n}'. `:"deviceGestureRecording start refused: the session holds no device. ")+"Call getAndroid or getApple to acquire a session on it first.",reason:"device_not_held"});return{success:!1,...a,error:a.message}}if(!n)return;try{ou({action:"deviceGestureRecording start",deviceId:n,ownerSessionUuid:r,requesterSessionUuid:i,sessionManager:s,remedy:TT})}catch(a){if(!(a instanceof ct))throw a;return e.warn(`[DeviceGestureRecording] ${a.message}`),{success:!1,error:a.message,...a.toPayload()}}return}class _1 extends t{payload;code="no_active_device_session";retryable=!1;constructor(n,i){super(n);this.payload=i;this.name="DeviceGestureRecordingStartUnheldError"}toPayload(){return this.payload}get reason(){return this.payload.reason}get nextAction(){return this.payload.nextAction}}function L8(n,i,o=!0){let s=kM(n,i,o);if(!s)return;let r=s.error,a={...s};if(delete a.success,delete a.error,"code"in s&&s.code==="device_owned_by_other_session"&&n)throw new ct("deviceGestureRecording start",n,i,{remedy:TT,message:r});throw new _1(r,a)}
|
|
12
|
-
export{Tu,WE,Nb,RM,zE,RP,PM,jE,lG,x8,Fr,AM,C8,TM,D8,uG,ry,O8,M8,pG,Di,ny,N8,F8,iy,Rf,xp,kM,_1,L8};
|
|
13
|
-
|
|
14
|
-
//# debugId=717265F6F6D4215564756E2164756E21
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{LG,BG}from"./chunk-vs9r72ta.js";import"./chunk-mqc1d0eb.js";import"./chunk-nwm2pq5v.js";import"./chunk-a4k9rt7z.js";import"./chunk-8cghfzb2.js";import"./chunk-44bt78m9.js";import"./chunk-a2sc4jm0.js";import"./chunk-jhnbfj19.js";import"./chunk-sjn0nj4p.js";import"./chunk-tyazf3sk.js";import"./chunk-bn64x5z5.js";import"./chunk-0e4gm1kj.js";import"./chunk-4fgdhcwx.js";import"./chunk-6d3mmqxt.js";import"./chunk-sns0c35v.js";import"./chunk-h3n4adc6.js";import"./chunk-32jpxz2y.js";import"./chunk-79q5xsdc.js";import"./chunk-ggtd5x5a.js";import"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";export{LG as printUnknownDaemonCommand,BG as runDaemonCommand};
|
|
3
|
-
|
|
4
|
-
//# debugId=B5801593B03F858664756E2164756E21
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{i,te,e}from"./chunk-z8t0v07j.js";import{Jr}from"./chunk-h3n4adc6.js";import{sC}from"./chunk-6d3mmqxt.js";import{W3,nb,LD,Kz}from"./chunk-32jpxz2y.js";import{wp,u}from"./chunk-9rkfyt6q.js";var p=300000;class dO{store;windowMs;constructor(r=new sC,t=p){this.store=r,this.windowMs=t}recordFailure(r,t){let a=this.read().filter((o)=>t-o.at<=this.windowMs);a.push({at:t,kind:r});try{this.store.write(JSON.stringify(a))}catch(o){return e.debug(`Failed to persist startup failure tracker: ${o}`),Math.max(a.length,2)}return a.length}reset(){this.store.clear()}read(){let r=this.store.read();if(r===null)return[];try{let t=JSON.parse(r);if(!Array.isArray(t))return[];return t.filter((a)=>typeof a?.at==="number"&&(a.kind==="transient"||a.kind==="permanent"))}catch(t){return e.debug(`Failed to parse startup failure tracker contents: ${t}`),[]}}}var d=Math.max(1000,Jr-2000);async function P$(r,t,a=i){let o=W3(r),n=t.recordFailure(o,a.now()),c=Kz(r)?`${o}/${nb}`:o;if(e.error(`Fatal: database initialization failed (${c}; ${n} recent failure(s)); daemon cannot serve queries and will exit for a clean restart: ${wp(r)}`),o==="permanent"&&n>1){let l=te({initialDelayMs:1000,multiplier:2,maxDelayMs:d}).delayForAttempt(n-1);e.error(`Database initialization has failed ${n} times; backing off ${l}ms before exit to avoid a restart hot-loop.`),await a.sleep(l)}let s=u(r,"Database initialization failed at daemon startup");if(Kz(r))s.code=nb;throw s}function Roe(r){return Kz(r)?LD:1}async function Poe(r,t=new dO,a=i){try{await r()}catch(o){await P$(o,t,a)}}
|
|
3
|
-
export{dO,P$,Roe,Poe};
|
|
4
|
-
|
|
5
|
-
//# debugId=A0FBF46811C616C164756E2164756E21
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{Xt,U,q,ne,le,v,$n,F,S,Vo,Ke,o,R,W,Im,YL,Ot,cz,Ls,k}from"./chunk-h3n4adc6.js";import{i,Q,l,e}from"./chunk-z8t0v07j.js";import{vh,Kq,Gq,vF,O4,bF,Yq,Jq,qS,VS,Xq,Jx,Gy,M4,SF}from"./chunk-0e4gm1kj.js";import{dm,At,Zl}from"./chunk-6d3mmqxt.js";import{r,t,u}from"./chunk-9rkfyt6q.js";import{Lt}from"./chunk-2v7tw1nj.js";var tr={smaller:0.85,larger:1.15},Pf=72,Af=1280;function Ze(s,n){if(typeof s==="number"){let c=Math.round(s);if(c<Pf)return{error:`Cannot set display density: ${c} dpi is below Android's ${Pf} dpi minimum.`};if(c>Af)return{error:`Cannot set display density: ${c} dpi exceeds Android's ${Af} dpi maximum.`};return{command:`shell wm density ${c}`,target:c}}if(s==="default")return{command:"shell wm density reset",target:"default"};if(n===void 0)return{error:`Cannot resolve relative density bucket '${s}': the device's physical density could not be read.`};let a=Math.round(n*tr[s]);if(a<Pf)return{error:`Cannot resolve relative density bucket '${s}': ${a} dpi is below Android's ${Pf} dpi minimum.`};if(a>Af)return{error:`Cannot resolve relative density bucket '${s}': ${a} dpi exceeds Android's ${Af} dpi maximum.`};return{command:`shell wm density ${a}`,target:a}}function je(s,n,a){if(n!==void 0)(a.invalidate??Ls)(s.deviceId,"Display density changed by displayConfig")}function rr(s,n){let a=s.scopes??["0"],c=(n.scopes??["0"]).filter((d)=>!a.includes(d));if(c.length===0)return!1;return s.commands=[...s.commands,...n.commands],s.scopes=[...a,...c],!0}class qe{entries=new Map;has(s,n){return this.entries.get(s)?.actions.has(n)??!1}record(s,n,a){let c=this.entries.get(s.deviceId)??{device:s,actions:new Map};if(this.entries.set(s.deviceId,c),c.device=s,a!==void 0)c.owner=a;let d=c.actions.get(n.facet);if(d?.facet==="display"&&n.facet==="display"){let p=Object.keys(n.values).some((f)=>!(f in d.values));return d.values={...n.values,...d.values},p}if(d&&"commands"in d&&"commands"in n)return rr(d,n);if(d)return!1;return c.actions.set(n.facet,n),!0}forget(s,n){let a=this.entries.get(s);if(a?.actions.delete(n),a&&a.actions.size===0)this.entries.delete(s)}forgetScopes(s,n,a){let c=this.entries.get(s)?.actions.get(n);if(!c||!("commands"in c))return;let d=c.scopes??["0"],p=d.flatMap((f,m)=>a.includes(f)?[]:[m]);if(p.length===0){this.forget(s,n);return}c.commands=p.map((f)=>c.commands[f]),c.scopes=p.map((f)=>d[f])}pending(s){return[...this.entries.get(s)?.actions.values()??[]].reverse()}restoresOnRelease(s){return this.entries.get(s)?.owner!==void 0}takeOwnedBy(s,n){let a=this.entries.get(s);if(a?.owner!==n)return;return this.entries.delete(s),{device:a.device,actions:[...a.actions.values()].reverse()}}retireDevice(s){this.entries.delete(s)}}var xl=new qe;var ir=29,sr=29,B8=["none","corner","double","hole","tall","waterfall"],$8=["gestural","threebutton","twobutton"],nr="com.android.internal.display.cutout.emulation.",or="com.android.internal.systemui.navbar.",de="debug.hwui.force_dark";async function Ye(s,n,a){o(a);let c=await s.executeCommand(n,{noRetry:!0,signal:a}),d=c.stderr??"";if(Ke(c.stdout,d))throw new t(`'${n}' failed: ${`${c.stdout}
|
|
3
|
-
${d}`.trim()}`);return c.stdout}function X(s,n){return Ye(s.deps.shell,n,s.deps.signal)}async function fe(s,n){for(let a of n)await X(s,a)}function Xe(s,n){return s.apiLevel!==null&&s.apiLevel<n?`needs API ${n}+, device is API ${s.apiLevel}`:void 0}function ar(s){return s.match(/Override size:\s*(\d+x\d+)/)?.[1]}function me(s){return[...s.matchAll(/^\s*\[(x| )\]\s+(\S+)/gm)].map((n)=>({name:n[2],enabled:n[1]==="x"}))}async function ye(s,n,a){let c=s.registry.record(s.device,n,s.deps.owner);try{await a()}catch(d){if(c)s.registry.forget(s.device.deviceId,n.facet);throw d}}async function lr(s,n){let a=ar(await X(s,"shell wm size")),c=a?`shell wm size ${a}`:"shell wm size reset",d=n==="default"?"shell wm size reset":`shell wm size ${n}`;return await ye(s,{facet:"screenSize",commands:[c]},()=>fe(s,[d])),le(s.device.deviceId)?{step:"screenSize",status:"applied",detail:d}:{step:"screenSize",status:"partial",detail:`${d} (physical device: best effort)`}}function cr(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.forceDark===!0?{theme:"dark"}:{}}}function ur(s,n){let a=s.previous??{},c=a.fontScale;return{...n.fontScale!==void 0&&c!==void 0?{fontScale:c}:{},...n.density!==void 0&&a.density!==void 0?{density:a.density}:{},...n.theme!==void 0&&a.theme!==void 0?{theme:a.theme}:{}}}async function dr(s,n){let a=await s.deps.displayConfig.setConfig(n),c=ur(a,n);if(Object.keys(c).length>0)s.registry.record(s.device,{facet:"display",values:c},s.deps.owner);let d=Object.keys(n).join(", ");if(!a.success)return{step:"display",status:"failed",detail:a.error??`displayConfig ${d} failed`};let p=n.density!==void 0&&a.supported.density==="partial";return{step:"display",status:p?"partial":"applied",detail:p?`displayConfig ${d} (density is best effort on this device)`:`displayConfig ${d}`}}async function We(s,n,a,c){let d=Xe(s,ir);if(d)return{step:n,status:"unsupported",detail:d};let p=me(await X(s,"shell cmd overlay list android")),f=c===void 0?void 0:`${a}${c}`;if(f&&!p.some((D)=>D.name===f))return{step:n,status:"unsupported",detail:`overlay ${f} is not on this system image`};let m=p.filter((D)=>D.name.startsWith(a)&&D.enabled),y=m[0]?[`shell cmd overlay enable-exclusive --category ${m[0].name}`]:f?[`shell cmd overlay disable ${f}`]:[],g=f?[`shell cmd overlay enable-exclusive --category ${f}`]:m.map((D)=>`shell cmd overlay disable ${D.name}`);return await ye(s,{facet:n,commands:y},()=>fe(s,g)),{step:n,status:"applied",detail:g.join("; ")||"already none"}}async function pr(s,n){let a=Xe(s,sr);if(a)return{step:"forceDark",status:"unsupported",detail:a};let c=(await X(s,`shell getprop ${de}`)).trim(),d=`shell setprop ${de} ${n}`;return await ye(s,{facet:"forceDark",commands:[`shell setprop ${de} ${S(c)}`]},()=>fe(s,[d])),{step:"forceDark",status:"applied",detail:`${d}; applies to activities started afterwards, so relaunch the app`}}async function fr(s,n){let a=await s.deps.posture.read(s.deps.signal),c=await s.deps.posture.set(n,s.deps.signal);if(c.status==="unsupported")return{step:"posture",status:"unsupported",detail:c.detail};if(a===void 0)return{step:"posture",status:"partial",detail:`posture ${n} set, but the previous posture was unreadable, so reset cannot restore it`};return s.registry.record(s.device,{facet:"posture",posture:a},s.deps.owner),{step:"posture",status:"applied",detail:`posture ${n}`}}function mr(s){return s==="none"?void 0:s}function yr(s,n){let a=[],{screenSize:c,cutout:d,navigationMode:p,forceDark:f,posture:m}=n,y=cr(n);if(c!==void 0)a.push(["screenSize",()=>lr(s,c)]);if(Object.keys(y).length>0)a.push(["display",()=>dr(s,y)]);if(d!==void 0)a.push(["cutout",()=>We(s,"cutout",nr,mr(d))]);if(p!==void 0)a.push(["navigationMode",()=>We(s,"navigationMode",or,p)]);if(f!==void 0)a.push(["forceDark",()=>pr(s,f)]);if(m!==void 0)a.push(["posture",()=>fr(s,m)]);return a}async function gr(s,n){try{return await n()}catch(a){return e.warn(`displayProfile ${s} step failed: ${r(a)}`,a),{step:s,status:"failed",detail:u(a,`${s} failed`).message}}}function hr(s){let n=s.screenSize;if(n!==void 0&&n!=="default"&&!/^\d+x\d+$/.test(n))throw new t(`screenSize must be WIDTHxHEIGHT (e.g. 1080x2400) or default, not '${n}'.`)}function Sr(s){if(s.every((n)=>n.status==="applied"))return"applied";return s.some((n)=>n.status==="applied"||n.status==="partial")?"partial":"unsupported"}function pe(s){return s.map((n)=>`${n.step}: ${n.detail??n.status}`).join("; ")}async function He(s,n){if(s.platform!=="android")throw new t(`displayProfile is Android-only; ${s.deviceId} is ${s.platform}. Use displayConfig and setPosture on iOS.`);let a=await Ot(n.shell,void 0,void 0,n.signal);return{device:s,deps:n,registry:n.registry??xl,apiLevel:a}}async function x1(s,n,a){hr(n);let c=await He(s,a),d=yr(c,n);if(d.length===0)throw new t("displayProfile apply needs at least one display field.");let p=[];for(let[g,D]of d)p.push(await gr(g,D));if(!p.some((g)=>g.status==="applied"||g.status==="partial")&&p.some((g)=>g.status==="failed"))throw new t(`displayProfile changed nothing on ${s.deviceId}: ${pe(p)}`);let m=c.registry.pending(s.deviceId).map((g)=>g.facet),y=Sr(p);return{message:`Applied display profile to ${s.deviceId} (${y}): ${pe(p)}`,deviceId:s.deviceId,action:"apply",status:y,steps:p,...m.length>0?{restore:{facets:m,onSessionRelease:c.registry.restoresOnRelease(s.deviceId)}}:{}}}async function mG(s,n,a){switch(n.facet){case"display":{let c=await s.displayConfig.setConfig(n.values);if(!c.success)throw new t(c.error??"displayConfig restore failed");return}case"posture":{let c=await s.posture.set(n.posture,a);if(c.status!=="applied")throw new t(c.detail??`posture ${n.posture} could not be restored`);return}default:for(let c of n.commands)await Ye(s.shell,c,a)}}async function C1(s,n){let a=await He(s,n),c=[];for(let p of a.registry.pending(s.deviceId))try{await mG(n,p,n.signal),a.registry.forget(s.deviceId,p.facet),c.push({step:p.facet,status:"applied"})}catch(f){e.warn(`displayProfile restore of ${p.facet} failed: ${r(f)}`,f),c.push({step:p.facet,status:"failed",detail:u(f,`restore ${p.facet} failed`).message})}let d=c.filter((p)=>p.status==="failed");if(d.length>0)throw new t(`displayProfile reset on ${s.deviceId} failed: ${pe(d)}`);return{message:c.length===0?`No displayProfile change is recorded on ${s.deviceId}; nothing was changed.`:`Restored ${c.map((p)=>p.step).join(", ")} on ${s.deviceId}`,deviceId:s.deviceId,action:"reset",status:"applied",steps:c}}var PP=["size","navigationMode","displayCutout"],Qe="size, navigationMode and displayCutout are Android only (`wm size` and `cmd overlay`).",vr={navigationMode:"Navigation mode",displayCutout:"Display cutout"},Dr={navigationMode:"navigationMode",displayCutout:"cutout"},br="0",wr=/^[A-Za-z0-9_.:]+$/,Cr=["screenSize","navigationMode","cutout"],Ar="shell cmd overlay list android";function O(s){return PP.some((n)=>s[n]!==void 0)}function et(s){return Object.fromEntries(Object.entries(s).filter(([n,a])=>a!==void 0&&!PP.includes(n)&&!(n==="reset"&&a===!1)))}function tt(s){let n=s.platform==="android";return{size:n?le(s.deviceId)?!0:"partial":!1,navigationMode:n,displayCutout:n}}function H(s){let n=bF("navigationMode",vF(s,"navigationMode")),a=bF("displayCutout",vF(s,"displayCutout"));return{...n===void 0?{}:{navigationMode:n},...a===void 0?{}:{displayCutout:a}}}function Je(s){return{navigationMode:Yq(s,"navigationMode"),displayCutout:Yq(s,"displayCutout")}}class ge{device;adb;options;registry;invalidate;constructor(s,n,a={}){this.device=s;this.adb=n;this.options=a;this.registry=a.registry??xl,this.invalidate=a.invalidate??Ls}get displayId(){return this.options.displayId??0}async run(s){let n=await this.adb.executeCommand(s,{noRetry:!0});if(Ke(n.stdout,n.stderr??""))throw Error(`'${s}' reported: ${`${n.stdout} ${n.stderr??""}`.trim()}`);return n.stdout}async runChecked(s,n){try{return await this.run(s),[]}catch(a){return e.warn(`[DisplayGeometry] ${n} command failed: ${r(a)}`,a),[`${n}: '${s}' failed: ${r(a)}`]}}async readSize(){let s=await this.run(VS(this.options.displayId)),n=qS(s);if(n===void 0)throw Error(`could not parse 'wm size' output: ${s.trim()||"(empty)"}`);return n}async readOverlays(){let s=me(await this.run(Ar)).filter((n)=>wr.test(n.name)).map((n)=>({packageName:n.name,enabled:n.enabled}));if(s.length===0)throw Error("could not parse 'cmd overlay list' output");return s}async read(){let[s,n]=await Promise.allSettled([this.readSize(),this.readOverlays()]),a={};if(s.status==="fulfilled")a.size=Gy(s.value);else e.warn(`[DisplayGeometry] size read failed: ${r(s.reason)}`,s.reason);if(n.status==="rejected")return e.warn(`[DisplayGeometry] overlay read failed: ${r(n.reason)}`,n.reason),{values:a};return{values:{...a,...H(n.value)},available:Je(n.value)}}async prepare(s){let n=this.overlaySteps(s);try{let a={previous:{}};if(s.size!==void 0){let c=await this.readSize(),d=this.sizeRefusal(s.size,c);if(d)return{refusal:d};a.size={current:c,target:s.size},a.previous.size=Jx(c)}if(n.length>0){let c=await this.readOverlays(),d=this.overlayRefusal(s,c);if(d)return{refusal:d};a.overlays={entries:c,steps:n},a.available=Je(c),Object.assign(a.previous,H(c))}return a}catch(a){return e.warn(`[DisplayGeometry] pre-read failed: ${r(a)}`,a),{refusal:`Could not read the display geometry: ${r(a)}`}}}overlaySteps(s){return["navigationMode","displayCutout"].flatMap((n)=>{let a=s[n];return a===void 0?[]:[{group:n,target:O4(n,a)}]})}sizeRefusal(s,n){if(s==="default"||n.physical===void 0)return;let{width:a,height:c}=n.physical,d=a*Kq,p=c*Kq;if(s.width<vh||s.height<vh||s.width>d||s.height>p)return`Cannot set display size ${SF(s)}: Android clamps each side to ${vh}..${Kq}x the physical size (${vh}-${d} x ${vh}-${p} px for this ${SF(n.physical)} display, natural orientation).`;return}overlayRefusal(s,n){let a=["navigationMode","displayCutout"].flatMap((c)=>{let d=s[c],p=Yq(n,c);return d===void 0||p.includes(d)?[]:[`${c} '${d}' is not available on this system image; its overlays allow: ${p.join(", ")}.`]});return a.length>0?a.join(" "):void 0}async apply(s){let n=[],a=await this.applySize(s.size,n),c=await this.applyOverlays(s.overlays,n);if(a||c)this.invalidate(this.device.deviceId,"Display geometry changed by displayConfig");let d=await this.verify(s,n);return{previous:s.previous,...d?{applied:d}:{},...s.available?{available:s.available}:{},errors:n}}async applySize(s,n){if(!s||M4(Jx(s.current),s.target))return!1;this.registry.record(this.device,{facet:"screenSize",commands:[Xq(Jx(s.current),this.options.displayId)],scopes:[String(this.displayId)]},this.options.owner);let a=Xq(s.target,this.options.displayId);return n.push(...await this.runChecked(a,"size")),!0}async applyOverlays(s,n){let a=!1;for(let c of s?.steps??[]){let d=s?.entries??[],p=vF(d,c.group),f=Jq(p,c.target);if(f.length>0)this.recordOverlayOriginal(d,c.group,p),a=!0;for(let m of f){let y=await this.runChecked(m,c.group);if(n.push(...y),y.length>0)break}}return a}recordOverlayOriginal(s,n,a){let c=Gq(s,n).map((d)=>d.packageName);this.registry.record(this.device,{facet:Dr[n],commands:Jq(c,a)},this.options.owner)}async verify(s,n){let a={};try{if(s.size){let c=await this.readSize();a.size=Gy(c);let d=s.size.target==="default"?Jx(c):a.size;if(!M4(d,s.size.target))n.push(`Display size remained ${SF(d)} after requesting ${SF(s.size.target)}.`)}if(s.overlays){let c=await this.readOverlays();Object.assign(a,H(c));for(let d of s.overlays.steps)this.verifyOverlayStep(d,vF(c,d.group),n)}return a}catch(c){return e.warn(`[DisplayGeometry] post-read failed: ${r(c)}`,c),n.push(`failed to read applied display geometry: ${r(c)}`),Object.keys(a).length>0?a:void 0}}verifyOverlayStep(s,n,a){if(Jq(n,s.target).length>0)a.push(`${vr[s.group]} remained ${String(bF(s.group,n)??n.join(", "))} after requesting ${String(bF(s.group,s.target)??s.target.join(", "))}.`)}async reset(){let s=[],n=await this.snapshot(),a=this.registry.pending(this.device.deviceId).flatMap((f)=>("commands"in f)&&Cr.includes(f.facet)?[f]:[]),c=String(this.displayId),d=!1;for(let f of a){let m=f.scopes??[br],y=f.facet==="screenSize"?m.indexOf(c):-1;if(f.facet==="screenSize"&&y<0)continue;d||=f.facet==="screenSize";let g=f.facet==="screenSize"?[f.commands[y]]:f.commands;if(!await this.runAll(g,f.facet,s))if(f.facet==="screenSize")this.registry.forgetScopes(this.device.deviceId,f.facet,[c]);else this.registry.forget(this.device.deviceId,f.facet)}if(!d)await this.runAll([Xq("default",this.options.displayId)],"size",s);this.invalidate(this.device.deviceId,"Display geometry reset by displayConfig");let p=await this.snapshot();return{previous:n,...Object.keys(p).length>0?{applied:p}:{},errors:s}}async runAll(s,n,a){for(let c of s){let d=await this.runChecked(c,n);if(a.push(...d),d.length>0)return!0}return!1}async snapshot(){let[s,n]=await Promise.allSettled([this.readSize(),this.readOverlays()]);return{...s.status==="fulfilled"?{size:Jx(s.value)}:{},...n.status==="fulfilled"?H(n.value):{}}}}var L=1;function rt(s){let n=s.trim();if(n==="null")return L;if(!/^[+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n))return;let a=Number(n);return Number.isFinite(a)&&a>0?a:void 0}function he(s){let n=s.trim();return n==="null"?"default":rt(n)}function Se(s){let n=new Map;for(let p of s.matchAll(/^[ \t]*(Physical|Override) density:[ \t]*([^\r\n]*)/gim)){let f=p[1].toLowerCase(),m=p[2].trim(),y=Number(m);if(!/^\d+$/.test(m)||!Number.isSafeInteger(y)||y<=0||n.has(f))return{effective:void 0,overridden:!1};n.set(f,y)}let a=n.get("physical"),c=n.get("override"),d=c!==void 0&&Number.isFinite(c);return{...a!==void 0&&Number.isFinite(a)?{physical:a}:{},effective:d?c:a!==void 0&&Number.isFinite(a)?a:void 0,overridden:d}}function ve(s){switch((s.match(/Night mode:\s*(\w+)/i)?.[1]??s.trim()).toLowerCase()){case"yes":return"dark";case"no":return"light";case"auto":return"system";case"custom":return"custom";default:return}}function De(s){switch(s){case"dark":return"yes";case"light":return"no";case"system":return"auto";case"custom":return"custom"}}var D1=["extra-small","small","medium","large","extra-large","extra-extra-large","extra-extra-extra-large","accessibility-medium","accessibility-large","accessibility-extra-large","accessibility-extra-extra-large","accessibility-extra-extra-extra-large"],be="large",N={"extra-small":14,small:15,medium:16,large:17,"extra-large":19,"extra-extra-large":21,"extra-extra-extra-large":23,"accessibility-medium":28,"accessibility-large":33,"accessibility-extra-large":40,"accessibility-extra-extra-large":47,"accessibility-extra-extra-extra-large":53};function Ir(s){return Math.round(N[s]/N.large*100)/100}function Pr(s){let n=s*N.large;return D1.reduce((a,c)=>Math.abs(N[c]-n)<=Math.abs(N[a]-n)?c:a)}function we(s){return D1.includes(s)}function Rr(s){return s==="default"?be:Pr(s)}var it=new Map;Xt({name:"ios-display-config-content-size-baselines",onDeviceIdentityReplaced:(s)=>it.delete(s),onDeviceIncarnationChanged:()=>{}});var st={get:()=>{return},set:()=>{},delete:()=>{}},z="density is not supported on iOS: there is no simctl, defaults or XCUITest control for display density.";class Ce{device;simctl;baselines;constructor(s,n,a=it){this.device=s;this.simctl=n;this.baselines=a}clearBaseline(){this.baselines.delete(this.device.deviceId)}async read(){let[s,n]=await Promise.all([this.readTheme(),this.readContentSizeOrUndefined()]);return{theme:s,...$r(n)}}async readRestorable(){let[s,n]=await Promise.all([this.readThemeOrUndefined(),this.readContentSizeOrUndefined()]);return{...s!==void 0?{theme:s}:{},...n!==void 0?{contentSize:n}:{}}}async set(s){let n=s.reset===!0,a=n?this.baselines.get(this.device.deviceId):xr(s),c=await this.readPrevious(a!==void 0);if(!n&&a!==void 0&&c.contentSize!==void 0)this.recordBaseline(c.contentSize);let d=n?"light":s.theme,p=await this.apply(s,d,a),{applied:f,readError:m}=await this.readApplied();p.push(...m?[m]:[],...Er(f,d,a));let y=n?this.confirmRestore(f,a):void 0;return{previous:c,...f?{applied:f}:{},errors:p,...y?{restoredContentSize:y}:{}}}async apply(s,n,a){return[...s.density!==void 0&&!s.reset?[z]:[],...n!==void 0?await this.setAppearance(n):[],...a!==void 0?await this.setContentSize(a):[]]}confirmRestore(s,n){if(n===void 0||s?.contentSize!==n)return;return this.baselines.delete(this.device.deviceId),n}recordBaseline(s){if(this.baselines.get(this.device.deviceId)===void 0)this.baselines.set(this.device.deviceId,s)}async readPrevious(s){let[n,a]=await Promise.all([this.readTheme(),s?this.readContentSize():this.readContentSizeOrUndefined()]);return{theme:n,...a!==void 0?{contentSize:a}:{}}}async readApplied(){try{return{applied:await this.read()}}catch(s){return e.warn(`[DisplayConfig] setConfig post-read failed (iOS simulator): ${r(s)}`,s),{readError:`failed to read applied theme: ${r(s)}`}}}async readTheme(){let s=await this.readThemeOrUndefined();if(s===void 0)throw Error("simctl did not report a readable Simulator appearance");return s}async readThemeOrUndefined(){let n=(await this.simctl.executeCommandArgs(["ui",this.device.deviceId,"appearance"])).stdout.trim();return n==="light"||n==="dark"?n:void 0}async readContentSize(){let n=(await this.simctl.executeCommandArgs(["ui",this.device.deviceId,"content_size"])).stdout.trim().toLowerCase();if(!we(n))throw Error(`simctl reported an unknown Simulator content size '${n}'`);return n}async readContentSizeOrUndefined(){try{return await this.readContentSize()}catch(s){e.warn(`[DisplayConfig] content_size read failed on ${this.device.deviceId}: ${r(s)}`,s);return}}async setAppearance(s){if(s!=="light"&&s!=="dark")return[`Cannot set theme '${s}' on the iOS Simulator: 'simctl ui appearance' only accepts 'light' or 'dark'.`];return this.run(["ui",this.device.deviceId,"appearance",s],`appearance ${s}`)}setContentSize(s){return this.run(["ui",this.device.deviceId,"content_size",s],`content_size ${s}`)}async run(s,n){try{return await this.simctl.executeCommandArgs(s),[]}catch(a){return e.warn(`[DisplayConfig] 'simctl ui ${n}' failed: ${r(a)}`,a),[`'simctl ui ${n}' failed: ${r(a)}`]}}}function $r(s){return s===void 0?{}:{contentSize:s,fontScale:Ir(s)}}function xr(s){if(s.contentSize!==void 0)return s.contentSize;return s.fontScale===void 0?void 0:Rr(s.fontScale)}function Er(s,n,a){if(!s)return[];return[...n!==void 0&&s.theme!==n?[`Simulator appearance remained ${s.theme} after requesting ${n}`]:[],...a!==void 0&&s.contentSize!==a?[`Simulator content size remained ${String(s.contentSize)} after requesting ${a}`]:[]]}var nt="[REDACTED]",Tr=new Map([["int","int"],["integer","int"],["boolean","bool"],["bool","bool"],["true","bool"],["false","bool"],["real","float"],["double","float"],["float","float"],["string","string"],["date","date"],["data","data"],["array","array"],["dictionary","dictionary"],["dict","dictionary"]]);function E(s){let n=s.trim().toLowerCase().replace(/^type is\s+/,"");return Tr.get(n)??"unknown"}var ot=Lt(Im());async function U8(s){try{let n=await ot.parseStringPromise(s,{explicitChildren:!0,preserveChildrenOrder:!0,explicitRoot:!1,trim:!1}),a=n["#name"]==="plist"?n.$$?.[0]:void 0;if(!a||a["#name"]!=="dict")throw new t("The iOS UserDefaults plist must contain a dictionary.");return new Map(at(a).map(([c,d])=>{let p=Ae(d);return[c,{type:E(d["#name"]),value:typeof p==="object"?JSON.stringify(p):p}]}))}catch(n){throw u(n,"Failed to parse iOS UserDefaults XML plist")}}function at(s){let n=s.$$??[],a=[];for(let c=0;c<n.length;c+=2){let d=n[c],p=n[c+1];if(d?.["#name"]!=="key"||!p)throw new t("Malformed iOS UserDefaults plist dictionary key/value pair.");a.push([d._??"",p])}return a}function Ae(s){let n=s._??"";switch(s["#name"]){case"dict":return Object.fromEntries(at(s).map(([a,c])=>[a,Ae(c)]));case"array":return(s.$$??[]).map(Ae);case"integer":return _r(n);case"real":return Ie(n);case"true":return!0;case"false":return!1;case"date":return new Date(n).toISOString();case"data":return n.replace(/\s/g,"");case"string":return n;default:throw new t(`Unsupported iOS UserDefaults plist tag '${s["#name"]}'.`)}}function _r(s){if(!/^-?\d+$/.test(s.trim()))throw new t("Invalid integer in iOS UserDefaults plist.");let n=Number(s);return Number.isSafeInteger(n)?n:s.trim()}function Ie(s){let n=s.trim().toLowerCase();if(n==="nan")return"nan";if(["inf","+inf","infinity","+infinity"].includes(n))return"inf";if(["-inf","-infinity"].includes(n))return"-inf";let a=Number(s);if(!Number.isFinite(a))throw new t("Invalid real in iOS UserDefaults plist.");return a}function EM(s){let n=Math.fround(s);if(Number.isNaN(n))return"NaN";if(n===Number.POSITIVE_INFINITY)return"Infinity";if(n===Number.NEGATIVE_INFINITY)return"-Infinity";if(Object.is(n,-0))return"-0.0";if(n===0)return"0.0";let a="";for(let c=1;c<=9;c+=1){let d=n.toPrecision(c);if(Math.fround(Number(d))===n){a=d;break}}return Or(a||String(n),n)}function Or(s,n){let a=/^(-?)(\d+(?:\.\d+)?)(?:e([+-]?\d+))?$/i.exec(s);if(!a)return s;let c=a[1],d=a[2],p=d.indexOf(".")===-1?d.length:d.indexOf("."),f=d.replace(".",""),m=f.search(/[1-9]/),y=f.slice(m).replace(/0+$/,"")||"0",g=Number(a[3]??0)+p-m-1,D=Math.abs(n);if(D<0.001||D>=1e7)return`${c}${y[0]}.${y.slice(1)||"0"}E${g}`;let h=g+1;if(h<=0)return`${c}0.${"0".repeat(-h)}${y}`;if(h>=y.length)return`${c}${y}${"0".repeat(h-y.length)}.0`;return`${c}${y.slice(0,h)}.${y.slice(h)}`}var ee=Lt(Im());function Re(s,n){return`shell run-as ${Vo(s)}${n?` --user ${n}`:""}`}function Fr(s,n){return n?`${s} (user ${n})`:s}function AP(s){let n=s.endsWith(".xml")?s.slice(0,-4):s;if(!/^[A-Za-z0-9_.-]+$/.test(n)||n==="."||n==="..")throw new t("Android SharedPreferences file name must be a safe file name using letters, numbers, underscore, dash, or dot.");return n}async function oy(s,n,a,c){try{return(await s.executeCommand(`${Re(n,c)} cat shared_prefs/${a}.xml`)).stdout}catch(d){if(dt(d))return"<map/>";throw $e("read",d,n,c)}}async function fG(s,n,a,c){try{return{xml:(await s.executeCommand(`${Re(n,c)} cat shared_prefs/${a}.xml`)).stdout,exists:!0}}catch(d){if(dt(d))return{xml:"<map/>",exists:!1};throw $e("read",d,n,c)}}async function TP(s,n,a,{xml:c,userId:d}){let f=`mkdir -p shared_prefs && printf '%s' '${Buffer.from(c,"utf8").toString("base64")}' | base64 -d > shared_prefs/${a}.xml`;try{await s.executeCommand(`${Re(n,d)} sh -c ${Vo(f)}`)}catch(m){throw $e("write",m,n,d)}}async function kP(s){let n=s.trim();if(!n)return{map:{}};try{let a=await ee.parseStringPromise(n,{explicitArray:!0,explicitRoot:!0,trim:!1,explicitChildren:!0,preserveChildrenOrder:!0,charsAsChildren:!0,includeWhiteChars:!0});return zr(Pe(a))}catch(a){throw u(a,"Failed to parse Android SharedPreferences XML")}}function KE(s){return new ee.Builder({xmldec:{version:"1.0",encoding:"utf-8",standalone:!0},renderOpts:{pretty:!1}}).buildObject(s)}function IM(s,n){for(let[a,c]of Object.entries(s.map))if(Array.isArray(c))s.map[a]=c.filter((d)=>d?.$?.name!==n)}function EP(s){if(Array.isArray(s))return s;if(s===void 0||s===null)return[];return[s]}function I(s,n){return EP(s).find((a)=>a?.$?.name===n)??null}var lt="$$",ct="#name",Lr="__text__";function Pe(s){if(Array.isArray(s))return s.map(Pe);if(!J(s))return s;let n={};for(let[c,d]of Object.entries(s))if(c!==lt&&c!==ct)n[c]=c==="$"?d:Pe(d);let a=Nr(s[lt]);if(n._===void 0&&a!==void 0)n._=a;return Object.keys(n).length===1&&typeof n._==="string"?n._:n}function Nr(s){if(!Array.isArray(s)||s.length===0)return;let n=s.filter((a)=>J(a)&&a[ct]===Lr);if(n.length!==s.length)return;return n.map((a)=>String(a._??"")).join("")}function zr(s){if(!J(s))return{map:{}};if(!J(s.map))return{...s,map:{}};return s}function J(s){return typeof s==="object"&&s!==null&&!Array.isArray(s)}function ut(s){let n=s;for(let a=0;a<5&&n instanceof Error;a+=1){let c=n,d=[c.stderr,c.stdout].map((p)=>Buffer.isBuffer(p)?p.toString():p).filter((p)=>typeof p==="string"&&p.length>0);if(d.length>0)return d.join(`
|
|
4
|
-
`);n=n.cause}return r(s).split(`
|
|
5
|
-
`).filter((a)=>!a.includes("Command failed:")).join(`
|
|
6
|
-
`)}var kr=/^run-as: couldn't stat \/data\/user(?:_de)?\/(\d+)\b/m,Mr=/^run-as:/m,Vr=/^cat: [^\n]*shared_prefs\/[^/\s:]+\.xml: No such file or directory/m;function dt(s){let n=ut(s);return!Mr.test(n)&&Vr.test(n)}function $e(s,n,a,c){let d=kr.exec(ut(n))?.[1];if(d!==void 0)return new t(`Cannot ${s} Android SharedPreferences: user ${d} does not exist, or ${a} is not installed for it (run-as could not open /data/user/${d}). Pass a userId of an existing user that has the app installed.`,{cause:n});return new t(`Failed to ${s} Android SharedPreferences via run-as. This requires a debuggable/test build for ${Fr(a,c)}. ${r(n)}`,{cause:n})}var O1=2,M1=2500,H8=5000,q8=/^(?:Command execution failed: )?iOS key-value storage requires \S+ to be the foreground app$/,V8="This value comes from the on-disk plist and may lag a running app because cfprefsd can hold newer values.",Br="defaults write to an absolute path bypasses the preferences daemon. A running app may not see the change, and cfprefsd may later overwrite it with cached state until the app restarts. verified: true proves only file content, not the running app's state.",hG="App-group suites live in the group container and are only reachable through the embedded SDK on this preference route.",IP=1e4,N1=30000,pt=-2147483648,ft=2147483647,Gr={string:"string",bool:"boolean",int:"int",float:"float"},Ur=[["string","STRING"],["boolean","BOOLEAN"],["int","INT"],["long","LONG"],["float","FLOAT"],["set","STRING_SET"],["null","UNKNOWN"]];async function W8(s){let n=await kP(s),a=[];for(let[c,d]of Ur)for(let p of EP(n.map[c])){let f=p.$?.name;if(typeof f!=="string")continue;let m=Zr(c,p);a.push({key:f,type:d,value:m})}return a}function Zr(s,n){if(s==="null")return null;if(s==="string")return n._??"";if(s==="set")return JSON.stringify(mt(n));if(s==="float"){let c=n.$?.value;return c===void 0?null:EM(Number(c))}let a=n.$?.value;return a===void 0?null:String(a)}function gG(s){let n=s.suite??`${s.appId}_preferences`;try{return AP(n)}catch{throw new t("Android SharedPreferences suite must be a safe file name using letters, numbers, underscore, dash, or dot.")}}async function z8(s,n){let c=(await kP(s)).map??{},d=I(c.string,n);if(d)return{type:"string",value:d._??""};let p=Kr(c,n);if(p)return p;let f=I(c.long,n);if(f)return{type:"long",value:Xr(f.$?.value??"")};let m=I(c.set,n);if(m)return{type:"stringSet",value:mt(m)};return null}function Kr(s,n){let a=I(s.boolean,n);if(a)return{type:"bool",value:sy(a.$?.value??"","bool")};let c=I(s.int,n);if(c)return{type:"int",value:sy(c.$?.value??"","int")};let d=I(s.float,n);if(d)return{type:"float",value:sy(d.$?.value??"","float")};return null}async function j8(s,n,a,c){let d=await kP(s);d.map??={},IM(d,n);let p=Gr[c],f=EP(d.map[p]);return f.push(jr(n,a,c)),d.map[p]=f,KE(d)}function mt(s){return EP(s.string).map((n)=>{if(typeof n==="string")return n;return n?._??""})}function jr(s,n,a){if(a==="string")return{_:ay(n),$:{name:s}};if(a==="int")qr(n);return{$:{name:s,value:a==="float"?EM(n):ay(n)}}}function qr(s){if(typeof s!=="number"||!Number.isInteger(s)||s<pt||s>ft)throw new t(`Android SharedPreferences int values must fit in the signed 32-bit range (${pt} to ${ft}).`)}var K8={string:"STRING",int:"INT",bool:"BOOLEAN",float:"FLOAT"};function yG(s){return s==="standard"?"Standard":s}function G8(s){if(!yt(s))throw new t(`iOS UserDefaults SDK write failed: ${r(s)}. The write may or may not have been applied. Read the value through the SDK before retrying; no container write was attempted.`,{cause:s})}function yt(s){let n=r(s);if(/(?:^|: )sdk_unavailable_not_dispatched$/.test(n))return!0;return/^(?:Command execution failed: )?iOS key-value storage requires (?:[A-Za-z0-9_.-]+ to embed and initialize the AutoMobile SDK and call UserDefaultsInspector\.shared\.setEnabled\(true\)|the target app to embed the AutoMobile SDK)$/.test(n)}function vG(s){let n=r(s);return yt(s)||s instanceof YL||n==="CtrlProxy service port changed"||n==="Failed to connect to CtrlProxy"||/^(?:Get preference timeout after \d+ms|iOS UserDefaults request timed out after \d+ms\.)$/.test(n)||/^(?:WebSocket (?:is not open|closed|connection closed)|Connection (?:closed|lost)|connection_lost)$/.test(n)||/^iOS key-value storage requires the target app to embed the AutoMobile SDK, initialize it, and call UserDefaultsInspector\.shared\.setEnabled\(true\): /.test(n)&&/(?:Could not connect to the server|couldn[\u2019']t connect to the server|connection refused|network connection was lost|not connected to the Internet|request timed out)\.?$/i.test(n)||/^iOS key-value storage requires the target app to embed or upgrade the AutoMobile SDK: (?:not_found|HTTP 404)$/.test(n)||/(?:^|: )user_defaults_inspection_disabled$/.test(n)}function _P(s){return s.redacted===!0||s.value===nt}function Y8(s){let n=s.value;if(_P(s))return{type:E(s.type),value:null,redacted:!0};let a=E(s.type);if(n!==null&&(a==="array"||a==="dictionary")){if(Wr(n,a))return{type:a,value:n,valueFormat:"canonical-json"};return{type:"unknown",value:n,valueFormat:"sdk-description",warning:"The SDK could not encode this collection as canonical JSON (older SDKs can fall back for nested Date/Data; unsafe integers are also non-canonical). The raw SDK description may be lossy; the container-plist route, used when the SDK is not connected, returns recursive JSON with ISO/base64 leaves and exact integer strings."}}return{type:a,value:n===null?null:a==="int"?ht(n):a==="bool"?gt(n):a==="float"?Ie(n):n}}function Wr(s,n){try{let a=!1,c=JSON.parse(s,(d,p)=>{if(typeof p==="number"&&Number.isInteger(p)&&!Number.isSafeInteger(p))a=!0;return p});return!a&&(n==="array"?Array.isArray(c):c!==null&&typeof c==="object"&&!Array.isArray(c))}catch(a){return e.debug("iOS SDK collection is not canonical JSON",a),!1}}function Fb(s){let n=s.suite?.trim().toLowerCase();return!n||n==="standard"||!!s.appId&&n===s.appId.toLowerCase()}function _M(s){return Fb(s)?s.appId:GE(s.suite)}function GE(s){if(!/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/.test(s))throw new t("iOS UserDefaults suite must be an identifier using letters, numbers, underscore, dash, or dot, without path separators or empty path segments.");return s}function J8(s){switch(s){case"bool":return"-bool";case"int":return"-int";case"float":return"-float";case"string":return"-string"}}function X8(s,n){return sy(ay(s),n)}function sy(s,n){switch(n){case"bool":return gt(s);case"int":return Yr(s);case"float":return Hr(s);case"string":return s}}function Z8(s,n){try{return sy(s,n),!0}catch(a){return e.debug("Preference read-back cannot be parsed as the requested type",a),!1}}function Q8(s,n){if(n===void 0||n==="string")return F1(s);if(n==="int")return ht(s);if(n==="bool"||n==="float")return sy(s,n);return F1(s)}function F1(s){if(s.endsWith(`\r
|
|
7
|
-
`))return s.slice(0,-2);if(s.endsWith(`
|
|
8
|
-
`)||s.endsWith("\r"))return s.slice(0,-1);return s}function eX(s){let n=E(s);return n==="unknown"?void 0:n}function gt(s){let n=s.trim().toLowerCase();if(["1","true","yes"].includes(n))return!0;if(["0","false","no"].includes(n))return!1;throw new t(`Expected bool preference value, got '${s}'.`)}function Yr(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected int preference value, got '${s}'.`);let a=Number.parseInt(n,10);if(!Number.isSafeInteger(a))throw new t(`Expected int preference value within JavaScript's safe integer range, got '${s}'.`);return a}function ht(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected int preference value, got '${s}'.`);let a=BigInt(n);if(a<BigInt(Number.MIN_SAFE_INTEGER)||a>BigInt(Number.MAX_SAFE_INTEGER))return n;return Number(a)}function Xr(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected long preference value, got '${s}'.`);let a=BigInt(n),c=-9223372036854775808n,d=9223372036854775807n;if(a<c||a>d)throw new t(`Expected signed 64-bit long preference value, got '${s}'.`);if(a<BigInt(Number.MIN_SAFE_INTEGER)||a>BigInt(Number.MAX_SAFE_INTEGER))return n;return Number(a)}function Hr(s){let n=s.trim();if(!/^-?(?:\d+|\d*\.\d+)(?:[eE][+-]?\d+)?$/.test(n))throw new t(`Expected float preference value, got '${s}'.`);let a=Number.parseFloat(n);if(!Number.isFinite(a))throw new t(`Expected float preference value, got '${s}'.`);return a}function ay(s){if(s===null)return"";return String(s)}function tX(s,n,a){if(s===null)return!1;return sy(ay(s),a)===n}function Lb(s){let n=r(s).trim(),a=typeof s==="object"&&s!==null&&"stderr"in s&&typeof s.stderr==="string"?s.stderr.trim():"";return[/The domain\/default pair of \([^)]+\) does not exist\.?$/i,/Domain [^\n]+ does not exist\.?$/i,/Domain [^\n]+ not found\.?$/i,/Domain [^\n]+ does not contain (?:a value for )?[^\n]+\.?$/i,/Could not find key '[^'\n]+' in domain '[^'\n]+'\.?(?:\s+Defaults have not been changed\.?)?$/i].some((c)=>c.test(n)||c.test(a))}function bG(s){return/Application not found|No such file or directory|NSPOSIXErrorDomain, code=2/i.test(s)}function L1(s){let n=r(s);return/timed out/i.test(n)||/Failed to connect to (?:the )?CoreSimulator service/i.test(n)||/CoreSimulatorService connection (?:refused|reset|interrupted|invalidated)/i.test(n)||/connection (?:refused|reset|interrupted|invalidated)/i.test(n)||/Unable to lookup in current state: Booting/i.test(n)}function B1(){return new t(`iOS UserDefaults preference operation timed out after ${N1}ms.`)}function rX(s,n,a){if(a===void 0||n===M1)return()=>new t(`iOS ${s} timed out after ${n}ms.`);if(a<=n)return B1;return()=>new t(`iOS ${s} timed out after ${n}ms (operation budget ${N1}ms).`)}function SG(s,n,a){if(s==="ios"&&n==="userDefaults"){if(a==="sdk")return;if(a==="container-plist")return Br;return"UserDefaults writes go through the preferences daemon; a running app that cached the value may need a cold relaunch to observe the change."}if(s==="android"&&n==="systemProperty")return"Android system properties are global and generally reset on reboot.";if(s==="android"&&n==="sharedPreferences")return"SharedPreferences writes edit the XML file on disk; a running app that cached the value may need a cold relaunch to observe the change.";return}function wG(s){return new t(`${s} On physical iOS devices, getPreference and setPreference require the app to embed the AutoMobile SDK with storage inspection enabled and to be connected. Launch the app's DEBUG build with the SDK, or use an iOS Simulator.`)}var Do=["increaseContrast","reduceMotion","boldText","colorInversion","colorCorrection","magnification","magnificationScale","extraDim"],nX=["off","deuteranomaly","protanomaly","tritanomaly","grayscale"],wt=new Map;Xt({name:"display-config-accessibility-baselines",onDeviceIdentityReplaced:(s)=>wt.delete(s),onDeviceIncarnationChanged:()=>{}});function re(s,n,a){return{decode:a,encode:(c,d)=>c===!0?s:d!==void 0&&!a(d)?d:n}}var Jr=31,Qr="300",xM=["window_animation_scale","transition_animation_scale","animator_duration_scale"],xe="com.apple.Accessibility",ei="ReduceMotionEnabled",ti="EnhancedTextLegibilityEnabled",ri="Written to the Simulator's com.apple.Accessibility defaults and read back from there; UIKit reads it at launch, so relaunch the app under test before observing.",ii="No automatable per-device control on physical iOS; set it in the Settings app.",si=/^[+]?(?:\d+(?:\.\d*)?|\.\d+)$/;function ie(s){let n=s.trim();if(n==="null")return null;if(!si.test(n))throw Error(`unexpected setting value '${n}'`);return n}function ni(s){return s!==null&&Number(s)!==0}function oi(s){return s!==null&&s.split(",").every((n)=>n!=="null"&&Number(n)===0)}async function B(s,n){let a=await s.executeCommand(n,{noRetry:!0}),c=a.stderr??"";if(Ke(a.stdout,c))throw Error(`'${n}' reported: ${`${a.stdout} ${c}`.trim()}`);return a.stdout}async function se(s,n,a,c){await B(s,c===null?`shell settings delete ${n} ${a}`:`shell settings put ${n} ${a} ${c}`)}function M(s,n,a){return{support:!0,...re(a,"0",ni),read:async()=>ie(await B(s,`shell settings get secure ${n}`)),write:(c)=>se(s,"secure",n,c)}}function ai(s){return{support:!0,...re("0,0,0","1,1,1",oi),read:async()=>(await Promise.all(xM.map(async(a)=>ie(await B(s,`shell settings get global ${a}`))))).map((a)=>a??"null").join(","),write:async(n)=>{let a=(n??"null,null,null").split(",");if(a.length!==xM.length)throw Error(`malformed animation scale snapshot '${n}'`);await Promise.all(xM.map((c,d)=>se(s,"global",c,a[d]==="null"?null:a[d])))}}}var li=31,Ct={grayscale:"0",protanomaly:"11",deuteranomaly:"12",tritanomaly:"13"},ci=2;function St(s){let[n,a]=(s??"null,null").split(",");if(n!=="1")return"off";return Object.entries(Ct).find(([,d])=>d===a)?.[0]??"deuteranomaly"}var Ee=["accessibility_display_daltonizer_enabled","accessibility_display_daltonizer"];function ui(s){return{support:!0,decode:St,encode:(n,a)=>{if(n!=="off")return`1,${Ct[n]}`;return a!==void 0&&St(a)==="off"?a:`0,${a?.split(",")[1]??"null"}`},read:async()=>(await Promise.all(Ee.map(async(a)=>ie(await B(s,`shell settings get secure ${a}`))))).map((a)=>a??"null").join(","),write:async(n)=>{let a=(n??"null,null").split(",");if(a.length!==Ee.length)throw Error(`malformed color correction snapshot '${n}'`);for(let c of[1,0]){let d=a[c];await se(s,"secure",Ee[c],d==="null"?null:d)}}}}function di(s){return{support:!0,decode:(a)=>a===null?ci:Number(a),encode:(a)=>String(a),read:async()=>ie(await B(s,"shell settings get secure accessibility_display_magnification_scale")),write:(a)=>se(s,"secure","accessibility_display_magnification_scale",a)}}function vt(s,n,a,c){if(a===null)return{unsupported:`Could not read the Android API level to gate ${s} (API ${n}+).`};return a<n?{unsupported:`${s} needs Android API ${n}+ (device is API ${a}).`}:c()}function pi(s,n){return{increaseContrast:M(s,"high_text_contrast_enabled","1"),reduceMotion:ai(s),boldText:vt("Bold text",Jr,n,()=>M(s,"font_weight_adjustment",Qr)),colorInversion:M(s,"accessibility_display_inversion_enabled","1"),colorCorrection:ui(s),magnification:M(s,"accessibility_display_magnification_enabled","1"),magnificationScale:di(s),extraDim:vt("Extra dim",li,n,()=>M(s,"reduce_bright_colors_activated","1"))}}function fi(s,n){return{support:!0,...re("enabled","disabled",(a)=>a==="enabled"),read:async()=>{let a=(await s.executeCommandArgs(["ui",n,"increase_contrast"])).stdout.trim();if(a!=="enabled"&&a!=="disabled")throw Error(`'simctl ui increase_contrast' reported '${a}'`);return a},write:async(a)=>{await s.executeCommandArgs(["ui",n,"increase_contrast",a??"disabled"])}}}function Dt(s,n,a){let c=(...d)=>s.executeCommandArgs(["spawn",n,"defaults",...d]);return{support:"partial",note:ri,...re("1","0",(d)=>d==="1"),read:async()=>{try{let d=(await c("read",xe,a)).stdout.trim();if(d!=="0"&&d!=="1")throw Error(`'defaults read ${a}' reported '${d}'`);return d}catch(d){if(Lb(d))return e.debug(`[DisplayConfig] Simulator default ${a} is unset`,d),null;throw d}},write:async(d)=>{await(d===null?c("delete",xe,a):c("write",xe,a,"-bool",d==="1"?"YES":"NO"))}}}var V={unsupported:"Android only: the iOS Simulator has no control for it."};function mi(s,n){return{increaseContrast:fi(s,n),reduceMotion:Dt(s,n,ei),boldText:Dt(s,n,ti),colorInversion:V,colorCorrection:V,magnification:V,magnificationScale:V,extraDim:V}}function te(s=ii){return{supported:Object.fromEntries(Do.map((n)=>[n,!1])),notes:Object.fromEntries(Do.map((n)=>[n,s]))}}function P(s){return Do.filter((n)=>s[n]!==void 0)}function Te(s){return!("unsupported"in s)}class _e{device;dependencies;baselines;settingsPromise;constructor(s,n={}){this.device=s;this.dependencies=n;this.baselines=n.baselines??wt}hasBaseline(){return Object.keys(this.baselines.get(this.device.deviceId)??{}).length>0}clearBaseline(){this.baselines.delete(this.device.deviceId)}async read(){let s=await this.settings();if(!s)return{values:{},...te()};return Pt(await this.readAll(s))}async set(s){let n=await this.settings();if(!n)return this.unsupportedChange(P(s));let a=await this.readAll(n),c=[],d=[];for(let f of P(s)){let m=await this.applyField(f,s[f],n[f],a[f]);if(c.push(...m),m.length===0)d.push(f)}let p=await this.readAll(n);return c.push(...hi(s,d,p)),bt(a,p,c,[])}async reset(){let s=this.baselines.get(this.device.deviceId)??{},n=Do.filter((y)=>(y in s)),a=await this.settings();if(!a)return this.unsupportedChange(n);let c=await this.readAll(a),d=await this.writeSnapshot(a,yi(s,n)),p=await this.readAll(a),f=n.filter((y)=>("raw"in p[y])&&p[y].raw===s[y]),m={...s};for(let y of f)delete m[y];this.storeBaseline(m);for(let y of n.filter((g)=>!f.includes(g)))if(!d.some((g)=>g.startsWith(`${y}:`)))d.push(`${y}: remained ${gi(p[y])} after restoring ${String(s[y])}`);return bt(c,p,d,f)}async readSnapshot(s){let n=await this.settings();if(!n||s.length===0)return{};let a=await this.readAll(n);return Object.fromEntries(s.filter((c)=>("raw"in a[c])).map((c)=>[c,a[c].raw]))}async restoreSnapshot(s){let n=await this.settings();if(!n)return[];let a=await this.writeSnapshot(n,s);for(let c of a)e.warn(`[DisplayConfig] Failed to restore ${c} on ${this.device.deviceId}`);return Do.filter((c)=>(c in s)&&!a.some((d)=>d.startsWith(`${c}:`)))}unsupportedChange(s){let n=te();return{values:{},...n,previous:{},applied:{},errors:s.map((a)=>`${a}: ${n.notes[a]}`),restored:[]}}settings(){return this.settingsPromise??=this.resolveSettings(),this.settingsPromise}async resolveSettings(){if(this.device.platform==="ios"){let n=this.dependencies.simctl;return this.dependencies.iosSimulator&&n?mi(n,this.device.deviceId):void 0}let s=this.dependencies.adb?.();if(!s)return;return pi(s,await Ot(s))}async readAll(s){let n=await Promise.all(Do.map(async(a)=>[a,await this.readField(a,s[a])]));return Object.fromEntries(n)}async readField(s,n){if(!Te(n))return{support:!1,note:n.unsupported};try{let a=await n.read();return{raw:a,value:n.decode(a),support:n.support,...n.note?{note:n.note}:{}}}catch(a){return e.warn(`[DisplayConfig] ${s} read failed on ${this.device.deviceId}: ${r(a)}`,a),{support:!1,note:`Could not read ${s}: ${r(a)}`}}}async applyField(s,n,a,c){if(!Te(a))return[`${s}: ${a.unsupported}`];if(!("raw"in c))return[`${s}: ${c.note??"current value is unreadable"}; left unchanged`];let d=c.raw??null;this.recordBaseline(s,d);let p=this.baselines.get(this.device.deviceId)?.[s];return this.writeField(s,a,a.encode(n,p))}async writeSnapshot(s,n){let a=[];for(let c of Do.filter((d)=>(d in n))){let d=s[c];a.push(...Te(d)?await this.writeField(c,d,n[c]??null):[`${c}: ${d.unsupported}`])}return a}async writeField(s,n,a){try{return await n.write(a),[]}catch(c){return e.warn(`[DisplayConfig] ${s} write failed on ${this.device.deviceId}: ${r(c)}`,c),[`${s}: write failed: ${r(c)}`]}}recordBaseline(s,n){let a=this.baselines.get(this.device.deviceId)??{};if(!(s in a))this.storeBaseline({...a,[s]:n})}storeBaseline(s){if(Object.keys(s).length===0)this.baselines.delete(this.device.deviceId);else this.baselines.set(this.device.deviceId,s)}}function yi(s,n){return Object.fromEntries(n.map((a)=>[a,s[a]??null]))}function gi(s){return"raw"in s?String(s.raw):"unreadable"}function It(s){return Object.fromEntries(Do.filter((n)=>("raw"in s[n])).map((n)=>[n,s[n].value]))}function Pt(s){return{values:It(s),supported:Object.fromEntries(Do.map((n)=>[n,s[n].support])),notes:Object.fromEntries(Do.filter((n)=>s[n].note!==void 0).map((n)=>[n,s[n].note]))}}function bt(s,n,a,c){let d=Pt(n);return{...d,previous:It(s),applied:d.values,errors:a,restored:c}}function hi(s,n,a){return n.flatMap((c)=>{let d=a[c];if(d.value===void 0)return[`${c}: could not read back the applied value`];let p=d.value;return p===s[c]?[]:[`${c} remained ${String(p)} after requesting ${String(s[c])}`]})}function Rt(s){let n=Oe(s)||O(s)||P(s).length>0;if(s.reset===!0&&n)return"reset cannot be combined with an explicit fontScale, contentSize, density, theme, size, navigationMode, displayCutout, or accessibility display preference: reset restores the platform defaults and recorded baselines. Send reset on its own, or send only the explicit fields you want to change.";if(s.reset!==!0&&!n)return"At least one of fontScale, contentSize, density, theme, size, navigationMode, displayCutout, an accessibility display preference, or reset must be provided to set display config.";if(s.fontScale!==void 0&&s.contentSize!==void 0)return"fontScale and contentSize both select the text size: send one of them.";return}function Oe(s){return s.fontScale!==void 0||s.density!==void 0||s.theme!==void 0||s.contentSize!==void 0}function $t(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.theme!==void 0?{theme:s.theme}:{},...s.contentSize!==void 0?{contentSize:s.contentSize}:{},...s.reset!==void 0?{reset:s.reset}:{}}}function xt(s){return Object.fromEntries(P(s).map((n)=>[n,s[n]]))}function Et(s,n,a,c){if(s!==void 0)return s;let d=a?Si(c):void 0;return[n,d].filter(Boolean).join(" ")||void 0}function Si(s){return s.length>0?`Restored ${s.join(", ")} to the value displayConfig replaced.`:"No accessibility display preference changed by displayConfig needed restoring."}function Tt(s,n,a){let c=[...s?.error?[s.error]:[],...n.errors],d=c.length>0?c.join("; "):void 0,p=d??s?.message;return{...s,...a,...s?{supported:s.supported}:{},success:d===void 0,applied:{...s?.applied,...n.applied},previous:{...s?.previous,...n.previous},...n.available?{available:n.available}:{},...d?{error:d}:{},...p===void 0?{}:{message:p}}}function vi(s,n){let a=(d)=>d===!0||d==="partial",c={};if(n.theme)c.theme="light";if(s==="ios"&&n.fontScale)c.contentSize=be;for(let d of["increaseContrast","reduceMotion","boldText","colorInversion","magnification","extraDim"])if(a(n[d]))c[d]=!1;if(a(n.colorCorrection))c.colorCorrection="off";return c}async function _t(s,n){let a=await s.setConfig({reset:!0});if(!a.success&&a.previous===void 0)return a;let c=(await s.accessibility().read()).supported,d=vi(n,{...a.supported,...c}),p=Object.keys(d).length>0?await s.setConfig(d):void 0;s.clearBaselines();let f=[a.error,p?.error].filter((g)=>g!==void 0),m=f.length>0?f.join("; "):void 0,y=Object.keys(d).join(", ")||"none needed";return{...a,success:m===void 0,applied:{...a.applied,...p?.applied},...m?{error:m}:{},message:m??`Factory reset: restored platform defaults (${y}).`}}function Ft(s,n,a){if(a!==void 0)return a;if(!s)return;return`Reset font scale and density to device defaults; ${n===void 0?"night mode left unchanged (no night-mode baseline was recorded by displayConfig)":`night mode restored to ${n} (changed earlier by displayConfig)`}.`}var kt=new Map;Xt({name:"android-display-config-theme-baselines",onDeviceIdentityReplaced:(s)=>kt.delete(s),onDeviceIncarnationChanged:()=>{}});var Nt="fontScale is not supported on iOS devices: there is no simctl, defaults or XCUITest control for the system text scale. The iOS Simulator supports it as a Dynamic Type category.",Di="contentSize is an iOS Dynamic Type category and is only supported on the iOS Simulator; use fontScale on Android.";class cy{device;get platform(){return Q(this.device.platform,"Display configuration")}adbFactory;simctl;iosRunnerAppearance;themeBaselines;accessibilityBaselines;contentSizeBaselines;geometryOptions;constructor(s,n={}){this.device=s,this.themeBaselines=n.themeBaselines??kt,this.adbFactory=n.adbFactory??v,this.simctl=n.simctl??new F(s),this.accessibilityBaselines=n.accessibilityBaselines,this.iosRunnerAppearance=n.iosRunnerAppearance,this.contentSizeBaselines=n.contentSizeBaselines,this.geometryOptions=n.geometry??{}}accessibility(){return new _e(this.device,{adb:()=>this.adbFactory.create(this.device),simctl:this.simctl,iosSimulator:this.platform==="ios"&&this.isIosSimulator(),...this.accessibilityBaselines?{baselines:this.accessibilityBaselines}:{}})}iosAppearance(){let s=this.iosRunnerAppearance??Zl(this.device),n=async(a)=>{let c=await s.requestAppearance(a);if(!c.success)throw Error(`CtrlProxy runner appearance request failed: ${c.error??"unknown error"}. Physical-device theme control needs a runner that supports request_appearance.`);return c.appearance==="light"||c.appearance==="dark"?c.appearance:void 0};return{target:"device",read:()=>n(),write:async(a)=>{await n(a)}}}isIosSimulator(){return W({deviceId:this.device.deviceId})==="simulator"}support(){if(this.platform==="ios"){let s=this.isIosSimulator();return{fontScale:s,density:!1,theme:!0,...s?{}:te().supported}}return{fontScale:!0,theme:!0,density:le(this.device.deviceId)?!0:"partial",...tt(this.device)}}unsupported(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async readIosTheme(){return this.iosAppearance().read()}async setIosAppearance(s){let n=this.iosAppearance();if(s!=="light"&&s!=="dark")return[`Cannot set theme '${s}' on the iOS ${n.target}: only 'light' or 'dark' can be set.`];try{return await n.write(s),[]}catch(a){return[`Setting the iOS ${n.target} appearance to ${s} failed: ${r(a)}`]}}iosSimulator(){return new Ce(this.device,this.simctl,this.contentSizeBaselines)}async getIosConfig(){try{let s=this.isIosSimulator()?await this.iosSimulator().read():await this.readIosThemeSnapshot();return this.withAccessibilityRead(s,await this.accessibility().read())}catch(s){return e.warn(`[DisplayConfig] getConfig failed (iOS): ${r(s)}`,s),this.failure(r(s))}}failure(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async applyIosChanges(s){let n=[];if(s.fontScale!==void 0||s.contentSize!==void 0)n.push(Nt);if(s.density!==void 0)n.push(z);if(s.theme!==void 0)n.push(...await this.setIosAppearance(s.theme));return n}async readIosThemeSnapshot(){let s=await this.readIosTheme();if(s===void 0)throw Error(`iOS did not report a readable ${this.iosAppearance().target} appearance`);return{theme:s}}iosPreReadFailure(s){return e.warn(`[DisplayConfig] setConfig pre-read failed (iOS simulator): ${r(s)}`,s),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(s)}}async readIosAppliedSnapshot(){try{return{applied:await this.readIosThemeSnapshot()}}catch(s){return e.warn(`[DisplayConfig] setConfig post-read failed (iOS simulator): ${r(s)}`,s),{readError:`failed to read applied theme: ${r(s)}`}}}validateIosDeviceSetInput(s){if(!s.reset&&s.theme===void 0){if(s.fontScale!==void 0||s.contentSize!==void 0)return this.unsupported(Nt);if(s.density!==void 0)return this.unsupported(z)}return}async applyIosMutation(s,n){if(!s.reset){if(s.theme!==void 0)this.recordIosThemeBaseline(n);return{errors:await this.applyIosChanges(s),expectedTheme:s.theme}}let a=this.iosResetTheme(),c=await this.setIosAppearance(a);if(c.length===0)this.themeBaselines.delete(this.device.deviceId);return{errors:c,expectedTheme:a}}recordIosThemeBaseline(s){let n=this.device.deviceId;if(s.theme&&!this.themeBaselines.get(n))this.themeBaselines.set(n,s.theme)}iosResetTheme(){return this.themeBaselines.get(this.device.deviceId)??"light"}async setIosDeviceConfig(s){let n=this.validateIosDeviceSetInput(s);if(n)return n;let a;try{a=await this.readIosThemeSnapshot()}catch(g){return this.iosPreReadFailure(g)}let{errors:c,expectedTheme:d}=await this.applyIosMutation(s,a),{applied:p,readError:f}=await this.readIosAppliedSnapshot(),m=f?[...c,f]:[...c];if(p&&d&&p.theme!==d)m.push(`iOS ${this.iosAppearance().target} appearance remained ${p.theme} after requesting ${d}`);let y=m.length>0?m.join("; "):void 0;return{success:y===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...p?{applied:p}:{},previous:a,...y?{error:y}:{}}}async setIosSimulatorConfig(s){if(!s.reset&&s.theme===void 0&&s.fontScale===void 0&&s.contentSize===void 0&&s.density!==void 0)return this.unsupported(z);let n;try{n=await this.iosSimulator().set(s)}catch(d){return e.warn(`[DisplayConfig] setConfig pre-read failed (iOS simulator): ${r(d)}`,d),this.failure(r(d))}let a=n.errors.length>0?n.errors.join("; "):void 0,c=n.restoredContentSize;return{success:a===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...n.applied?{applied:n.applied}:{},previous:n.previous,...a?{error:a}:{},...c&&!a?{message:`Restored the Simulator content size to ${c} (changed earlier by displayConfig).`}:{}}}async getConfig(){if(this.platform==="ios")return this.getIosConfig();try{let s=this.adbFactory.create(this.device),n=await this.readValues(s),a=await this.geometry(s).read(),c=this.withAccessibilityRead({...n,...a.values},await this.accessibility().read());return a.available?{...c,available:a.available}:c}catch(s){return e.warn(`[DisplayConfig] getConfig failed: ${r(s)}`,s),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(s)}}}withAccessibilityRead(s,n){return{success:!0,deviceId:this.device.deviceId,platform:this.platform,supported:{...this.support(),...n.supported},...zt(n.notes),current:{...s,...n.values}}}async getRestorableConfig(){if(this.platform==="ios"){if(this.isIosSimulator())return this.iosSimulator().readRestorable();let s=await this.readIosTheme();return s===void 0?{}:{theme:s}}return(await this.readRawValues(this.adbFactory.create(this.device))).restorableValues}invalidRequest(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async setConfig(s){if(s.factory===!0&&s.reset===!0)return _t(this,this.platform);let n=this.refuseSetInput(s);if(n)return n;if(this.platform==="android"&&(s.reset===!0||O(s)))return this.setWithGeometry(s);return this.setNonGeometry(s)}clearBaselines(){if(this.themeBaselines.delete(this.device.deviceId),this.accessibility().clearBaseline(),this.platform==="ios")this.iosSimulator().clearBaseline()}geometry(s){return new ge(this.device,s,this.geometryOptions)}async setWithGeometry(s){let n=this.geometry(this.adbFactory.create(this.device)),c=s.reset===!0?void 0:await n.prepare(s);if(c&&"refusal"in c)return this.invalidRequest(c.refusal);let d=et(s),p=Object.keys(d).length>0?await this.setNonGeometry(d):void 0;if(p&&!p.success&&p.previous===void 0)return p;let f=c?await n.apply(c):await n.reset();return Tt(p,f,{deviceId:this.device.deviceId,platform:this.platform,supported:this.support()})}async setNonGeometry(s){let n=s.reset===!0,a=this.accessibility(),c=P(s).length>0||n&&a.hasBaseline(),d=n||Oe(s)?await this.setDisplayFields($t(s)):void 0;if(d&&(!c||!d.success&&d.previous===void 0))return d;let p=n?await a.reset():await a.set(xt(s));return this.mergeAccessibilityChange(d,p,n)}refuseSetInput(s){let n=Rt(s);if(n!==void 0)return this.invalidRequest(n);if(this.platform==="android"&&s.contentSize!==void 0)return this.unsupported(Di);if(this.platform!=="android"&&O(s))return this.unsupported(Qe);return}setDisplayFields(s){if(this.platform!=="ios")return this.setAndroidConfig(s);return this.isIosSimulator()?this.setIosSimulatorConfig(s):this.setIosDeviceConfig(s)}mergeAccessibilityChange(s,n,a){let c=[...s?.error?[s.error]:[],...n.errors],d=c.length>0?c.join("; "):void 0,p=Et(d,s?.message,a,n.restored);return{success:d===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:{...s?.supported??this.support(),...n.supported},...zt(n.notes),applied:{...s?.applied,...n.applied},previous:{...s?.previous,...n.previous},...d?{error:d}:{},...p?{message:p}:{}}}async setAndroidConfig(s){let n=this.adbFactory.create(this.device),a,c;try{let h=await this.readRawValues(n);a=h.restorableValues,c=h.physicalDensity}catch(h){return e.warn(`[DisplayConfig] setConfig pre-read failed: ${r(h)}`,h),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(h),message:r(h)}}let d=this.prepareAndroidTheme(s,a),p=s.reset?await this.applyReset(n,d):await this.applyChanges(n,s,c),{errors:f,issuedDensity:m}=p;je(this.device,m,this.geometryOptions);let y;try{let h=await this.readRawValues(n);y=h.values;let b=this.verifyAndroidAppliedConfig(s,h,m,d);this.confirmAndroidThemeRestore(p.restoredTheme,h.values.theme),f.push(...b)}catch(h){e.warn(`[DisplayConfig] setConfig post-read failed: ${r(h)}`,h),f.push(`failed to read applied values: ${r(h)}`)}let g=f.length>0?f.join("; "):void 0,D=Ft(s.reset,d,g);return{success:g===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...y?{applied:y}:{},previous:a,...g?{error:g}:{},...D!==void 0?{message:D}:{}}}prepareAndroidTheme(s,n){if(s.reset)return this.themeBaselines.get(this.device.deviceId);if(s.theme!==void 0&&n.theme!==void 0&&this.themeBaselines.get(this.device.deviceId)===void 0)this.themeBaselines.set(this.device.deviceId,n.theme);return s.theme}confirmAndroidThemeRestore(s,n){if(s!==void 0&&n===s)this.themeBaselines.delete(this.device.deviceId)}async readValues(s){return(await this.readRawValues(s)).values}async readRawValues(s){let[n,a,c]=await Promise.all([this.run(s,"shell settings get system font_scale","font scale"),this.run(s,"shell wm density","density"),this.run(s,"shell cmd uimode night","night mode")]),d=Se(a),p=he(n),f=ve(c),m=[];if(p===void 0)m.push("font scale");if(d.effective===void 0)m.push("display density");if(f===void 0)m.push("night mode");if(m.length>0)throw Error(`Could not parse Android display baseline: ${m.join(", ")}.`);let g={fontScale:p==="default"?L:p,density:d.effective,theme:f},D={...g,fontScale:p,density:d.overridden?d.effective:"default"};return{values:g,restorableValues:D,physicalDensity:d.physical}}async applyChanges(s,n,a){let c=[];if(n.fontScale!==void 0){let p=n.fontScale==="default"?"shell settings delete system font_scale":`shell settings put system font_scale ${n.fontScale}`;c.push(...await this.runChecked(s,p,"font scale"))}let d;if(n.density!==void 0){let p=Ze(n.density,a);if("error"in p)c.push(p.error);else c.push(...await this.runChecked(s,p.command,"density")),d=p.target}if(n.theme!==void 0)c.push(...await this.runChecked(s,`shell cmd uimode night ${De(n.theme)}`,"night mode"));return{errors:c,issuedDensity:d}}async applyReset(s,n){let a=[];a.push(...await this.runChecked(s,"shell settings delete system font_scale","font scale")),a.push(...await this.runChecked(s,"shell wm density reset","density"));let c;if(n!==void 0){let d=await this.runChecked(s,`shell cmd uimode night ${De(n)}`,"night mode");if(a.push(...d),d.length===0)c=n}return{errors:a,issuedDensity:"default",restoredTheme:c}}verifyAndroidAppliedConfig(s,n,a,c){let d=[],p=s.reset?"default":s.fontScale,f=n.restorableValues.fontScale;if(p!==void 0&&!(p==="default"?f==="default"||f===L:f===p))d.push(`Font scale remained ${String(f)} after requesting ${String(p)}.`);let y=a;if(y!==void 0){let g=y==="default"?n.restorableValues.density:n.values.density;if(g!==y)d.push(`Display density remained ${String(g)} after requesting ${String(y)}.`)}if(c!==void 0&&n.values.theme!==c)d.push(`Night mode remained ${String(n.values.theme)} after requesting ${c}.`);return d}async run(s,n,a){try{let c=await s.executeCommand(n,{noRetry:!0}),d=c.stdout,p=c.stderr??"";if(Ke(d,p))throw Error(`'${n}' reported: ${`${d} ${p}`.trim()}`);return d}catch(c){throw new t(`${a}: failed to read '${n}': ${r(c)}`,{cause:c})}}async runChecked(s,n,a){try{let c=await s.executeCommand(n,{noRetry:!0}),d=c.stdout,p=c.stderr??"";if(Ke(d,p))return[`${a}: '${n}' reported: ${`${d} ${p}`.trim()}`];return[]}catch(c){return e.warn(`[DisplayConfig] ${a} command failed: ${r(c)}`,c),[`${a}: '${n}' failed: ${r(c)}`]}}}function zt(s){return Object.keys(s).length>0?{supportNotes:s}:{}}function w(s){if(s===null||s===void 0)return null;let n=s.trim();if(!n||n==="null"||n==="undefined")return null;return n}function x(s){let n=w(s);if(n==="12"||n==="24")return n;return null}function C(s){let n=w(s);if(n===null)return null;let a=n.toLowerCase();if(a==="1"||a==="true")return!0;if(a==="0"||a==="false")return!1;return null}function Le(s){let n=w(s);if(!n)return null;return n.split(",")[0]?.trim()||null}var bi=/\bare\s+\[([^\]]*)\]\s*$/,Mt=/\bUnknown package\s+\S+\s+for userId\s+\d+/;function G(s,n=""){let c=w(s)?.match(bi)?.[1];if(c!==void 0)return{kind:"list",list:c.trim()};if(Mt.test(s)||Mt.test(n))return{kind:"notInstalled"};return{kind:"unreadable"}}function oe(s){let n=s.trim();if(!n)return null;let a=n.match(/@calendar=([a-z0-9-]+)/i);if(a&&a[1])return a[1];let c=n.replace(/_/g,"-"),d=c.toLowerCase().indexOf("-u-");if(d===-1)return null;let f=c.slice(d+3).split("-").filter(Boolean),m=0;while(m<f.length){let y=f[m];if(y.length===2){m+=1;let g=[];while(m<f.length&&f[m].length>2)g.push(f[m]),m+=1;if(y.toLowerCase()==="ca"&&g.length>0)return g.join("-")}else m+=1}return null}var wi=/^q[a-t][a-z]$/;function Gt(s){let a;try{a=new Intl.Locale(s.replace(/_/g,"-")).language.toLowerCase()}catch(c){return e.debug(`locale tag "${s}" is not a well-formed BCP 47 tag: ${c}`),`Invalid locale "${s}": not a well-formed BCP 47 language tag (e.g. "fr-FR", "sr-Latn-RS" or "zh-Hant-TW").`}if(a==="und")return`Invalid locale "${s}": "und" (undetermined) is not a real locale; use a language such as "fr-FR".`;if(wi.test(a))return`Invalid locale "${s}": "${a}" is in the private-use language range (qaa-qtz), which is not a real locale (e.g. "fr-FR", "sr-Latn-RS" or "zh-Hant-TW").`;return null}function Fe(s){try{return new Intl.DateTimeFormat("en-US",{timeZone:s}).resolvedOptions().timeZone}catch(n){return e.debug(`time zone "${s}" is not known to the runtime: ${n}`),null}}function Ci(s,n){let a=s.toLowerCase(),c=[n,...Intl.supportedValuesOf("timeZone")].find((d)=>d.toLowerCase()===a);return c===void 0||c===s?null:c}var Ai=/^GMT([+-])(\d{1,2})(?::(\d{2})|(\d{2}))?$/;function Ii(s){let n=Ai.exec(s);if(!n)return!1;let a=Number(n[2]),c=Number(n[3]??n[4]??"0");return a<=23&&c<=59}var Pi=/^[A-Z][A-Za-z0-9._+-]*(?:\/[A-Z][A-Za-z0-9._+-]*){1,2}$/,Ri=new Set(["EST5EDT","CST6CDT","MST7MDT","PST8PDT"]);function Ne(s,n){if(n==="android"&&Ii(s))return{error:null};let a='e.g. "America/Los_Angeles", "Asia/Kolkata" or "UTC"';if(/^[+-]/.test(s))return{error:`Invalid time zone "${s}": a bare UTC offset is not a zone id and the device has no entry for it. Use an IANA id (${a}) or a fixed-offset zone such as "Etc/GMT-5" (the sign is inverted: Etc/GMT-5 is UTC+5).`};if(Ri.has(s))return{error:null};let c=Fe(s);if(c===null)return Pi.test(s)?{error:null,note:`Time zone "${s}" could not be validated: it is not in the host's time zone database, which may be older than the device's. It was sent as given and the device stores any string, so only its read-back vouches for it; check the spelling if the zone is not in effect.`}:{error:`Invalid time zone "${s}": not an IANA time zone id (${a}).`};let d=Ci(s,c);if(d!==null)return{error:`Invalid time zone "${s}": zone ids are case-sensitive on the device; did you mean "${d}"?`};return{error:null}}function $i(s,n){return Ne(s,n).error}function A(s,n){if(!s)return!1;if(s===n)return!0;let a=Fe(s),c=Fe(n);return a!==null&&a===c&&$i(s)===null}function Vt(s){let n;try{let p=new Intl.Locale(s.replace(/_/g,"-"));n=(p.language==="und"?p:p.maximize()).toString().split("-")}catch(p){return e.debug(`locale tag "${s}" is not comparable: ${p}`),null}let a=(n.shift()??"").toLowerCase(),c=n[0]!==void 0&&/^[A-Za-z]{4}$/.test(n[0])?n.shift():"",d=n[0]!==void 0&&/^([A-Za-z]{2}|\d{3})$/.test(n[0])?n.shift():"";return{language:a,script:(c??"").toLowerCase(),region:(d??"").toUpperCase(),rest:n.join("-").toLowerCase()}}function Bt(s){try{return new Intl.Locale(s.replace(/_/g,"-")).region?.toUpperCase()??null}catch(n){return e.debug(`locale tag "${s}" has no readable region: ${n}`),null}}function ae(s,n){if(!s)return!1;let a=Vt(s),c=Vt(n);if(!a||!c)return!1;if(a.language!==c.language||a.script!==c.script||a.rest!==c.rest)return!1;let d=Bt(n);return d===null||Bt(s)===d}var ze=33;class RG{adb;constructor(s){this.adb=s}async readAppLocales(s,n){let a=await Ot(this.adb,void 0,i,n);if(a===null||a<ze)return null;if((await this.adb.listUsers(n)).filter((m)=>m.running).length>1)return null;let d=await new At(this.adb).resolve({packageName:s,installedOnly:!0,signal:n}),p=await this.adb.executeCommand(`shell cmd locale get-app-locales ${S(s)} --user ${d.userId}`,{noRetry:!0,signal:n}),f=G(p.stdout,p.stderr);return f.kind==="list"?{userId:d.userId,locales:f.list}:null}async readSettingRow(s,n,a){let c=await this.adb.executeCommand(`shell settings get ${s} ${n}`,{noRetry:!0,signal:a});return c.error||c.stderr.trim()?{readable:!1}:{readable:!0,value:w(c.stdout)}}}function Ut(s){return s.readable?Le(s.list):null}function Zt(s){return s.split(",").map((n)=>n.trim().replace(/_/g,"-").toLowerCase()).filter(Boolean)}function Kt(s,n){return Zt(s).join(",")===Zt(n).join(",")}function jt(s){return!s.readable&&s.notInstalled}function xi(s,n){return`Cannot change the locale: app ${s} is not installed for user ${n}; nothing was changed. Check the appId, or install the app first.`}function Z(s){if(!s.readable)return"unknown (it could not be read)";return s.list?`"${s.list}"`:"unset"}function qt(s,n,a){return`Locale change outcome is indeterminate: "${s}" was sent but no result was confirmed (${n}). ${a} was not restored and may have changed. Do not retry automatically. Check the current locale before retrying.`}var K="shell getprop persist.sys.timezone",Ei="persist.sys.timezone was stored and read back, which does not confirm the zone is in effect: a raw setprop bypasses the system time-zone setter, so already-running apps may keep the previous zone until restarted.";function Ti(s,n){if(s.length===0)return"";if(s.length===1&&!n)return` (${s[0]?.message})`;return` (${s.map(({label:a,message:c})=>`${a}: ${c}`).join("; ")})`}var ke=60000,_i=2000;class Me{device;adb;timer;defaultCalendarSystem="gregory";constructor(s,n,a=i){this.device=s;this.adb=n;this.timer=a}async setLocale(s,n){if(!n.appId)return{success:!1,languageTag:s,error:"appId is required for Android locale changes. Provide the target app package so AutoMobile can choose the supported Android locale path."};let a=Gt(s);if(a)return{success:!1,languageTag:s,error:a};return this.setTargetAppLocale(s,n.appId,n)}async setSystemLocale(s,n,a){let c=await this.readSetting("shell getprop persist.sys.locale");try{await this.runShellCommand(`shell setprop persist.sys.locale ${S(s)}`),await this.runShellCommand("shell stop; start")}catch(m){e.warn(`[SystemConfigurationManager] Failed to set device-wide locale: ${r(m)}`,m);let y=r(m);return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:`Failed to set device-wide locale: ${y}`}}let d=await this.waitForFrameworkReady(),p=await this.readSetting("shell getprop persist.sys.locale");if(p===null)return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:qt(s,`persist.sys.locale could not be read back${d?"":` and the framework did not report boot_completed within ${ke}ms after stop; start`}`,"the device-wide locale")};if(!ae(p,s)){let m=await this.restoreSystemLocale(c,p);return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:`Read-back verification failed: expected persist.sys.locale "${s}" but got "${p??"null"}"${m}`}}if(!d)e.warn(`[SystemConfigurationManager] Device-wide locale ${s} was applied and persisted, but the framework did not report boot_completed within ${ke}ms after stop; start. Subsequent tools may briefly see the device as not fully booted.`);let f=n.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,languageTag:s,previousLanguageTag:c,method:a,localeScope:"system",broadcasted:f}}async restoreSystemLocale(s,n){let a=(f)=>s===null?f===null:ae(f,s);if(a(n))return"";let c=s===null?"unset":`"${s}"`,d="";try{await this.runShellCommand(`shell setprop persist.sys.locale ${S(s??"")}`),await this.runShellCommand("shell stop; start")}catch(f){e.warn(`[SystemConfigurationManager] Failed to restore device-wide locale: ${r(f)}`,f),d=` (${r(f)})`}await this.waitForFrameworkReady();let p=await this.readSetting("shell getprop persist.sys.locale");if(a(p))return`. Restored the previous device-wide locale (${c}).`;return`. Restoring the previous device-wide locale (${c}) failed${d}; persist.sys.locale is left as "${p??"null"}".`}async waitForFrameworkReady(){let s=this.timer.now()+ke;for(;;){let n=null;try{let a=await this.adb.executeCommand("shell getprop sys.boot_completed",{noRetry:!0});n=w(a.stdout)}catch(a){e.debug(`[SystemConfigurationManager] boot_completed probe failed: ${a}`)}if(n==="1")return!0;if(this.timer.now()>=s)return!1;await this.timer.sleep(_i)}}async setLegacyAppLocale(s,n,a){let c=await this.ensureRootForLegacyLocale(a);if(!c.success)return{success:!1,languageTag:s,error:c.error};return this.setSystemLocale(s,n,"setprop persist.sys.locale + stop/start after adb root")}async setTargetAppLocale(s,n,a){let c=await Ot(this.adb);if(c!==null&&c<ze)return this.setLegacyAppLocale(s,a,c);let d=await this.resolveTargetUserId(n);if("error"in d)return{success:!1,languageTag:s,error:d.error};let p=d.userId,f=await this.readAppLocales(n,p),m=Ut(f),y={success:!1,languageTag:s,previousLanguageTag:m,error:xi(n,p)},g=await this.sendAppLocale(n,p,s,f);if(g==="notInstalled")return y;if(g!=="sent")return{success:!1,languageTag:s,previousLanguageTag:m,error:g.error};let D=await this.readAppLocales(n,p);if(jt(D))return y;if(!D.readable)return{success:!1,languageTag:s,previousLanguageTag:m,error:qt(s,`the app's locale could not be read back for ${n}`,`the app's locale (previously ${Z(f)})`)};let h=Ut(D);if(!ae(h,s)){let er=await this.restoreAppLocales(n,p,f,D);return{success:!1,languageTag:s,previousLanguageTag:m,error:`Read-back verification failed for ${n}: expected "${s}" but got "${h??"null"}"${er}`}}let b=a.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,languageTag:s,previousLanguageTag:m,method:`cmd locale set-app-locales ${n} --user ${p}`,localeScope:"app",broadcasted:b,...d.warning?{warning:d.warning}:{}}}async sendAppLocale(s,n,a,c){if(jt(c))return"notInstalled";try{let d=await this.adb.executeCommand(`shell cmd locale set-app-locales ${S(s)} --user ${n} --locales ${S(a)}`);return G(d.stdout,d.stderr).kind==="notInstalled"?"notInstalled":"sent"}catch(d){return e.warn(`[SystemConfigurationManager] Failed to set app locale: ${r(d)}`,d),{error:`Failed to set app locale for ${s}: ${r(d)}`}}}async resolveTargetUserId(s){try{return{userId:(await new At(this.adb).resolve({packageName:s,installedOnly:!0})).userId}}catch(n){e.warn(`[SystemConfigurationManager] Failed to resolve Android user for ${s}: ${r(n)}`,n);let a=await this.singleUserFallback(s,n);if(a)return a;return{error:n instanceof dm?n.message:`Failed to resolve Android user for ${s}: ${r(n)}`}}}async singleUserFallback(s,n){if(!(n instanceof dm)||n.details.kind!=="unavailable"||n.details.users.some((a)=>a.userId!==0)||!await this.currentUserIsPrimary())return null;return{userId:0,warning:`Could not read the device's Android user list and found no sign of a second user, so ${s}'s locale was set for user 0. If the device has a work profile or secondary user, verify the locale on the intended one.`}}async currentUserIsPrimary(){try{let s=await this.adb.executeCommand("shell am get-current-user",{noRetry:!0});return Number.parseInt(s.stdout.trim(),10)===0}catch(s){return e.warn(`[SystemConfigurationManager] Could not read the current Android user: ${r(s)}`,s),!1}}async ensureRootForLegacyLocale(s){let n=await cz(this.adb);return n.success?n:{success:!1,error:`Android API ${s} does not support app-scoped locale changes, so AutoMobile must use the root-backed system locale path. ${n.error}`}}async setTimeZone(s){let n=await this.readSetting(K),a=await this.attemptTimeZoneWrite(`shell setprop persist.sys.timezone ${S(s)}`,"Failed to set time zone"),c=await this.readSetting(K);if(c===null)return{success:!1,zoneId:s,previousZoneId:n,error:`${this.indeterminateTimeZoneError(s,n)}${this.timeZoneWriteFailure(a)}`};if(a.success&&A(c,s))return{success:!0,zoneId:s,previousZoneId:n,method:"setprop persist.sys.timezone",warning:Ei};let d=await this.attemptTimeZoneWrite(`shell cmd alarm set-timezone ${S(s)}`,"cmd alarm set-timezone fallback failed");if(c=await this.readSetting(K),c===null)return{success:!1,zoneId:s,previousZoneId:n,error:`${this.indeterminateTimeZoneError(s,n)}${this.timeZoneWriteFailure(a,d)}`};if(!A(c,s)){let p=await this.restoreSystemTimeZone(n,c);return{success:!1,zoneId:s,previousZoneId:n,error:`Read-back verification failed: expected "${s}" but got "${c}"${p}${this.timeZoneWriteFailure(a,d)}`}}return{success:!0,zoneId:s,previousZoneId:n,method:"cmd alarm set-timezone"}}async attemptTimeZoneWrite(s,n){try{return await this.adb.executeCommand(s),{success:!0}}catch(a){return e.warn(`[SystemConfigurationManager] ${n}: ${r(a)}`,a),{success:!1,error:a}}}indeterminateTimeZoneError(s,n){return`Time zone change outcome is indeterminate: "${s}" was sent but no result was confirmed (persist.sys.timezone could not be read back). The device-wide time zone was not restored and may have changed${n===null?"":` (previously "${n}")`}. Do not retry automatically. Check the current time zone before retrying.`}timeZoneWriteFailure(s,n){let a=[];if(!s.success)a.push(r(s.error));if(n&&!n.success)a.push(`cmd alarm set-timezone: ${r(n.error)}`);return a.length===0?"":` Failed to set time zone: ${a.join("; ")}.`}async restoreSystemTimeZone(s,n){let a=(g)=>s===null?g===null:A(g,s);if(a(n))return"";let c=s===null?"unset":`"${s}"`,d=[],p=!1,f=n;try{await this.adb.executeCommand(`shell setprop persist.sys.timezone ${S(s??"")}`)}catch(g){e.warn(`[SystemConfigurationManager] Failed to restore time zone: ${r(g)}`,g),d.push({label:"setprop",message:r(g)})}let m=await this.readSetting(K);if(a(m))return`. Restored the previous time zone (${c}).`;if(s!==null){p=!0;let g=await this.restoreTimeZoneWithAlarm(s);if(f=g.value,g.error)d.push({label:"cmd alarm set-timezone",message:g.error});if(a(g.value))return`. Restored the previous time zone (${c}).`}let y=Ti(d,p);return`. Restoring the previous time zone (${c}) failed${y}; persist.sys.timezone is left as "${f??"null"}".`}async restoreTimeZoneWithAlarm(s){let n;try{await this.adb.executeCommand(`shell cmd alarm set-timezone ${S(s)}`)}catch(a){n=r(a),e.warn(`[SystemConfigurationManager] Failed to restore time zone with cmd alarm: ${n}`,a)}return{value:await this.readSetting(K),error:n}}async setTextDirection(s,n){let a=await this.readSetting("shell settings get global debug.force_rtl"),c=await this.readSetting("shell settings get global force_rtl"),d=C(a??c),p=[],f=a!==null||c===null,m=c!==null;if(f)p.push("debug.force_rtl");if(m)p.push("force_rtl");if(p.length===0)p.push("debug.force_rtl");let y=[],g=s?1:0;for(let h of p)try{await this.runShellCommand(`shell settings put global ${h} ${g}`),y.push(h)}catch(b){e.warn(`[SystemConfigurationManager] Failed to set ${h}: ${b}`)}if(y.length===0)return{success:!1,rtl:s,previousRtl:d,error:"Failed to update RTL settings"};let D=n.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,rtl:s,previousRtl:d,settings:y,broadcasted:D}}async set24HourFormat(s){let n=await this.readSetting("shell settings get system time_12_24"),a=s?"24":"12";try{return await this.runShellCommand(`shell settings put system time_12_24 ${a}`),{success:!0,enabled:s,previousFormat:x(n)}}catch(c){e.warn(`[SystemConfigurationManager] Failed to set 24-hour format: ${r(c)}`,c);let d=r(c);return{success:!1,enabled:s,previousFormat:x(n),error:`Failed to set 24-hour format: ${d}`}}}async setCalendarSystem(s){let a=(await this.getCalendarSystem()).calendarSystem??null;try{await this.runShellCommand(`shell settings put system calendar_type ${S(s)}`);let c=await this.readSetting("shell settings get system calendar_type");if(!c||c!==s)return{success:!1,calendarSystem:c??s,previousCalendarSystem:a,error:`Read-back verification failed: expected "${s}" but got "${c??"null"}"`};return{success:!0,calendarSystem:c,previousCalendarSystem:a}}catch(c){e.warn(`[SystemConfigurationManager] Failed to set calendar system: ${r(c)}`,c);let d=r(c);return{success:!1,calendarSystem:s,previousCalendarSystem:a,error:`Failed to set calendar system: ${d}`}}}async getCalendarSystem(){let s=await this.readSetting("shell settings get system calendar_type");if(s)return{success:!0,calendarSystem:s,source:"settings.calendar_type"};let n=await this.getCurrentLocaleTag();if(n){let a=oe(n);if(a)return{success:!0,calendarSystem:a,locale:n,source:"locale"}}return{success:!0,calendarSystem:this.defaultCalendarSystem,locale:n??null,source:"default"}}async getLocalizationSettings(){let s=await this.getCurrentLocaleTag(),n=await this.readSetting("shell getprop persist.sys.timezone"),a=x(await this.readSetting("shell settings get system time_12_24")),c=await this.readSetting("shell settings get global debug.force_rtl"),d=await this.readSetting("shell settings get global force_rtl"),p=C(c)??C(d),f=p===null?null:p?"rtl":"ltr",m=await this.getCalendarSystem();return{success:m.success,locale:s,timeZone:n,textDirection:f,timeFormat:a,calendarSystem:m.calendarSystem??null,error:m.error}}async broadcastLocaleChange(){try{return await this.adb.executeCommand("shell am broadcast -a android.intent.action.LOCALE_CHANGED"),!0}catch(s){return e.warn(`[SystemConfigurationManager] Failed to broadcast localization change: ${s}`),!1}}async readSetting(s){let n=s.match(/^shell\s+settings\s+get\s+(system|secure|global)\s+(\S+)\s*$/);if(n){let a=n[1],c=n[2];try{let p=await k.getInstance(this.device).requestSettingsGet(a,c);if(p.success)return w(p.found?p.value??null:null)}catch(d){e.debug(`[SystemConfigurationManager] a11y settings get failed for ${a}/${c}: ${d}`)}}try{let a=await this.adb.executeCommand(s,{noRetry:!0});return w(a.stdout)}catch(a){return e.warn(`[SystemConfigurationManager] Failed to read setting (${s}): ${a}`),null}}async runShellCommand(s){let n=s.match(/^shell\s+settings\s+put\s+(system|secure|global)\s+(\S+)\s+(.+)$/);if(n){let a=n[1],c=n[2],d=n[3].trim();try{if((await k.getInstance(this.device).requestSettingsPut(a,c,d,{valueType:"string"})).success)return}catch(p){e.debug(`[SystemConfigurationManager] a11y settings put failed for ${a}/${c}: ${p}`)}}await this.adb.executeCommand(s)}async getCurrentLocaleTag(){let s=await this.readSetting("shell settings get system system_locales"),n=Le(s);if(n)return n;let a=await this.getEffectiveLocaleTag();if(a)return a;let c=await this.readSetting("shell getprop persist.sys.locale");if(c)return c;let d=await this.readSetting("shell getprop persist.sys.language");if(!d)return null;let p=await this.readSetting("shell getprop persist.sys.country");if(p)return`${d}-${p}`;return d}async readAppLocales(s,n){try{let a=await this.adb.executeCommand(`shell cmd locale get-app-locales ${S(s)} --user ${n}`,{noRetry:!0}),c=G(a.stdout,a.stderr);if(c.kind==="list")return{readable:!0,list:c.list};return{readable:!1,notInstalled:c.kind==="notInstalled"}}catch(a){return e.warn(`[SystemConfigurationManager] Failed to read Android app locale for ${s}: ${a}`),{readable:!1,notInstalled:!1}}}async restoreAppLocales(s,n,a,c){if(!a.readable)return`. The app's previous locale could not be read before the change, so it was not restored; the app's locale is now ${Z(c)}.`;if(c.readable&&Kt(c.list,a.list))return"";let d="";try{await this.adb.executeCommand(`shell cmd locale set-app-locales ${S(s)} --user ${n} --locales ${S(a.list)}`)}catch(f){e.warn(`[SystemConfigurationManager] Failed to restore app locale for ${s}: ${r(f)}`,f),d=` (${r(f)})`}let p=await this.readAppLocales(s,n);if(p.readable&&Kt(p.list,a.list))return`. Restored the app's previous locale (${Z(a)}).`;return`. Restoring the app's previous locale (${Z(a)}) failed${d}; the app's locale is left as ${Z(p)}.`}async getEffectiveLocaleTag(){try{let s=await this.adb.executeCommand("shell am get-config",{noRetry:!0});return this.parseLocaleFromAmConfig(s.stdout)}catch(s){return e.warn(`[SystemConfigurationManager] Failed to read effective Android locale: ${s}`),null}}parseLocaleFromAmConfig(s){let n=w(s);if(!n)return null;let a=n.match(/(?:^|[-\s])b\+([a-z]{2,3})(?:\+([A-Za-z]{4}))?(?:\+([A-Z]{2}|\d{3}))?(?=[-\s]|$)/);if(a?.[1])return[a[1],a[2],a[3]].filter(Boolean).join("-");let c=n.match(/(?:^|[-\s])([a-z]{2,3})-r([A-Z]{2})(?=[-\s]|$)/);if(c?.[1]&&c[2])return`${c[1]}-${c[2]}`;return n.match(/(?:^|[-\s])([a-z]{2,3})(?=[-\s]|$)/)?.[1]??null}}function T(s){return W({deviceId:s})==="simulator"}function ce(s){let n=[s],a=s.split("-");for(let c=a.length-1;c>=1;c--){let d=a.slice(0,c).join("-");if(!n.includes(d))n.push(d)}return n}function Ve(s){if(s==="1")return"24";if(s==="0")return"12";return s}var _="System configuration is not supported on physical iOS devices.",Wt="gregory",ue="com.apple.mobiletimerd",j="AutomaticTimeZoneSetting",Oi="AppleTimeZone was stored and read back, which does not confirm that running apps observe the new zone. Automatic time zone is now off so the zone stays pinned.";class Be{device;processExecutor;defaultCalendarSystem=Wt;constructor(s,n){this.device=s;this.processExecutor=n}async setLocale(s,n){if(!this.isSimulator())return{success:!1,languageTag:s,error:_};try{let a=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale"),c=this.toAppleLocale(s);await this.iosDefaultsWrite(".GlobalPreferences","AppleLocale",[c]);let d=this.buildAppleLanguages(s);await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"defaults","write",".GlobalPreferences","AppleLanguages","-array",...d]));let p=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale");if(!p||p!==c)return{success:!1,languageTag:s,previousLanguageTag:a,error:`Read-back verification failed: expected "${c}" but got "${p??"null"}"`};return{success:!0,languageTag:s,previousLanguageTag:a,appliedLanguages:d,method:"defaults write AppleLocale + AppleLanguages"}}catch(a){let c=r(a);return e.warn(`Failed to set locale: ${r(a)}`,a),{success:!1,languageTag:s,error:`Failed to set locale: ${c}`}}}async setTimeZone(s){if(!this.isSimulator())return{success:!1,zoneId:s,error:_};let n={zoneId:await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),automatic:await this.iosDefaultsRead(ue,j)};try{await this.iosDefaultsWrite(ue,j,["-bool","NO"])}catch(c){return this.timeZoneWriteFailure(s,c,"")}let a;try{await this.iosDefaultsWrite(".GlobalPreferences","AppleTimeZone",[s]),a=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone")}catch(c){let d=await this.restoreTimeZoneSettings(n,null);return this.timeZoneWriteFailure(s,c,d)}if(a===null)return{success:!1,zoneId:s,previousZoneId:n.zoneId,error:`Time zone change outcome is indeterminate: "${s}" was sent but no result was confirmed (AppleTimeZone could not be read back). The simulator's time zone and its automatic time zone setting were not restored: automatic time zone is off and the zone may have changed${n.zoneId===null?"":` (previously "${n.zoneId}")`}. Do not retry automatically. Check the current time zone before retrying.`};if(!A(a,s)){let c=await this.restoreTimeZoneSettings(n,a);return{success:!1,zoneId:s,previousZoneId:n.zoneId,error:`Read-back verification failed: expected "${s}" but got "${a}"${c}`}}return{success:!0,zoneId:s,previousZoneId:n.zoneId,warning:Oi}}timeZoneWriteFailure(s,n,a){let c=r(n);return e.warn(`Failed to set time zone: ${c}`,n),{success:!1,zoneId:s,error:`Failed to set time zone: ${c}${a}`}}async restoreTimeZoneSettings(s,n){let a=[];if(!(s.zoneId===null?n===null:A(n,s.zoneId)))await this.restoreDefault(".GlobalPreferences","AppleTimeZone",s.zoneId===null?null:[s.zoneId],a);let d=C(s.automatic);if(s.automatic!==null&&d===null)a.push(`the earlier automatic time zone value "${s.automatic}" is not a boolean`);else await this.restoreDefault(ue,j,d===null?null:["-bool",d?"YES":"NO"],a);a.push(...await this.timeZoneRestoreMismatches(s));let p=s.zoneId===null?"unset":`"${s.zoneId}"`,f=s.automatic===null?"unset":`"${s.automatic}"`;return a.length===0?`. Restored automatic time zone (${f}) and the previous time zone (${p}).`:`. Restoring the previous automatic time zone (${f}) and time zone (${p}) failed: ${a.join("; ")}.`}async timeZoneRestoreMismatches(s){let n=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),a=await this.iosDefaultsRead(ue,j),c=[];if(!(s.zoneId===null?n===null:A(n,s.zoneId)))c.push(`AppleTimeZone is left as "${n??"null"}"`);if(C(a)!==C(s.automatic))c.push(`${j} is left as "${a??"null"}"`);return c}async restoreDefault(s,n,a,c){try{if(a===null)await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"defaults","delete",s,n]));else await this.iosDefaultsWrite(s,n,a)}catch(d){e.warn(`Failed to restore ${s} ${n}: ${r(d)}`,d),c.push(`${n}: ${r(d)}`)}}async setTextDirection(s,n){return{success:!1,rtl:s,error:'Text direction is not supported on iOS. To mirror a prototype without changing the system locale, set window.layoutDirection: "rtl" on its prototype spec.'}}async set24HourFormat(s){if(!this.isSimulator())return{success:!1,enabled:s,error:_};try{let n=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),a=x(Ve(n));await this.iosDefaultsWrite(".GlobalPreferences","AppleICUForce24HourTime",["-bool",s?"YES":"NO"]);let c=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),d=s?"1":"0";if(!c||c!==d)return{success:!1,enabled:s,previousFormat:a,error:`Read-back verification failed: expected "${d}" but got "${c??"null"}"`};return{success:!0,enabled:s,previousFormat:a}}catch(n){let a=r(n);return e.warn(`Failed to set 24-hour format: ${r(n)}`,n),{success:!1,enabled:s,error:`Failed to set 24-hour format: ${a}`}}}async setCalendarSystem(s){if(!this.isSimulator())return{success:!1,calendarSystem:s,error:_};try{let n=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");await this.iosDefaultsWrite(".GlobalPreferences","AppleCalendar",[s]);let a=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");if(!a||a!==s)return{success:!1,calendarSystem:a??s,previousCalendarSystem:n,error:`Read-back verification failed: expected "${s}" but got "${a??"null"}"`};return{success:!0,calendarSystem:a,previousCalendarSystem:n}}catch(n){let a=r(n);return e.warn(`Failed to set calendar system: ${r(n)}`,n),{success:!1,calendarSystem:s,error:`Failed to set calendar system: ${a}`}}}async getCalendarSystem(){if(!this.isSimulator())return{success:!1,error:_};let s=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");if(s)return{success:!0,calendarSystem:s,source:"default"};let n=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale");if(n){let a=oe(n);if(a)return{success:!0,calendarSystem:a,locale:n,source:"locale"}}return{success:!0,calendarSystem:Wt,locale:n??null,source:"default"}}async getLocalizationSettings(){if(!this.isSimulator())return{success:!1,error:_};let s=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale"),n=await this.iosDefaultsRead(".GlobalPreferences","AppleLanguages"),a=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),c=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),d=x(Ve(c)),p=await this.getCalendarSystem();return{success:!0,locale:s,languages:n,timeZone:a,textDirection:null,timeFormat:d,calendarSystem:p.calendarSystem??null}}async broadcastLocaleChange(){return!1}buildAppleLanguages(s){return ce(s)}isSimulator(){return T(this.device.deviceId)}async iosDefaultsRead(s,n){try{let a=await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"defaults","read",s,n]));return w(a.stdout)}catch(a){return e.debug(`src/features/utility/system-configuration/IosSystemConfigurationAdapter.ts defaults read failed: ${a}`,a),null}}async iosDefaultsWrite(s,n,a){await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"defaults","write",s,n,...a]))}toAppleLocale(s){return s.replace(/-/g,"_")}}function Yt(s,n,a){if(s.platform==="ios")return new Be(s,a);return new Me(s,n)}var Ht=500,Fi=10,Li=/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*)+$/;class dy{device;processExecutor;timer;adapter;constructor(s,n=v,a=new ne,c=i){this.device=s,this.processExecutor=a,this.timer=c,this.adapter=Yt(s,n.create(s),a)}async setLocale(s,n={}){let a=s.trim();if(!a)return{success:!1,languageTag:s,error:"languageTag must be a non-empty string"};return this.adapter.setLocale(a,n)}async setTimeZone(s){let n=s.trim();if(!n)return{success:!1,zoneId:s,error:"zoneId must be a non-empty string"};let a=Ne(n,Q(this.device.platform,"Setting the time zone"));if(a.error)return{success:!1,zoneId:s,error:a.error};let c=await this.adapter.setTimeZone(n);return a.note?Ni(c,a.note):c}async setTextDirection(s,n={}){return this.adapter.setTextDirection(s,n)}async broadcastLocaleChange(){return this.adapter.broadcastLocaleChange()}async set24HourFormat(s){return this.adapter.set24HourFormat(s)}async setCalendarSystem(s){let n=s.trim();if(!n)return{success:!1,calendarSystem:s,error:"calendarSystem must be a non-empty string"};return this.adapter.setCalendarSystem(n)}async getCalendarSystem(){return this.adapter.getCalendarSystem()}async getLocalizationSettings(){return this.adapter.getLocalizationSettings()}buildAppleLanguages(s){return ce(s)}async restartSpringBoard(){if(!T(this.device.deviceId))return!1;try{await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"launchctl","stop","com.apple.SpringBoard"]))}catch(s){return e.warn(`[SystemConfigurationManager] Failed to stop SpringBoard: ${s}`),!1}for(let s=0;s<Fi;s++){await this.timer.sleep(Ht);try{let n=await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"launchctl","list","com.apple.SpringBoard"]));if(n.stdout&&n.stdout.includes("SpringBoard"))return!0}catch(n){e.debug(`[SystemConfigurationManager] SpringBoard restart probe: ${r(n)}`)}}return e.warn("[SystemConfigurationManager] SpringBoard did not restart within timeout"),!1}async postLocaleChangeNotification(){if(!T(this.device.deviceId))return!1;try{return await this.processExecutor.executeCommand("xcrun",$n(["spawn",this.device.deviceId,"notifyutil","-p","com.apple.language.changed"])),!0}catch(s){return e.warn(`[SystemConfigurationManager] Failed to post locale notification: ${s}`),!1}}async applyIosLiveChanges(s){let n=T(this.device.deviceId),a=await this.restartSpringBoard(),c=await this.postLocaleChangeNotification(),d={springBoardRestarted:a,notificationPosted:c};if(s)if(!Li.test(s))e.warn(`[SystemConfigurationManager] Invalid bundle ID: ${s}`),d.appRestarted=!1;else if(!n)e.warn("[SystemConfigurationManager] iOS app restart after localization is only supported on simulators"),d.appRestarted=!1;else try{await this.processExecutor.executeCommand("xcrun",$n(["terminate",this.device.deviceId,s])),await this.timer.sleep(Ht),await this.processExecutor.executeCommand("xcrun",$n(["launch",this.device.deviceId,s])),d.appRestarted=!0}catch(p){e.warn(`[SystemConfigurationManager] Failed to restart app ${s}: ${p}`),d.appRestarted=!1}return d}}function Ni(s,n){return s.success?{...s,warning:s.warning?`${s.warning} ${n}`:n}:{...s,error:s.error?`${s.error}. ${n}`:n}}var CM=["fontScale","contentSize","density","nightMode"],zi=[...CM,...Do];function ki(s){return Do.filter((n)=>s.includes(n))}function Y(s,n){return Object.fromEntries(n.filter((a)=>(a in s)).map((a)=>[a,s[a]]))}var Mi={get:()=>{return},set:()=>{},delete:()=>{}};class xP{adbFactory;simctlFor;constructor(s=v,n){this.adbFactory=s;this.simctlFor=n}displayConfig(s,n={}){let a=this.simctlFor?.(s);return new cy(s,{adbFactory:this.adbFactory,...a?{simctl:a}:{},...n})}async read(s,n,a=q()){return a?.throwIfAborted(),U(a,()=>R(this.readValues(s,n),a))}async readValues(s,n){let a={};if(n.some((d)=>CM.includes(d)))Object.assign(a,Vi(await this.displayConfig(s).getRestorableConfig()));let c=ki(n);if(c.length>0)Object.assign(a,await this.displayConfig(s).accessibility().readSnapshot(c));if(n.some((d)=>!zi.includes(d))){let d=await new dy(s,this.adbFactory).getLocalizationSettings();if(d.success)Object.assign(a,{...s.platform==="ios"&&d.locale?{locale:d.locale}:{},...d.timeFormat!==void 0?{timeFormat:d.timeFormat}:{},...d.calendarSystem?{calendarSystem:d.calendarSystem}:{}})}return Y(a,n)}async write(s,n){let a=[],c=Bi(n);if(c.keys.length>0){let p=await this.displayConfig(s,{themeBaselines:Mi,contentSizeBaselines:st}).setConfig(c.input);if(p.success)a.push(...c.keys);else e.warn(`Failed to reset display settings on ${s.deviceId}: ${p.error}`)}a.push(...await this.writeAccessibility(s,n));let d=new dy(s,this.adbFactory);if(typeof n.locale==="string"){let p=await d.setLocale(n.locale,{broadcast:!1});this.collect(p,"locale",s,a)}if("timeFormat"in n){if(await this.writeTimeFormat(s,d,n.timeFormat??null))a.push("timeFormat")}if(typeof n.calendarSystem==="string"){let p=await d.setCalendarSystem(n.calendarSystem);this.collect(p,"calendarSystem",s,a)}return a}async writeAccessibility(s,n){let a=Object.fromEntries(Do.filter((c)=>typeof n[c]==="string"||n[c]===null).map((c)=>[c,n[c]]));if(Object.keys(a).length===0)return[];return this.displayConfig(s).accessibility().restoreSnapshot(a)}collect(s,n,a,c){if(s.success)c.push(n);else e.warn(`Failed to reset ${n} on ${a.deviceId}: ${s.error}`)}async writeTimeFormat(s,n,a){if(a==="12"||a==="24"){let c=await n.set24HourFormat(a==="24");if(!c.success)e.warn(`Failed to reset timeFormat on ${s.deviceId}: ${c.error}`);return c.success}if(s.platform!=="android")return e.warn(`Cannot unset the 24-hour override on ${s.deviceId}; leaving it as is`),!0;try{return await this.adbFactory.create(s).executeCommand("shell settings delete system time_12_24"),!0}catch(c){return e.warn(`Failed to unset timeFormat on ${s.deviceId}: ${r(c)}`,c),!1}}}function Vi(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.theme!==void 0?{nightMode:s.theme}:{},...s.contentSize!==void 0?{contentSize:s.contentSize}:{}}}function Bi(s){let n={},a=[];if(typeof s.fontScale==="number"||s.fontScale==="default")n.fontScale=s.fontScale,a.push("fontScale");if(typeof s.density==="number"||s.density==="default")n.density=s.density,a.push("density");if(we(s.contentSize))n.contentSize=s.contentSize,a.push("contentSize");if(typeof s.nightMode==="string")n.theme=s.nightMode,a.push("nightMode");return{input:n,keys:a}}var Bb=["fontScale","contentSize","density","nightMode","locale","timeFormat","calendarSystem","increaseContrast","reduceMotion","boldText","colorInversion","colorCorrection","magnification","magnificationScale","extraDim"];class Ge extends Error{}function $b(s,n,a,c){let{timer:d,capMs:p,label:f}=c,m=l(a,{timer:d,timeoutMs:p,unref:!0,label:f,timeoutError:()=>new Ge}).then(()=>{return},(y)=>{if(y instanceof Ge)e.warn(`[acquisition cleanup] ${f} on ${n} exceeded ${p}ms; the device is no longer held for it`);else e.warn(`[acquisition cleanup] Failed to ${f} on ${n}: ${r(y)}`,y)});s.registerAcquisitionDeviceCleanup(n,m,p)}function Ue(s){return Bb.filter((n)=>(n in s))}var Jt=15000;class PG{persistence;access;holderOf;queues=new Map;identityEpochs=new Map;pendingResetFences=new Map;timer;resetWaitMs;constructor(s,n,a,{timer:c=i,resetWaitMs:d=Jt}={}){this.persistence=s;this.access=n;this.holderOf=a;this.timer=c,this.resetWaitMs=d}recordBeforeChange(s,n){let a=this.holderOf(s.deviceId),c={value:!1},d=a===null||n.length===0?this.settled(s.deviceId):this.enqueueRecord(s,n,a,c);return this.awaitPendingReset(s.deviceId,d,a,{abandoned:c,keys:n})}async awaitPendingReset(s,n,a,{abandoned:c,keys:d}){try{await l(n,{timer:this.timer,timeoutMs:this.resetWaitMs,label:`Reset of device settings on ${s}`})}catch(p){if(c.value=!0,a!==null)this.fenceKeys(s,d,a);e.warn(`Proceeding with a settings change on ${s} before its pending reset finished: ${r(p)}`,p)}}fenceKeys(s,n,a){for(let c of this.pendingResetFences.get(s)??[]){for(let d of n)c.keys.add(d);c.sessionId=a}}enqueueRecord(s,n,a,c){return this.enqueue(s.deviceId,async()=>{if(c.value)return;let d=await this.persistence.get(s.deviceId),p=d?.values??{},f=n.filter((g)=>!(g in p)),m=f.length>0?await this.access.read(s,f):{},y={...Y(m,f),...p};if(Ue(y).length===0)return;if(d&&d.sessionId===a&&Ue(m).length===0)return;await this.persistence.put(s.deviceId,{platform:s.platform,name:s.name,sessionId:a,values:y})})}resetOnAcquisition(s,n){let a={keys:new Set,sessionId:n},c=this.pendingResetFences.get(s)??new Set;c.add(a),this.pendingResetFences.set(s,c);let d=this.enqueue(s,()=>this.runReset(s,n,a));return d.then(()=>{if(c.delete(a),c.size===0&&this.pendingResetFences.get(s)===c)this.pendingResetFences.delete(s)}),d}async runReset(s,n,a){let c=await this.persistence.get(s);if(!c||c.sessionId===n)return;let d={deviceId:s,name:c.name,platform:c.platform},p=Ue(c.values),f=await this.access.read(d,p),m=p.filter((b)=>a.keys.has(b)),y=p.filter((b)=>!a.keys.has(b)&&(!(b in f)||f[b]!==c.values[b])),g=y.length>0?await this.access.write(d,Y(c.values,y)):[],D=y.filter((b)=>!g.includes(b)),h=[...D,...m];if(h.length===0){await this.persistence.delete(s);return}if(D.length>0)e.warn(`Could not reset ${D.join(", ")} on ${s} to the recorded device defaults; the next acquisition by another session retries`);await this.persistence.put(s,{...c,...m.length>0?{sessionId:a.sessionId}:{},values:Y(c.values,h)})}forget(s){return this.identityEpochs.set(s,(this.identityEpochs.get(s)??0)+1),this.enqueue(s,()=>this.persistence.delete(s),!0)}settled(s){return this.queues.get(s)??Promise.resolve()}enqueue(s,n,a=!1){let c=this.queues.get(s)??Promise.resolve(),d=this.identityEpochs.get(s)??0,p=c.then(()=>a||(this.identityEpochs.get(s)??0)===d?n():void 0).catch((f)=>{e.warn(`Device setting defaults failed on ${s}: ${r(f)}`,f)});return this.queues.set(s,p),p.then(()=>{if(this.queues.get(s)===p)this.queues.delete(s)}),p}}var Qt;function iX(s){Qt=s}async function Ed(s,n){try{await Qt?.recordBeforeChange(s,n)}catch(a){e.warn(`Failed to record device setting defaults on ${s.deviceId}: ${r(a)}`,a)}}function oX(s,n,a=i){return(c,d)=>{$b(s,c,n.resetOnAcquisition(c,d),{timer:a,capMs:Jt,label:`reset device setting defaults for session ${d}`})}}var Gi="device-setting-defaults";function Ui(s){return{name:Gi,onDeviceIdentityReplaced:(n)=>{s.forget(n)},onDeviceIncarnationChanged:()=>{}}}function sX(s){return Xt(Ui(s))}
|
|
9
|
-
export{Pf,Af,xl,B8,$8,x1,mG,C1,PP,D1,U8,EM,AP,oy,fG,TP,kP,KE,IM,EP,O1,M1,H8,q8,V8,hG,IP,N1,W8,gG,z8,j8,K8,yG,G8,vG,_P,Y8,Fb,_M,GE,J8,X8,sy,Z8,Q8,F1,eX,ay,tX,Lb,bG,L1,B1,rX,SG,wG,Do,nX,xM,cy,RG,dy,CM,xP,Bb,$b,PG,iX,Ed,oX,sX};
|
|
10
|
-
|
|
11
|
-
//# debugId=D706F8FDC5739E9464756E2164756E21
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{e}from"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";import{up}from"./chunk-32jpxz2y.js";import"./chunk-nwm2pq5v.js";import{So}from"./chunk-h3n4adc6.js";import"./chunk-a2sc4jm0.js";import"./chunk-ggtd5x5a.js";import"./chunk-8cghfzb2.js";import"./chunk-tyazf3sk.js";import"./chunk-79q5xsdc.js";import"./chunk-44bt78m9.js";import"./chunk-jhnbfj19.js";import"./chunk-6d3mmqxt.js";import"./chunk-4fgdhcwx.js";import"./chunk-0e4gm1kj.js";import{ku}from"./chunk-zd9vmkzn.js";import"./chunk-vs9r72ta.js";import"./chunk-mqc1d0eb.js";import"./chunk-a4k9rt7z.js";import"./chunk-sjn0nj4p.js";import"./chunk-bn64x5z5.js";import"./chunk-sns0c35v.js";import{r,t}from"./chunk-9rkfyt6q.js";import{realpathSync as p}from"fs";import{basename as h,dirname as g,resolve as f}from"path";function b(o){let n=f(o);try{return p(n)}catch(a){e.debug(`Direct-mode DB realpath unavailable: ${r(a)}`);try{return f(p(g(n)),h(n))}catch(D){return e.debug(`Direct-mode DB parent realpath unavailable: ${r(D)}`),n}}}function P(o,n){return o.filter((a)=>a.dbPath!==void 0&&b(a.dbPath)===n)}function _(o){let n=b(o.resolveDbPath()),a=o.findLiveDaemonDbOwners(),D=P(a,n);if(D.length>0){let i=D.map((c)=>c.pid).join(", ");throw new t(`A live AutoMobile daemon (pid ${i}) already owns the database at ${n}. Direct mode (--no-proxy/--direct) would open a second writer on the same SQLite file, causing SQLITE_BUSY stalls and competing migrations. Resolve this by either running without --no-proxy/--direct to share the daemon, stopping the daemon, or setting AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database for this direct-mode instance.`)}let d=a.filter((i)=>i.dbPath===void 0);if(d.length>0){let i=d.map((c)=>c.pid).join(", ");throw new t(`Cannot safely start direct mode (--no-proxy/--direct): a live AutoMobile daemon (pid ${i}) is running but its database path could not be determined (it may still be starting up, or is using a non-default PID file), so a collision on ${n} cannot be ruled out. Wait for the daemon to finish starting and retry, stop the daemon, or set AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database for this direct-mode instance.`)}}function I(o={}){let n=o.manager??new ku,a=o.readPidFileData??So;return{resolveDbPath:o.resolveDbPath??up,findLiveDaemonDbOwners:()=>{let d;try{d=n.findLiveDaemonProcesses()}catch(l){let u=r(l);throw e.warn(`Direct-mode guard: process-table scan failed; refusing direct mode because same-DB daemon ownership cannot be verified. ${u}`,l),new t(`Cannot verify daemon ownership before starting direct mode (--no-proxy/--direct): failed to inspect the process table (${u}). Retry, stop any running daemon, or set AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database.`)}if(d.length===0)return[];let i=[],c=new Set,s=a();if(s&&typeof s.pid==="number"&&s.dbPath!==void 0&&d.includes(s.pid))i.push({pid:s.pid,dbPath:s.dbPath}),c.add(s.pid);let m=d.filter((l)=>!c.has(l));if(m.length>0){e.debug(`Direct-mode guard: ${m.length} live daemon(s) could not be mapped to a DB path (starting up or non-default PID file); direct mode will refuse to be safe: ${m.join(", ")}`);for(let l of m)i.push({pid:l,dbPath:void 0})}return i}}}export{_ as assertDirectModeDbOwnership,I as createDefaultDirectModeGuardDeps};
|
|
3
|
-
|
|
4
|
-
//# debugId=DAC110DDC61262BF64756E2164756E21
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{i,e}from"./chunk-z8t0v07j.js";import{pe,B,o,M,zo,Vn,_e,Br,_}from"./chunk-h3n4adc6.js";import{Yx}from"./chunk-0e4gm1kj.js";import{oV,wV,RV,eT,AV}from"./chunk-6d3mmqxt.js";import{Lo,aC}from"./chunk-sns0c35v.js";import{r,t,u,yt}from"./chunk-9rkfyt6q.js";var Oc=5000,o0=2500,Hd=30000,ql=1770000;var s0=800,q6=500;async function My(a,n,c,{timeoutMs:m=s0,context:d="while TalkBack is on",platform:l="android"}={}){let p=n.now()+Math.max(0,m);while(n.now()<p){o(c);let s=await a(p-n.now());if(o(c),s&&n.now()<=p)return s;let y=p-n.now();if(y>0)await n.sleep(Math.min(q6,y))}throw o(c),new t(l==="ios"?`Unable to retrieve a fresh tap hierarchy: iOS runner failed to produce a view hierarchy ${d}. Observe again.`:`Unable to retrieve a fresh tap hierarchy: hierarchy unavailable from the accessibility service ${d}. Observe again and check that the accessibility service is running.`)}async function a0(a){let{adb:n,x:c,y:m,durationMs:d,signal:l,assertCurrent:p,logTag:s}=a;o(l);let y=Lo(d),w=Br(d),f=async(h)=>{p?.();let T=await n.executeCommand(h,{timeoutMs:w,signal:l});aC(h,T)};try{try{await f(`shell input touchscreen swipe ${c} ${m} ${c} ${m} ${y}`)}catch(h){if(e.warn(`[${s}] touch input swipe failed: ${r(h)}`,h),Yx(h,d,l),h instanceof _e)throw h;o(l),await f(`shell input swipe ${c} ${m} ${c} ${m} ${y}`)}}catch(h){if(e.warn(`[${s}] Android long press failed: ${r(h)}`,h),Yx(h,d,l),h instanceof _e)throw h;throw u(h,"Android long press failed")}}var A=300,VI=1500,c0=100;async function d0(a,n,c,{preTapHash:m,signal:d}){d=pe(d),o(d),await a.sleep(A),o(d);let l;try{l=await n(VI)}catch(s){if(d?.aborted||s instanceof Error&&s.name==="AbortError"||s instanceof _e||s instanceof Vn)throw s;return e.warn(`[androidGhostTapRetry] Post-tap hierarchy unreadable: ${r(s)}`,s),{status:"unavailable"}}if(o(d),!l||!m)return{status:"unavailable"};let p=c(l);if(!p)return{status:"unavailable"};if(p!==m)return{status:"changed"};return{status:"unchanged",hierarchy:l}}async function b(a,n,c,m){let l=(m?.timer??i).now()+n,p=await a.requestHierarchySync(new B,M.isRawElementSearchEnabled(),c,{timeoutMs:n}),s=p?a.convertToViewHierarchyResult(p.hierarchy):null;if(!s)return null;if(s.ctrlProxyIncomplete&&m)return oV(s,m,l,c);return s}function l0(a,n){if(!a)return!0;let c=n?.hierarchy;return Boolean(c&&typeof c==="object"&&"error"in c&&c.error)}async function u0(a,n){let{device:c}=a,{signal:m,screenSize:d}=n,l=Math.max(0,n.timeoutMs),p=a.timer.now()+l;switch(c.platform){case"android":{let s=await b(a.androidService,l,m,{adb:a.adb,timer:a.timer});return s?a.prepareForResponse(s,d):null}case"ios":{let s=_.getInstance(c),y=n.forceCapture?await s.requestHierarchySyncForTapRevalidation(void 0,!1,m,l):await s.requestHierarchySync(void 0,!1,m,{timeoutMs:l});if(!y?.hierarchy)return null;let w=a.viewHierarchy.normalizeIosHierarchy(s.convertToViewHierarchyResult(y.hierarchy)),f=y[zo];if(f==="device"||f==="client-cache")Object.assign(w,{[zo]:f});let h=a.prepareForResponse(w,d);return await RV(h,a.sdkBridge??wV(c,a.timer),m,Math.max(0,p-a.timer.now())),await AV(h,a.sdkWeb??eT(c,a.timer),m,Math.max(0,p-a.timer.now())),h}default:throw yt(c.platform,a.actionLabel)}}async function p0(a){let{timer:n,signal:c}=a,m=a.startTime+a.durationMs,d=a.maxRequests??Number.POSITIVE_INFINITY,l=0,p=a.startTime;while(n.now()<m&&l<d){if(o(c),a.pacing==="sleepFirst")await n.sleep(a.intervalMs);else{let y=Math.min(p,m)-n.now();if(y>0)await n.sleep(y),o(c)}if(n.now()>=m)break;p=n.now()+a.intervalMs;let s=await a.fetch(Math.max(0,m-n.now()));if(l+=1,!s)continue;if(a.discardLateResult&&n.now()>=m)break;if(a.accept(s))break}return{requestCount:l}}
|
|
3
|
-
export{Oc,o0,Hd,ql,s0,q6,My,a0,VI,c0,d0,l0,u0,p0};
|
|
4
|
-
|
|
5
|
-
//# debugId=30B0064D2A5C5D2F64756E2164756E21
|