@kaeawc/auto-mobile 0.0.92 → 0.0.94
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/ble-peripheral.py +153 -0
- package/dist/src/{chunk-r14wwk37.js → chunk-026y62r9.js} +12 -12
- package/dist/src/chunk-0jyfg947.js +4 -0
- package/dist/src/{chunk-950qcq1e.js → chunk-0zfpp1wh.js} +4 -4
- package/dist/src/chunk-13qxf7ym.js +7 -0
- package/dist/src/chunk-1scenrk7.js +4 -0
- package/dist/src/chunk-1vb5ph1k.js +4 -0
- package/dist/src/chunk-20g565q7.js +5 -0
- package/dist/src/chunk-21h6dhdm.js +5 -0
- package/dist/src/{chunk-2e6s75qv.js → chunk-25mfpthk.js} +8 -8
- package/dist/src/{chunk-9rkfyt6q.js → chunk-2b39zyxc.js} +3 -3
- package/dist/src/chunk-2gzd6wbd.js +4 -0
- package/dist/src/{chunk-eka89q3k.js → chunk-3dntffy9.js} +1 -1
- package/dist/src/chunk-3gfczcsn.js +4 -0
- package/dist/src/chunk-3h5jz1vb.js +9 -0
- package/dist/src/chunk-41zcy6b3.js +5 -0
- package/dist/src/chunk-47n9m2de.js +4 -0
- package/dist/src/chunk-4vxeq0vd.js +58 -0
- package/dist/src/chunk-59dx6qaf.js +4 -0
- package/dist/src/chunk-5sdf9y92.js +4 -0
- package/dist/src/chunk-5wk1t46v.js +5 -0
- package/dist/src/chunk-661c50hh.js +17 -0
- package/dist/src/chunk-68n6bjjd.js +21 -0
- package/dist/src/{chunk-zg67wjkh.js → chunk-69pmjdf2.js} +3 -3
- package/dist/src/chunk-6hrj3jt6.js +145 -0
- package/dist/src/{chunk-b4cxdzwy.js → chunk-6myr26wx.js} +8 -8
- package/dist/src/chunk-6n96k09n.js +4 -0
- package/dist/src/chunk-6vwrbkre.js +4 -0
- package/dist/src/chunk-6wk0yrab.js +4 -0
- package/dist/src/chunk-6yhm9een.js +4 -0
- package/dist/src/chunk-7k7gjg2t.js +7 -0
- package/dist/src/chunk-7n5fz68h.js +4 -0
- package/dist/src/chunk-8cvnpnbp.js +4 -0
- package/dist/src/chunk-8kzv7rk7.js +4 -0
- package/dist/src/chunk-8nj68t1v.js +167 -0
- package/dist/src/{chunk-r20pe1nv.js → chunk-96r3bpg7.js} +3 -3
- package/dist/src/chunk-97x887te.js +4 -0
- package/dist/src/{chunk-sz1a7p43.js → chunk-99a6tbvd.js} +1 -1
- package/dist/src/chunk-9p5d2994.js +5 -0
- package/dist/src/{chunk-w7zsh13a.js → chunk-9q265er0.js} +4 -4
- package/dist/src/chunk-9xgnrv5w.js +5 -0
- package/dist/src/chunk-9xgsmshb.js +5 -0
- package/dist/src/chunk-a02d1wgv.js +4 -0
- package/dist/src/{chunk-km0dy5vc.js → chunk-a9ps00a1.js} +10 -10
- package/dist/src/chunk-aewdveet.js +5 -0
- package/dist/src/chunk-b3tdtq7r.js +9 -0
- package/dist/src/chunk-bn7jx7a2.js +4 -0
- package/dist/src/chunk-bnyw27ja.js +4 -0
- package/dist/src/{chunk-s1zq65ny.js → chunk-bpwsg76p.js} +2 -2
- package/dist/src/chunk-bvranw3g.js +4 -0
- package/dist/src/chunk-c25a84zb.js +4 -0
- package/dist/src/chunk-c27yv1dx.js +5 -0
- package/dist/src/chunk-c3ewxm4x.js +5 -0
- package/dist/src/chunk-cb1ga9rd.js +7 -0
- package/dist/src/chunk-cn7fwy7k.js +4 -0
- package/dist/src/chunk-cnvy4a64.js +4 -0
- package/dist/src/chunk-cqhw4yr6.js +5 -0
- package/dist/src/{chunk-v90es00d.js → chunk-ctmfshjc.js} +2 -2
- package/dist/src/chunk-ctwmhz13.js +4 -0
- package/dist/src/{chunk-qv2918jt.js → chunk-d3jx9bz5.js} +2 -2
- package/dist/src/{chunk-wry6skrm.js → chunk-d6rb08ga.js} +1 -1
- package/dist/src/chunk-ddqhj4eg.js +5 -0
- package/dist/src/{chunk-d57432wq.js → chunk-ddrhs1c3.js} +2 -2
- package/dist/src/chunk-dnjnh9p6.js +4 -0
- package/dist/src/{chunk-ajsrz473.js → chunk-dw5rwgya.js} +3 -3
- package/dist/src/chunk-e0870khr.js +5 -0
- package/dist/src/chunk-ea3k10kj.js +4 -0
- package/dist/src/chunk-emv82m1w.js +7 -0
- package/dist/src/chunk-f3m6pdnx.js +4 -0
- package/dist/src/chunk-f84z32cb.js +4 -0
- package/dist/src/chunk-fpczgf0z.js +4 -0
- package/dist/src/chunk-g2js4c2v.js +971 -0
- package/dist/src/chunk-g3af2qbk.js +5 -0
- package/dist/src/chunk-gadtna7s.js +11 -0
- package/dist/src/{chunk-c9nk1r78.js → chunk-gcyx407v.js} +3 -3
- package/dist/src/{chunk-jdqvcq0a.js → chunk-gfpntwc1.js} +3 -3
- package/dist/src/chunk-gmnm5e3e.js +4 -0
- package/dist/src/chunk-gp6vb5gf.js +4 -0
- package/dist/src/chunk-gppgy7pa.js +4 -0
- package/dist/src/chunk-hegfz0ae.js +5 -0
- package/dist/src/chunk-hpzxdp1k.js +17 -0
- package/dist/src/{chunk-2v7tw1nj.js → chunk-j69g8b50.js} +3 -3
- package/dist/src/chunk-jvstjnqm.js +19 -0
- package/dist/src/chunk-jzqrv78s.js +4 -0
- package/dist/src/chunk-k2948b8d.js +4 -0
- package/dist/src/chunk-k4ftd40d.js +4 -0
- package/dist/src/chunk-kd9vfaxh.js +5 -0
- package/dist/src/{chunk-34zxqcmq.js → chunk-kdczmgwk.js} +3 -3
- package/dist/src/chunk-ke3wn14v.js +4 -0
- package/dist/src/chunk-kh5n7m6w.js +4 -0
- package/dist/src/{chunk-0dfnyfkh.js → chunk-khejfph4.js} +3 -3
- package/dist/src/chunk-kny2xemh.js +4 -0
- package/dist/src/chunk-knyzw9md.js +4 -0
- package/dist/src/chunk-mbzpt2hp.js +4 -0
- package/dist/src/chunk-mm8rcxad.js +4 -0
- package/dist/src/chunk-nc4516tx.js +4 -0
- package/dist/src/{chunk-stfzjr9y.js → chunk-ntfrqrqn.js} +5 -5
- package/dist/src/chunk-nz5h2j52.js +4 -0
- package/dist/src/chunk-p22s97qy.js +4 -0
- package/dist/src/chunk-p9kt1sgr.js +6 -0
- package/dist/src/{chunk-9y5bcy28.js → chunk-pf282r5g.js} +4 -4
- package/dist/src/chunk-pnd4mrxy.js +4 -0
- package/dist/src/chunk-pqqteyj6.js +4 -0
- package/dist/src/chunk-qj1tbnv2.js +8 -0
- package/dist/src/chunk-qnh9egwr.js +4 -0
- package/dist/src/chunk-qy3khhf8.js +8 -0
- package/dist/src/chunk-r0vp315h.js +11 -0
- package/dist/src/chunk-r4j43b9s.js +237 -0
- package/dist/src/{chunk-4pfftt07.js → chunk-r54cxxze.js} +3 -3
- package/dist/src/chunk-r6pvhj33.js +325 -0
- package/dist/src/chunk-rb7aa5gr.js +54 -0
- package/dist/src/chunk-rdj50kb4.js +4 -0
- package/dist/src/chunk-rnd4vcas.js +4 -0
- package/dist/src/chunk-s3y3zfcx.js +14 -0
- package/dist/src/chunk-s4g43k75.js +5 -0
- package/dist/src/chunk-sfqe223f.js +311 -0
- package/dist/src/chunk-sqdrxjw5.js +7 -0
- package/dist/src/{chunk-0w1spptt.js → chunk-t54k47em.js} +4 -4
- package/dist/src/chunk-tek4pnvv.js +26 -0
- package/dist/src/chunk-tn74y7af.js +4 -0
- package/dist/src/chunk-tvq0nzam.js +5 -0
- package/dist/src/chunk-tx4f0h9c.js +6 -0
- package/dist/src/chunk-vdqag3fj.js +5 -0
- package/dist/src/chunk-vz5zzs57.js +4 -0
- package/dist/src/chunk-w4s2vfpj.js +4 -0
- package/dist/src/chunk-w5yypt53.js +42 -0
- package/dist/src/{chunk-r0f1q783.js → chunk-w68v64vh.js} +3 -3
- package/dist/src/chunk-whwj0pdk.js +5 -0
- package/dist/src/chunk-wnmqt1dc.js +4 -0
- package/dist/src/{chunk-8en08r7q.js → chunk-wpe46vsa.js} +3 -3
- package/dist/src/chunk-wxdjeb4k.js +27 -0
- package/dist/src/chunk-xcqzwf9j.js +247 -0
- package/dist/src/chunk-xezekwwn.js +5 -0
- package/dist/src/chunk-xf19m15s.js +4 -0
- package/dist/src/chunk-xghbxha4.js +4 -0
- package/dist/src/{chunk-jhnbfj19.js → chunk-xn9m3xc2.js} +5 -5
- package/dist/src/{chunk-a4k9rt7z.js → chunk-yqfz4vts.js} +3 -3
- package/dist/src/chunk-z8tvs8nk.js +5 -0
- package/dist/src/chunk-zm2rehqb.js +5 -0
- package/dist/src/chunk-zs6dqm35.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 +4 -3
- 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-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-w2mwa0jk.js +0 -4
- 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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{i,l,e}from"./chunk-r0vp315h.js";import{Ug,rP,Ei,gr,Ce}from"./chunk-sfqe223f.js";import{t,u}from"./chunk-2b39zyxc.js";function _(r){let s=[],n=[];for(let o of r.split(`
|
|
3
|
+
`)){let d=o.trim();if(!d)continue;let c=o.length-o.trimStart().length;while(n.length&&n[n.length-1].indent>=c)n.pop();let a={text:d,indent:c,children:[]};n[n.length-1]?.children.push(a),s.push(a),n.push(a)}return s}function v(r){let s=new Map;for(let{text:n}of r?.children??[]){let o=n.match(/^([A-Za-z0-9_.]+):\s+granted=(true|false)\b(.*)$/);if(!o)continue;let[,d,c,a]=o;s.set(d,{permission:d,state:c==="true"?"granted":"denied",source:"androidRuntime",raw:{granted:c==="true",flags:a.trim()||null}})}return s}function I(r,s){let o=r.children.find((d)=>d.text.startsWith("sharedUser=SharedUserSetting{"))?.text.split(" ")[1]?.split("/")[0];return o?s.find((d)=>d.text==="Shared users:")?.children.find((d)=>d.text.startsWith(`SharedUser [${o}]`)):void 0}function wn(r,s,n=0){let o=_(r),d=o.find((p)=>p.text.startsWith(`Package [${s}]`)),c=d?.children.find((p)=>p.text==="requested permissions:");if(!d)return;let a=I(d,o),m=d.children.find((p)=>p.text==="install permissions:")??a?.children.find((p)=>p.text==="install permissions:"),f=d.children.find((p)=>p.text.startsWith(`User ${n}:`)),S=a?.children.find((p)=>p.text.startsWith(`User ${n}:`)),g=f?.children.find((p)=>p.text==="runtime permissions:")??S?.children.find((p)=>p.text==="runtime permissions:");return{requestedPermissions:new Set(c?.children.map((p)=>p.text)??[]),installPermissions:v(m),runtimePermissions:v(g)}}function A(r){return["shell",`echo $$; exec ${r.join(" ")}`]}function O(r){let s=r.trim();if(!/^\d+$/.test(s))return;let n=Number(s);return Number.isSafeInteger(n)&&n>0?n:void 0}function w(r){let s={pid:void 0},n="",o=!1;return r.on("data",(d)=>{if(o)return;n+=d.toString();let c=n.indexOf(`
|
|
4
|
+
`);if(c===-1&&n.length<=32)return;o=!0,s.pid=O(c===-1?n:n.slice(0,c))}),s}function P5(r,s){let n=r.split(/[\0\s]+/).filter((o)=>o.length>0);return n.length>0&&(n[0]==="screenrecord"||n[0].endsWith("/screenrecord"))&&n.includes(s)}function vee(r,s){if(r.warning=s?.warning??r.warning,r.warning?.includes("rejected --display-id"))r.recordedPanel=void 0}function N(r,s){return r!==void 0&&r!==null&&r!==0&&/usage|unknown (?:option|argument)|unrecognized (?:option|argument)/i.test(s.join(""))}async function oF(r,s,n=20){let o=Error("screenrecord display flag probe timed out");try{await l(r.exitPromise,{timer:s,timeoutMs:n,label:"screenrecord display flag probe",timeoutError:()=>o})}catch(d){if(d!==o)throw u(d,"Android screenrecord startup failed");e.debug("[VideoCapture] screenrecord display flag probe found a live capture")}return N(r.exitState.exitCode,r.stderr)}function M(r,s){if(s!==void 0&&s!=="active")throw new t("Recording a selected Android panel requires API 34 or newer.");let n=Ei(r,"active",{}),o={key:n.key,role:n.role};return{panel:o,activePanel:o,warning:"Android API below 34: recording the default display without a pinned panel."}}function U(r,s){if(!r.displays?.panels.length){if(s!==void 0&&s!=="active")Ei(r,s,{});return}let n=Ei(r,s,{}),o={key:n.key,role:n.role};return{panel:o,activePanel:o}}async function wV(r,s,{request:n,signal:o,timer:d=i}={}){if(rP(r,n),(r.displays?.panels.length??0)<2)return U(r,n);if(r.apiLevel!==void 0&&r.apiLevel<34)return M(r,n);let c=await new gr(d).resolve(r,s,o,!0),a=Ce.observedPanel(r.deviceId),m=a&&r.displays?.panels.some((S)=>S.key===a.key)?a:c.display,f=Ei(r,n,{focusedPanelKey:m.key,activePanelKey:c.display.key,posture:c.display.posture});if(!/^(0|[1-9]\d*)$/.test(f.key))throw new t(`Display panel "${f.key}" has no physical Android display ID.`);return{panel:{key:f.key,role:f.role},physicalId:f.key,activePanel:{key:m.key,role:m.role}}}var Oi=180,A5=170000,ZA={gracefulExit:1e4,pkill:8000,tempFileRemove:8000,probe:5000,pkillOpts:{timeoutMs:8000}},L=100;async function W(r,s){if(!r||r.readableEnded||r.destroyed)return;let n=new Promise((d)=>{r.once("end",d),r.once("close",d)}),o=Error("screenrecord stderr drain timed out");try{await l(n,{timer:s,timeoutMs:L,label:"screenrecord stderr drain",timeoutError:()=>o})}catch(d){if(d!==o)throw d;e.debug("[VideoCapture] screenrecord stderr did not end before the drain deadline")}}var D=1000,F=8192,V=1000,j=/\/sdcard\/auto-mobile-[^\s'":]+\.mp4/g,x={maxStderrChars:F};function sF(r){return r.join("").replace(j,"<device recording file>").trim().slice(-V)}function __(r,s){let n=r.exitCode;if(!(n!==void 0&&n!==null&&n!==0)&&!r.signal)return;let d=r.signal?`signal ${r.signal}`:`code ${n}`,c=r.endedAt?` at ${r.endedAt}`:"",a=sF(s);return`exited${c} with ${d}${a?`: ${a}`:""}`}async function bee(r,s,n,o){n.abortSignal?.throwIfAborted();let[d,c]=o.deviceTempPaths,a=await T(r,{argv:s,deviceTempPath:d},n,o);if(!("failure"in a))return a;if(!n.abortSignal?.aborted)e.warn(`[VideoCapture] ${a.failure.message} ${sF(a.stderr)?"":"stderr was empty; "}retrying once after ${o.timer.now()-a.launchedAtMs} ms since launch.`);await o.cleanupFailedStart(a.devicePid,d),n.abortSignal?.throwIfAborted();let m=await T(r,{argv:s,deviceTempPath:c},n,o);if("failure"in m)throw await o.cleanupFailedStart(m.devicePid,c),n.abortSignal?.throwIfAborted(),m.failure;return m}async function T(r,{argv:s,deviceTempPath:n},o,{device:d,physicalDisplayId:c,timer:a,cleanupFailedStart:m}){let f=[...s,n],S=a.now(),g=await r.spawn(A(f),{signal:o.abortSignal,abortSignalScope:"startup"}),p=w(g.stdout),b=()=>g.kill("SIGTERM");o.abortSignal?.addEventListener("abort",b,{once:!0});let h=[];try{if(o.abortSignal?.aborted)b();let{exitState:y,exitPromise:P}=Ug(g,h,x),R,E=c;if(await oF({exitPromise:P,exitState:y,stderr:h},a,D)&&c!==void 0&&d.apiLevel===void 0)R="Android screenrecord rejected --display-id; recording the default display.",e.warn(`[VideoCapture] ${R}`),S=a.now(),g=await r.spawn(A(f.filter((C,k)=>C!=="--display-id"&&f[k-1]!=="--display-id")),{signal:o.abortSignal,abortSignalScope:"startup"}),p=w(g.stdout),h=[],{exitState:y,exitPromise:P}=Ug(g,h,x),E=void 0,await oF({exitPromise:P,exitState:y,stderr:h},a,D);if(__(y,h))return o.abortSignal?.throwIfAborted(),await W(g.stderr,a),{failure:new t(`Android screenrecord ${__(y,h)} within ${D} ms of launch, so no recording was started.`),stderr:h,devicePid:p,launchedAtMs:S};return{process:g,exitState:y,exitPromise:P,stderr:h,devicePid:p,warning:R,physicalDisplayId:E,launchedAtMs:S,deviceTempPath:n}}catch(y){throw await m(p,n),y}finally{o.abortSignal?.removeEventListener("abort",b)}}class Zc extends t{}class Em extends t{deviceId;recordingIds;code="orphan_recorder_active";retryable=!0;constructor(r,s,n){super(`A recorder from before the daemon restart is still running on device '${r}' and could not be stopped. Retry or stop it by id (${s.join(", ")}).`,{cause:n});this.deviceId=r;this.recordingIds=s;this.name="OrphanRecorderActiveError"}toPayload(){return{code:this.code,message:this.message,retryable:this.retryable,deviceId:this.deviceId,recordingIds:this.recordingIds}}}
|
|
5
|
+
export{wn,P5,vee,oF,wV,Oi,A5,ZA,sF,__,bee,Zc,Em};
|
|
6
|
+
|
|
7
|
+
//# debugId=9C1A13782193C7F464756E2164756E21
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
3
|
-
`);if(S<0&&h.length<=I)return;if(b=!0,S<0||S>I)return;let f=h.slice(0,S).trim(),E=/^\d+$/.test(f)?Number(f):NaN;if(Number.isSafeInteger(E)&&E>0)y=E};try{let w=`echo $$; exec ${m}`;return await n.execute(["shell",w],{...u,noRetry:!0,waitForProcessSettlementAfterAbort:!0,onStdout:T})}catch(w){if(y===void 0)e.warn("[ADB input text] Guest PID unavailable; using host process settlement only");else{e.warn(`[ADB input text] Dispatch failed; settling guest PID ${y}`);let S=Math.min(C,x+g*c);await q(n,s,y,{terminate:!0,settlementMs:S})}throw w}}async function B(n,s,a,{textLength:d,signal:c,timeoutMs:u,...m}){c?.throwIfAborted();let p=L(d),y=new AbortController,h=!1,b=Je(()=>n.execute(["shell",a],{...m,noRetry:!0,timeoutMs:(u??0)+p,signal:y.signal,onStdout:(f)=>{h||=f.length>0}})),T=s.now(),w=!1,S=!1;b.then(()=>{w=!0},()=>{w=!0,S=!0});try{let f=await l(b,{timer:s,timeoutMs:u,signal:c,label:"Android input text",timeoutError:()=>new dt(`Android input text timed out after ${u}ms`)}),E=K*d-(s.now()-T);if(E>0)await V(s,E,c);return f}catch(f){let E=S;if(!w){if(!h)y.abort(f);await U(s,b,p),y.abort(f)}if(h&&!E)await s.sleep(K*d+H);throw f}}function V(n,s,a){return new Promise((d,c)=>{if(a?.aborted){c(a.reason);return}let u=()=>{n.clearTimeout(m),c(a?.reason)},m=n.setTimeout(()=>{a?.removeEventListener("abort",u),d()},s);a?.addEventListener("abort",u,{once:!0})})}function L(n){return Math.min(N,x+M*n)}async function U(n,s,a){e.warn(`[ADB input text] Cancelled; holding for the host client up to ${a}ms`);try{await l(s.then(()=>{return},()=>{return}),{timer:n,timeoutMs:a,label:"Android input text host settlement"})}catch(d){e.warn(`[ADB input text] Host client settlement deadline expired after ${a}ms`,d)}}function W(n,s){let a=["input text ","/system/bin/input text ","sh /system/bin/input text ","/system/bin/sh /system/bin/input text ","cmd input text ","/system/bin/cmd input text ","app_process /system/bin com.android.commands.input.Input text ","/system/bin/app_process /system/bin com.android.commands.input.Input text "].map((d)=>`"${d}"*`).join("|");return["shell",`if [ -r /proc/${n}/cmdline ]; then if cmdline=$(tr '\\0' ' ' < /proc/${n}/cmdline 2>/dev/null); then case "$cmdline" in ${a}) ${s?`kill ${n} 2>/dev/null; `:""}echo alive;; esac; else echo alive; fi; fi`]}async function q(n,s,a,{terminate:d,settlementMs:c}){let u=s.now()+c,m=new AbortController,p=!1,y=async()=>{while(!p&&s.now()<u){try{let b=await n.execute(W(a,d),{signal:m.signal,timeoutMs:Math.min(F,u-s.now()),noRetry:!0});if(d=!1,b.stdout.trim()!=="alive")return}catch(b){if(p)e.debug(`[ADB input text] Probe for guest PID ${a} ended after settlement deadline`,b);else e.warn(`[ADB input text] Could not verify guest PID ${a}`,b)}let h=u-s.now();if(p||h<=0)return;await s.sleep(Math.min(D,h))}};try{await l(y,{timer:s,timeoutMs:c,label:"Android input text guest settlement",onTimeout:()=>{p=!0,m.abort()}})}catch(h){e.warn(`[ADB input text] Guest PID ${a} settlement deadline expired after ${c}ms`,h)}}function tv(n,s){return`IME action '${n}' failed after the text was entered: ${s}. Do not retype the text.`}async function P(n,s,a,d){if(Zs(n)&&!await d())return"Runner does not support stable node selectors";if(!WF(s))return"Unable to verify the node selector in an incomplete hierarchy";let c=new we().project(s).filter((m)=>KL(m.properties,n)),u=new Set(c.map((m)=>m.source)).size;if(u!==1)return u>1?`Node selector matches ${u} elements`:"Node selector matches no element in the current hierarchy";return Y(c[0],a)?void 0:"Node selector does not resolve to the focused text input"}function Y(n,s){let a=String(n.properties.class??n.properties.className??"");return st(n.properties.focused)&&eg.some((d)=>a.includes(d))&&n.bounds!==void 0&&s.bounds!==void 0&&Ms(n.bounds,s.bounds,0)}function A(n,s){return`Keyboard open outcome is indeterminate: the ${n} was dispatched but no result was confirmed (${s??"request cancelled"}). The keyboard may have opened. Do not retry automatically; observe before retrying.`}class ev extends t{constructor(n,s){super(A(n,s));this.name="KeyboardOpenIndeterminateError"}}class O{viewHierarchy;cache;constructor(n,s){this.viewHierarchy=n,this.cache=s}async getViewHierarchy(n,s){if(s?.forceFresh)this.cache.invalidateCache();return this.viewHierarchy.getViewHierarchy(void 0,{skipWaitForFresh:!1,minTimestamp:0,signal:n,timeoutMs:s?.timeoutMs})}}function X(n,s,a){return n==="ios"?s():a()}function Q(n,s){return n?.length===s.length&&n.every((a,d)=>a.left===s[d].left&&a.top===s[d].top&&a.right===s[d].right&&a.bottom===s[d].bottom)}class bo{static INPUT_METHOD_WINDOW_TYPE=2;static STATE_CONFIRMATION_TIMEOUT_MS=2000;static IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS=2000;static IOS_KEYBOARD_SETTLE_TIMEOUT_MS=1500;static IOS_KEYBOARD_SETTLE_INTERVAL_MS=250;static STATE_CONFIRMATION_POLL_INTERVAL_MS=100;static CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS=2000;device;adb;hierarchyProvider;parser;geometry;finder;timer;adbFactory;openClient;constructor(n,s={}){let{adbFactory:a=v,hierarchyProvider:d,timer:c=i,parser:u=new G,geometry:m=new tr,finder:p=new dC,openClient:y}=s;if(this.device=n,this.adbFactory=a,this.openClient=y,this.adb=a.create(n),this.parser=u,this.geometry=m,this.finder=p,this.timer=c,d)this.hierarchyProvider=d;else this.hierarchyProvider=new O(new Vi(n,a),X(n.platform,()=>_.getInstance(n),()=>k.getInstance(n,a)))}async execute(n,s){let{signal:a}=xh(s);if(o(a),this.device.platform==="ios")return this.executeIOS(n,a);switch(n){case"detect":return this.detect(a);case"open":return this.open(a);case"close":return this.close(a);default:return{success:!1,open:!1,message:`Unsupported keyboard action: ${n}`,error:`Unsupported keyboard action: ${n}`}}}async executeIOS(n,s){let a=_.getInstance(this.device);o(s);let d=await R(a.requestKeyboard(n,void 0,void 0,s),s);if(o(s),!d.success)return this.iosFailure(n,d,a,s);if(n!=="close"&&d.open===!0&&j(await this.settledIOSKeyboardVisibility(s))){let c=n==="detect"?"Keyboard is closed (no visible on-screen software keyboard)":"Keyboard did not open: no visible on-screen software keyboard. It may be minimized off screen because the simulator uses a hardware keyboard and cannot be shown on request.";return{success:n==="detect",open:!1,message:c,...n==="open"?{error:c}:{}}}return this.iosKeyboardResult(n,d)}iosKeyboardResult(n,s){let a=n==="detect"||n==="open"&&s.open||n==="close"&&!s.open,d=this.keyboardMessage(n,s.open,s.method);return{success:a,open:s.open,message:d,...n==="close"&&s.method?{method:s.method}:{},...a?{}:{error:d}}}async settledIOSKeyboardVisibility(n){let s=await this.isIOSKeyboardOnScreen(n,bo.IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS);if(s!==!1)return s===!0?"visible":"unknown";let a=!1,d=this.timer.now()+bo.IOS_KEYBOARD_SETTLE_TIMEOUT_MS;while(this.timer.now()<d){await R(this.timer.sleep(Math.min(bo.IOS_KEYBOARD_SETTLE_INTERVAL_MS,d-this.timer.now())),n),o(n);let c=await this.isIOSKeyboardOnScreen(n,bo.IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS);if(c===!0)return"visible";a||=c===!1}return a?"hidden":"hidden_unconfirmed"}async isIOSKeyboardOnScreen(n,s){try{let a=await l(()=>this.hierarchyProvider.getViewHierarchy(n,{timeoutMs:s,forceFresh:!0}),{timer:this.timer,timeoutMs:s,signal:n,label:"iOS keyboard visibility hierarchy"});if(o(n),a?.fresh===!1){e.warn("iOS keyboard visibility hierarchy is stale; using runner state");return}let d=a?.screenWidth,c=a?.screenHeight;if(!a||a.hierarchy?.error||![d,c].every((p)=>typeof p==="number"&&Number.isFinite(p)&&p>0))return;let u=new Qc(this.parser).collect(a,"ios"),m=u&&TD(u);return!!m&&_z(m,{width:d,height:c})!==void 0}catch(a){o(n),e.warn("iOS keyboard visibility hierarchy read failed; using runner state",a);return}}async iosFailure(n,s,a,d){if(n==="close"&&/^Keyboard timed out after \d+ms$/.test(s.error??"")&&await this.confirmIOSCloseAfterTimeout(a,d))return{success:!0,open:!1,message:"Keyboard closed after the close request timed out; dismissal method unknown (Return may have submitted the field)"};let c=n==="close"?await this.settledIOSKeyboardVisibility(d):void 0;if(c==="hidden")return e.warn(`iOS keyboard close failed but no software keyboard is visible: ${s.error}`),{success:!0,open:!1,message:"Keyboard is closed (no visible on-screen software keyboard)"};if(c==="hidden_unconfirmed")return this.iosCloseStateUnknown(s);let u=s.error??`Failed to ${n} iOS keyboard`;return{success:!1,open:s.open,message:u,error:u}}iosCloseStateUnknown(n){let s=n.error??"Failed to close iOS keyboard";e.warn(`iOS keyboard close failed and no settle re-read confirmed the keyboard gone: ${s}`);let a=`Keyboard state unknown after close: ${s}. One hierarchy read showed no keyboard, but every re-read timed out or failed, so the keyboard may still be on screen. Run keyboard detect to check.`;return{success:!1,open:n.open,message:a,error:a,reason:"keyboard_state_unknown"}}async confirmIOSCloseAfterTimeout(n,s){try{o(s);let a=await R(l(n.requestKeyboard("detect",bo.CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS,void 0,s),{timer:this.timer,timeoutMs:bo.CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS,label:"Keyboard close follow-up detect"}),s);return a.success&&!a.open}catch(a){return o(s),e.warn(`Keyboard close timeout follow-up detect failed: ${String(a)}`,a),!1}}keyboardMessage(n,s,a){if(n==="detect")return s?"Keyboard is open":"Keyboard is closed";if(n==="open")return s?"Keyboard opened":"Keyboard did not open";if(!s&&a==="returnKey")return"Keyboard closed with Return; the field may have submitted or committed autocorrect";return s?"Keyboard did not close":"Keyboard closed"}async detect(n){let{state:s}=await this.getHierarchyWithState(n);if(s.error)return{success:!1,open:s.open,bounds:s.bounds,message:s.error,error:s.error};return{success:!0,open:s.open,bounds:s.bounds,message:s.open?"Keyboard is open":"Keyboard is closed"}}async open(n){let{hierarchy:s,state:a}=await this.getHierarchyWithState(n);if(a.error)return{success:!1,open:a.open,bounds:a.bounds,message:a.error,error:a.error};if(a.open)return{success:!0,open:!0,bounds:a.bounds,message:"Keyboard already open"};let d=s?this.findFocusedTextInput(s):null;if(!d)return{success:!1,open:!1,message:"No focused text input to open keyboard",error:"No focused text input to open keyboard"};let c=await this.showWithoutTouch(d,s,n);if(c.kind==="unconfirmed"){let y=A("node click",c.error);return{success:!1,open:!1,message:y,error:y}}if(c.kind==="sent")return this.openResult(await this.waitForKeyboardState(!0,n),"Keyboard opened");let u=await this.readCaret(n);await this.tapOnElement(d,n);let m=await this.waitForKeyboardState(!0,n),p=m.open?await this.caretMovedNote(u,n):"";return this.openResult(m,"Keyboard opened",p)}openResult(n,s,a=""){let d=n.open&&!n.error,c=d?`${s}${a}`:n.error??"Failed to open keyboard";return{success:d,open:n.open,bounds:n.bounds,message:c,...n.error?{error:n.error}:{}}}getOpenClient(){return this.openClient??=k.getInstance(this.device,this.adbFactory),this.openClient}async showWithoutTouch(n,s,a){let d=rs(n);if(!d)return this.dispatchNodeClick(this.getOpenClient(),void 0,a);let c;try{c=this.getOpenClient();let u=await P(d,s,n,()=>R(c.supportsNodeActionSelectors(void 0,a),a));if(u)return e.warn(`Keyboard open: node click unavailable (${u})`),{kind:"unavailable"}}catch(u){return o(a),e.warn(`Keyboard open: node click errored: ${r(u)}`,u),{kind:"unavailable"}}return this.dispatchNodeClick(c,d,a)}async dispatchNodeClick(n,s,a){o(a);let d;try{d=s?await n.requestNodeAction("click",s,{signal:a}):await n.requestClickFocusedInput(void 0,void 0,a)}catch(m){return o(a),e.warn(`Keyboard open: node click errored: ${r(m)}`,m),{kind:"unavailable"}}let u=!(!s&&d.error==="Unknown command type: request_click_focused_input")&&d.dispatched===!0&&d.acknowledged!==!0;if(a?.aborted&&u)throw new ev("node click",d.error);if(o(a),d.success)return{kind:"sent"};return e.warn(`Keyboard open: node click failed (${d.error??"unknown error"})`),u?{kind:"unconfirmed",error:d.error}:{kind:"unavailable"}}async readCaret(n){try{let s=await R(this.getOpenClient().requestInsertTextState(),n);return o(n),s.success?s.state:void 0}catch(s){o(n),e.warn(`Keyboard open: caret read failed: ${r(s)}`,s);return}}async caretMovedNote(n,s){if(!n)return"";let a=await this.readCaret(s);if(!a||a.selectionStart===n.selectionStart&&a.selectionEnd===n.selectionEnd)return"";let d=(c)=>`${c.selectionStart}-${c.selectionEnd}`;return` (the tap used to show it moved the caret from ${d(n)} to ${d(a)})`}async close(n){let{state:s}=await this.getHierarchyWithState(n,{timeoutMs:bo.STATE_CONFIRMATION_TIMEOUT_MS,forceFresh:!0});if(s.error)return{success:!1,open:s.open,bounds:s.bounds,message:s.error,error:s.error};if(!s.open)return{success:!0,open:!1,message:"Keyboard already closed"};o(n),await R(this.adb.executeCommand("shell input keyevent KEYCODE_BACK",{signal:n}),n);let a=await this.waitForKeyboardState(!1,n),d=!a.open&&!a.error,c=d?"Keyboard closed":a.error??"Failed to close keyboard";return{success:d,open:a.open,bounds:a.bounds,message:c,...a.error?{error:a.error}:{}}}async waitForKeyboardState(n,s){let a=this.timer.now()+bo.STATE_CONFIRMATION_TIMEOUT_MS,d=await this.readKeyboardStateBefore(a,s),c;while(!this.isStateSettled(d,c,n)){c=d;let u=a-this.timer.now();if(o(s),u<=0)break;if(await R(this.timer.sleep(Math.min(bo.STATE_CONFIRMATION_POLL_INTERVAL_MS,u)),s),o(s),this.timer.now()>=a)break;d=await this.readKeyboardStateBefore(a,s)}return d}isStateSettled(n,s,a){if(n.error||n.open!==a)return!1;if(!a||!n.bounds?.length)return!0;return s?.open===!0&&Q(s.bounds,n.bounds)}async readKeyboardStateBefore(n,s){let{state:a}=await this.getHierarchyWithState(s,{timeoutMs:Math.max(0,n-this.timer.now()),forceFresh:!0});return a}async getHierarchyWithState(n,s){o(n);let a=await R(this.hierarchyProvider.getViewHierarchy(n,s),n);return o(n),{hierarchy:a,state:this.resolveKeyboardState(a)}}resolveKeyboardState(n){if(!n)return{open:!1,error:"No view hierarchy available"};let s=n.windows??[],a=s.length>0,d=s.some((m)=>m.type===bo.INPUT_METHOD_WINDOW_TYPE),c=this.findKeyboardWindowBounds(n);if(c)return{open:!0,bounds:[c],source:"window",windowInfoAvailable:a,imeWindowPresent:!0};if((d||!a)&&this.detectKeyboardInHierarchy(n))return{open:!0,source:"heuristic",windowInfoAvailable:a,imeWindowPresent:d};let u=n.hierarchy?.error;if(u)return{open:!1,error:u};return{open:!1}}findKeyboardWindowBounds(n){let s=n.windows??[];for(let a of s){if(a.type!==bo.INPUT_METHOD_WINDOW_TYPE)continue;if(a.bounds&&this.isValidBounds(a.bounds))return a.bounds}return null}isValidBounds(n){return n.right>n.left&&n.bottom>n.top}detectKeyboardInHierarchy(n){let s=this.parser.extractRootNodes(n),a=["delete","enter","keyboard","emoji","shift"];for(let d of s){let c=!1;if(this.parser.traverseNode(d,(u)=>{if(c)return;let m=this.parser.extractNodeProperties(u),p=this.getStringProp(m,"resource-id","resourceId"),y=this.getStringProp(m,"content-desc","contentDesc"),h=p?.toLowerCase(),b=y?.toLowerCase();if(h&&(h.includes("keyboard")||h.includes("inputmethod"))){c=!0;return}if(b&&a.some((T)=>b.includes(T)))c=!0}),c)return!0}return!1}getStringProp(n,s,a){let d=n[s];if(typeof d==="string")return d;let c=n[a];if(typeof c==="string")return c;return}findFocusedTextInput(n){let s=this.finder.findFocusedTextInput(n);if(!s||!s.bounds)return null;return s}async tapOnElement(n,s){let a=this.geometry.getElementCenter(n),d=Math.round(a.x),c=Math.round(a.y);o(s);try{await this.adb.executeCommand(`shell input tap ${d} ${c}`,{signal:s,waitForProcessSettlementAfterAbort:!0})}catch(u){if(s?.aborted)throw new ev("tap",r(u));throw u}}}function j(n){return n==="hidden"||n==="hidden_unconfirmed"}
|
|
4
|
-
export{
|
|
2
|
+
import{Xe,ht,v,o,P,dt,jg,mn,K,Dl,fe,Sd,or,DO,f2,x,E,Qi}from"./chunk-sfqe223f.js";import{i,l,e}from"./chunk-r0vp315h.js";import{Eu,Kn,fa,Sg,mD}from"./chunk-cb1ga9rd.js";import{r,t}from"./chunk-2b39zyxc.js";var C=3000,R=4,M=30000,N=20,H=60000,g=14,D=500,F=75,B=500,A=32;async function aB(n,s,a,{apiLevel:d,textLength:c,...u}){let m=a.slice(6);if(d===null||d>=31)return V(n,s,`echo $$; exec ${d===null?"":"cmd "}${m}`,{textLength:c,...u});let y,h="",b=!1,I=(w)=>{if(b)return;h+=w.slice(0,A+1);let S=h.indexOf(`
|
|
3
|
+
`);if(S<0&&h.length<=A)return;if(b=!0,S<0||S>A)return;let f=h.slice(0,S).trim(),T=/^\d+$/.test(f)?Number(f):NaN;if(Number.isSafeInteger(T)&&T>0)y=T};try{let w=`echo $$; exec ${m}`;return await n.execute(["shell",w],{...u,noRetry:!0,waitForProcessSettlementAfterAbort:!0,onStdout:I})}catch(w){if(y===void 0)e.warn("[ADB input text] Guest PID unavailable; using host process settlement only");else{e.warn(`[ADB input text] Dispatch failed; settling guest PID ${y}`);let S=Math.min(M,C+R*c);await Y(n,s,y,{terminate:!0,settlementMs:S})}throw w}}async function V(n,s,a,{textLength:d,signal:c,timeoutMs:u,...m}){c?.throwIfAborted();let p=U(d),y=new AbortController,h=!1,b=Xe(()=>n.execute(["shell",a],{...m,noRetry:!0,timeoutMs:(u??0)+p,signal:y.signal,onStdout:(f)=>{h||=f.length>0}})),I=s.now(),w=!1,S=!1;b.then(()=>{w=!0},()=>{w=!0,S=!0});try{let f=await l(b,{timer:s,timeoutMs:u,signal:c,label:"Android input text",timeoutError:()=>new ht(`Android input text timed out after ${u}ms`)}),T=g*d-(s.now()-I);if(T>0)await L(s,T,c);return f}catch(f){let T=S;if(!w){if(!h)y.abort(f);await W(s,b,p),y.abort(f)}if(h&&!T)await s.sleep(g*d+D);throw f}}function L(n,s,a){return new Promise((d,c)=>{if(a?.aborted){c(a.reason);return}let u=()=>{n.clearTimeout(m),c(a?.reason)},m=n.setTimeout(()=>{a?.removeEventListener("abort",u),d()},s);a?.addEventListener("abort",u,{once:!0})})}function U(n){return Math.min(H,C+N*n)}async function W(n,s,a){e.warn(`[ADB input text] Cancelled; holding for the host client up to ${a}ms`);try{await l(s.then(()=>{return},()=>{return}),{timer:n,timeoutMs:a,label:"Android input text host settlement"})}catch(d){e.warn(`[ADB input text] Host client settlement deadline expired after ${a}ms`,d)}}function q(n,s){let a=["input text ","/system/bin/input text ","sh /system/bin/input text ","/system/bin/sh /system/bin/input text ","cmd input text ","/system/bin/cmd input text ","app_process /system/bin com.android.commands.input.Input text ","/system/bin/app_process /system/bin com.android.commands.input.Input text "].map((d)=>`"${d}"*`).join("|");return["shell",`if [ -r /proc/${n}/cmdline ]; then if cmdline=$(tr '\\0' ' ' < /proc/${n}/cmdline 2>/dev/null); then case "$cmdline" in ${a}) ${s?`kill ${n} 2>/dev/null; `:""}echo alive;; esac; else echo alive; fi; fi`]}async function Y(n,s,a,{terminate:d,settlementMs:c}){let u=s.now()+c,m=new AbortController,p=!1,y=async()=>{while(!p&&s.now()<u){try{let b=await n.execute(q(a,d),{signal:m.signal,timeoutMs:Math.min(B,u-s.now()),noRetry:!0});if(d=!1,b.stdout.trim()!=="alive")return}catch(b){if(p)e.debug(`[ADB input text] Probe for guest PID ${a} ended after settlement deadline`,b);else e.warn(`[ADB input text] Could not verify guest PID ${a}`,b)}let h=u-s.now();if(p||h<=0)return;await s.sleep(Math.min(F,h))}};try{await l(y,{timer:s,timeoutMs:c,label:"Android input text guest settlement",onTimeout:()=>{p=!0,m.abort()}})}catch(h){e.warn(`[ADB input text] Guest PID ${a} settlement deadline expired after ${c}ms`,h)}}function Vv(n,s){return`IME action '${n}' failed after the text was entered: ${s}. Do not retype the text.`}async function k(n,s,a,d){if(fa(n)&&!await d())return"Runner does not support stable node selectors";if(!Eu(s))return"Unable to verify the node selector in an incomplete hierarchy";let c=new fe().project(s).filter((m)=>Dl(m.properties,n)),u=new Set(c.map((m)=>m.source)).size;if(u!==1)return u>1?`Node selector matches ${u} elements`:"Node selector matches no element in the current hierarchy";return X(c[0],a)?void 0:"Node selector does not resolve to the focused text input"}function X(n,s){let a=String(n.properties.class??n.properties.className??"");return dt(n.properties.focused)&&jg.some((d)=>a.includes(d))&&n.bounds!==void 0&&s.bounds!==void 0&&mn(n.bounds,s.bounds,0)}function _(n,s){return`Keyboard open outcome is indeterminate: the ${n} was dispatched but no result was confirmed (${s??"request cancelled"}). The keyboard may have opened. Do not retry automatically; observe before retrying.`}class qv extends t{constructor(n,s){super(_(n,s));this.name="KeyboardOpenIndeterminateError"}}class O{viewHierarchy;cache;constructor(n,s){this.viewHierarchy=n,this.cache=s}async getViewHierarchy(n,s){if(s?.forceFresh)this.cache.invalidateCache();return this.viewHierarchy.getViewHierarchy(void 0,{skipWaitForFresh:!1,minTimestamp:0,signal:n,timeoutMs:s?.timeoutMs})}}function G(n,s,a){return n==="ios"?s():a()}function Q(n,s){return n?.length===s.length&&n.every((a,d)=>a.left===s[d].left&&a.top===s[d].top&&a.right===s[d].right&&a.bottom===s[d].bottom)}class Eo{static INPUT_METHOD_WINDOW_TYPE=2;static STATE_CONFIRMATION_TIMEOUT_MS=2000;static IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS=2000;static IOS_KEYBOARD_SETTLE_TIMEOUT_MS=1500;static IOS_KEYBOARD_SETTLE_INTERVAL_MS=250;static STATE_CONFIRMATION_POLL_INTERVAL_MS=100;static CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS=2000;device;adb;hierarchyProvider;parser;geometry;finder;timer;adbFactory;openClient;constructor(n,s={}){let{adbFactory:a=v,hierarchyProvider:d,timer:c=i,parser:u=new K,geometry:m=new or,finder:p=new mD,openClient:y}=s;if(this.device=n,this.adbFactory=a,this.openClient=y,this.adb=a.create(n),this.parser=u,this.geometry=m,this.finder=p,this.timer=c,d)this.hierarchyProvider=d;else this.hierarchyProvider=new O(new Qi(n,a),G(n.platform,()=>x.getInstance(n),()=>E.getInstance(n,a)))}async execute(n,s){let{signal:a}=Sg(s);if(o(a),this.device.platform==="ios")return this.executeIOS(n,a);switch(n){case"detect":return this.detect(a);case"open":return this.open(a);case"close":return this.close(a);default:return{success:!1,open:!1,message:`Unsupported keyboard action: ${n}`,error:`Unsupported keyboard action: ${n}`}}}async executeIOS(n,s){let a=x.getInstance(this.device);o(s);let d=await P(a.requestKeyboard(n,void 0,void 0,s),s);if(o(s),!d.success)return this.iosFailure(n,d,a,s);if(n!=="close"&&d.open===!0&&j(await this.settledIOSKeyboardVisibility(s))){let c=n==="detect"?"Keyboard is closed (no visible on-screen software keyboard)":"Keyboard did not open: no visible on-screen software keyboard. It may be minimized off screen because the simulator uses a hardware keyboard and cannot be shown on request.";return{success:n==="detect",open:!1,message:c,...n==="open"?{error:c}:{}}}return this.iosKeyboardResult(n,d)}iosKeyboardResult(n,s){let a=n==="detect"||n==="open"&&s.open||n==="close"&&!s.open,d=this.keyboardMessage(n,s.open,s.method);return{success:a,open:s.open,message:d,...n==="close"&&s.method?{method:s.method}:{},...a?{}:{error:d}}}async settledIOSKeyboardVisibility(n){let s=await this.isIOSKeyboardOnScreen(n,Eo.IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS);if(s!==!1)return s===!0?"visible":"unknown";let a=!1,d=this.timer.now()+Eo.IOS_KEYBOARD_SETTLE_TIMEOUT_MS;while(this.timer.now()<d){await P(this.timer.sleep(Math.min(Eo.IOS_KEYBOARD_SETTLE_INTERVAL_MS,d-this.timer.now())),n),o(n);let c=await this.isIOSKeyboardOnScreen(n,Eo.IOS_KEYBOARD_VISIBILITY_TIMEOUT_MS);if(c===!0)return"visible";a||=c===!1}return a?"hidden":"hidden_unconfirmed"}async isIOSKeyboardOnScreen(n,s){try{let a=await l(()=>this.hierarchyProvider.getViewHierarchy(n,{timeoutMs:s,forceFresh:!0}),{timer:this.timer,timeoutMs:s,signal:n,label:"iOS keyboard visibility hierarchy"});if(o(n),a?.fresh===!1){e.warn("iOS keyboard visibility hierarchy is stale; using runner state");return}let d=a?.screenWidth,c=a?.screenHeight;if(!a||a.hierarchy?.error||![d,c].every((p)=>typeof p==="number"&&Number.isFinite(p)&&p>0))return;let u=new Sd(this.parser).collect(a,"ios"),m=u&&DO(u);return!!m&&f2(m,{width:d,height:c})!==void 0}catch(a){o(n),e.warn("iOS keyboard visibility hierarchy read failed; using runner state",a);return}}async iosFailure(n,s,a,d){if(n==="close"&&/^Keyboard timed out after \d+ms$/.test(s.error??"")&&await this.confirmIOSCloseAfterTimeout(a,d))return{success:!0,open:!1,message:"Keyboard closed after the close request timed out; dismissal method unknown (Return may have submitted the field)"};let c=n==="close"?await this.settledIOSKeyboardVisibility(d):void 0;if(c==="hidden")return e.warn(`iOS keyboard close failed but no software keyboard is visible: ${s.error}`),{success:!0,open:!1,message:"Keyboard is closed (no visible on-screen software keyboard)"};if(c==="hidden_unconfirmed")return this.iosCloseStateUnknown(s);let u=s.error??`Failed to ${n} iOS keyboard`;return{success:!1,open:s.open,message:u,error:u}}iosCloseStateUnknown(n){let s=n.error??"Failed to close iOS keyboard";e.warn(`iOS keyboard close failed and no settle re-read confirmed the keyboard gone: ${s}`);let a=`Keyboard state unknown after close: ${s}. One hierarchy read showed no keyboard, but every re-read timed out or failed, so the keyboard may still be on screen. Run keyboard detect to check.`;return{success:!1,open:n.open,message:a,error:a,reason:"keyboard_state_unknown"}}async confirmIOSCloseAfterTimeout(n,s){try{o(s);let a=await P(l(n.requestKeyboard("detect",Eo.CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS,void 0,s),{timer:this.timer,timeoutMs:Eo.CLOSE_FOLLOW_UP_DETECT_TIMEOUT_MS,label:"Keyboard close follow-up detect"}),s);return a.success&&!a.open}catch(a){return o(s),e.warn(`Keyboard close timeout follow-up detect failed: ${String(a)}`,a),!1}}keyboardMessage(n,s,a){if(n==="detect")return s?"Keyboard is open":"Keyboard is closed";if(n==="open")return s?"Keyboard opened":"Keyboard did not open";if(!s&&a==="returnKey")return"Keyboard closed with Return; the field may have submitted or committed autocorrect";return s?"Keyboard did not close":"Keyboard closed"}async detect(n){let{state:s}=await this.getHierarchyWithState(n);if(s.error)return{success:!1,open:s.open,bounds:s.bounds,message:s.error,error:s.error};return{success:!0,open:s.open,bounds:s.bounds,message:s.open?"Keyboard is open":"Keyboard is closed"}}async open(n){let{hierarchy:s,state:a}=await this.getHierarchyWithState(n);if(a.error)return{success:!1,open:a.open,bounds:a.bounds,message:a.error,error:a.error};if(a.open)return{success:!0,open:!0,bounds:a.bounds,message:"Keyboard already open"};let d=s?this.findFocusedTextInput(s):null;if(!d)return{success:!1,open:!1,message:"No focused text input to open keyboard",error:"No focused text input to open keyboard"};let c=await this.showWithoutTouch(d,s,n);if(c.kind==="unconfirmed"){let y=_("node click",c.error);return{success:!1,open:!1,message:y,error:y}}if(c.kind==="sent")return this.openResult(await this.waitForKeyboardState(!0,n),"Keyboard opened");let u=await this.readCaret(n);await this.tapOnElement(d,n);let m=await this.waitForKeyboardState(!0,n),p=m.open?await this.caretMovedNote(u,n):"";return this.openResult(m,"Keyboard opened",p)}openResult(n,s,a=""){let d=n.open&&!n.error,c=d?`${s}${a}`:n.error??"Failed to open keyboard";return{success:d,open:n.open,bounds:n.bounds,message:c,...n.error?{error:n.error}:{}}}getOpenClient(){return this.openClient??=E.getInstance(this.device,this.adbFactory),this.openClient}async showWithoutTouch(n,s,a){let d=Kn(n);if(!d)return this.dispatchNodeClick(this.getOpenClient(),void 0,a);let c;try{c=this.getOpenClient();let u=await k(d,s,n,()=>P(c.supportsNodeActionSelectors(void 0,a),a));if(u)return e.warn(`Keyboard open: node click unavailable (${u})`),{kind:"unavailable"}}catch(u){return o(a),e.warn(`Keyboard open: node click errored: ${r(u)}`,u),{kind:"unavailable"}}return this.dispatchNodeClick(c,d,a)}async dispatchNodeClick(n,s,a){o(a);let d;try{d=s?await n.requestNodeAction("click",s,{signal:a}):await n.requestClickFocusedInput(void 0,void 0,a)}catch(m){return o(a),e.warn(`Keyboard open: node click errored: ${r(m)}`,m),{kind:"unavailable"}}let u=!(!s&&d.error==="Unknown command type: request_click_focused_input")&&d.dispatched===!0&&d.acknowledged!==!0;if(a?.aborted&&u)throw new qv("node click",d.error);if(o(a),d.success)return{kind:"sent"};return e.warn(`Keyboard open: node click failed (${d.error??"unknown error"})`),u?{kind:"unconfirmed",error:d.error}:{kind:"unavailable"}}async readCaret(n){try{let s=await P(this.getOpenClient().requestInsertTextState(),n);return o(n),s.success?s.state:void 0}catch(s){o(n),e.warn(`Keyboard open: caret read failed: ${r(s)}`,s);return}}async caretMovedNote(n,s){if(!n)return"";let a=await this.readCaret(s);if(!a||a.selectionStart===n.selectionStart&&a.selectionEnd===n.selectionEnd)return"";let d=(c)=>`${c.selectionStart}-${c.selectionEnd}`;return` (the tap used to show it moved the caret from ${d(n)} to ${d(a)})`}async close(n){let{state:s}=await this.getHierarchyWithState(n,{timeoutMs:Eo.STATE_CONFIRMATION_TIMEOUT_MS,forceFresh:!0});if(s.error)return{success:!1,open:s.open,bounds:s.bounds,message:s.error,error:s.error};if(!s.open)return{success:!0,open:!1,message:"Keyboard already closed"};o(n),await P(this.adb.executeCommand("shell input keyevent KEYCODE_BACK",{signal:n}),n);let a=await this.waitForKeyboardState(!1,n),d=!a.open&&!a.error,c=d?"Keyboard closed":a.error??"Failed to close keyboard";return{success:d,open:a.open,bounds:a.bounds,message:c,...a.error?{error:a.error}:{}}}async waitForKeyboardState(n,s){let a=this.timer.now()+Eo.STATE_CONFIRMATION_TIMEOUT_MS,d=await this.readKeyboardStateBefore(a,s),c;while(!this.isStateSettled(d,c,n)){c=d;let u=a-this.timer.now();if(o(s),u<=0)break;if(await P(this.timer.sleep(Math.min(Eo.STATE_CONFIRMATION_POLL_INTERVAL_MS,u)),s),o(s),this.timer.now()>=a)break;d=await this.readKeyboardStateBefore(a,s)}return d}isStateSettled(n,s,a){if(n.error||n.open!==a)return!1;if(!a||!n.bounds?.length)return!0;return s?.open===!0&&Q(s.bounds,n.bounds)}async readKeyboardStateBefore(n,s){let{state:a}=await this.getHierarchyWithState(s,{timeoutMs:Math.max(0,n-this.timer.now()),forceFresh:!0});return a}async getHierarchyWithState(n,s){o(n);let a=await P(this.hierarchyProvider.getViewHierarchy(n,s),n);return o(n),{hierarchy:a,state:this.resolveKeyboardState(a)}}resolveKeyboardState(n){if(!n)return{open:!1,error:"No view hierarchy available"};let s=n.windows??[],a=s.length>0,d=s.some((m)=>m.type===Eo.INPUT_METHOD_WINDOW_TYPE),c=this.findKeyboardWindowBounds(n);if(c)return{open:!0,bounds:[c],source:"window",windowInfoAvailable:a,imeWindowPresent:!0};if((d||!a)&&this.detectKeyboardInHierarchy(n))return{open:!0,source:"heuristic",windowInfoAvailable:a,imeWindowPresent:d};let u=n.hierarchy?.error;if(u)return{open:!1,error:u};return{open:!1}}findKeyboardWindowBounds(n){let s=n.windows??[];for(let a of s){if(a.type!==Eo.INPUT_METHOD_WINDOW_TYPE)continue;if(a.bounds&&this.isValidBounds(a.bounds))return a.bounds}return null}isValidBounds(n){return n.right>n.left&&n.bottom>n.top}detectKeyboardInHierarchy(n){let s=this.parser.extractRootNodes(n),a=["delete","enter","keyboard","emoji","shift"];for(let d of s){let c=!1;if(this.parser.traverseNode(d,(u)=>{if(c)return;let m=this.parser.extractNodeProperties(u),p=this.getStringProp(m,"resource-id","resourceId"),y=this.getStringProp(m,"content-desc","contentDesc"),h=p?.toLowerCase(),b=y?.toLowerCase();if(h&&(h.includes("keyboard")||h.includes("inputmethod"))){c=!0;return}if(b&&a.some((I)=>b.includes(I)))c=!0}),c)return!0}return!1}getStringProp(n,s,a){let d=n[s];if(typeof d==="string")return d;let c=n[a];if(typeof c==="string")return c;return}findFocusedTextInput(n){let s=this.finder.findFocusedTextInput(n);if(!s||!s.bounds)return null;return s}async tapOnElement(n,s){let a=this.geometry.getElementCenter(n),d=Math.round(a.x),c=Math.round(a.y);o(s);try{await this.adb.executeCommand(`shell input tap ${d} ${c}`,{signal:s,waitForProcessSettlementAfterAbort:!0})}catch(u){if(s?.aborted)throw new qv("tap",r(u));throw u}}}function j(n){return n==="hidden"||n==="hidden_unconfirmed"}
|
|
4
|
+
export{qv,Eo,aB,Vv};
|
|
5
5
|
|
|
6
|
-
//# debugId=
|
|
6
|
+
//# debugId=88C1450A8B783C1264756E2164756E21
|