@kaeawc/auto-mobile 0.0.91 → 0.0.92
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/README.md +16 -0
- package/dist/schemas/prototype-icon-names.json +302 -0
- package/dist/src/chunk-09442h7v.js +4 -0
- package/dist/src/chunk-0dfnyfkh.js +5 -0
- package/dist/src/chunk-0e4gm1kj.js +5 -0
- package/dist/src/chunk-0eb8576f.js +4 -0
- package/dist/src/chunk-0rjm4nx7.js +5 -0
- package/dist/src/chunk-0w1spptt.js +6 -0
- package/dist/src/chunk-1zmh2eak.js +4 -0
- package/dist/src/chunk-28k63ha3.js +5 -0
- package/dist/src/chunk-2d4wmp8b.js +4 -0
- package/dist/src/chunk-2e6s75qv.js +78 -0
- package/dist/src/chunk-2v7tw1nj.js +5 -0
- package/dist/src/chunk-32jpxz2y.js +323 -0
- package/dist/src/chunk-34zxqcmq.js +5 -0
- package/dist/src/chunk-3jmvqygr.js +238 -0
- package/dist/src/chunk-3swvfhqt.js +5 -0
- package/dist/src/chunk-44bt78m9.js +5 -0
- package/dist/src/chunk-488vt2bp.js +4 -0
- package/dist/src/chunk-4fgdhcwx.js +5 -0
- package/dist/src/chunk-4jp2se4w.js +4 -0
- package/dist/src/chunk-4pfftt07.js +5 -0
- package/dist/src/chunk-4vhr9e4t.js +4 -0
- package/dist/src/chunk-4xd6zs3y.js +15 -0
- package/dist/src/chunk-51567pg8.js +4 -0
- package/dist/src/chunk-5agqsfev.js +4 -0
- package/dist/src/chunk-5d706gmr.js +4 -0
- package/dist/src/chunk-5kd4rqk7.js +5 -0
- package/dist/src/chunk-5s645vr4.js +4 -0
- package/dist/src/chunk-61t538bm.js +4 -0
- package/dist/src/chunk-6d3mmqxt.js +54 -0
- package/dist/src/chunk-6hyt398x.js +5 -0
- package/dist/src/chunk-6mnr8kpm.js +4 -0
- package/dist/src/chunk-6pg7bqck.js +4 -0
- package/dist/src/chunk-79q5xsdc.js +42 -0
- package/dist/src/chunk-7bdgand3.js +4 -0
- package/dist/src/chunk-84cp9dw5.js +4 -0
- package/dist/src/chunk-86f2h5ww.js +5 -0
- package/dist/src/chunk-8cghfzb2.js +19 -0
- package/dist/src/chunk-8en08r7q.js +5 -0
- package/dist/src/chunk-950qcq1e.js +10 -0
- package/dist/src/chunk-9rkfyt6q.js +5 -0
- package/dist/src/chunk-9tf2p9y9.js +5 -0
- package/dist/src/chunk-9y5bcy28.js +6 -0
- package/dist/src/chunk-a2sc4jm0.js +5 -0
- package/dist/src/chunk-a4k9rt7z.js +5 -0
- package/dist/src/chunk-aa5ng3d1.js +4 -0
- package/dist/src/chunk-ajsrz473.js +5 -0
- package/dist/src/chunk-b3h0a6ca.js +4 -0
- package/dist/src/chunk-b4cxdzwy.js +20 -0
- package/dist/src/chunk-b6a737qt.js +4 -0
- package/dist/src/chunk-bn64x5z5.js +5 -0
- package/dist/src/chunk-bvh649za.js +12 -0
- package/dist/src/chunk-c9nk1r78.js +5 -0
- package/dist/src/chunk-c9tyfg4j.js +26 -0
- package/dist/src/chunk-cfsdfqnm.js +4 -0
- package/dist/src/chunk-cxyf04jc.js +7 -0
- package/dist/src/chunk-d57432wq.js +4 -0
- package/dist/src/chunk-da08tx5v.js +4 -0
- package/dist/src/chunk-eka89q3k.js +4 -0
- package/dist/src/chunk-f2tc08m2.js +4 -0
- package/dist/src/chunk-f8tnk179.js +5 -0
- package/dist/src/chunk-f9s1kkhx.js +5 -0
- package/dist/src/chunk-fbp8a4rx.js +4 -0
- package/dist/src/chunk-fd2z0sze.js +4 -0
- package/dist/src/chunk-fk927f4q.js +54 -0
- package/dist/src/chunk-fxmr3a0f.js +4 -0
- package/dist/src/chunk-gaqwhd44.js +4 -0
- package/dist/src/chunk-ggtd5x5a.js +5 -0
- package/dist/src/chunk-gndcfrm7.js +4 -0
- package/dist/src/chunk-h3n4adc6.js +310 -0
- package/dist/src/chunk-h5pjbb83.js +4 -0
- package/dist/src/chunk-hgnnh302.js +4 -0
- package/dist/src/chunk-hmke8nhx.js +5 -0
- package/dist/src/chunk-j2bx12hn.js +4 -0
- package/dist/src/chunk-j70y1a2g.js +4 -0
- package/dist/src/chunk-jdqvcq0a.js +5 -0
- package/dist/src/chunk-jhnbfj19.js +55 -0
- package/dist/src/chunk-js1jpyxp.js +6 -0
- package/dist/src/chunk-kbjq0qvb.js +4 -0
- package/dist/src/chunk-kfwx57xd.js +4 -0
- package/dist/src/chunk-km0dy5vc.js +71 -0
- package/dist/src/chunk-kzwctna2.js +4 -0
- package/dist/src/chunk-m9ehyehy.js +4 -0
- package/dist/src/chunk-mct91p1f.js +4 -0
- package/dist/src/chunk-mf9spd4g.js +5 -0
- package/dist/src/chunk-mgrcansb.js +4 -0
- package/dist/src/chunk-mqc1d0eb.js +6 -0
- package/dist/src/chunk-n1zmpk0z.js +4 -0
- package/dist/src/chunk-ncyjf63g.js +4 -0
- package/dist/src/chunk-nr64d21q.js +973 -0
- package/dist/src/chunk-nwm2pq5v.js +168 -0
- package/dist/src/chunk-pm06b05d.js +9 -0
- package/dist/src/chunk-q50s00ry.js +4 -0
- package/dist/src/chunk-qv2918jt.js +4 -0
- package/dist/src/chunk-qwye1958.js +14 -0
- package/dist/src/chunk-r0f1q783.js +5 -0
- package/dist/src/chunk-r14wwk37.js +18 -0
- package/dist/src/chunk-r20pe1nv.js +5 -0
- package/dist/src/chunk-r8z9pfve.js +5 -0
- package/dist/src/chunk-rdpgkjf6.js +4 -0
- package/dist/src/chunk-rkr0dks9.js +5 -0
- package/dist/src/chunk-rn84t3sf.js +11 -0
- package/dist/src/chunk-s123kn7n.js +4 -0
- package/dist/src/chunk-s1zq65ny.js +4 -0
- package/dist/src/chunk-s73qn3fx.js +4 -0
- package/dist/src/chunk-sjn0nj4p.js +5 -0
- package/dist/src/chunk-sns0c35v.js +7 -0
- package/dist/src/chunk-stfzjr9y.js +8 -0
- package/dist/src/chunk-sz1a7p43.js +4 -0
- package/dist/src/chunk-t4dr5c8v.js +8 -0
- package/dist/src/chunk-tc8k9c1j.js +4 -0
- package/dist/src/chunk-teznhase.js +4 -0
- package/dist/src/chunk-ty9xgmz4.js +4 -0
- package/dist/src/chunk-tyazf3sk.js +145 -0
- package/dist/src/chunk-v6npjrjm.js +5 -0
- package/dist/src/chunk-v90es00d.js +4 -0
- package/dist/src/chunk-vbvtzkwz.js +5 -0
- package/dist/src/chunk-vefd8qee.js +8 -0
- package/dist/src/chunk-vs9r72ta.js +17 -0
- package/dist/src/chunk-w2mwa0jk.js +4 -0
- package/dist/src/chunk-w7zsh13a.js +9 -0
- package/dist/src/chunk-w88k0bgr.js +4 -0
- package/dist/src/chunk-wry6skrm.js +4 -0
- package/dist/src/chunk-wzdt0enk.js +4 -0
- package/dist/src/chunk-xhhv854c.js +4 -0
- package/dist/src/chunk-y58270hd.js +4 -0
- package/dist/src/chunk-yk0hmbex.js +4 -0
- package/dist/src/chunk-ympy4fdz.js +28 -0
- package/dist/src/chunk-yw436axy.js +4 -0
- package/dist/src/chunk-z04jrpjy.js +5 -0
- package/dist/src/chunk-z2xznczw.js +4 -0
- package/dist/src/chunk-z4xnrgps.js +4 -0
- package/dist/src/chunk-z7csyszv.js +4 -0
- package/dist/src/chunk-z8t0v07j.js +11 -0
- package/dist/src/chunk-z916af47.js +228 -0
- package/dist/src/chunk-zcr8he8q.js +5 -0
- package/dist/src/chunk-zd9vmkzn.js +9 -0
- package/dist/src/chunk-zg67wjkh.js +5 -0
- package/dist/src/chunk-zj939v0h.js +5 -0
- package/dist/src/chunk-zkdjwtc1.js +4 -0
- package/dist/src/chunk-zkv5kzt6.js +4 -0
- package/dist/src/daemon/processEntry.js +4 -0
- package/dist/src/index.js +4 -2843
- package/dist/src/runtime/bunRuntimeGuard.js +4 -0
- package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -3
- package/package.json +5 -5
- package/schemas/README.md +16 -0
- package/schemas/prototype-icon-names.json +302 -0
- package/node_modules/@borewit/text-codec/README.md +0 -87
- package/node_modules/@jimp/diff/node_modules/pixelmatch/README.md +0 -110
- package/node_modules/@jimp/diff/node_modules/pixelmatch/node_modules/pngjs/README.md +0 -433
- package/node_modules/@jimp/file-ops/dist/browser/index.js +0 -8
- package/node_modules/@jimp/js-png/README.md +0 -35
- package/node_modules/@jimp/js-png/src/__image_snapshots__/index-node-test-ts-png-should-use-png-options-1-snap.png +0 -0
- package/node_modules/@jimp/js-png/src/output.png +0 -0
- package/node_modules/@jimp/js-png/vitest.config.browser.mjs +0 -3
- package/node_modules/@jimp/plugin-resize/README.md +0 -12
- package/node_modules/@jimp/plugin-resize/vitest.config.browser.mjs +0 -3
- package/node_modules/@tokenizer/inflate/README.md +0 -114
- package/node_modules/@tokenizer/token/README.md +0 -19
- package/node_modules/await-to-js/README.md +0 -82
- package/node_modules/debug/README.md +0 -481
- package/node_modules/exif-parser/README.md +0 -83
- package/node_modules/file-type/readme.md +0 -667
- package/node_modules/ieee754/README.md +0 -51
- package/node_modules/mime/README.md +0 -178
- package/node_modules/ms/readme.md +0 -59
- package/node_modules/parse-bmfont-xml/README.md +0 -74
- package/node_modules/parse-bmfont-xml/lib/browser.js +0 -85
- package/node_modules/parse-bmfont-xml/node_modules/xml2js/README.md +0 -507
- package/node_modules/pngjs/README.md +0 -287
- package/node_modules/sax/README.md +0 -228
- package/node_modules/strtok3/README.md +0 -795
- package/node_modules/tinycolor2/README.md +0 -492
- package/node_modules/tinycolor2/cjs/test.js +0 -2191
- package/node_modules/tinycolor2/cjs/test_template.js +0 -26
- package/node_modules/tinycolor2/deno_asserts@0.168.0.mjs +0 -807
- package/node_modules/tinycolor2/esm/test.js +0 -2189
- package/node_modules/tinycolor2/esm/test_template.js +0 -24
- package/node_modules/tinycolor2/tinycolor.js +0 -1191
- package/node_modules/token-types/README.md +0 -160
- package/node_modules/uint8array-extras/readme.md +0 -318
- package/node_modules/xml-parse-from-string/README.md +0 -35
- package/node_modules/xmlbuilder/README.md +0 -86
- package/node_modules/zod/README.md +0 -208
- package/node_modules/zod/v4/locales/ar.d.cts +0 -4
- package/node_modules/zod/v4/locales/ar.d.ts +0 -4
- package/node_modules/zod/v4/locales/az.d.cts +0 -4
- package/node_modules/zod/v4/locales/az.d.ts +0 -4
- package/node_modules/zod/v4/locales/be.d.cts +0 -4
- package/node_modules/zod/v4/locales/be.d.ts +0 -4
- package/node_modules/zod/v4/locales/ca.d.cts +0 -4
- package/node_modules/zod/v4/locales/ca.d.ts +0 -4
- package/node_modules/zod/v4/locales/cs.d.cts +0 -4
- package/node_modules/zod/v4/locales/cs.d.ts +0 -4
- package/node_modules/zod/v4/locales/de.d.cts +0 -4
- package/node_modules/zod/v4/locales/de.d.ts +0 -4
- package/node_modules/zod/v4/locales/en.d.cts +0 -5
- package/node_modules/zod/v4/locales/en.d.ts +0 -5
- package/node_modules/zod/v4/locales/eo.d.cts +0 -5
- package/node_modules/zod/v4/locales/eo.d.ts +0 -5
- package/node_modules/zod/v4/locales/es.d.cts +0 -4
- package/node_modules/zod/v4/locales/es.d.ts +0 -4
- package/node_modules/zod/v4/locales/fa.d.cts +0 -4
- package/node_modules/zod/v4/locales/fa.d.ts +0 -4
- package/node_modules/zod/v4/locales/fi.d.cts +0 -4
- package/node_modules/zod/v4/locales/fi.d.ts +0 -4
- package/node_modules/zod/v4/locales/fr-CA.d.cts +0 -4
- package/node_modules/zod/v4/locales/fr-CA.d.ts +0 -4
- package/node_modules/zod/v4/locales/fr.d.cts +0 -4
- package/node_modules/zod/v4/locales/fr.d.ts +0 -4
- package/node_modules/zod/v4/locales/he.d.cts +0 -4
- package/node_modules/zod/v4/locales/he.d.ts +0 -4
- package/node_modules/zod/v4/locales/hu.d.cts +0 -4
- package/node_modules/zod/v4/locales/hu.d.ts +0 -4
- package/node_modules/zod/v4/locales/id.d.cts +0 -4
- package/node_modules/zod/v4/locales/id.d.ts +0 -4
- package/node_modules/zod/v4/locales/index.d.cts +0 -39
- package/node_modules/zod/v4/locales/index.d.ts +0 -39
- package/node_modules/zod/v4/locales/it.d.cts +0 -4
- package/node_modules/zod/v4/locales/it.d.ts +0 -4
- package/node_modules/zod/v4/locales/ja.d.cts +0 -4
- package/node_modules/zod/v4/locales/ja.d.ts +0 -4
- package/node_modules/zod/v4/locales/kh.d.cts +0 -4
- package/node_modules/zod/v4/locales/kh.d.ts +0 -4
- package/node_modules/zod/v4/locales/ko.d.cts +0 -4
- package/node_modules/zod/v4/locales/ko.d.ts +0 -4
- package/node_modules/zod/v4/locales/mk.d.cts +0 -4
- package/node_modules/zod/v4/locales/mk.d.ts +0 -4
- package/node_modules/zod/v4/locales/ms.d.cts +0 -4
- package/node_modules/zod/v4/locales/ms.d.ts +0 -4
- package/node_modules/zod/v4/locales/nl.d.cts +0 -4
- package/node_modules/zod/v4/locales/nl.d.ts +0 -4
- package/node_modules/zod/v4/locales/no.d.cts +0 -4
- package/node_modules/zod/v4/locales/no.d.ts +0 -4
- package/node_modules/zod/v4/locales/ota.d.cts +0 -4
- package/node_modules/zod/v4/locales/ota.d.ts +0 -4
- package/node_modules/zod/v4/locales/pl.d.cts +0 -4
- package/node_modules/zod/v4/locales/pl.d.ts +0 -4
- package/node_modules/zod/v4/locales/ps.d.cts +0 -4
- package/node_modules/zod/v4/locales/ps.d.ts +0 -4
- package/node_modules/zod/v4/locales/pt.d.cts +0 -4
- package/node_modules/zod/v4/locales/pt.d.ts +0 -4
- package/node_modules/zod/v4/locales/ru.d.cts +0 -4
- package/node_modules/zod/v4/locales/ru.d.ts +0 -4
- package/node_modules/zod/v4/locales/sl.d.cts +0 -4
- package/node_modules/zod/v4/locales/sl.d.ts +0 -4
- package/node_modules/zod/v4/locales/sv.d.cts +0 -4
- package/node_modules/zod/v4/locales/sv.d.ts +0 -4
- package/node_modules/zod/v4/locales/ta.d.cts +0 -4
- package/node_modules/zod/v4/locales/ta.d.ts +0 -4
- package/node_modules/zod/v4/locales/th.d.cts +0 -4
- package/node_modules/zod/v4/locales/th.d.ts +0 -4
- package/node_modules/zod/v4/locales/tr.d.cts +0 -5
- package/node_modules/zod/v4/locales/tr.d.ts +0 -5
- package/node_modules/zod/v4/locales/ua.d.cts +0 -4
- package/node_modules/zod/v4/locales/ua.d.ts +0 -4
- package/node_modules/zod/v4/locales/ur.d.cts +0 -4
- package/node_modules/zod/v4/locales/ur.d.ts +0 -4
- package/node_modules/zod/v4/locales/vi.d.cts +0 -4
- package/node_modules/zod/v4/locales/vi.d.ts +0 -4
- package/node_modules/zod/v4/locales/zh-CN.d.cts +0 -4
- package/node_modules/zod/v4/locales/zh-CN.d.ts +0 -4
- package/node_modules/zod/v4/locales/zh-TW.d.cts +0 -4
- package/node_modules/zod/v4/locales/zh-TW.d.ts +0 -4
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{qR,i,nr,xi,hd,te,l,nt,e}from"./chunk-z8t0v07j.js";import{g}from"./chunk-mf9spd4g.js";import{fl}from"./chunk-32jpxz2y.js";import{zr,li,Jt,dI,ui,Fl,Oo,Ja,kX,EX,Xa,zG,In,oN,Od,jb,Kb,ha,Gb,Md,yH,aN,YG,bH,UX,JG,HX,Eu,fI,wH,ZG,qX,RH,Lp,VX,WX,zX,wi,QG,cN,Sy,Za,Bp,PH,jX,EI,II,EN,f6,bZ,DN,xI,xc,ON,MN,_u,NN}from"./chunk-nwm2pq5v.js";import{rc,Gf,Yf,aA,GN,fS,YN,Es,Jf,B6}from"./chunk-a2sc4jm0.js";import{lc,iv,ZS,Qn,QS,Ve,is,Mh,Ct,vr,UV,aw,uv,sL,os,gC,aL,Lh,yC,vC,Vu,lee,qV,dL,lw,hT,lL,mee,gT,uL,Je,Ho,AC,yv,bv,Po,ct,Os,rt,sl,$i,al,Rt,ri,ZL,yi,Mm,Xw,Fs,Nm,XT,Q5,QL,lz,pz,jv,mz,Qte,mk,lD,Kv,hk,D,k}from"./chunk-h3n4adc6.js";import{No,$d,ji,ks,fe,xr,ya,j}from"./chunk-8cghfzb2.js";import{y,A,Z,hr,f,ee,P,J3}from"./chunk-79q5xsdc.js";import{qp,WN}from"./chunk-44bt78m9.js";import{WS}from"./chunk-6d3mmqxt.js";import{Yn,Id,Cl,tI,rI,iH,br,Ya,If,QM}from"./chunk-mqc1d0eb.js";import{ky,DI,Hp}from"./chunk-a4k9rt7z.js";import{Pc}from"./chunk-0dfnyfkh.js";import{r,t,u}from"./chunk-9rkfyt6q.js";async function uX(s,n,o,a=j){let c=await a.cancelSessionUuidExecutions(s,n);return o(c)}function JE(s,n,o){return Ze(s,n,o,o.releaseReason)}var ce="plan-auto-release";function zs(s,n){return Ze(s,n,`Session ${n.sessionId} was released when its plan finished (${ce}) while this call was in flight; the session UUID is not terminal and may be named again`,ce)}function Ze(s,n,o,a){let{sessionId:c,baseSessionId:d,deviceId:m,excludeExecutionId:p}=n,h=[s.cancelDeviceSessionExecutions(c,o,{excludeExecutionId:p})];if(d!==void 0&&d!==c&&m)h.push(s.cancelDeviceExecutions(m,`Session ${c} was released (${a}), so device ${m} is no longer reachable through session ${d}`,{onlySessionUuid:d,excludeExecutionId:p}));return Promise.all(h).then((S)=>S.reduce((w,R)=>w+R,0))}async function OP(s,n,o,a=j){zs(a,o).catch((c)=>{e.warn(`Failed to cancel executions of plan-released session ${o.sessionId}: ${r(c)}`,c)}),await As({manager:s,pool:n},o.deviceId,o.sessionId,{reason:ce})}function ly(s,n,o){return s.releaseDevice(n,o)}function DM(s){return{releaseDevice:(n,o)=>s().releaseDevice(n,o)}}async function As({manager:s,pool:n},o,a,c={}){let{reason:d}=c,m=o;try{if(c.release)m=await c.release();else if(d===void 0)await s.releaseSession(a);else await s.releaseSession(a,d)}catch(p){if(!c.deferFailureFallback&&o&&!s.hasSession(a))try{await n.releaseDevice(o,a)}catch(h){e.warn(`Failed to free device ${o} after session ${a} release`,h)}throw p}if(m)await n.releaseDevice(m,a)}async function G1(s,n,o){let a=s.forceStuckRelease(o);if(a)await n.releaseDevice(a.deviceId,o)}function Cp(s,n){return s?.resolveAndroidCanonicalId?.(n)??n}async function OM(s,n,o,a){if(!s||n!=="android")return{devices:[...o],deviceId:a};let c=s.mapAndroidDiscovery?.(o)??[...o];if(s.normalizeAndroidDiscovery&&Gs(s,c,a))c=await s.normalizeAndroidDiscovery(o,!1,()=>!0,!1);return{devices:c,deviceId:a===void 0?void 0:Cp(s,a)}}function Gs(s,n,o){let a=new Set((s.getAllDevices?.()??[]).map((c)=>c.id));return n.some((c)=>c.platform==="android"&&(o===void 0||c.deviceId===o)&&Ho(c.deviceId)&&!a.has(c.deviceId))}function et(s,n,o){return s?.androidTransportMayAliasDevice?.(n,o)!==!1}function MP(s){return s.getHeldDeviceSessions?s.getHeldDeviceSessions().map(({deviceId:n,...o})=>({...o,assignedDevice:n})):s.getAllSessions?.()??[]}async function Ys(s,n,o){let a=o.filter((d)=>d.platform==="android"),c=await s?.androidBindingHold?.(a.flatMap((d)=>d.stableDeviceId?[d.assignedDevice,d.stableDeviceId]:[d.assignedDevice]));return{sessions:a.filter((d)=>et(s,n,d.assignedDevice)),managed:c&&et(s,n)?c:void 0}}async function IG(s,n,o,a){if(o||n.platform!=="android"||s?.isAndroidTransportAssignable?.(n)!==!1)return;let c=await Ys(s,n,a);return c.sessions.length>0||c.managed?c:void 0}async function MM(s,n,o,a){let c=await IG(s,n,a.heldBySession,a.sessions);if(!c)return;let{sessions:d,managed:m}=c,p=a.requester?.()??a.requesterSessionUuid;if(!m&&d.every((h)=>sl(h.sessionId,p,a.sessionManager)))throw new t(`${o} refused: Android transport '${n.deviceId}' has no proven identity, so it cannot be told apart from a device another session holds; nothing was sent. The device pool does not pool this transport either. Address the device by a transport whose serial can be read (its USB serial or emulator-NNNN id), or reconnect it and refresh devices.`);throw Js(o,n.deviceId,p,m)}function Js(s,n,o,a){if(a?.entry)return new li(s,n,a.entry);return new ct(s,n,o,{remedy:"This transport cannot be told apart from a device another session holds; address the device by its USB serial or emulator-NNNN id. Nothing was sent."})}var NM=2,FM=["focused_trace","vendor_documented","cdd_derived","inferred","experimental"],pX=["keyboard","kill","display"],_G={keyboard:"functionalityBreak",kill:"functionalityBreak",display:"functionalityBreak"};function de(s){return WN.find((n)=>n.id===s)?.note??s}var XE={"samsung-dex":"Samsung DeX desktop mode.",knox:"Samsung Knox attestation, containers and enterprise APIs.","flip-cover-screen":"The Galaxy Z Flip cover screen and its launcher.","spen-air-actions":"S Pen Air actions and the S Pen remote.","oem-systemui":"The OEM's own SystemUI (status bar, quick settings, recents); runtime resource overlays cannot overlay code.","oem-unused-app-triggers":de("oem-unused-app-triggers"),"firmware-update-exemption-reset":de("firmware-update-exemption-reset"),"xiaomi-proprietary-appops":de("xiaomi-proprietary-appops")};var Tf=aN,Qs="https://dontkillmyapp.com/",tt="The gboard profile matches InputConnection traces captured from real Gboard on API 36; autocorrect and prediction are not claimed.";function M(s){return{status:"inferred",note:`${s} global builds ship Gboard as the default keyboard. ${tt}`}}function I(s){let n=qp[s];return{status:n.evidenceStatus,note:n.evidenceNote,...n.source?{source:n.source}:{}}}var ue={status:"inferred",note:"Current flagship and mid-range phones use a centred punch-hole camera; approximated with the AOSP hole cutout overlay. The OEM's own SystemUI is not reproduced."},Dp={"pixel-baseline":{id:"pixel-baseline",version:1,displayName:"Pixel (stock baseline)",keyboardProfileId:"gboard",nonEmulatable:[],evidence:{keyboard:{status:"focused_trace",note:tt}}},"samsung-oneui":{id:"samsung-oneui",version:1,displayName:"Samsung One UI",keyboardProfileId:"samsung",killProfile:"samsung-sleeping",displayProfile:{cutout:"hole",navigationMode:"threebutton"},nonEmulatable:["samsung-dex","knox","flip-cover-screen","spen-air-actions","oem-systemui","oem-unused-app-triggers"],evidence:{keyboard:{status:"experimental",note:"The samsung profile is an AutoMobile behaviour model; a Samsung Keyboard trace is pending."},kill:I("samsung-sleeping"),display:{status:"inferred",note:"Many One UI releases ship the three-button navigation bar by default and current Galaxy S phones use a centred punch-hole (defaults vary by model and One UI version); approximated with the AOSP overlays. One UI SystemUI is not reproduced."}}},"xiaomi-hyperos":{id:"xiaomi-hyperos",version:1,displayName:"Xiaomi HyperOS",keyboardProfileId:"gboard",killProfile:"xiaomi-autostart-off",displayProfile:{cutout:"hole"},nonEmulatable:["xiaomi-proprietary-appops","oem-systemui","firmware-update-exemption-reset"],evidence:{keyboard:M("Xiaomi"),kill:I("xiaomi-autostart-off"),display:ue}},"oneplus-oxygenos":{id:"oneplus-oxygenos",version:1,displayName:"OnePlus OxygenOS",keyboardProfileId:"gboard",killProfile:"oneplus-deep-optimization",displayProfile:{cutout:"hole"},nonEmulatable:["oem-systemui"],evidence:{keyboard:M("OnePlus"),kill:I("oneplus-deep-optimization"),display:ue}},"oppo-coloros":{id:"oppo-coloros",version:1,displayName:"OPPO ColorOS",keyboardProfileId:"gboard",killProfile:"recents-swipe-force-stop",displayProfile:{cutout:"hole"},nonEmulatable:["oem-systemui"],evidence:{keyboard:M("OPPO"),kill:{...I("recents-swipe-force-stop"),note:`ColorOS is reported to force-stop apps swiped from recents. ${qp["recents-swipe-force-stop"].evidenceNote}`,source:Qs},display:ue}},motorola:{id:"motorola",version:1,displayName:"Motorola",keyboardProfileId:"gboard",killProfile:"motorola-adaptive",nonEmulatable:[],evidence:{keyboard:M("Motorola"),kill:I("motorola-adaptive")}},"huawei-emui":{id:"huawei-emui",version:1,displayName:"Huawei EMUI",keyboardProfileId:"gboard",killProfile:"huawei-powergenie",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Huawei"),kill:I("huawei-powergenie")}},"vivo-funtouch":{id:"vivo-funtouch",version:1,displayName:"Vivo Funtouch OS",keyboardProfileId:"gboard",killProfile:"vivo-autostart",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Vivo"),kill:I("vivo-autostart")}},"realme-ui":{id:"realme-ui",version:1,displayName:"realme UI",keyboardProfileId:"gboard",killProfile:"realme-power-saver",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("realme"),kill:I("realme-power-saver")}},"meizu-flyme":{id:"meizu-flyme",version:1,displayName:"Meizu Flyme",keyboardProfileId:"gboard",killProfile:"meizu-flyme-background",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Meizu"),kill:I("meizu-flyme-background")}},"asus-zenui":{id:"asus-zenui",version:1,displayName:"Asus ZenUI",keyboardProfileId:"gboard",killProfile:"asus-power-master",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Asus"),kill:I("asus-power-master")}},"sony-xperia":{id:"sony-xperia",version:1,displayName:"Sony Xperia",keyboardProfileId:"gboard",killProfile:"sony-stamina",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Sony"),kill:I("sony-stamina")}},"tecno-hios":{id:"tecno-hios",version:1,displayName:"Tecno HiOS",keyboardProfileId:"gboard",killProfile:"tecno-app-halt",nonEmulatable:["oem-systemui"],evidence:{keyboard:M("Tecno"),kill:I("tecno-app-halt")}}};function NP(s){return["keyboard",...s.killProfile?["kill"]:[],...s.displayProfile?["display"]:[]]}function xG(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Je(async()=>Qte(n,(o.clientFactory??pz())(a),{timer:o.timer??i,forgetRememberedUnlock:o.forgetRememberedUnlock??mz})).catch((d)=>{let m=lz(r(d),[n.credential]);return e.warn(`[screenLock] Clearing session ${n.sessionId}'s lock threw: ${m}`),{status:"failed",deviceId:n.deviceId,type:n.type,error:m,leftover:`Device ${n.deviceId} may still have the ${n.type} lock this session set.`}});return(o.registry??jv).noteRestore(n.sessionId,c),s.registerPendingDeviceCleanup(n.deviceId,c,{name:"clear session screen lock",leftover:"the released session's lock-screen credential"}),c}function mX(s,n={}){let o=n.registry??jv,a=(c,d,m)=>{let p=o.takeOwnedBy(d,c);if(!p)return;if(m?.deviceIdentityReplaced){e.info(`[screenLock] Session ${c}'s ${d} was replaced; not clearing`),o.noteRestore(c,Promise.resolve({status:"skipped",deviceId:d,type:p.type,error:"The device was replaced before its lock could be cleared."}));return}xG(s,p,n)};s.onSessionRelease((c,d,m,p)=>{if(p?.upgradeOnly)return;a(c,d,p)}),s.onSessionDeviceUnbound(a)}var st=Symbol("screen lock report wait");async function LM(s,n={}){let o=(n.registry??jv).restoreReport(s);if(!o)return{};return{screenLockRestore:await l(o,{timer:n.timer??i,timeoutMs:br,unref:!0,label:"screen lock restore report",timeoutError:()=>st}).catch((c)=>{if(c!==st)throw c;return{status:"pending"}})}}var ot=2,Xs=1000,Zs=3000;function it(s){return lD.includes(s)}function en(s,n){let o=s.baseline.battery;if(!o?.faked)return{apply:()=>n.resetBattery(),verify:async()=>!(await n.readBattery()).faked};return{apply:async()=>{await n.setBatteryCharging(o.charging),await n.setBatteryLevel(o.level)},verify:async()=>{let a=await n.readBattery();return a.level===o.level&&a.charging===o.charging}}}async function Y1(s,n){if(s.screenSlept&&!await n.isScreenOn())await n.wakeScreen()}function tn(s,n,o){let a=s.baseline.doze??"off";return{apply:async()=>{await n.unforceDoze();try{await Y1(s,n)}catch(c){e.warn(`[power] Could not wake the screen before the Doze read-back: ${r(c)}`,c)}if(a!=="off")await n.forceDoze(a)},verify:async()=>(await hk(n,a,{timer:o.timer,budgetMs:Zs,backoff:o.dozeBackoff??te({initialDelayMs:250,multiplier:2,maxDelayMs:1000}),reading:await n.readDoze()})).settled}}function sn(s,n){let o=s.baseline.thermal;return{apply:()=>o?.override?n.overrideThermal(o.status):n.resetThermal(),verify:async()=>{let a=await n.readThermal();return o?.override?a.override&&a.status===o.status:!a.override}}}function nn(s,n){let o=s.baseline.batterySaver===!0;return{apply:()=>n.setBatterySaver(o),verify:async()=>(await n.readBatterySaver()??!1)===o}}function rn(s,n){let o=s.baseline.dataSaver===!0;return{apply:()=>n.setDataSaver(o),verify:async()=>await n.readDataSaver()===o}}function on(s,n){let o=Object.entries(s.baseline.standby??{}),a=o.filter(([,d])=>!it(d)),c=o.filter((d)=>it(d[1]));return{skip:c.length===0&&a.length>0?`A shell cannot set a ${a.map(([d,m])=>`${d} (${m})`).join(", ")} bucket back.`:void 0,apply:async()=>{for(let[d,m]of c)await n.setStandbyBucket(d,m)},verify:async()=>(await Promise.all(c.map(async([m,p])=>await n.readStandbyBucket(m)===p))).every(Boolean)}}function an(s,n){let o=Object.entries(s.baseline.inactive??{});return{apply:async()=>{for(let[a,c]of o)await n.setInactive(a,c)},verify:async()=>(await Promise.all(o.map(async([c,d])=>await n.readInactive(c)===d))).every(Boolean)}}function ln(s,n){return{apply:()=>Y1(s,n),verify:()=>n.isScreenOn()}}function cn(s,n,o,a){switch(s){case"battery":return en(n,o);case"screen":return n.screenSlept?ln(n,o):void 0;case"doze":return tn(n,o,a);case"batterySaver":return nn(n,o);case"dataSaver":return rn(n,o);case"thermal":return sn(n,o);case"standby":return on(n,o);case"inactive":return an(n,o)}}async function dn(s,n,o){if(n.skip)return{field:s,status:"skipped",error:n.skip};let a="";for(let c=1;c<=ot;c++){try{await n.apply();let d=await un(s,n);if(d!==!1)return{field:s,status:"restored",...d===!0?{verified:!0}:{}};a="the device still differs from the value read before the session's change"}catch(d){a=r(d),e.warn(`[power] Restoring ${s} failed (attempt ${c}): ${a}`,d)}if(c<ot)await o.timer.sleep(Xs)}return{field:s,status:"failed",error:a}}async function un(s,n){try{return await n.verify()}catch(o){e.warn(`[power] Could not read back restored ${s}: ${r(o)}`,o);return}}function mn(s,n){let o=s.deviceId,a={battery:"dumpsys battery reset",screen:"input keyevent KEYCODE_WAKEUP",doze:"dumpsys deviceidle unforce",batterySaver:"settings put global low_power 0",dataSaver:"cmd netpolicy set restrict-background false",thermal:"cmd thermalservice reset",standby:"am set-standby-bucket <appId> <bucket>",inactive:"am set-inactive <appId> false"};return`Device ${o} may still carry power state session ${s.sessionId} changed: `+n.map((c)=>`${c} (adb -s ${o} shell ${a[c]})`).join("; ")+". Fix it with those commands or setDeviceState power."}async function at(s,n,o){let a=[];for(let p of[...s.changed].reverse()){let h=cn(p,s,n,o);if(h)a.push(await dn(p,h,o))}let c=a.filter((p)=>p.status==="failed"),d=a.filter((p)=>p.status==="restored"),m=c.length===0?d.length>0?"restored":"skipped":d.length>0?"partial":"failed";if(c.length>0)e.warn(`[power] Session ${s.sessionId} left ${c.map((p)=>p.field).join(", ")} changed on ${s.deviceId}`);return{status:m,deviceId:s.deviceId,fields:a,...c.length>0?{leftover:mn(s,c.map((p)=>p.field))}:{}}}function CG(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Je(async()=>at(n,(o.clientFactory??mk())(a),{timer:o.timer??i})).catch((d)=>{let m=r(d);return e.warn(`[power] Restoring session ${n.sessionId}'s power state threw: ${m}`,d),{status:"failed",deviceId:n.deviceId,fields:[],error:m,leftover:`Device ${n.deviceId} may still carry power state (${n.changed.join(", ")}) session ${n.sessionId} changed.`}});return(o.registry??Kv).noteRestore(n.sessionId,c),s.registerPendingDeviceCleanup(n.deviceId,c,{name:"restore session power state",leftover:"the released session's battery, Doze, standby, saver or thermal changes"}),c}function fX(s,n={}){let o=n.registry??Kv,a=(c,d,m)=>{let p=o.takeOwnedBy(d,c);if(!p)return;if(m?.deviceIdentityReplaced){e.info(`[power] Session ${c}'s ${d} was replaced; not restoring`),o.noteRestore(c,Promise.resolve({status:"skipped",deviceId:d,fields:[],error:"The device was replaced before its power state could be restored."}));return}CG(s,p,n)};s.onSessionRelease((c,d,m,p)=>{if(p?.upgradeOnly)return;a(c,d,p)}),s.onSessionDeviceUnbound(a)}var lt=Symbol("power restore report wait");async function BM(s,n={}){let o=(n.registry??Kv).restoreReport(s);if(!o)return{};return{powerRestore:await l(o,{timer:n.timer??i,timeoutMs:br,unref:!0,label:"power restore report",timeoutError:()=>lt}).catch((c)=>{if(c!==lt)throw c;return{status:"pending"}})}}var pn=[[/junit/i,"junit"],[/\b(ide|intellij|android studio|plugin)\b/i,"ide"],[/desktop/i,"desktop"]];function fn(s){if(s.livenessPolicy==="cli-idle")return"cli";let n=s.clientName,o=n===void 0?void 0:pn.find(([a])=>a.test(n));if(o)return o[1];return s.livenessOwnerToken===void 0?"unknown":"stdio-proxy"}function gn(s,n){if(Id(s.livenessPolicy,n))return null;return If(s)}function W(s,n,o){let a=gn(s,o);if(a===null||n===void 0)return a;return Math.max(a,iH({vetoedSince:a,latestDeadlineMs:n.latestDeadlineMs}))}function me(s,n,o,{toWall:a=(d)=>d,leasePhase:c}={}){let d=W(s,o,c);return{lastToolActivityAt:a(s.lastUsedAt),lastOwnerHeartbeatAt:s.lastOwnerHeartbeat===void 0?null:a(s.lastOwnerHeartbeat),idleReleaseAt:d===null?null:a(d),holderKind:fn(s),activeExecutions:n}}function dt(s){let n=[s.keepAwakeRestore?.status,s.screenLockRestore?.status,s.powerRestore?.status];if(n.includes("failed")||n.includes("partial"))return"failed";return n.includes("pending")?"pending":void 0}import{lstat as hn,realpath as Sn,rm as yn}from"fs/promises";import{resolve as ft,join as ut,basename as vn,dirname as wn}from"path";var hX={listNames:nr,lstat:hn,realpath:Sn,removeDirectory:(s)=>yn(s,{recursive:!0})};function gt(s){if(!Xa(s.avdName))return"Not a broker-created AVD name";if(s.referencedAvdNames===null)return"Registry unavailable";if(s.referencedAvdNames.some((n)=>n.toLowerCase()===s.avdName.toLowerCase()))return"Registry references this AVD (including case aliases)";if(s.unsafeReason)return s.unsafeReason;if(s.running!==!1)return s.running?"AVD is running":"AVD liveness uncertain";return}function Rn(s){let n=[],o=[],a=gt(s);for(let c of s.snapshotNames){let d=a;if(c.toLowerCase()===Hp||DI(c))d="Reserved boot or broker baseline snapshot";if(d??=s.unsafeSnapshotReasons?.get(c),d)o.push({snapshotName:c,reason:d});else n.push(c)}return{deleteNames:n,keptSnapshots:o}}async function pe(s,n){let o=await n.lstat(s);if(!o.isDirectory()||o.isSymbolicLink()||await n.realpath(s)!==s)throw Error(`Not an exact real directory: ${s}`);if(!(await n.listNames(wn(s))).includes(vn(s)))throw Error(`Directory name case mismatch: ${s}`)}async function mt(s,n){ky("AVD name",s);let o=await n.filesystem.realpath(n.resolver.getAvdHome()),a=await n.resolver.resolveAvdDirectory(s),c=ut(o,`${s}.avd`);if(!a||ft(a)!==c)throw Error("AVD resolver did not find the exact owned conventional directory");await pe(c,n.filesystem);let d=ut(c,QS);return await pe(d,n.filesystem),d}async function pt(s,n){return await n.hasLiveProcess(s)||await n.findLiveEmulatorSerial(s)!==null}function bn(s,n){let o=new Map;for(let a of s)try{ky("snapshot name",a)}catch(c){let d=r(c);n.warn(`[AvdSnapshotCleanup] Keeping invalid snapshot name: ${d}`,c),o.set(a,d)}return o}async function kn(s,n,o,a){let c={avdName:s,deletedSnapshotNames:[],keptSnapshots:[],...o?{error:o}:{}},d=a.log??e,m=[];try{let p=await mt(s,a);m=await a.filesystem.listNames(p);let S=gt({avdName:s,snapshotNames:m,referencedAvdNames:n,running:!1})?null:await pt(s,a.liveness),w=bn(m,d);if(w.size>0)c.error=[...w.values()].join("; ");let R=Rn({avdName:s,snapshotNames:m,referencedAvdNames:n,running:S,unsafeSnapshotReasons:w});c.keptSnapshots=R.keptSnapshots;for(let v of R.keptSnapshots)d.warn(`[AvdSnapshotCleanup] Keeping ${s}/${v.snapshotName}: ${v.reason}`);for(let v of R.deleteNames){if(await mt(s,a)!==p||await pt(s,a.liveness))throw Error("AVD directory changed or AVD started before deletion");ky("snapshot name",v);let E=ft(p,v);if(!Pc(p,E,{allowEqual:!1}))throw Error("Snapshot path escapes the snapshots root");await pe(E,a.filesystem),await a.filesystem.listNames(E),await a.filesystem.removeDirectory(E),c.deletedSnapshotNames.push(v)}}catch(p){let h=r(p);d.warn(`[AvdSnapshotCleanup] Keeping remaining snapshots for ${s}: ${h}`,p),c.error=o?`${o}; ${h}`:h;let S=new Set([...c.deletedSnapshotNames,...c.keptSnapshots.map((w)=>w.snapshotName)]);c.keptSnapshots.push(...m.filter((w)=>!S.has(w)).map((w)=>({snapshotName:w,reason:h})))}return c}async function ht(s,n){let o=null,a;try{if(!n.registry)throw Error("Registry unavailable");o=await n.registry.listReferencedAvdNames()}catch(d){a=r(d),(n.log??e).warn(`[AvdSnapshotCleanup] Keeping all snapshots: ${a}`,d)}let c=[];for(let d of new Set(s))c.push(await kn(d,o,a,n));return c}class B extends t{code="session_broker_maintenance";retryable=!0;retryAfterMs=Od;constructor(){super("Session broker snapshot maintenance is running; retry shortly");this.name="SessionBrokerMaintenanceError"}}function ge(s,n){let o=Promise.resolve().then(n).finally(()=>s.delete(o));return s.add(o),o}class he{broker;running=!1;activeRun;constructor(s){this.broker=s}get inProgress(){return this.running}async run(s){if(this.broker.isStopping())throw new Md;if(this.running)throw new B;this.running=!0;let n=this.runAfterPreparations(s);return this.activeRun=n,n}async join(){await Promise.allSettled(this.activeRun?[this.activeRun]:[])}async runAfterPreparations(s){try{if(await Promise.allSettled([...this.broker.preparations(),...this.broker.poolOperations()]),this.broker.isStopping())throw new Md;return await s()}finally{this.running=!1,this.activeRun=void 0}}}function St(s,n){if(s.platform!=="android"||n.platform!=="android")return(d)=>yH(s,oN(d)).kind==="match";let o=s.effective.hardware;if(o.kind==="archetype"&&o.archetype==="foldable")Gb(bH(s,n));let a=UX(s,n),c=a.ok?a.value:void 0;return(d)=>{let m=oN(d);return yH(s,m).kind==="match"&&m.platform==="android"&&m.memoryMb===c}}function X(s){return s.device.platform==="android"?s.device.deviceProfile:void 0}function yt(s){if(!s?.requires?.length)return;let n=Dp[s.manufacturerProfile],o=s.requires.filter((a)=>n.nonEmulatable.includes(a));if(o.length===0)return;throw new ha({code:"requires_real_device",message:`Manufacturer profile ${n.id} cannot emulate ${o.join(", ")} (${o.map((a)=>XE[a]).join(" ")}); run this task on a real ${n.displayName} device.`,retryable:!1})}async function vt(s,n,{fingerprint:o,signal:a,exportIdentity:c}){if(a.throwIfAborted(),n.device.platform==="watchos")return HX(s,n,{fingerprint:o,signal:a,exportIdentity:c});let d=await s.catalog(n.device.platform,a),m=s.defaults(n.device.platform),p=Gb(YG(n.device,m,d));return yt(X(n)),{requestId:n.requestId,fingerprint:o,parameters:n,owner:s.owner,export:c,limits:s.limits,matches:St(p,m),resolveCreation:()=>Gb(JG(p,m,d))}}class Se{concurrency;waitMs;timer;inFlight=new Map;stopping=new AbortController;constructor(s=4,n=5000,o=i){this.concurrency=s;this.waitMs=n;this.timer=o;if(!Number.isSafeInteger(s)||s<1)throw new t("Recovery cleanup concurrency must be a positive integer");if(!Number.isFinite(n)||n<=0)throw new t("Recovery cleanup wait must be positive and finite")}async run(s){let n=new Set,o=0;while(!this.stopping.signal.aborted){while(o<s.length&&this.inFlight.size<this.concurrency){let a=s[o++];if(!this.inFlight.has(a.resourceId)){let c=this.start(a).then(()=>{n.delete(c)});n.add(c)}}if(n.size===0){let a=s.slice(o).filter((c)=>!this.inFlight.has(c.resourceId));if(a.length>0&&this.inFlight.size>=this.concurrency)e.warn(`recovery cleanup slots saturated, ${a.length} items deferred`);return}await l([...n],{timer:this.timer,label:"Recovery cleanup slot"})}}stop(){this.stopping.abort(new t("Session broker cleanup is stopping"))}async join(){await Promise.allSettled([...this.inFlight.values()])}async start(s){let n=this.stopping.signal,o=Promise.resolve().then(async()=>{n.throwIfAborted(),await s.run(n)}).catch((c)=>{e.warn(`Session resource ${s.resourceId} recovery cleanup remains pending: ${r(c)}`,c)}).finally(()=>{this.inFlight.delete(s.resourceId)});this.inFlight.set(s.resourceId,o);let a=new t("Recovery cleanup pass wait elapsed");try{await l(o,{timer:this.timer,timeoutMs:this.waitMs,signal:n,label:`Session resource ${s.resourceId} recovery cleanup`,timeoutError:()=>a})}catch(c){if(c===a){e.debug(`Session resource ${s.resourceId} cleanup wait ended: ${r(c)}`,c);return}e.warn(`Session resource ${s.resourceId} cleanup wait ended: ${r(c)}`,c)}}}class se extends t{constructor(s,n){super(`Session request ${s} committed its session, but its receipt could not be read (${r(n)}); replay the same request ID to recover it`,{cause:n})}}class ye{store;devices;destroys=new Map;drains=new Set;constructor(s,n){this.store=s;this.devices=n}async destroy(s,n){if(await this.devices.destroy(s,n)!=="absent")return!1;return n?.throwIfAborted(),this.store.confirmDestroyed(Za(s))}tryCleanup(s,n){let o=this.destroys.get(s.resourceId);if(o)return o;let a=this.cleanupOnce(s,n).finally(()=>{this.destroys.delete(s.resourceId)});return this.destroys.set(s.resourceId,a),a}async joinAll(){while(this.drains.size>0||this.destroys.size>0)await Promise.allSettled([...this.drains,...this.destroys.values()])}drainIdlePool(){return this.trackedDrain(()=>this.store.drainIdle())}expireIdle(s){return this.trackedDrain(()=>this.store.drainIdle(s))}trackedDrain(s){let n=this.drainOnce(s).finally(()=>{this.drains.delete(n)});return this.drains.add(n),n}async drainOnce(s){let n=[];for(let o of await s()){await this.tryCleanup(o);let a=await this.store.getResource(o.resourceId),c=!a||a.state==="destroyed";n.push({resourceId:o.resourceId,outcome:c?"destroyed":"cleanup_pending",cleanupPending:!c})}return{resources:n}}async cleanupOnce(s,n){let o=await this.store.getResource(s.resourceId);if(o?.state==="destroying"&&o.revision===s.revision)try{n?.throwIfAborted(),await this.destroy(o,n)}catch(a){e.warn(`Session resource ${o.resourceId} cleanup remains pending: ${r(a)}`)}}}class ve{ttlMs;store;destructions;now;observed=new Map;constructor(s,n,o,a){this.ttlMs=s;this.store=n;this.destructions=o;this.now=a}get enabled(){return this.ttlMs.ios!==void 0||this.ttlMs.android!==void 0}async sweep(){if(!this.enabled)return{resources:[]};let s=this.now(),n=(await this.store.listLiveResources()).filter((d)=>d.state==="idle"),o=[],a=new Set;for(let d of n){let m=this.ttlFor(d);if(m===void 0)continue;a.add(d.resourceId);let p=this.observed.get(d.resourceId);if(!p||p.revision!==d.revision)this.observed.set(d.resourceId,{revision:d.revision,idleSinceMs:s});else if(s-p.idleSinceMs>=m)o.push(Za(d))}for(let d of[...this.observed.keys()])if(!a.has(d))this.observed.delete(d);if(o.length===0)return{resources:[]};for(let d of o)this.observed.delete(d.resourceId);let c=await this.destructions.expireIdle(o);if(c.resources.length>0)e.info(`Session broker expired ${c.resources.length} idle pooled device(s): ${c.resources.map((d)=>`${d.resourceId} ${d.outcome}`).join(", ")}`);return c}ttlFor(s){try{let n=In(s).platform;return this.ttlMs[n==="watchos"?"ios":n]}catch(n){e.warn(`Idle expiry skipped session resource ${s.resourceId}: ${r(n)}`,n);return}}}var N=2592000000;async function ne(s,n,o,a){if(!Number.isFinite(o)||o<0||o>N||!Number.isInteger(a)||a<1||a>1e4)throw new t(`Broker stats needs a window of 0 to ${N/86400000} days and a limit of 1 to 10000`);let c=n(),d=c-o,m=await s.timingSamples(d,c,a+1);return{sinceMs:d,untilMs:c,limit:a,truncated:m.length>a,groups:Dn(m.slice(0,a),d,c)}}function Dn(s,n,o){let a=new Map;for(let c of s){let d=JSON.stringify(c.profile),m=a.get(d)??[];m.push(c),a.set(d,m)}return[...a.values()].map((c)=>{let d=(v)=>v!==void 0&&v>=n&&v<=o,m=c.flatMap((v)=>v.timing.acquisition?.outcome==="ready"&&d(v.timing.acquisition.completedAtMs)?[v.timing.acquisition]:[]),p=c.flatMap((v)=>v.timing.reset&&d(v.timing.reset.completedAtMs)?[v.timing.reset]:[]),h={},S={},w=(v,b,E)=>{if(E!==void 0&&Number.isFinite(E)&&E>=0)(v[b]??=[]).push(E)};for(let v of m)for(let b of["queueMs","admissionWaitMs","createMs","bootMs","automationReadyMs","totalMs"])w(h,b,v[b]);for(let v of p){for(let[b,E]of Object.entries(v.phases))w(S,b,E);w(S,"totalMs",v.totalMs)}let R=(v)=>Object.fromEntries(Object.entries(v).map(([b,E])=>(E.sort((Ws,Ks)=>Ws-Ks),[b,{count:E.length,p50:ri(E,50),p90:ri(E,90)}])));return{profile:c[0].profile,acquisitions:m.length,resets:p.length,reuseHitRate:m.length?m.filter((v)=>v.admission==="reuse").length/m.length:0,fallbackRate:p.length?p.filter((v)=>v.outcome.startsWith("fallback:")).length/p.length:0,retirements:c.filter(({timing:v})=>v.reset&&(v.reset.retired||v.reset.outcome==="destroyed")&&d(v.reset.completedAtMs??v.reset.startedAtMs)).length,acquisitionPhases:R(h),resetPhases:R(S)}}).filter((c)=>c.acquisitions>0||c.resets>0||c.retirements>0)}function wt(s,n){switch(s){case"android":return n.reuseAndroidCleanDevices===!0;case"ios":case"watchos":return n.reuseCleanDevices===!0}}class we{limit;timer;now;active=0;pending=[];constructor(s=Number.POSITIVE_INFINITY,n=i,o=()=>i.now()){this.limit=s;this.timer=n;this.now=o}async run(s,n,o){n?.throwIfAborted();let a=this.now();if(this.active>=this.limit){let c=Promise.withResolvers(),d=()=>{this.active+=1,c.resolve()};this.pending.push(d);try{await l(()=>c.promise,{timer:this.timer,signal:n,label:"Reset boot cleanup queue"})}catch(m){let p=this.pending.indexOf(d);if(p>=0)this.pending.splice(p,1);else this.release();throw u(m,"Reset boot cleanup queue was cancelled")}}else this.active+=1;try{return n?.throwIfAborted(),o?.(this.now()-a),await s()}finally{this.release()}}release(){this.active-=1,this.pending.shift()?.()}}class Re{options;timing;now;hooks;resetBoots;async releaseStatus(s,n){let o=s.resourceId?await this.options.store.getResource(s.resourceId):void 0,a=o?.requestId===s.requestId&&o.state!=="idle"&&o.state!=="destroyed",c=await this.options.store.getRequest(s.requestId);return{sessionUuid:n,outcome:a?"cleanup_pending":"released",...c?.timing?{timing:c.timing}:{}}}constructor(s,n,o,a){this.options=s;this.timing=n;this.now=o;this.hooks=a;this.resetBoots=new we(s.limits.maxConcurrentResetBoots,s.timer,o)}async drainAndReset(s,n,o,a){let c=!1,d=this.timing.initialResetTiming(s,n),m=()=>this.timing.recordResetTiming(s,n,d);try{await m();let p=this.now();if(!(await this.options.devices.release(o)).settled)return d.phases.drain=this.now()-p,await m(),"pending";if(d.phases.drain=this.now()-p,a?.throwIfAborted(),!wt(In(n).platform,this.options)||!this.options.devices.reset||n.state!=="resetting")return await m(),"destroy";let h=this.now(),S=(v)=>{d.phases.bootQueue=(d.phases.bootQueue??0)+v},w=async()=>{this.hooks.setResetActive?.(n.resourceId,!0);try{let v=this.options.devices.managesResetBootSlots?async(b)=>(this.hooks.setResetActive?.(n.resourceId,!1),this.resetBoots.run(async()=>(this.hooks.setResetActive?.(n.resourceId,!0),b()),a,S)):void 0;return await this.options.devices.reset(n,void 0,v)}finally{this.hooks.setResetActive?.(n.resourceId,!1)}},R=await(this.needsResetBootSlot(n)?this.resetBoots.run(w,a,S):w());if(d.phases.reset=this.now()-h,d=this.timing.mergeResetTiming(d,R),!["clean","fallback:keep-booted","fallback:erase","fallback:snapshot","fallback:wipe-data"].includes(d.outcome))return d.outcome="pending",await m(),"destroy";return a?.throwIfAborted(),c=!0,await this.completeCleanReset(s,n,d,a),"idle"}catch(p){return d=c?d:this.timing.failedResetTiming(d,p),await m(),VX(p instanceof wi?p.cause:p,o,c)}}needsResetBootSlot(s){return In(s).platform!=="android"&&!this.options.devices.managesResetBootSlots}async completeCleanReset(s,n,o,a){let c=await this.options.store.completeCleanRelease(s.requestId,this.options.owner,this.options.limits);if(this.hooks.notifyReady?.(n.resourceId),c.some((m)=>m.resourceId===n.resourceId))o.outcome="pending",o.retired=!0,await this.timing.recordResetTiming(s,n,o);for(let m of c)a?.throwIfAborted(),await this.hooks.tryCleanup(m,a);if((await this.options.store.getResource(n.resourceId))?.state==="destroyed")o.outcome="destroyed";await this.timing.recordResetTiming(s,n,o)}}function Pn(s){return{...s,timing:{acquisition:s.timing.acquisition?.admission==="reuse"?void 0:s.timing.acquisition,reset:s.timing.reset?.outcome==="clean"||s.timing.reset?.outcome.startsWith("fallback:")?s.timing.reset:void 0}}}function En(s,n){let o=s.acquisitionPhases;return Math.max(n+(o.automationReadyMs?.p50??0),o.totalMs?.p50??0)}function An(s){let n=s?.resetPhases.totalMs?.p90,o=s?.acquisitionPhases.createMs?.p50,a=s?.acquisitionPhases.bootMs?.p50;if(n===void 0||o===void 0||a===void 0||o+a<=0)return;return{resetMs:n,thresholdMs:En(s,o+a)}}class be{store;timer;listeners=new Map;activeResets=new Set;waiters=new Map;constructor(s,n=i){this.store=s;this.timer=n}async snapshot(s){try{return await this.readSnapshot(s)}catch(n){e.warn("Could not estimate resetting simulator readiness",n);return}}setResetActive(s,n){if(n)this.activeResets.add(s);else this.activeResets.delete(s)}releaseWait(s){this.waiters.delete(s)}canWait(s){return this.activeResets.has(s)&&![...this.waiters.values()].includes(s)}async readSnapshot(s){let n=(await this.store.listLiveResources()).filter((d)=>d.state==="resetting"&&this.canWait(d.resourceId)&&s(d.profile)&&In(d).platform!=="android");if(n.length===0)return;let o=await ne({timingSamples:async(d,m,p)=>(await this.store.timingSamples(d,m,p)).map(Pn)},()=>this.timer.now(),86400000,5000),a=new Map,c=Number.POSITIVE_INFINITY;for(let d of n){let m=o.groups.find((S)=>JSON.stringify(S.profile)===JSON.stringify(In(d))),p=An(m);if(!p)continue;let h=await this.remainingMs(d,p.resetMs);if(h===void 0)continue;a.set(d.resourceId,h),c=Math.min(c,p.thresholdMs)}return a.size>0?{thresholdMs:c,expectedReadyMs:a,canWait:(d)=>this.canWait(d),reserveWait:(d,m)=>this.waiters.set(d,m)}:void 0}async remainingMs(s,n){let a=(s.requestId?await this.store.getRequest(s.requestId):void 0)?.timing?.reset;if(!a||a.outcome!=="pending")return;let c=n-(this.timer.now()-a.startedAtMs);return c<0?void 0:c}notify(s){for(let n of this.listeners.get(s)??[])n()}async continueAfterWait(s,n,o,a){if(s.kind!=="wait")return{admission:s,preparationTimeoutMs:o};let c=(n.timingStartedAtMs??this.timer.now())+(o??Po),d=n.resetReadiness?.thresholdMs??0;try{if(await this.wait(s.resourceId,Math.max(0,Math.min(s.waitMs,c-this.timer.now())),a),d>0&&(await this.store.getResource(s.resourceId))?.state==="resetting"&&this.activeResets.has(s.resourceId)&&this.timer.now()<c)await this.wait(s.resourceId,Math.max(0,Math.min(d,c-this.timer.now())),a)}finally{this.releaseWait(n.requestId)}a.throwIfAborted();let m=c-this.timer.now();if(m<=0)throw new ha({code:"session_preparation_failed",message:"Session preparation deadline expired waiting for a resetting simulator",retryable:!0});return n.resetReadiness=void 0,{admission:await this.store.continueAdmission(n),preparationTimeoutMs:m}}async wait(s,n,o){let a=Promise.withResolvers(),c=this.listeners.get(s)??new Set;this.listeners.set(s,c),c.add(a.resolve);let d=this.timer.setTimeout(a.resolve,n);try{if((await this.store.getResource(s))?.state!=="resetting"||!this.activeResets.has(s))return;await l(()=>a.promise,{timer:this.timer,signal:o,label:"Waiting for resetting simulator"})}finally{if(this.timer.clearTimeout(d),c.delete(a.resolve),c.size===0)this.listeners.delete(s)}}}var K=30000;function ke(s,n,o,a){let c={pending:o,committed:a};return s.set(n,c),o.then(()=>s.delete(n),(d)=>{s.delete(n),e.warn(`Session ${n} release failed: ${r(d)}`,d)}),c}function On(s,n){return s!==void 0&&Number.isFinite(s)?Math.max(0,Math.min(s,K)):n??K}async function bt(s,n,o,a){await n.committed;let c=new t("Session release reply budget elapsed");try{return await l(n.pending,{timer:a.timer??i,timeoutMs:On(o,a.releaseReplyBudgetMs),label:`Release session ${s}`,timeoutError:()=>c})}catch(d){if(d===c)return{sessionUuid:s,outcome:"cleanup_pending"};throw d}}var DG=500;class OG{options;releases=new Map;preparations=new Map;preparationOwners=new Map;stopping=!1;poolOperations=new Set;snapshotCleanup=new he({isStopping:()=>this.stopping,preparations:()=>this.preparationOwners.keys(),poolOperations:()=>this.poolOperations});cleanup;destructions;idleExpiry;queuedRecoveryReleases=new Set;timing;resetRelease;resetReadiness;constructor(s){this.options=s;this.destructions=new ye(s.store,s.devices),this.idleExpiry=new ve(s.idleTtlMs??{},s.store,this.destructions,()=>this.now()),this.cleanup=new Se(s.cleanupConcurrency,s.cleanupWaitMs,s.timer),this.timing=new QG(s.store,{now:()=>this.now()}),this.resetReadiness=new be(s.store,{now:()=>this.now(),setTimeout:(n,o)=>(s.timer??i).setTimeout(n,o),clearTimeout:(n)=>(s.timer??i).clearTimeout(n)}),this.resetRelease=new Re(s,this.timing,()=>this.now(),{tryCleanup:(n,o)=>this.tryCleanup(n,o),notifyReady:(n)=>this.resetReadiness.notify(n),setResetActive:(n,o)=>this.resetReadiness.setResetActive(n,o)})}now(){return this.options.timer?.now?.()??i.now()}stats(s=86400000,n=5000){return ne(this.options.store,()=>this.now(),s,n)}async drainIdlePool(){if(this.stopping)throw new Md;if(this.snapshotCleanup.inProgress)throw new B;return ge(this.poolOperations,()=>this.destructions.drainIdlePool())}async cleanupAvdSnapshots(s){return this.snapshotCleanup.run(s)}async expireIdlePool(){if(this.stopping||this.snapshotCleanup.inProgress)return{resources:[]};return ge(this.poolOperations,()=>this.idleExpiry.sweep())}prepare(s,n,o,a){if(this.stopping)return Promise.reject(new Md);if(this.snapshotCleanup.inProgress)return Promise.reject(new B);let c=new AbortController,d=o?AbortSignal.any([o,c.signal]):c.signal,m=this.prepareOnce(s,n,d,a);return this.preparationOwners.set(m,{controller:c,requestId:s.requestId}),m.then(()=>this.preparationOwners.delete(m),()=>this.preparationOwners.delete(m)),m}async prepareOnce(s,n,o,a){let c=!1,d=this.now(),m=fI(s,n);this.preparations.set(s.requestId,(this.preparations.get(s.requestId)??0)+1);try{let p=await this.options.store.getRequest(s.requestId);if(p)return this.replay(p,{config:s,fingerprint:m,livenessOwnerToken:n,signal:o,exportIdentity:a});let h=await vt(this.options,s,{fingerprint:m,signal:o,exportIdentity:a});if(h.timingStartedAtMs=d,this.options.reuseCleanDevices&&s.device.platform!=="android")h.resetReadiness=await this.resetReadiness.snapshot(h.matches);let S=await this.options.store.admit(h);if(S.kind==="existing"||S.kind==="refused")return this.resultUnlessAborted(S.request,o);return c=!0,await this.prepareAdmission(S,h,s,{livenessOwnerToken:n,signal:o})}catch(p){if(p instanceof Sy)throw p;if(p instanceof se)throw e.warn(p.message,p.cause),p;if(!c&&ZG(o))throw e.debug(`Session request ${s.requestId} refused while stopping`,p),new Md;return e.warn(`Session request ${s.requestId} preparation failed: ${r(p)}`,p),this.handlePreparationFailure(s,n,m,{admitted:c,error:qX(p,o),exportIdentity:a})}finally{this.finishPreparation(s.requestId)}}async handlePreparationFailure(s,n,o,{admitted:a,error:c,exportIdentity:d}){let m=wH(c);if(a)return this.failAdmittedPreparation(s,m);if(c instanceof zr)return RH(s,m);let p=await this.options.store.getRequest(s.requestId);if(p?.errorCode===Eu&&this.consumerOwns(p,n)){if(d)await this.options.store.linkRequestExport(s.requestId,p.fingerprint,d);return this.result(p)}let h;try{h=await this.options.store.recordPreAdmissionFailure({requestId:s.requestId,fingerprint:o,parameters:s,owner:this.options.owner,export:d},m)}catch(S){if(!(S instanceof zr))throw S;return e.warn(`Session request ${s.requestId} receipt refused: ${S.message}`,S),RH(s,wH(S))}return this.result(h)}async failAdmittedPreparation(s,n){let o=await this.options.store.fail(s.requestId,this.options.owner,n.message,{errorCode:n.code,retryable:n.retryable});if(o)await this.tryCleanup(o);let a=await this.options.store.getRequest(s.requestId);if(!a)throw new t("Admitted session request lost its durable receipt; cleanup cannot be acknowledged");await this.timing.recordFailedAcquisition(a);let c=await this.result(a);return zX(a,c,n)}finishPreparation(s){let n=(this.preparations.get(s)??1)-1;if(n===0)this.resetReadiness.releaseWait(s),this.preparations.delete(s);else this.preparations.set(s,n)}async replay(s,n){let{config:o,fingerprint:a,livenessOwnerToken:c,signal:d,exportIdentity:m}=n,p=s.errorCode===Eu&&this.consumerOwns(s,c);if(s.fingerprint!==a&&!p)return RH(o,wH(new t("Session request identity was already used with different parameters")));if(m)await this.options.store.linkRequestExport(s.requestId,s.fingerprint,m);return this.resultUnlessAborted(s,d)}async prepareAdmission(s,n,o,{livenessOwnerToken:a,signal:c}){let d=await this.resetReadiness.continueAfterWait(s,n,o.preparationTimeoutMs,c),{admission:m,preparationTimeoutMs:p}=d;while(m.kind==="evict"){if(!await this.destructions.destroy(m.resource).catch((R)=>{if(Kb(R)!=="retryable")throw R;return e.warn(`Device eviction remains pending: ${r(R)}`,R),!1}))throw new ha({code:"eviction_pending",message:"Device eviction remains unresolved; its capacity is still reserved",retryable:!0,retryAfterMs:1000});c.throwIfAborted(),m=await this.options.store.continueAdmission(n)}if(await this.timing.recordRefusedAdmission(m),m.kind==="refused"||m.kind==="existing"||m.kind==="wait")return this.result(m.request);c.throwIfAborted();let h=await this.options.devices.prepare(m.resource,{livenessOwnerToken:a,signal:c,preparationTimeoutMs:p,idleTimeoutMs:o.idleTimeoutMs,executionOwnerPid:o.executionOwnerPid,deviceProfile:X(o)});c.throwIfAborted();let S=await this.options.store.activate(o.requestId,this.options.owner,h.sessionId,{...h.timing,profile:h.profile});if(this.stopping)try{await this.options.store.relinquishForRestart(o.requestId,this.options.owner)}catch(w){e.warn(`Session request ${o.requestId} could not be kept for restart: ${r(w)}`,w)}try{this.timing.logReadyAcquisition(S,m.resource);let w=await this.result(c.aborted?await this.options.store.getRequest(o.requestId)??S:S);return w.outcome==="ready"?await this.rereadIfSuperseded(w,o):w}catch(w){throw new se(o.requestId,w)}}async rereadIfSuperseded(s,n){let o=await this.options.store.getRequest(n.requestId);return o&&o.state!=="active"?this.result(o):s}async status(s){let n=await this.options.store.getRequest(s);return n&&this.result(n)}async ownedStatus(s,n){let o=await this.options.store.getRequest(s);if(!o)return;return this.assertConsumerOwner(o,n),this.result(o)}async abandon(s,n){if(this.stopping)throw new Md;let o=await this.options.store.abandon(s,this.options.owner,n);for(let a of this.preparationOwners.values())if(a.requestId===s)a.controller.abort(new t("Session request was abandoned by its liveness owner"));if(o.request.sessionId)await this.drainAbandonedSession(o.request.sessionId);if(o.ticket&&!this.hasPendingPreparation(s))await this.tryCleanup(o.ticket);return this.result(await this.options.store.getRequest(s)??o.request)}async ownedSessionRequest(s,n){let o=await this.options.store.getSession(s);if(o)this.assertConsumerOwner(o,n);return o}async hasActiveSession(s){let n=await this.options.store.getSession(s);return n?.state==="active"&&Lp(n.owner,this.options.owner)}async getExport(s,n,o){let a=await this.authorizedExport(s,n,o);if(!a)return;return{contractVersion:1,prepareId:s,requestDigest:n,acknowledged:a.record.acknowledgedAtMs!==null,result:await this.result(a.request)}}async acknowledgeExport(s,n,o){let c=await this.authorizedExport(s,n,o)&&await this.options.store.acknowledgeExport(s);return{prepareId:s,outcome:c?"acknowledged":"unknown_export"}}async authorizedExport(s,n,o){let a=await this.options.store.getExport(s);if(!a)return;let c=await this.options.store.getRequest(a.requestId);if(a.requestDigest!==n||!c||!this.consumerOwns(c,o))throw new Sy;return{record:a,request:c}}assertConsumerOwner(s,n){if(!this.consumerOwns(s,n))throw new t("Session request belongs to another liveness owner")}consumerOwns(s,n){return Boolean(n)&&s.fingerprint===fI(s.parameters,n)}release(s,n,o={}){if(n===Bp&&!this.releases.has(s))return this.releaseAfterOwnerExit(s);return bt(s,this.releaseTracked(s),o.replyBudgetMs,this.options)}releaseTracked(s,n){let o=this.releases.get(s);if(o)return o;let a=this.options.store.beginRelease(s,this.options.owner);return ke(this.releases,s,a.then((c)=>this.releaseOnce(s,c,n)),a)}releaseAfterOwnerExit(s){let n=this.commitOwnerExit(s);return ke(this.releases,s,n.then((o)=>o?this.finishOwnerExit(s,o):{sessionUuid:s,outcome:"unknown_session"}),n),n.then(async(o)=>o?this.resetRelease.releaseStatus(o.request,s):{sessionUuid:s,outcome:"unknown_session"})}async commitOwnerExit(s){let n=await this.options.store.getSession(s);if(!n)return;let o=await this.options.store.fail(n.requestId,this.options.owner,PH,{errorCode:Bp});return e.info(`Session ${s} lost its execution owner; request ${n.requestId} is terminal (${Bp})`),{request:await this.options.store.getRequest(n.requestId)??n,...o?{ticket:o}:{}}}async finishOwnerExit(s,n){try{await this.options.devices.release(s)}catch(o){e.warn(`Session ${s} drain after owner exit remains pending: ${r(o)}`)}if(n.ticket)await this.tryCleanup(n.ticket);return this.resetRelease.releaseStatus(n.request,s)}async joinReleases(){await Promise.allSettled([...this.releases.values()].map((s)=>s.pending))}async close(){try{await this.markRestartHandoff()}catch(n){e.warn(`Session broker restart handoff failed: ${r(n)}`,n)}await Promise.allSettled([...this.preparationOwners.keys()]),await this.markRestartHandoff();let s=await this.options.store.listRecoverableRequests();await Promise.allSettled(s.filter((n)=>Lp(n.owner,this.options.owner)&&n.sessionId&&n.state==="releasing"&&!this.queuedRecoveryReleases.has(n.requestId)).map((n)=>this.releaseTracked(n.sessionId).pending)),await this.joinReleases(),await this.cleanup.join(),await this.destructions.joinAll(),await this.snapshotCleanup.join()}async markRestartHandoff(){this.stopping=!0,this.cleanup.stop();for(let n of this.preparationOwners.values())n.controller.abort(new Md);let s=await this.options.store.listRecoverableRequests();await Promise.allSettled(s.filter((n)=>Lp(n.owner,this.options.owner)&&n.sessionId&&n.state==="active").map((n)=>this.options.store.relinquishForRestart(n.requestId,this.options.owner).catch((o)=>{e.warn(`Session request ${n.requestId} could not be kept for restart: ${r(o)}`,o)})))}async recover(){await this.recoverReceipts(),await this.recoverCleanup()}async recoverReceipts(){for(let s of await this.options.store.listRecoverableRequests()){if(this.stopping)return;try{await this.recoverOneRequest(s)}catch(n){e.warn(`Session request ${s.requestId} recovery remains pending: ${r(n)}`,n)}}}async recoverCleanup(){if(this.stopping)return;let s=new Map((await this.options.store.listRecoverableRequests()).filter((o)=>Lp(o.owner,this.options.owner)).map((o)=>[o.requestId,o])),n=[];for(let o of await this.options.store.listLiveResources()){if(o.requestId&&this.hasPendingPreparation(o.requestId))continue;let a=o.requestId?s.get(o.requestId):void 0;if(o.state!=="destroying"&&a?.state!=="releasing")continue;if(a?.state==="releasing")this.queuedRecoveryReleases.add(a.requestId);n.push({resourceId:o.resourceId,run:(c)=>this.recoverResource(o,a,c)})}await this.cleanup.run(n)}async recoverResource(s,n,o){if(n?.state==="releasing"&&n.sessionId){let a=n.sessionId;await this.releaseTracked(a,o).pending;return}if(n?.state==="failed"&&n.errorCode===Eu&&n.sessionId)await this.drainAbandonedSession(n.sessionId);o.throwIfAborted(),await this.tryCleanup(Za(s),o)}async recoverOneRequest(s){if(Lp(s.owner,this.options.owner)){await this.recoverOwnedRequest(s);return}if(await this.recoverRestartHandoff(s)!=="terminal")return;if(await this.options.store.recoverRequest(s.requestId,this.options.owner),s.state==="acquiring")await this.timing.recordFailedAcquisition(s)}async recoverOwnedRequest(s){if(s.state==="active"&&s.sessionId&&this.options.sessionDisposition&&await this.options.sessionDisposition(s.sessionId)==="gone"&&!this.stopping)await this.options.store.beginRelease(s.sessionId,this.options.owner);if(s.state==="acquiring"&&!this.preparations.has(s.requestId))await this.options.store.failInterruptedAcquisition(s.requestId,this.options.owner,"Acquisition ended without committing a session; cleanup is pending"),await this.timing.recordFailedAcquisition(s)}async recoverRestartHandoff(s){if(!s.restartHandoff||s.state!=="active"||!s.sessionId)return"terminal";if((this.options.sessionDisposition?await this.options.sessionDisposition(s.sessionId):"gone")==="gone")return"terminal";let o=await this.options.store.adoptRestartHandoff(s.requestId,this.options.owner);if(o==="adopted")e.info(`Session request ${s.requestId} adopted session ${s.sessionId} after a provider restart`);return o==="not-handoff"?"terminal":o}pruneReceipts(){return this.options.store.pruneTerminalRequests(this.options.receiptRetentionMs??N,DG,this.options.exportRetentionMs??cN)}async releaseOnce(s,n,o){if(!n)return{sessionUuid:s,outcome:"unknown_session"};if(n.state==="released"||n.state==="failed")return this.resetRelease.releaseStatus(n,s);let a=await this.requestResource(n);if(!a)throw new t("Session has no durable resource; cannot acknowledge cleanup");o?.throwIfAborted();try{if(n.state==="releasing"&&a.state==="destroying")return await this.tryCleanup(Za(a),o),this.resetRelease.releaseStatus(n,s);let c=await this.resetRelease.drainAndReset(n,a,s,o);if(o?.throwIfAborted(),c==="pending")return{...await this.resetRelease.releaseStatus(n,s),outcome:"cleanup_pending"};if(c==="idle")return this.resetRelease.releaseStatus(n,s);let d=await this.options.store.releaseByDestruction(n.requestId,this.options.owner);if(this.resetReadiness.notify(a.resourceId),d)await this.tryCleanup(d,o);return this.resetRelease.releaseStatus(n,s)}finally{this.resetReadiness.notify(a.resourceId)}}async drainAbandonedSession(s){try{let n=this.releases.get(s);if(n)await n.pending;else await this.options.devices.release(s)}catch(n){e.warn(`Abandoned session ${s} release remains pending: ${r(n)}`)}}async requestResource(s){return s.resourceId?this.options.store.getResource(s.resourceId):void 0}async result(s){let n=await this.requestResource(s);return WX(s,n,this.hasPendingPreparation(s.requestId))}async resultUnlessAborted(s,n){let o=await this.result(s);return n.throwIfAborted(),o}hasPendingPreparation(s){return(this.preparations.get(s)??0)>0}tryCleanup(s,n){return this.destructions.tryCleanup(s,n)}}var re=y().min(1),kt=f({prepareId:y().min(1).max(256),requestDigest:y().min(1).max(256)}).strict(),Mn=kt.extend({livenessOwnerToken:re}).strict(),Tn=f({config:hr(),livenessOwnerToken:re,export:kt.optional()}).strict(),Dt=f({requestId:y().min(1),livenessOwnerToken:re}).strict(),Cn=Dt,xn=f({sessionId:y().uuid(),livenessOwnerToken:re,reason:ee(Bp).optional(),replyBudgetMs:J3((s)=>typeof s==="number"&&!Number.isFinite(s)?void 0:s,A().transform((s)=>Math.max(0,Math.min(s,K))).nullish())}).strict();async function _n(s,n,o,a){let c=n.getSessionBrokerService?.();if(!c)return x(n);q(n,a,c.scopeKey,[]);let d=Tn.safeParse(s.params);if(!d.success)return{success:!1,code:"session_config_invalid",error:"config and livenessOwnerToken are required"};let m;try{m=f6(d.data.config)}catch(h){return e.warn(`Session broker rejected invalid configuration: ${r(h)}`),{success:!1,code:"session_config_invalid",error:r(h)}}let p;try{p=await c.broker.prepare(m,d.data.livenessOwnerToken,o,d.data.export)}catch(h){return H(h)}if(!o?.aborted)q(n,a,c.scopeKey,p.outcome==="ready"&&p.sessionUuid?[p.sessionUuid]:[]);return{success:!0,result:{...p}}}async function Bn(s,n){return Pt(s,n,!1)}async function Nn(s,n){return Pt(s,n,!0)}async function Pt(s,n,o){let a=n.getSessionBrokerService?.();if(!a)return x(n);let c=Mn.safeParse(s.params);if(!c.success)return{success:!1,code:"session_config_invalid",error:"prepareId, requestDigest and livenessOwnerToken are required"};let{prepareId:d,requestDigest:m,livenessOwnerToken:p}=c.data;try{let h=o?await a.broker.acknowledgeExport(d,m,p):await a.broker.getExport(d,m,p);return h?{success:!0,result:{...h}}:{success:!1,code:"session_export_not_found",error:"No session export has that prepare identity"}}catch(h){return H(h)}}function H(s){if(s instanceof jb||s instanceof Md||s instanceof B){let n=`Session broker rejected request: ${r(s)}`;if(s.retryable)e.debug(n);else e.warn(n);return{success:!1,code:s.code,error:r(s),retryable:s.retryable,...s.retryAfterMs===void 0?{}:{retryAfterMs:s.retryAfterMs}}}if(!(s instanceof Sy))throw s;return e.warn(`Session broker rejected export identity: ${r(s)}`),{success:!1,code:s.code,error:r(s)}}async function Fn(s,n,o){let a=n.getSessionBrokerService?.();if(!a)return x(n);q(n,o,a.scopeKey,[]);let c=Dt.safeParse(s.params);if(!c.success)return{success:!1,error:"requestId and livenessOwnerToken are required"};let d=await a.broker.ownedStatus(c.data.requestId,c.data.livenessOwnerToken);return q(n,o,a.scopeKey,d?.outcome==="ready"&&d.sessionUuid?[d.sessionUuid]:[]),d?{success:!0,result:{...d}}:{success:!1,code:"session_request_not_found",error:"No committed session request has that identity"}}async function Ln(s,n){let o=n.getSessionBrokerService?.();if(!o)return x(n);let a=Cn.safeParse(s.params);if(!a.success)return{success:!1,error:"requestId and livenessOwnerToken are required"};try{return{success:!0,result:{...await o.broker.abandon(a.data.requestId,a.data.livenessOwnerToken)}}}catch(c){return H(c)}}async function qn(s,n){let o=n.getSessionBrokerService?.();if(!o)return x(n);let a=xn.safeParse(s.params);if(!a.success)return{success:!1,error:"sessionId and livenessOwnerToken are required"};try{if(!await o.broker.ownedSessionRequest(a.data.sessionId,a.data.livenessOwnerToken))return{success:!0,result:{sessionUuid:a.data.sessionId,outcome:"unknown_session"}};return{success:!0,result:{...await o.broker.release(a.data.sessionId,a.data.reason,{replyBudgetMs:a.data.replyBudgetMs??void 0})}}}catch(c){return H(c)}}async function Et(s,n,o,a){let c=s.getSessionBrokerService?.();if(!c)return x(s);q(s,a,c.scopeKey,[]);let d=await c.broker.ownedStatus(o.requestId,o.livenessOwnerToken);if(!d||d.outcome!=="ready"||d.sessionUuid!==n)return{success:!1,code:"session_ownership_lost",error:"That request no longer grants this session; no replacement was acquired"};if(s.getSessionManager().getSessionLivenessOwnerToken?.(n)!==o.livenessOwnerToken)return{success:!1,code:"session_ownership_lost",error:"This provider no longer holds the requested session for that owner"};q(s,a,c.scopeKey,[n]);return}function q(s,n,o,a){if(n)s.getBrokerConnectionScopes?.().bind(n,{scopeKey:o,sessionUuids:a})}function x(s){let n=s.isSessionBrokerMode?.()===!0;return{success:!1,code:"session_broker_unavailable",error:"Session-broker mode is not available in this provider",retryable:n,...n?{retryAfterMs:Od}:{}}}var At=[["daemon/sessionBrokerStats",async(s,n)=>{let o=n.getSessionBrokerService?.();if(!o)return x(n);let a=f({windowMs:A().finite().min(0).max(N).optional(),limit:A().int().min(1).max(1e4).optional()}).strict().safeParse(s.params??{});if(!a.success)return{success:!1,code:"session_config_invalid",error:"Invalid broker stats window or limit"};return{success:!0,result:{...await o.broker.stats(a.data.windowMs,a.data.limit)}}}],["daemon/prepareSession",(s,n,{signal:o,context:a})=>_n(s,n,o,a.socketSessionId)],["daemon/getSessionExport",(s,n)=>Bn(s,n)],["daemon/acknowledgeSessionExport",(s,n)=>Nn(s,n)],["daemon/sessionRequestStatus",(s,n,{context:o})=>Fn(s,n,o.socketSessionId)],["daemon/abandonSessionRequest",(s,n)=>Ln(s,n)],["daemon/releaseBrokerSession",(s,n)=>qn(s,n)],["daemon/drainBrokerPool",(s,n,{context:o})=>$n(s,n,o.socketSessionId)],["daemon/cleanupBrokerAvdSnapshots",(s,n,{context:o})=>Hn(s,n,o.socketSessionId)]];async function $n(s,n,o){let a=ZS({binding:n.getBrokerConnectionScopes?.().get(o),action:"daemon/drainBrokerPool"});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getSessionBrokerService?.();if(!c)return x(n);if(!f({}).strict().safeParse(s.params??{}).success)return{success:!1,code:"session_config_invalid",error:"Drain takes no parameters"};try{return{success:!0,result:{...await c.broker.drainIdlePool()}}}catch(m){return H(m)}}async function Hn(s,n,o){let a=ZS({binding:n.getBrokerConnectionScopes?.().get(o),action:"daemon/cleanupBrokerAvdSnapshots"});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getSessionBrokerService?.();if(!c)return x(n);if(!f({}).strict().safeParse(s.params??{}).success)return{success:!1,code:"session_config_invalid",error:"Snapshot cleanup takes no parameters"};try{return{success:!0,result:{reports:await c.broker.cleanupAvdSnapshots(async()=>{let m=c.avdSnapshotCleanup,h=(await m.filesystem.listNames(m.resolver.getAvdHome())).filter((S)=>S.endsWith(".avd")&&S.length>4).map((S)=>S.slice(0,-4));return ht(h,m)})}}}catch(d){return H(u(d,"Snapshot cleanup failed; verify AVD home access and retry"))}}function Un(s,n){if(s===null)return n;return n===null?s:Math.min(s,n)}function $M(s,n){let o=s.clientActivity(n);return{sessionId:s.sessionForDevice(n),activeExecutions:s.activeExecutionCount(n),inFlightRequests:o.inFlightRequests,streaming:s.hasStreamSubscriber(n),idleForMs:Un(s.toolIdleForMs(n),o.idleForMs)}}function gX(s){return s.sessionId!==null||s.activeExecutions>0||s.inFlightRequests>0||s.streaming}function J1(s){return{sessionForDevice:s,activeExecutionCount:(n)=>j.getActiveDeviceExecutionCount(n),toolIdleForMs:(n)=>j.getDeviceIdleForMs(n),hasStreamSubscriber:(n)=>Rt()?.hasSubscriberForDevice(n)??!1,clientActivity:(n)=>k.getForwardLeaseActivity(n)}}function Ot(){return{idleMs:lL(),release:async(s)=>{if(!k.getForwardLeaseHeldDeviceIds().includes(s))return;await k.releaseIdleForwardLease(s)}}}function T(s,n){return s.sessionClockToReportedWall?.(n)??s.sessionClockToWall?.(n)??n}async function oe(s,n,o){return De(n,await G(s,n),o)}function De(s,n,o){return{success:!1,error:`Session not found: ${s}`,code:rc,...Jf(n.releaseReason,n.idleTimeoutMs),...o!==void 0?{daemonInstance:o}:{}}}async function G(s,n){let o=await Pe(s,n),a=await Vn(s,n,o);return a===void 0?{releaseReason:o}:{releaseReason:o,idleTimeoutMs:a}}async function Vn(s,n,o){if(o!=="cli-idle-timeout")return;try{return await s.getReleasedSessionIdleTimeoutMs?.(n)}catch(a){e.warn(`Idle window lookup failed for ${n}: ${r(a)}`,a);return}}async function Pe(s,n){try{return await s.getReleasedSessionReason?.(n)}catch(o){e.warn(`Release reason lookup failed for ${n}: ${r(o)}`,o);return}}var It=32,Mt=128,Tt=128;function jn(s){return s===null}class MG{timer;heartbeatTimeoutMs;onObserverGone;sessions=new Map;disposed=!1;sweepHandle=null;sweepAtMs=Number.POSITIVE_INFINITY;clock;stallProbe;constructor(s=i,n=Ya()+is,o){this.timer=s;this.heartbeatTimeoutMs=n;this.onObserverGone=o;this.clock=new qR(s)}register(s,n){if(this.purgeExpired(),this.disposed)return{accepted:!1,error:"Observer session registry is closed; reconnect to the daemon"};if(!this.sessions.has(s)&&this.sessions.size>=It)return{accepted:!1,error:`Observer session limit (${It}) reached; release a session or wait for heartbeat expiry before retrying`};let o=this.clock.now(),a=o+this.heartbeatTimeoutMs;return this.sessions.set(s,{sessionId:s,clientName:n,lastHeartbeat:o,expiresAtMs:a}),this.scheduleSweep(),e.debug(`Registered observer session ${s} (${n})`),{accepted:!0,heartbeatTimeoutMs:this.heartbeatTimeoutMs,expiresAtMs:this.clock.toWall(a)}}heartbeat(s){this.purgeExpired();let n=this.sessions.get(s);if(!n)return!1;return n.lastHeartbeat=this.clock.now(),n.expiresAtMs=n.lastHeartbeat+this.heartbeatTimeoutMs,!0}release(s,n="explicit-release"){return this.purgeExpired(),this.remove(s,n)}list(){return this.purgeExpired(),Array.from(this.sessions.values(),(s)=>({...s,lastHeartbeat:this.clock.toWall(s.lastHeartbeat),expiresAtMs:this.clock.toWall(s.expiresAtMs)}))}resolveObserverScope(s){return this.purgeExpired(),this.sessions.has(s)?{kind:"unowned-devices-only"}:{kind:"denied"}}canObserveDevice(s,n,o){return this.resolveObserverScope(s).kind!=="denied"&&jn(o.getSessionForDevice(n))}setStallProbe(s){this.stallProbe=s}forgiveStall({lostMs:s,sleptMs:n,gapAgeMs:o}){let a=this.clock.now(),c=0;for(let d of this.sessions.values()){if(o!==void 0&&!tI(d.lastHeartbeat,this.heartbeatTimeoutMs,a-o))continue;let m=d.expiresAtMs-this.heartbeatTimeoutMs;d.expiresAtMs=rI(m,a,s+n)+this.heartbeatTimeoutMs,c++}return c}dispose(){this.disposed=!0,this.sessions.clear(),this.cancelSweep()}remove(s,n){let o=this.sessions.delete(s);if(o){if(e.debug(`Removed observer session ${s}: ${n}`),n!=="promotion")this.onObserverGone?.(s)}return o}scheduleSweep(){if(this.disposed)return;let s=Math.min(...Array.from(this.sessions.values(),(n)=>n.expiresAtMs));if(!Number.isFinite(s)||this.sweepHandle&&this.sweepAtMs<=s)return;this.cancelSweep(),this.sweepAtMs=s,this.sweepHandle=this.timer.setTimeout(()=>{this.sweepHandle=null,this.sweepAtMs=Number.POSITIVE_INFINITY,this.purgeExpired(),this.scheduleSweep()},Math.max(0,s-this.clock.now())),this.sweepHandle?.unref?.()}cancelSweep(){if(this.sweepHandle)this.timer.clearTimeout(this.sweepHandle),this.sweepHandle=null;this.sweepAtMs=Number.POSITIVE_INFINITY}purgeExpired(){this.stallProbe?.();let s=this.clock.now();for(let n of this.sessions.values())if(n.expiresAtMs<=s)this.remove(n.sessionId,"heartbeat-timeout")}}var Wn=f({sessionId:y().max(Tt).uuid(),clientName:y().max(Mt).trim().min(1),sessionBroker:f({requestId:y().min(1),livenessOwnerToken:y().min(1)}).strict().optional()});function Kn(s,n){if(s&&!s.sessionUuids.has(n)){let o=new lc(aw,"session",s.scopeKey,{sessionUuid:n});return{success:!1,code:o.code,retryable:!1,error:o.message}}return}async function zn(s,n){return await s.waitForSessionReleaseWithin?.(n,uv)===!1?{success:!1,error:`Session ${n} release is still in progress after ${uv}ms; retry registration`}:void 0}async function Gn(s,n){let o=Bt(s,n),a;if(!o)try{a=await s.getExpiredReleaseSnapshot?.(n)}catch(d){e.warn(`Expired snapshot lookup failed for ${n}: ${r(d)}`,d)}let c=o??a??await Jn(s,n);return Nt(n,c,a!==void 0)}function Bt(s,n){return s.getTerminalReleaseSnapshot?.(n)??s.peekTerminalAnswerForEndedSession?.(n)?.release}function Nt(s,n,o=!1){if(!n?.terminal||!o&&!dI(n.releaseReason))return;let{releaseReason:a,ownerPid:c,cliIdleTimeoutMs:d}=n;return{success:!1,code:Oo,retryable:!1,nextAction:Qn,error:`Session ${s} is terminal after ${a} and cannot be registered again. Acquire a new device with getAndroid or getApple, or register a new session UUID to observe.`,details:{sessionUuid:s,reason:a,...ui(a),...Fl(a,d),...c===void 0?{}:{ownerPid:c}},...Jf(a,d)}}async function Jn(s,n){let{releaseReason:o,idleTimeoutMs:a}=await G(s,n);return o===void 0?void 0:{releaseReason:o,terminal:Jt(o),...a===void 0?{}:{cliIdleTimeoutMs:a}}}function xt(s,n,o){let a=al(s,n);if(!a)return;return s.recordSessionClientName?.(n,o),{success:!0,result:{accepted:!0,heartbeatTimeoutMs:a.heartbeatTimeoutMs,expiresAtMs:T(s,a.lastHeartbeat+a.heartbeatTimeoutMs)}}}function _t(s,n,o){return s.terminalAnswerForEndedSession?.(n),o}async function Ft(s,n,{context:o={}}={}){let a=s.params,c=Wn.safeParse(a);if(!c.success)return{success:!1,error:`Invalid registerSession parameters: ${c.error.message}`};let{sessionId:d,clientName:m}=c.data,p=await Zn(n,c.data,o);if(p)return p;let h=n.getSessionManager(),S=await zn(h,d);if(S)return S;let w=xt(h,d,m);if(w)return w;let R=await Gn(h,d);if(R)return _t(h,d,R);let v=xt(h,d,m);if(v)return v;let b=Nt(d,Bt(h,d));if(b)return _t(h,d,b);return Xn(n.getObserverSessionRegistry?.(),d,m)}function Xn(s,n,o){if(!s)return{success:!1,error:"Observer session registration is unavailable"};let a=s.register(n,o);return a.accepted?{success:!0,result:{...a}}:{success:!1,error:a.error}}async function Zn(s,n,o){let{sessionId:a,sessionBroker:c}=n;if(c){let m=await Et(s,a,c,o.socketSessionId);if(m)return m}let d=Kn(s.getBrokerConnectionScopes?.().get(o.socketSessionId),a);if(d)return d;return}var er=`${process.pid}:${performance.timeOrigin}`;async function Lt(s,n){let o=f({sessionId:y().min(1),livenessOwnerToken:y().refine((m)=>m.trim().length>0)}).safeParse(s.params);if(!o.success)return{success:!1,error:`Invalid releaseLivenessOwnership parameters: ${o.error.message}`};let{sessionId:a,livenessOwnerToken:c}=o.data,d=await n.getSessionManager().releaseLivenessOwnership?.(a,c);if(d==="not-found")return{success:!1,code:rc,error:`Session not found: ${a}`};if(d==="not-owner"||d===void 0)return{success:!1,code:aA,error:`Session ${a}'s liveness can only be released by its current owner token; nothing changed.`};return{success:!0,result:{sessionId:a,alreadyUnowned:d==="already-unowned"}}}function qt(s,n){let o=f({livenessOwnerToken:y().refine((m)=>m.trim().length>0)}).safeParse(s.params);if(!o.success)return{success:!1,error:"livenessOwnerToken parameter required"};let{livenessOwnerToken:a}=o.data,c=n.getSessionManager();return{success:!0,result:{sessions:(c.getAllSessions?.()??[]).filter((m)=>m.livenessOwnerToken===a&&!$i(c,m.sessionId,m)).map((m)=>({sessionId:m.sessionId,deviceId:m.assignedDevice,platform:m.platform,lastUsedAt:T(c,m.lastUsedAt)}))}}}function X1(s){return s.livenessOwnerToken!==void 0||!!s.livenessOwnershipClaims?.size}async function Z1(s,n,o,a){if(a!==void 0)s.creditOwnerHeartbeatDuringRelease?.(o,a);if(n?.heartbeat(o))return{kind:"observer"};return{kind:"notFound",recorded:await G(s,o)}}async function $t(s,n){let o=tr(s),a=o?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getDaemonInstance?.()??er,d=lr(o?.expectedDaemonInstance,c,a);if(d)return d;let m=pr(o,c),p=n.getSessionManager(),h=al(p,a);if(!h||$i(p,a,h))return sr(n,p,a,{params:o,report:m});return or({manager:p,session:h,sessionId:a,params:o,report:m})}function tr(s){return s.params}async function sr(s,n,o,{params:a,report:c}){let d=await Z1(n,s.getObserverSessionRegistry?.(),o,typeof a?.livenessOwnerToken==="string"?a.livenessOwnerToken:void 0);if(d.kind==="observer")return{success:!0,result:{sessionId:o}};return De(o,d.recorded,c.daemonInstance)}function rr(s){return ie(s.params?.livenessOwnerKind,s.session)??(Ht(s.params?.livenessOwnerKind,s.session)?Ut(s.sessionId):void 0)}async function or(s){let{manager:n,sessionId:o,report:a}=s,c=rr(s);if(c)return c;let d=fr(s.params),m=s.params?.claimLivenessOwnership===!0;if(!d&&X1(s.session))return{success:!0,result:{sessionId:o}};if(d){if(n.hasLivenessOwnership?.(o,d))n.recordHeartbeat?.(o);let p=await ur(n,o,d,m),h=ir(s,d,p);if(h)return h;if(!m)return n.recordHeartbeat?.(o),Y(n,o,a)}return ar(s)}function ir(s,n,o){let{manager:a,sessionId:c,report:d}=s,m=dr(a,s.session,c,{livenessOwnerToken:n,outcome:o});if(m?.code===rc)return oe(a,c,d.daemonInstance);if(m){let p=al(a,c);return m.code===Gf&&p&&Ht(s.params?.livenessOwnerKind,p)?Ut(c):m}return}function ar(s){let{manager:n,sessionId:o,report:a}=s,c=gr(s);if(c)return c;if(s.params?.livenessPolicy===yC||s.params?.livenessPolicy===void 0){if(n.restoreHeartbeatLivenessPolicy?.(o))return Y(n,o,a,{livenessPolicy:yC})}return n.recordHeartbeat?.(o),Y(n,o,a)}function lr(s,n,o){if(typeof s!=="string"||s===n)return;return{success:!1,code:GN,error:`The daemon was restarted since this heartbeat's owner last heard from it, so the heartbeat for session ${o} was refused and nothing changed. Resume the session by naming its sessionUuid in a tool call.`}}function Y(s,n,o,a={}){let c=al(s,n),d=o.daemonInstance===void 0?{}:{daemonInstance:o.daemonInstance},m=o.idleRelease&&c?W(c,s.getIdleReleaseExecutionVeto?.(n),s.getSessionLeaseState?.(n)?.phase):null,p=o.idleRelease&&c?{idleReleaseAt:m===null?null:T(s,m)}:{};return{success:!0,result:{sessionId:n,...a,...p,...d}}}function cr(s){return Cl(s.livenessPolicy)&&s.livenessOwnerToken!==void 0}function ie(s,n){if(s!==vC||!cr(n))return;return{success:!1,code:YN,error:`Session ${n.sessionId} is owned by an MCP proxy, which is the only liveness owner for its sessions, so this heartbeat was rejected and nothing changed. The external heartbeat keeper is for one-shot CLI sessions only. Let the harness's proxy keep the session alive and check its state with \`--daemon session-info ${n.sessionId}\`.`}}function Ht(s,n){return s===vC&&n.livenessPolicy==="cli-idle"}function Ut(s){return{success:!0,result:{sessionId:s,livenessPolicy:"cli-idle",livenessUnchanged:!0}}}function dr(s,n,o,{livenessOwnerToken:a,outcome:c}){let d=al(s,o);if(c==="not-found"||!d||d!==n||$i(s,o,d))return{success:!1,error:`Session not found: ${o}`,code:rc};let m=s.hasLivenessOwnership?.(o,a)??d.livenessOwnerToken===a;return mr(c==="claimed"&&!m?"superseded":c,o,d.livenessOwnerToken!==void 0,()=>s.getOwnerLeaseHold?.(o))}async function ur(s,n,o,a){if(a)return await s.claimLivenessOwnership?.(n,o)??"superseded";return(s.hasLivenessOwnership?.(n,o)??!1)||(s.claimUnownedLivenessOwnership?.(n,o)??!1)?"claimed":"superseded"}function mr(s,n,o,a){if(s==="conflict"){let c=a();return{success:!1,code:fS,error:`Session ${n} is owned by another liveness owner whose lease is still live, so this claim was rejected and nothing changed. Retry after the owner's lease expires, or claim with the owner's stable token.`,...c?{result:{liveness:c}}:{}}}if(s==="superseded"&&!o)return{success:!1,code:Yf,error:`Session ${n}'s liveness is unowned. Explicitly claim ownership before sending keeper ticks; nothing changed.`};if(s==="superseded")return{success:!1,code:Gf,error:`The token no longer owns session ${n}'s liveness. Another token has claimed it since. Re-claim with a fresh token and --claim-liveness-ownership once that owner's lease expires, or stop the keeper.`};return}function pr(s,n){return{idleRelease:s?.reportIdleRelease===!0,...s?.reportDaemonInstance===!0?{daemonInstance:n}:{}}}function fr(s){return typeof s?.livenessOwnerToken==="string"&&s.livenessOwnerToken.length>0?s.livenessOwnerToken:void 0}function gr(s){if(s.params?.livenessPolicy===Lh&&al(s.manager,s.sessionId)?.livenessPolicy===Yn)return s.manager.recordHeartbeat?.(s.sessionId),Y(s.manager,s.sessionId,s.report,{livenessPolicy:Yn,livenessUnchanged:!0});if(s.params?.livenessPolicy===Lh)return s.manager.adoptCliLivenessPolicy?.(s.sessionId,s.params.idleTimeoutMs),Y(s.manager,s.sessionId,s.report,{livenessPolicy:"cli-idle",idleTimeoutMs:al(s.manager,s.sessionId)?.heartbeatTimeoutMs});return}var Ee="daemon/capabilities",Sr="input/typeText.mode:append",yr="input/gestureStream";async function UM(s,n,o={}){if(!s.method.startsWith("daemon/"))return{success:!1,error:`Unsupported daemon method: ${s.method}`};if(s.method===Ee)return wr(n);if(!n.isInitialized())return{success:!1,error:"Daemon not initialized"};return Dr(s,n,o)}async function wr(s){let n=await Rr(s);return{success:!0,result:{...n?{bindingRegistry:n}:{},capabilities:[Sr,yr,aw,...s.isSessionBrokerMode?.()?[EX,kX]:[]]}}}async function Rr(s){if(!s.isSessionBrokerMode?.())return;try{return await s.getBindingRegistrySchemaProbe?.()?.describeSchema()}catch(n){if(e.warn("[Bindings] Cannot describe the open registry schema",n),n instanceof zr)return{schemaVersion:null,knownSchemaVersion:zG,supported:!1,writerVersion:null};return}}var kr=new Map([...At,[aw,Ft],[sL,Lt],[os,$t],[aL,qt],["daemon/refreshDevices",(s,n,{context:o})=>Pr(s,n,o)],["daemon/availableDevices",Er],["daemon/sessionInfo",(s,n)=>Ar(s,n)],["daemon/activeSessions",(s,n)=>Ir(s,n)],[gC,(s,n,{executions:o,context:a})=>Mr(s,n,o,a)],[lee,Nr],[qV,Fr],[dL,Lr]]);async function Dr(s,n,o){let a=kr.get(s.method);if(!a)return{success:!1,error:`Unsupported daemon method: ${s.method}`};return await a(s,n,{...o,context:o.context??{}})}async function jt(s){try{if(s.getRefreshedInventory){let{stats:n,deviceIds:o}=await s.getRefreshedInventory();return{ok:!0,stats:n,deviceIds:o}}return{ok:!0,stats:s.getRefreshedStats?await s.getRefreshedStats():s.getStats()}}catch(n){return e.warn(`[Daemon] Could not refresh device ownership: ${r(n)}`,n),{ok:!1,refusal:{success:!1,error:`Could not determine which devices are available: ${r(n)}. Resolve the cause and retry.`,...n instanceof Ve?{code:n.code,retryable:n.retryable}:{}}}}}async function Pr(s,n,o){let a=ZS({binding:n.getBrokerConnectionScopes?.().get(o.socketSessionId),action:s.method});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getDevicePool(),d=c.refreshDevicesWithOutcome?await c.refreshDevicesWithOutcome():{addedCount:await c.refreshDevices()};if(d.failure!==void 0)return{success:!1,error:`Could not refresh device list: ${d.failure}. Resolve the cause and retry.`};let m=await jt(c);if(!m.ok)return m.refusal;let p=m.stats;return{success:!0,result:{addedDevices:d.addedCount,totalDevices:p.total,availableDevices:p.idle,stats:p}}}async function Er(s,n){let o=n.getDevicePool(),a=await jt(o);if(!a.ok)return a.refusal;let c=a.stats,d=o.getRecoveryPolicy?.(),m=o.getAllDevices?.().filter((p)=>!a.deviceIds||a.deviceIds.has(p.id)).map((p)=>({deviceId:p.id,platform:p.platform,recoveryEligibility:o.getRecoveryEligibility?.(p.id),...o.getDeviceHealthMarker?.(p.id)?{unhealthy:o.getDeviceHealthMarker(p.id)}:{}}));return{success:!0,result:{availableDevices:c.idle,totalDevices:c.total,assignedDevices:c.assigned,errorDevices:c.error,stats:c,...d?{recoveryPolicy:d}:{},...m?{devices:m}:{}}}}async function Ar(s,n,o=j){let a=s.params?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getSessionManager(),d=al(c,a);if(!d)return oe(c,a);return{success:!0,result:{sessionId:d.sessionId,assignedDevice:d.assignedDevice,...QM(d),platform:d.platform,createdAt:T(c,d.createdAt),lastUsedAt:T(c,d.lastUsedAt),expiresAt:T(c,d.expiresAt),cacheSize:JSON.stringify(d.cacheData).length,...me(d,o.getActiveDeviceSessionExecutionCount(a),c.getIdleReleaseExecutionVeto?.(a),{toWall:(m)=>T(c,m),leasePhase:c.getSessionLeaseState?.(a)?.phase}),...Or(c.getSessionLeaseState?.(a)),...$i(c,a,d)?{releasing:!0}:{}}}}function Or(s){return s?{liveness:{state:s.phase,remainingMs:s.remainingMs}}:{}}async function Ir(s,n,o=j){let a=n.getSessionManager(),c=a.getAllSessions?.()??[],d=c.filter((p)=>$i(a,p.sessionId,p)).length,m=s.params?.includeSessions===!0;return{success:!0,result:{activeSessions:c.length,activeExecutions:o.getActiveExecutionCount(),...d>0?{releasingSessions:d}:{},...m?{sessions:c.map((p)=>({sessionId:p.sessionId,assignedDevice:p.assignedDevice,...QM(p),platform:p.platform,...me(p,o.getActiveDeviceSessionExecutionCount(p.sessionId),a.getIdleReleaseExecutionVeto?.(p.sessionId),{toWall:(h)=>T(a,h),leasePhase:a.getSessionLeaseState?.(p.sessionId)?.phase}),...$i(a,p.sessionId,p)?{releasing:!0}:{}}))}:{}}}}function Wt(s,n,o,a){let c=s.getSessionManager(),d=iv({binding:s.getBrokerConnectionScopes?.().get(n.socketSessionId),action:o,deviceId:a.deviceId===void 0?void 0:Cp(s.getDevicePool(),a.deviceId),requesterSessionUuid:a.sessionUuid,grantedDeviceOf:(m)=>c.getSession(m)?.assignedDevice??void 0});return d?{success:!1,code:d.code,error:d.message}:void 0}async function Mr(s,n,o,a={}){let c=s.params,d=c?.sessionId;if(!d)return{success:!1,error:"sessionId parameter required"};let m=Wt(n,a,gC,{sessionUuid:d});if(m)return m;let p=n.getSessionManager(),h=Tr(p,d,c?.livenessOwnerToken);if(h)return h;let S=p.getSession(d)??p.getReleasingSession?.(d);if(!S&&!p.hasSession(d))return await Cr(n,d,c?.requireKnown===!0,o);return zt(n,p,d,{session:S,executions:o})}function Tr(s,n,o){if(typeof o!=="string"||o.length===0)return;if(!s.hasSession(n)&&!s.getReleasingSession?.(n))return;if((s.getSessionLivenessOwnerToken?s.getSessionLivenessOwnerToken(n):(s.getSession(n)??s.getReleasingSession?.(n))?.livenessOwnerToken)===o)return;return{success:!1,code:aA,error:`Session ${n} can only be released by its current liveness owner; nothing changed.`}}async function Cr(s,n,o,a){if(typeof n==="string"&&s.getObserverSessionRegistry?.()?.release(n))return{success:!0,result:{message:`Session ${n} released`,alreadyReleased:!1}};return await _r(s,s.getSessionManager(),n,{requireKnown:o,executions:a})}async function Kt(s,n,o){let a=n.getKeepAwakeRestoreReport?.(o),c={...a?{keepAwakeRestore:a}:{},...await LM(o,{registry:s.getScreenLockRegistry?.()}),...await BM(o,{registry:s.getPowerRegistry?.()})},d=dt(c);return{...c,...d?{cleanup:d}:{}}}async function _r(s,n,o,{requireKnown:a,executions:c}){if(!n.getTerminalReleaseSnapshot?.(o)){let d=await n.releaseSession(o),m=n.getSession(o)??n.getReleasingSession?.(o);if(m||n.hasSession(o))return zt(s,n,o,{session:m,executions:c});if(d!==null&&d!==void 0){let p=s.getDevicePool();return p.releaseRehydrationReservation?.(o),await ly(p,d,o),{success:!0,result:{message:`Session ${o} released`,device:d,alreadyReleased:!1}}}}return Br(s,n,o,a)}async function Br(s,n,o,a){let c=Boolean(n.getTerminalReleaseSnapshot?.(o))||await Pe(n,o)!==void 0;if(a&&!c)return{success:!1,error:`Session ${o} is not a known session (never issued by this daemon, or its release record has expired). Run --daemon active-sessions to list held sessions.`,code:rc};let d=await Kt(s,n,o),m=d.cleanup==="failed"?"; cleanup failed":d.cleanup==="pending"?"; cleanup still pending":"";return{success:!0,result:{message:c?`Session ${o} already released${m}`:`Session ${o} is not known to this daemon (never issued, or its release record expired); nothing was released`,alreadyReleased:c,known:c,...d}}}async function zt(s,n,o,{session:a,executions:c=j}){let d=s.getDevicePool(),m=a?.assignedDevice??n.getTerminalReleaseSnapshot?.(o)?.deviceId??null;return JE(c,{sessionId:o,baseSessionId:rt(o,n),deviceId:m},new Ja(o,"explicit-release")).catch((p)=>{e.warn(`Failed to cancel executions of explicitly released session ${o}: ${r(p)}`,p)}),await As({manager:n,pool:d},m,o,{release:async()=>(m=await n.releaseSession(o),m)}),{success:!0,result:{message:`Session ${o} released`,device:m,alreadyReleased:!1,...await Kt(s,n,o)}}}async function Nr(s,n){let o=n.getDeviceSessionRegistry(),a=n.getDevicePool(),c=o.list().map((d)=>({deviceSessionUuid:d.deviceSessionUuid,deviceId:d.deviceId,platform:d.platform,epochStartedAt:d.epochStartedAt,...a.getDeviceHealthMarker?.(d.deviceId)?{unhealthy:a.getDeviceHealthMarker(d.deviceId)}:{},...a.isPooledIdentityUnresolved?.(d.deviceId)===!0?{identityUnresolved:!0}:{}}));return{success:!0,result:{deviceSessions:c,totalDeviceSessions:c.length}}}function Gt(s){let n=s.getDevicePool(),o=s.getDeviceLeaseActivitySources?.();if(o)return Vt(o,n);let a=s.getSessionManager();return Vt(J1((c)=>a.getSessionForDevice?.(c)??D(n.getDevice?.(c))??null),n)}function Vt(s,n){return{...s,activeExecutionCount:(o)=>s.activeExecutionCount(o)+(n.isUnderShutdownReservation?.(o)?1:0)}}async function Fr(s,n){let o=f({deviceId:y().min(1)}).safeParse(s.params);if(!o.success)return{success:!1,error:`Invalid deviceLeaseStatus parameters: ${o.error.message}`};let{deviceId:a}=o.data,c=Gt(n);return{success:!0,result:{pid:process.pid,deviceId:a,...$M(c,a)}}}async function Lr(s,n,{context:o}){let a=f({deviceId:y().min(1)}).safeParse(s.params);if(!a.success)return{success:!1,error:`Invalid relinquishDeviceLease parameters: ${a.error.message}`};let{deviceId:c}=a.data,d=Wt(n,o,dL,{deviceId:c});if(d)return d;let m=Gt(n),p=n.getDeviceLeaseRelinquishPort?.()??Ot(),h={pid:process.pid,deviceId:c,...$M(m,c)},S=mee(h,p.idleMs);if(!S.release)return{success:!0,result:{...h,released:!1,reason:S.reason,...S.transient?{transient:!0}:{}}};return await p.release(c),{success:!0,result:{...h,released:!0,reason:S.reason}}}import{existsSync as Ae}from"fs";import{platform as Yt}from"os";import{readFile as qr}from"fs/promises";async function ZE(s=i,n={}){let o=n.socketPath??Ct,a=n.pidFilePath??vr,c=(n.platform??Yt())==="win32",d={timestamp:new Date().toISOString(),daemonRunning:!1,socketExists:!1,socketAccessible:!1,pidFileExists:!1,pidFileValid:!1,socketConnectable:!1,recommendations:[]};if(!c)if(d.socketExists=Ae(o),!d.socketExists)d.recommendations.push("Socket file not found. Daemon may not be running.");else d.socketAccessible=!0;if(d.pidFileExists=Ae(a),!d.pidFileExists){if(d.socketExists)d.recommendations.push("Socket exists but PID file missing. Daemon may be in bad state.")}else await $r(d,a,s);if(c||d.socketExists)await Hr(d,o,c,{timer:s,...n});return Ur(d),d}async function $r(s,n,o){try{let a=await qr(n,"utf-8"),c=JSON.parse(a);s.pidFileValid=!0,s.daemonPid=c.pid,s.daemonPort=c.port;try{if(process.kill(c.pid,0),s.daemonRunning=!0,c.startedAt)s.daemonUptime=o.now()-new Date(c.startedAt).getTime()}catch(d){e.debug(`Daemon PID liveness probe failed: ${r(d)}`),s.recommendations.push(`PID file references process ${c.pid} which is not running. Daemon may have crashed. Stale PID file should be cleaned up.`)}}catch(a){if(a instanceof SyntaxError)e.warn("Daemon PID file check failed: invalid JSON");else e.warn(`Daemon PID file check failed: ${r(a)}`,a);s.recommendations.push(`PID file exists but is invalid or unreadable: ${a}`)}}async function Hr(s,n,o,{timer:a,...c}){try{let d=await ya.isAvailable(n,{signal:c.signal,timeoutMs:c.timeoutMs,timer:a});if(s.socketConnectable=d,o)s.socketExists=d,s.socketAccessible=d;if(!d)s.recommendations.push(o?"Named pipe not found or not responding. Daemon may not be running.":"Socket file exists, but socket is not responding. Daemon may be stuck or unresponsive.");else if(!s.daemonRunning)s.daemonRunning=!0,s.recommendations.push("Daemon socket is responsive, but PID bookkeeping is stale or missing.")}catch(d){s.lastError=r(d),s.recommendations.push("Socket connection test failed. Daemon may be unresponsive or socket may be corrupted.")}}function Ur(s){if(s.recommendations.length===0){if(s.daemonRunning&&s.socketConnectable)s.recommendations.push("Daemon is healthy and responsive.");else if(!s.daemonRunning&&!s.socketExists&&!s.pidFileExists)s.recommendations.push(`Daemon is not running. Start it with: bunx ${Os()} --daemon start`)}}function Oe(s){let n=[`
|
|
3
|
+
=== AutoMobile Daemon Health Report ===`,`Timestamp: ${s.timestamp}`,"","Status Summary:",` Daemon Running: ${s.daemonRunning?"\u2713 YES":"\u2717 NO"}`,` Socket File: ${s.socketExists?"\u2713 EXISTS":"\u2717 MISSING"}`,` Socket Accessible: ${s.socketAccessible?"\u2713 YES":"\u2717 NO"}`,` PID File: ${s.pidFileExists?"\u2713 EXISTS":"\u2717 MISSING"}`,` Socket Connectable: ${s.socketConnectable?"\u2713 YES":"\u2717 NO"}`,"","Details:"];if(s.daemonPid)n.push(` Daemon PID: ${s.daemonPid}`);if(s.daemonPort)n.push(` HTTP Port: ${s.daemonPort}`);if(s.daemonUptime){let o=Math.floor(s.daemonUptime/1000),a=Math.floor(o/60),c=Math.floor(a/60);if(c>0)n.push(` Uptime: ${c}h ${a%60}m ${o%60}s`);else if(a>0)n.push(` Uptime: ${a}m ${o%60}s`);else n.push(` Uptime: ${o}s`)}if(s.lastError)n.push(` Last Error: ${s.lastError}`);return n.push("","Recommendations:"),n.push(...s.recommendations.map((o)=>` \u2022 ${o}`)),n.push("","File Locations:"),n.push(` Socket: ${Ct}`),n.push(` PID: ${vr}`),n.push("",`=== End Report ===
|
|
4
|
+
`),n.join(`
|
|
5
|
+
`)}async function Vr(s,n){try{return await(await import("fs/promises")).stat(s),n.socketReadable=!0,n.socketWritable=!0,!0}catch(o){return n.issues.push(`Cannot access socket file: ${o}`),!1}}async function jr(s,n,o,a){try{let c=n.now(),d=await ya.isAvailable(s),m=n.now()-c;if(o)a.socketExists=d,a.socketReadable=d,a.socketWritable=d;if(d)a.socketConnectable=!0,a.connectionLatency=m;else a.issues.push(o?"Named pipe not found or not responding":"Socket connection test returned false")}catch(c){a.issues.push(`Connection failed: ${c}`)}}async function Qt(s=i,n={}){let o=n.socketPath??Ct,a=(n.platform??Yt())==="win32",c={socketExists:!a&&Ae(o),socketReadable:!1,socketWritable:!1,socketConnectable:!1,issues:[],lastTestTime:new Date().toISOString()};if(!a&&!c.socketExists)return c.issues.push("Socket file does not exist"),c;if(!a&&!await Vr(o,c))return c;return await jr(o,s,a,c),c}function Xt(s){let n=[`
|
|
6
|
+
=== Socket Diagnostics ===`,`Test Time: ${s.lastTestTime}`,"","Results:",` Socket Exists: ${s.socketExists?"\u2713":"\u2717"}`,` Socket Readable: ${s.socketReadable?"\u2713":"\u2717"}`,` Socket Writable: ${s.socketWritable?"\u2713":"\u2717"}`,` Socket Connectable: ${s.socketConnectable?"\u2713":"\u2717"}`];if(s.connectionLatency!==void 0)n.push(` Connection Latency: ${s.connectionLatency}ms`);if(s.issues.length>0)n.push("","Issues Found:"),n.push(...s.issues.map((o)=>` \u26A0 ${o}`));return n.push("","Socket Path:",` ${Ct}`),n.push("",`=== End Diagnostics ===
|
|
7
|
+
`),n.join(`
|
|
8
|
+
`)}var Ie={"--video-target-bitrate-kbps":{field:"videoTargetBitrateKbps",label:"video target bitrate",allowFloat:!1},"--video-max-throughput-mbps":{field:"videoMaxThroughputMbps",label:"video max throughput",allowFloat:!0},"--video-fps":{field:"videoFps",label:"video fps",allowFloat:!1},"--video-archive-size-mb":{field:"videoMaxArchiveSizeMb",label:"video max archive size",allowFloat:!0}},Me={"--video-quality":"videoQualityPreset","--video-quality-preset":"videoQualityPreset","--video-format":"videoFormat","--accessibility-level":"accessibilityLevel","--a11y-level":"accessibilityLevel","--accessibility-failure-mode":"accessibilityFailureMode","--a11y-failure-mode":"accessibilityFailureMode","--accessibility-min-severity":"accessibilityMinSeverity","--a11y-min-severity":"accessibilityMinSeverity"},Te={"--strict-port":"strictPort","--debug":"debug","--debug-perf":"debugPerf","--ui-perf-debug":"debugPerf","--network-mockable":"networkMockable","--embedded-sdk":"embeddedSdk","--dismiss-keyboard-after-input":"dismissKeyboardAfterInput","--no-ui-perf-mode":"noUiPerfMode","--no-navigation-screenshots":"noNavigationScreenshots","--no-waitfor-polling-overhead":"noWaitForPollingOverhead","--no-occlusion":"noOcclusion","--no-include-not-important-views":"noA11yIncludeNotImportantViews","--no-report-view-ids":"noA11yReportViewIds","--no-retrieve-interactive-windows":"noA11yRetrieveInteractiveWindows","--mem-perf-audit":"memPerfAudit","--accessibility-audit":"accessibilityAudit","--accessibility-use-baseline":"accessibilityUseBaseline","--a11y-use-baseline":"accessibilityUseBaseline","--predictive-ui":"predictiveUi","--predictive":"predictiveUi","--raw-element-search":"rawElementSearch","--skip-ctrl-proxy-download":"skipCtrlProxyDownload","--skip-accessibility-download":"skipCtrlProxyDownload","--tool-call-recording":"toolCallRecording","--observe-result-include-elements":"observeResultIncludeElements","--tool-results-no-structured-content":"toolResultsNoStructuredContent","--actions-diff-observe":"actionsDiffObserve","--actions-no-observe":"actionsNoObserve"};function Wr(s){return s!==void 0&&!s.startsWith("--")}function Kr(s,n){if(!n)return!1;return s.host=n,!0}function Gr(s,n){if(n!=="global"&&n!=="session")return!1;return s.planExecutionLockScope=n,!0}function Yr(s,n){let o=bv(n);if(o===void 0)return!1;return s.runnerReadinessTimeoutMs=o,!0}function Zt(s,n){if(!n)return!1;return s.toolOutputsDir=n,!0}function es(s,n,o){if(!n)return!1;return s[o]=[...s[o]??[],n],!0}var Ce={"--host":Kr,"--plan-execution-lock-scope":Gr,[yv]:Yr,[EI]:Zt,[II]:Zt,"--enable-tool":(s,n)=>es(s,n,"enabledTools"),"--disable-tool":(s,n)=>es(s,n,"disabledTools")};function ts({value:s,inline:n}){return s!==void 0&&(n||Wr(s))}function Jr(s,n,o,a){let{value:c}=n,d=ts(n),m=Object.hasOwn(Ie,s)?Ie[s]:void 0;if(m)return o[m.field]=xI(c,m.label,m.allowFloat,a),d;let p=Object.hasOwn(Me,s)?Me[s]:void 0;if(p){if(d)o[p]=c;return d}if(s==="--port")return o.port=DN(c,a),d;return}function Qr(s,n,o,a){let c=Jr(s,n,o,a);if(c!==void 0)return c;let d=Object.hasOwn(Ce,s)?Ce[s]:void 0;if(!d)return;let{value:m}=n,p=ts(n),h=d(o,p?m:void 0);if(!h&&p)a.warn(`Ignoring invalid value for ${s}: ${m}`);return h}function Xr(s,n,o,a){let c=Qr(s,n,o,a);if(c!==void 0)return c;let d=Object.hasOwn(Te,s)?Te[s]:void 0;if(d){let m=Fs(n.inline?n.value:void 0);if(m===void 0)a.warn(`Invalid value for ${s}: ${n.value}; expected true or false`);else o[d]=m}return!1}function Zr(s,n,o){for(let a=0;a<s.length&&s[a]!==ZL;a++){let c=Mm(s,a);if(Xr(c.flag,c,n,o))a=c.last}}function ss(s,n=process.env,o=e){let a=QL(s,n)?{skipCtrlProxyDownload:!0}:{},c=NN(s,n).actionsCompactMetadata;if(c!==void 0)a.actionsCompactMetadata=c;a.toolOutputsDir=EN([],n,hd());let d=MN(s,n),m=ON(s);if(d.length>0||m)a.eventAllMarkers=d,a.eventAllMarkersCliOverride=m;let p=bv(n[AC]??n.AUTO_MOBILE_RUNNER_READINESS_TIMEOUT_MS);if(p!==void 0)a.runnerReadinessTimeoutMs=p;return Zr(s,a,o),a}var eo=[xc,"--daemon-socket-path"],to=[XT,Q5,..._u.flatMap((s)=>s.disableCli?[s.cli,s.disableCli]:[s.cli])],so=new Set(["--port",...Object.keys(Ie),...Object.keys(Me),...Object.keys(Ce),...eo]),no=new Set([...Object.keys(Te),...to]);function ro(s,n){let{flag:o,inlineValue:a}=yi(s);if(!n(o))return{kind:"option",argument:s};return Fs(a)===void 0?{kind:"value",argument:s}:void 0}function ns(s,n){let o=(p)=>n.launchFlags&&so.has(p)||(n.valueFlags?.includes(p)??!1),a=(p)=>n.launchFlags&&no.has(p)||(n.booleanFlags?.includes(p)??!1),c=n.positionals??0,d=0,m=!1;for(let p=0;p<s.length;p++){let h=s[p];if(h==="")continue;if(h===ZL&&!m)m=!0;else if(m||!h.startsWith("-")){if(d++,d>c)return{kind:"positional",argument:h}}else if(o(yi(h).flag))p=Mm(s,p).last;else{let S=ro(h,a);if(S)return S}}return}var oo="ide/setFeatureFlag",io="Usage: set-feature-flag <key> <true|false> [--json]";function ao(s){return WS.some((n)=>n.key===s)}function rs(s){if(s.length!==2)throw new t(io);let[n,o]=s;if(!ao(n)){let c=WS.map((d)=>d.key).join(", ");throw new t(`Unknown feature flag: ${n}. Known flags: ${c}`)}let a=Fs(o);if(a===void 0)throw new t(`Invalid value for feature flag ${n}: ${o}; expected true or false`);return{key:n,enabled:a}}async function as(s,n){try{return await n.connect(),await n.callDaemonMethod(oo,{key:s.key,enabled:s.enabled})}finally{await n.close()}}import{join as lo}from"path";var co={lockDir:gT,listFiles:(s)=>xi(s),readLock:fl,isProcessRunning:(s)=>nt(s)};function NG(s=co){let n,o;try{n=s.lockDir(),o=s.listFiles(n)}catch(a){return e.warn(`Cannot list CtrlProxy forwarding leases: ${r(a)}`,a),[]}return o.flatMap((a)=>{let c=uL(a),d=c===void 0?void 0:s.readLock(lo(n,a));if(c===void 0||!d||Number.isNaN(d.pid))return[];let m=hT(d.metadata);return[{deviceId:c,pid:d.pid,alive:s.isProcessRunning(d.pid),...m?{socketPath:m.socketPath,acquiredAt:m.acquiredAt}:{}}]})}function uo(s){if(!s)return"session unknown (no socket recorded)";switch(s.kind){case"status":return s.status.sessionId===null?"no live session":`live session ${s.status.sessionId}`;case"unreachable":return`socket unreachable (${s.detail})`;case"no-response":case"unsupported":return`session unknown (${s.detail})`}}async function ls(s,n=NG(),o=new lw,a=i){let c=n.filter((m)=>m.pid!==s),d=await Promise.all(c.map(async(m)=>{let p=m.alive&&m.socketPath?await o.query(m.socketPath,m.deviceId):void 0,h=m.acquiredAt===void 0?"age unknown":`held ${Math.max(0,Math.round((a.now()-m.acquiredAt)/1000))}s`,S=m.alive?uo(p):"process gone (reclaimable)";return` - ${m.deviceId}: PID ${m.pid}, socket ${m.socketPath??"unknown"}, ${h}, ${S}`}));return d.length===0?[]:["CtrlProxy forwarding leases held by other processes:",...d]}var U="--allow-shared-namespace",ds=g.ALLOW_SHARED_DAEMON_NAMESPACE.name,cs="shared_daemon_namespace",mo=[["AUTOMOBILE_DATA_DIR","AUTO_MOBILE_DATA_DIR"],["AUTOMOBILE_DB_DIR","AUTO_MOBILE_DB_DIR"],["AUTOMOBILE_DB_PATH","AUTO_MOBILE_DB_PATH"]];function po(s){return mo.flatMap(([n,o])=>{if(s[n]?.trim())return[n];return s[o]?.trim()?[o]:[]})}function FG(s){return Mh("sock",s)!==Mh("sock",{})}class us extends t{code=cs;nextAction;constructor(s,n,o){let a=`Set AUTOMOBILE_AUX_SOCKET_DIR (or AUTOMOBILE_DAEMON_SOCKET_PATH, AUTOMOBILE_DAEMON_PID_FILE_PATH and AUTOMOBILE_DAEMON_LOCK_FILE_PATH) to target a private daemon, or pass ${U} (or set ${ds}=1) to act on the shared daemon deliberately.`;super(`Refusing to ${s}: ${n.join(", ")} ${n.length===1?"is":"are"} set, but AUTOMOBILE_AUX_SOCKET_DIR and AUTOMOBILE_DAEMON_SOCKET_PATH are not, so this would act on the shared daemon at ${o}, which runs on different state. ${a} [${cs}]`);this.nextAction=a}}function Q1(s,n,o=!1){if(o||n[ds]?.trim()==="1")return;let a=po(n);if(a.length===0||FG(n))return;throw new us(s,a,Mh("sock",n))}class FP extends fe{attemptTimeoutMs;constructor(s){super(`Daemon connection attempt did not settle within ${s}ms`);this.attemptTimeoutMs=s;this.name="DaemonConnectAttemptStalledError"}}class Op extends fe{cause;constructor(s){super(s.message);this.cause=s;this.name="DaemonPreflightConnectionError"}}var fo="daemon/prepareSession",Fe="daemon/sessionRequestStatus",fs="daemon/abandonSessionRequest",eH="daemon/releaseBrokerSession",go="daemon/capabilities",_e=5000,ho=250,So=15000,yo=1000;function _(s,n,o){return{code:s,message:n,retryable:o}}function F(s,n,o=!1){return{contractVersion:1,requestId:s.requestId,outcome:"failed",sessionUuid:null,profile:null,cleanupPending:o,failure:n}}function ae(s,n){return{contractVersion:1,requestId:s.requestId,outcome:"pending",sessionUuid:null,profile:null,cleanupPending:!0,failure:_("session_status_unresolved",n,!0)}}function vo(s,n){if(!s||typeof s!=="object")return!1;let o=s;return!(o.contractVersion!==1||o.requestId!==n||!["ready","pending","released","failed"].includes(String(o.outcome))||typeof o.cleanupPending!=="boolean"||!(o.sessionUuid===null||typeof o.sessionUuid==="string")||!(o.profile===null||typeof o.profile==="object"))}function gs(s,n){if(!vo(s,n))return!1;if(s.outcome==="ready")return typeof s.sessionUuid==="string"&&s.sessionUuid.trim().length>0&&typeof s.profile==="object"&&s.profile!==null;return!0}function wo(s,n){if(!s||typeof s!=="object")return!1;let o=s;return o.sessionUuid===n&&["released","cleanup_pending","unknown_session"].includes(String(o.outcome))}function hs(s,n){return F(s,_("timeout",`Session preparation did not finish within its deadline: ${r(n)}`,!0))}function Ro(s){return s instanceof fe&&(s.constructor===fe||s instanceof FP||s instanceof Op)}async function Ss(s,n,o,a){let c=Math.min(n,s.timer.now()+UV);for(;;)try{await l(()=>s.ensureConnected(),{timer:s.timer,timeoutMs:Math.max(1,c-s.timer.now()),signal:o,label:a});return}catch(d){let m=Math.min(yo,c-s.timer.now());if(o?.aborted||!Ro(d)||m<=0)throw d;e.debug(`[SessionBroker] ${a} failed; retrying: ${r(d)}`,d),await vs(s.timer,m,o)}}async function bo(s,n,o,a){try{let c=await n.callDaemonMethod(Fe,{requestId:s.requestId,livenessOwnerToken:n.livenessOwnerToken},{timeoutMs:o,signal:a});return gs(c,s.requestId)?c:void 0}catch(c){if(!a?.aborted)e.debug(`[SessionBroker] Same-request status check failed: ${r(c)}`,c);return}}var ys=Symbol("daemon-unreachable");async function ko(s,n,o,a){let c=o-n.timer.now();try{await l(()=>n.ensureConnected(),{timer:n.timer,timeoutMs:Math.max(1,Math.min(_e,c)),signal:a,label:"session broker status connection"})}catch(d){if(!a?.aborted)e.debug(`[SessionBroker] Status reconnect failed: ${r(d)}`,d);return ys}if(a?.aborted||n.timer.now()>=o)return;return bo(s,n,Math.max(1,Math.min(_e,o-n.timer.now())),a)}function Do(s,n,o,a){if(n!==ys){if(s.unreachableSinceMs=void 0,n&&n.outcome!=="pending")return n;s.last=n??s.last;return}if(s.unreachableSinceMs??=a.timer.now(),a.timer.now()-s.unreachableSinceMs<UV)return;return s.last??ae(o,`The daemon stayed unreachable for ${UV}ms; status recovery must keep the same requestId and liveness owner token.`)}async function ms(s,n,o,{signal:a,initial:c}={}){let d={last:c,unreachableSinceMs:void 0};while(!a?.aborted&&n.timer.now()<o){let m=await ko(s,n,o,a);if(a?.aborted)break;let p=Do(d,m,s,n);if(p)return p;let h=Math.min(ho,o-n.timer.now());if(h>0)await n.timer.sleep(h)}return d.last??ae(s,"The daemon may still be preparing this request; status recovery must keep the same requestId and liveness owner token.")}async function Le(s,n,o){try{let a=n.releaseSession(s),c=o===void 0?await a:await l(a,{timer:n.timer,timeoutMs:Math.max(1,o-n.timer.now()),label:`session broker release of unheld session ${s}`});return!wo(c,s)||c.outcome!=="released"}catch(a){return e.warn(`[SessionBroker] Releasing unheld session ${s} failed: ${r(a)}`,a),!0}}class Be extends Error{constructor(s){super(`Session ownership was not established within the remaining ${s}ms`);this.name="OwnershipHoldDeadlineError"}}function Eo(s,n,o){s.then(async()=>{e.warn(`[SessionBroker] Ownership of ${n} was established after acquisition ended; releasing it.`),await Le(n,o)},(a)=>{e.debug(`[SessionBroker] Late hold of ${n} failed after acquisition ended: ${r(a)}`)})}function ps(s,n,o){if(o?.aborted)return"cancelled";return s.timer.now()>=n?"timeout":void 0}async function xe(s,n,o,{end:a,deadlineMs:c}){let d=s.sessionUuid;if(n)Eo(n,d,o);let m=await Le(d,o,c);return F({requestId:s.requestId},a==="cancelled"?_("cancelled","The proxy shut down before session ownership was established.",!0):_("timeout","Session preparation did not finish within its deadline: ownership was not established.",!0),m)}async function Ao(s,n,o,a){let c=s.sessionUuid;return e.warn(`[SessionBroker] Holding session ${c} failed: ${r(o)}`,o),F({requestId:s.requestId},_("session_hold_failed",`The prepared session could not be held: ${r(o)}`,!0),await Le(c,n,a))}async function Io(s,n,o,a){if(s.outcome!=="ready")return s;let c=s.sessionUuid,d=ps(n,o,a);if(d)return xe(s,void 0,n,{end:d,deadlineMs:o});let m=o-n.timer.now(),p=n.holdSession(s.requestId,c);try{await l(p,{timer:n.timer,timeoutMs:m,signal:a,label:`session broker ownership hold for ${c}`,timeoutError:()=>new Be(m)})}catch(S){let w=a?.aborted?"cancelled":S instanceof Be?"timeout":void 0;if(!w)return Ao(s,n,S,o);return e.warn(`[SessionBroker] Holding session ${c} did not finish before acquisition ended: ${r(S)}`,S),xe(s,p,n,{end:w,deadlineMs:o})}let h=ps(n,o,a);return h?xe(s,void 0,n,{end:h,deadlineMs:o}):s}async function Mo(s,n,o){let a=await s.callDaemonMethod(go,{},{timeoutMs:n,signal:o}),c=Array.isArray(a?.capabilities)?a.capabilities.filter((d)=>typeof d==="string"):[];return bZ(c)}function To(s){if(typeof s!=="object"||s===null||!("code"in s)||s.code!=="session_broker_stopping"&&s.code!=="session_broker_maintenance")return;let n="retryAfterMs"in s?s.retryAfterMs:void 0;return typeof n==="number"&&Number.isFinite(n)&&n>=0?Math.max(1,n):Od}function vs(s,n,o){return new Promise((a,c)=>{o?.throwIfAborted();let d=()=>{s.clearTimeout(m),o?.removeEventListener("abort",d),c(o?.reason)},m=s.setTimeout(()=>{o?.removeEventListener("abort",d),a()},n);if(o?.addEventListener("abort",d,{once:!0}),o?.aborted)d()})}async function Co(s,n,o,{deadlineMs:a,signal:c,retryAfterMs:d}){let m=Math.floor(a-n.timer.now()-o);if(d!==void 0&&m>0){let p=Math.min(d,Math.max(0,a-n.timer.now()));if(await vs(n.timer,p,c),m=Math.floor(a-n.timer.now()-o),m<=0)return Ne(s,d);try{await Ss(n,a-o,c,"session broker retry daemon connection")}catch(h){if(c?.aborted)return e.debug("[SessionBroker] Retry reconnect cancelled during proxy shutdown.",h),ae(s,"Session preparation was cancelled during proxy shutdown.");if(n.timer.now()>=a-o)return e.debug("[SessionBroker] Retry reconnect exhausted the preparation budget.",h),Ne(s,d);let S=`Session preparation could not reconnect to the daemon after a stopping refusal: ${r(h)}`;return e.warn(S,h),F(s,_("daemon_unavailable",S,!0))}m=Math.floor(a-n.timer.now()-o)}return m}function Ne(s,n){return n===void 0?hs(s,Error(jX)):F(s,_("session_broker_stopping","The session broker kept stopping until no preparation budget remained.",!0))}async function xo(s,n,o,{deadlineMs:a,signal:c}){let{executionOwnerStartIdentity:d,...m}=s,p={config:m,livenessOwnerToken:n.livenessOwnerToken},h;while(!0){let S;try{let R=await Co(s,n,o,{deadlineMs:a,signal:c,retryAfterMs:h});if(typeof R!=="number")return R;if(R<=0)return Ne(s,h);S=await n.callDaemonMethod(fo,p,{timeoutMs:Math.max(1,R),signal:c,cancelOnTimeout:!1})}catch(R){if(c?.aborted)return ae(s,"Session preparation was cancelled during proxy shutdown.");if(h=To(R),h!==void 0){e.debug(`[SessionBroker] Prepare refused while stopping or maintaining snapshots; retrying in ${h}ms.`,R);continue}return e.warn(`[SessionBroker] Prepare reply was not received; checking request ${s.requestId}: ${r(R)}`,R),ms(s,n,a,{signal:c})}let w=gs(S,s.requestId)?S:void 0;return w!==void 0&&w.outcome!=="pending"?w:await ms(s,n,a,{signal:c,initial:w})}}function _o(s,n,o){if(n instanceof xr)return hs(s,n);let a=o?.aborted===!0;return F(s,_(a?"cancelled":"daemon_unavailable",a?"The proxy shut down while preparing its session.":`Session preparation could not reach the daemon: ${r(n)}`,!0))}async function yX(s,n,o){let a=s.preparationTimeoutMs??Po,c=n.timer.now()+a,d=()=>c-n.timer.now();try{if(await Ss(n,c,o,"session broker daemon connection"),!await Mo(n,Math.max(1,Math.min(_e,d())),o))return F(s,_("contract_unsupported","The running daemon does not advertise session-broker/v1; nothing was changed.",!1));let m=Math.min(So,Math.max(1,Math.floor(a/4))),p=await xo(s,n,m,{deadlineMs:c,signal:o});return await Io(p,n,c,o)}catch(m){let p=_o(s,m,o);return e.warn(`[SessionBroker] Acquisition failed (${p.failure?.code})`,m),p}}var Bo=5000,ws=240000,Fo=y().uuid();function le(s){return`Usage: ${s} ${s==="release-broker-session"?"<session-uuid>":"<request-id>"} --liveness-owner-token <token> --json`}function Lo(s,n,o){let a=s[n];if(!a||a==="--")return;let{flag:c,inlineValue:d}=yi(a);if(c==="--json"){if(o.json||Fs(d)!==!0)return;return o.json=!0,n}if(c==="--liveness-owner-token"){let p=Mm(s,n),h=p.value?.trim();if(o.livenessOwnerToken!==void 0||!h)return;return o.livenessOwnerToken=h,p.last}let m=a.trim();if([a.startsWith("-"),o.identity!==void 0,!m].some(Boolean))return;return o.identity=m,n}function Rs(s,n){let o={json:!1};for(let a=0;a<n.length;a++){let c=Lo(n,a,o);if(c===void 0)return;a=c}if(!o.identity||!o.livenessOwnerToken||!o.json||s==="release-broker-session"&&!Fo.safeParse(o.identity).success)return;return{identity:o.identity,livenessOwnerToken:o.livenessOwnerToken}}function bs(s,n){return Rs(s,n)!==void 0}function qe(s,n){let o=Rs(s,n);if(!o)throw new t(le(s));return o}function V(s){return s!==null&&typeof s==="object"&&!Array.isArray(s)}function qo(s){return s===void 0||V(s)&&typeof s.code==="string"&&s.code.length>0&&typeof s.message==="string"&&typeof s.retryable==="boolean"}function Ds(s,n){if(!V(s))return!1;let{outcome:o,sessionUuid:a,profile:c}=s;if(![s.contractVersion===1,s.requestId===n,["ready","pending","released","failed"].includes(String(o)),a===null||typeof a==="string"&&a.length>0,c===null||V(c),typeof s.cleanupPending==="boolean",qo(s.failure)].every(Boolean))return!1;return o!=="ready"||typeof a==="string"&&V(c)}function $o(s,n){if(!V(s))return!1;return[s.sessionUuid===n,["released","cleanup_pending","unknown_session"].includes(String(s.outcome))].every(Boolean)}function $e(s,n){let o=(c)=>typeof c==="string"?c.replaceAll(n,"[REDACTED]"):c,a=V(s)?s:{};return Object.assign(new t(String(o(r(s)))),{code:o(a.code),nextAction:o(a.nextAction),retryable:a.retryable,retryAfterMs:a.retryAfterMs,releaseReason:o(a.releaseReason),idle:a.idle})}async function He(s,n,o,a){let c=s();try{return await c.connect(),await c.callDaemonMethod(n,o,{timeoutMs:a})}finally{await c.close()}}async function Ps(s,n){let o=qe("session-request-status",s);try{let a=await He(n,Fe,{requestId:o.identity,livenessOwnerToken:o.livenessOwnerToken},Bo);if(!Ds(a,o.identity))throw new t("Invalid daemon session-request-status result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}async function Is(s,n){let o=qe("abandon-session-request",s);try{let a=await He(n,fs,{requestId:o.identity,livenessOwnerToken:o.livenessOwnerToken},ws);if(!Ds(a,o.identity))throw new t("Invalid daemon abandon-session-request result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}async function Ms(s,n){let o=qe("release-broker-session",s);try{let a=await He(n,eH,{sessionId:o.identity,livenessOwnerToken:o.livenessOwnerToken},ws);if(!$o(a,o.identity))throw new t("Invalid daemon release-broker-session result");return a}catch(a){throw $e(a,o.livenessOwnerToken)}}var Uo=5000,Ue="Usage: capabilities --json";function je(s){if(s.length!==1)return!1;let{flag:n,inlineValue:o}=yi(s[0]);return n==="--json"&&Fs(o)===!0}function Vo(s){if(s===null||typeof s!=="object"||Array.isArray(s))return!1;let n=s.capabilities;return Array.isArray(n)&&n.every((o)=>typeof o==="string")}async function Ts(s,n){if(!je(s))throw new t(Ue);let o=n();try{await o.connect();let a=await o.callDaemonMethod(Ee,{},{timeoutMs:Uo});if(!Vo(a))throw new t("Invalid daemon capabilities result");return a}finally{await o.close()}}var O="--json";function We(s){let n=s[0];if(!n)throw new t("heartbeat requires a session ID argument");let o,a=!1;for(let c=1;c<s.length;c++){let{flag:d,inlineValue:m}=yi(s[c]);switch(d){case"--liveness-owner-token":{let p=Mm(s,c);if(!p.value)throw new t("--liveness-owner-token requires a non-empty value");o=p.value,c=p.last;break}case"--claim-liveness-ownership":{let p=Fs(m);if(p===void 0)throw new t(`Invalid value for --claim-liveness-ownership: ${m}; expected true or false`);a=p;break}default:throw new t(`Unknown heartbeat option: ${s[c]}`)}}if(a&&!o)throw new t("--claim-liveness-ownership requires --liveness-owner-token");return{sessionId:n,livenessOwnerToken:o,claimLivenessOwnership:a}}function _s(s){let n=Xw(s,["--maintenance-token"])?.value;if(!n)throw new t("--maintenance-token requires a non-empty value");return n}function Bs(s){let n=(c)=>{let d=Xw(s,[c])?.value;if(!d)throw new t(`${c} requires a non-empty value`);return d},o=n("--platform");if(o!=="android"&&o!=="ios")throw new t("--platform must be android or ios");let a=Number(n("--expires-at"));if(!Number.isFinite(a)||a<=0)throw new t("--expires-at must be a positive finite timestamp");return{sessionUuid:n("--session-uuid"),platform:o,stableDeviceId:n("--stable-device-id"),controls:{androidSiblingAvdName:n("--android-sibling-avd-name"),androidDuplicateSerial:n("--android-duplicate-serial"),iosSameNameSiblingUdid:n("--ios-same-name-sibling-uuid")},expiresAt:a}}function Ke(s){if(s.length!==3||!s[0]||s[1]!=="--liveness-owner-token"||!s[2]?.trim()||s[2].startsWith("--"))throw new t("Usage: release-liveness-ownership <session> --liveness-owner-token <token>");return{sessionId:s[0],livenessOwnerToken:s[2]}}function LG(s){Ge(s===void 0?"Missing daemon command.":`Unknown daemon command: ${s}`)}var jo=["--session-uuid","--platform","--stable-device-id","--android-sibling-avd-name","--android-duplicate-serial","--ios-same-name-sibling-uuid","--expires-at"],Cs={start:{launchFlags:!0},stop:{launchFlags:!0},restart:{launchFlags:!0},"restart-admitted":{launchFlags:!0,valueFlags:["--maintenance-token"]},"restart-acceptance-session":{launchFlags:!1,valueFlags:jo},status:{launchFlags:!0,booleanFlags:[O]},capabilities:{launchFlags:!1,booleanFlags:[O]},health:{launchFlags:!0},diagnose:{launchFlags:!0},"available-devices":{launchFlags:!0,booleanFlags:[O]},"active-sessions":{launchFlags:!0,booleanFlags:[O]},"session-info":{launchFlags:!1,booleanFlags:[O],positionals:1},"release-session":{launchFlags:!1,booleanFlags:[O],positionals:1},"set-feature-flag":{launchFlags:!1,booleanFlags:[O],positionals:2},"session-request-status":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[O],positionals:1},"abandon-session-request":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[O],positionals:1},"release-broker-session":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[O],positionals:1}};function xs(s){return["session-request-status","abandon-session-request","release-broker-session"].includes(s)}function ze(s,n){let o=Object.hasOwn(Cs,s)?Cs[s]:void 0;if(!o)return;let a=ns(n,o);if(!a){if(s==="capabilities"&&!je(n))return Ue;if(xs(s)&&!bs(s,n))return le(s);return}if(xs(s))return le(s);if(a.kind==="positional")return`Unexpected argument for daemon ${s}: ${a.argument}`;return a.kind==="value"?`Invalid value for daemon ${s} option ${a.argument}; expected true or false`:`Unknown option for daemon ${s}: ${a.argument}`}function Ge(s){try{console.error(s),console.log(`
|
|
9
|
+
Available commands:`),console.log(" start Start the daemon"),console.log(" stop Stop the daemon"),console.log(" status Check daemon status"),console.log(" capabilities --json Query the existing daemon's capability contract"),console.log(" restart Restart the daemon"),console.log(" health Check daemon health"),console.log(" diagnose Run full diagnostics"),console.log(" available-devices Query device pool status"),console.log(" active-sessions List held sessions and why each holds its device"),console.log(" session-info <id> Get information about a session"),console.log(" release-session <id> Release a session and free its device"),console.log(" set-feature-flag <key> <true|false> Set a feature flag (e.g. device-condition) without the IDE"),console.log(" session-request-status <request-id> --liveness-owner-token <token> --json"),console.log(" abandon-session-request <request-id> --liveness-owner-token <token> --json"),console.log(" release-broker-session <session-uuid> --liveness-owner-token <token> --json"),console.log(" (capabilities requires --json; status, available-devices, active-sessions, session-info and release-session accept --json)"),console.log(" release-liveness-ownership <id> --liveness-owner-token <token> Hand off liveness; keep the device"),console.log(" heartbeat <id> Heartbeat a session (one-shot CLI: no-op; proxy-owned: refused)"),console.log(`
|
|
10
|
+
Options:`),console.log(` ${U} Let start/stop/restart/release act on the shared daemon while AUTOMOBILE_DATA_DIR or DB dirs are set without AUTOMOBILE_AUX_SOCKET_DIR`),process.exit(1)}catch(n){if(n instanceof t)console.error(`Error: ${n.message}`);else console.error(`Unexpected error: ${r(n)}`);process.exit(1)}}function Ye(s,n){let o=ss(s);if(!n.startupToolDefaults)return o;return{...o,...n.startupToolDefaults.enabledTools!==void 0?{enabledTools:[...n.startupToolDefaults.enabledTools]}:{},...n.startupToolDefaults.disabledTools!==void 0?{disabledTools:[...n.startupToolDefaults.disabledTools]}:{}}}function Wo(s,n){let o=ks(s),a=[` Build ID: ${o.buildId||"unknown"}`,` Entry Script: ${o.entryScript||"unknown"}`];if(!$d(n,o))a.push(`
|
|
11
|
+
\u26A0\uFE0F WARNING: the running daemon is a different build than this checkout:`,` daemon build=${ji(o)}`,` client build=${ji(n)}`,"\nRestart the daemon from this checkout (run `--daemon restart` with this same CLI) to align them.");return a}var $s=(s,n,o)=>JSON.stringify({availableDevices:s?.idle??0,totalDevices:s?.total??0,assignedDevices:s?.assigned??0,errorDevices:s?.error??0,...n?{recoveryPolicy:n}:{},...o?{devices:o}:{}});function Ns(s){return Object.assign(new t(s),{code:"discovery_incomplete",retryable:!0})}function Ko(s){let n=s.poolStatus?.countUnknown;if(n)return`Device discovery for ${n.platforms?.join(", ")||"a pooled platform"} did not complete, so the pooled device count is unknown`;if(s.observationComplete===!1&&(s.devices?.length??0)===0)return"The booted-devices resource reports incomplete discovery and the pool has no devices, so the count is unknown";return}function zo(s){let n=null;try{n=s?JSON.parse(s):null}catch(a){throw new t(`The booted-devices resource was not valid JSON: ${r(a)}`)}if(typeof n?.error==="string")throw new t(`The booted-devices resource reported an error: ${n.error}`);if(!n?.poolStatus)throw Ns("The booted-devices resource carried no pool status, so the device count is unknown (discovery_incomplete); retry once the daemon finishes discovery.");let o=Ko(n);if(o)throw Ns(`${o} (discovery_incomplete); retry once the daemon finishes discovery.`);console.log($s(n.poolStatus,n.poolStatus.recoveryPolicy,n.devices?.map((a)=>({deviceId:a.runtime?.deviceId??"unknown",platform:a.platform,recoveryEligibility:a.recoveryEligibility}))))}function Ls(s){return!s.running&&s.recovery!==void 0}function Go(s,n){if(s.recovery)console.log(` Identity recovery: ${s.recovery.state}${s.recovery.reason?` (${s.recovery.reason})`:""}`);if(s.running){console.log("Daemon is running"),console.log(` PID: ${s.pid}`),console.log(` Port: ${s.port}`),console.log(` Socket: ${s.socketPath}`),console.log(` Database: ${s.dbPath||"unknown"}`),console.log(` Version: ${s.version||"unknown"}`),console.log(` Started: ${s.startedAt?new Date(s.startedAt).toISOString():"unknown"}`);for(let a of Wo(s,No()))console.log(a);let o=n.findOtherDaemonProcesses(s.pid);if(o.length>0){console.log(`
|
|
12
|
+
\u26A0\uFE0F WARNING: Found ${o.length} other daemon process(es) from other worktrees:`);for(let a of o)console.log(` - PID ${a}`);console.log(`
|
|
13
|
+
These can cause device pool conflicts. Run 'bunx ${Os()} --daemon restart' to stop them.`)}}else if(s.recovery)console.log("Daemon socket is held by a process that is not an authenticated daemon");else console.log("Daemon is not running")}function Hs(s,n){let o=s.getSession(n);if(!o)throw new t(`Session not found: ${n}`);return o}function qs(s){return`Session ${s} is a one-shot CLI session: its idle window runs from tool calls, so this heartbeat changed nothing (no keeper is needed).`}function Yo(s,n){let o=s.getSessionManager(),a=o.getSession(n)??o.getReleasingSession(n);if(!a||$i(o,n,a))throw new t(`Session not found: ${n}`);let c=ie(vC,a);if(c)throw new t(js(n,Object.assign(Error(c.error),{code:c.code})));if(a.livenessPolicy==="cli-idle")return!1;return o.recordHeartbeat(n),!0}async function J(s,n,o,a){try{switch(s){case"start":{await a.start(Ye(n,o));break}case"stop":await a.stop();break;case"restart":{await a.restart(Ye(n,o));break}case"restart-admitted":{await a.restartAdmitted(Ye(n,o),_s(n));break}case"restart-acceptance-session":{await a.restartAcceptanceSession(Bs(n));break}}}catch(c){if(c instanceof t)console.error(`Error: ${c.message}`);else console.error(`Unexpected error: ${r(c)}`);process.exit(1)}}async function Jo(s,n){let o=await n.status();if(Nm(s,[O])===!0)return console.log(JSON.stringify(o)),Ls(o);Go(o,n);for(let a of await ls(o.running?o.pid:void 0))console.log(a);return Ls(o)}async function Qe(s,n,o){let a=!1;try{switch(s){case"status":{a=await Jo(n,o);break}case"health":{let c=await ZE();if(console.log(Oe(c)),!c.daemonRunning||!c.socketConnectable)process.exit(1);break}case"diagnose":{console.log(`Running daemon diagnostics...
|
|
14
|
+
`);let c=await ZE();console.log(Oe(c));let d=await Qt();if(console.log(Xt(d)),c.recommendations.length>0||d.issues.length>0)process.exit(1);break}}}catch(c){if(c instanceof t)console.error(`Error: ${c.message}`);else console.error(`Unexpected error: ${r(c)}`);process.exit(1)}if(a)process.exit(1)}function Us(s,n,o){let a=[s,n?"idle":void 0,o===void 0?void 0:`idle timeout ${o} ms`].filter(Boolean).join(", ");return a?` (released: ${a})`:""}function Vs(s){return s!==null&&typeof s==="object"&&!Array.isArray(s)?s:void 0}class C extends t{code;nextAction;retryable;retryAfterMs;releaseReason;idle;idleTimeoutMs;details;detail;constructor(s,n){let o=(b)=>n!==null&&typeof n==="object"&&(b in n)?n[b]:void 0,a=o("code"),c=o("nextAction"),d=o("retryable"),m=o("retryAfterMs"),p=Es(n),h=o("idle")===!0,S=B6(n),w=r(n),R=typeof a==="string"||typeof a==="number"?String(a):void 0,v=typeof c==="string"?c:void 0;super(`${s}: ${w}${Us(p,h,S)}${R?` [${R}]`:""}${v?` Next: ${v}`:""}`,{cause:n});this.detail=w,this.code=R,this.nextAction=v,this.retryable=typeof d==="boolean"?d:void 0,this.retryAfterMs=typeof m==="number"?m:void 0,this.releaseReason=p,this.idle=h?!0:void 0,this.idleTimeoutMs=S,this.details=Vs(o("details"))}}function Qo(s){if(!(s instanceof C))return{ok:!1,error:r(s)};let n={code:s.code,nextAction:s.nextAction,retryable:s.retryable,retryAfterMs:s.retryAfterMs,releaseReason:s.releaseReason,idle:s.idle,idleTimeoutMs:s.idleTimeoutMs,details:s.details};return{ok:!1,error:s.detail,...Object.fromEntries(Object.entries(n).filter(([,o])=>o!==void 0))}}function L(s,n){if(n)console.log(JSON.stringify(Qo(s)));else if(s instanceof t)console.error(`Error: ${s.message}`);else console.error(`Unexpected error: ${r(s)}`);process.exit(1)}function Q(s){let n=s.indexOf("--"),o=n===-1?s:s.slice(0,n),a=n===-1?[]:s.slice(n+1);return{json:Nm(o,[O])===!0,rest:[...o.filter((c)=>yi(c).flag!==O),...a]}}async function Xo(s,n){let{json:o}=Q(s);try{let a=n.getDaemonState();if(a.isInitialized()){let c=a.getDevicePool(),{stats:d,deviceIds:m}=await c.getRefreshedInventory().catch((p)=>{throw new C("Failed to query available devices",p)});console.log($s(d,c.getRecoveryPolicy(),c.getAllDevices().filter((p)=>m.has(p.id)).map((p)=>({deviceId:p.id,platform:p.platform,recoveryEligibility:c.getRecoveryEligibility(p.id)}))));return}{let c=n.createClient();try{await c.connect();let m=(await c.readResource("automobile:devices/booted"))?.contents?.[0]?.text;zo(m),await c.close()}catch(d){throw new C("Failed to query available devices",d)}}return}catch(a){L(a,o)}}async function Zo(s,n){let{json:o,rest:a}=Q(s);try{if(a.length===0)throw new t("session-info requires a session ID argument");let c=a[0],d=n.getDaemonState();if(d.isInitialized()){let m=d.getSessionManager(),p=Hs(m,c),h=W(p,m.getIdleReleaseExecutionVeto(c),m.getSessionLeaseState(c)?.phase);console.log(JSON.stringify({sessionId:p.sessionId,assignedDevice:p.assignedDevice,...QM(p),createdAt:p.createdAt,lastUsedAt:p.lastUsedAt,expiresAt:p.expiresAt,cacheSize:JSON.stringify(p.cacheData).length,idleReleaseAt:h===null?null:m.sessionClockToReportedWall(h)}));return}{let m=n.createClient();try{await m.connect();let p=await m.callDaemonMethod("daemon/sessionInfo",{sessionId:c});console.log(JSON.stringify(p)),await m.close()}catch(p){throw new C("Failed to get session info",p)}}return}catch(c){L(c,o)}}async function ei(s,n){let{json:o}=Q(s);try{let a=n.createClient();try{await a.connect();let c=await a.callDaemonMethod("daemon/activeSessions",{includeSessions:!0});console.log(JSON.stringify(c)),await a.close()}catch(c){throw new C("Failed to query active sessions",c)}}catch(a){L(a,o)}}async function ti(s,n){let{json:o,rest:a}=Q(s);try{let c=rs(a.filter((m)=>m!=="")),d;try{d=await as(c,n.createClient())}catch(m){throw new C(`Failed to set feature flag ${c.key}`,m)}if(o){console.log(JSON.stringify({ok:!0,flag:d}));return}console.log(`Feature flag ${c.key} is now ${c.enabled?"enabled":"disabled"}`)}catch(c){L(c,o)}}async function si(s,n){try{let o=await Ts(s,()=>n.createClient());console.log(JSON.stringify(o))}catch(o){L(new C("Failed to query daemon capabilities",o),!0)}}var ni=f({message:y(),alreadyReleased:Z(),device:y().optional(),known:Z().optional(),cleanup:P(["pending","failed"]).optional()});async function oi(s,n){let{json:o,rest:a}=Q(s),c=(d,m,{device:p,known:h,cleanup:S}={})=>{if(o){console.log(JSON.stringify({ok:!0,sessionId:a[0],alreadyReleased:d,message:m,...p!==void 0?{device:p}:{},...h!==void 0?{known:h}:{},...S!==void 0?{cleanup:S}:{}}));return}if(console.log(m),S!==void 0)console.log(`Cleanup ${S}: the device may not be fully restored`);if(!d&&p!==void 0)console.log(`Device ${p} is now available`)};try{if(a.length===0)throw new t("release-session requires a session ID argument");let d=a[0],m=n.getDaemonState();if(m.isInitialized()){let p=m.getSessionManager(),h=m.getDevicePool(),w=Hs(p,d).assignedDevice;await As({manager:p,pool:h},w,d,{deferFailureFallback:!0}),c(!1,`Session ${d} released`,{device:w});return}{let p=n.createClient(),h=(S)=>ni.safeParse(S).success;try{await p.connect(),await p.callDaemonMethod("daemon/releaseSession",{sessionId:d,requireKnown:!0}).then(async(S)=>{if(await p.close(),!h(S))throw new t("Invalid daemon release-session result");c(S.alreadyReleased,S.alreadyReleased?S.message:`Session ${d} released`,{device:S.device,known:S.known,cleanup:S.cleanup})})}catch(S){throw new C("Failed to release session",S)}}return}catch(d){L(d,o)}}async function Xe(s,n,o){try{let a=()=>o.createClient(),c=s==="session-request-status"?await Ps(n,a):s==="abandon-session-request"?await Is(n,a):await Ms(n,a);console.log(JSON.stringify(c))}catch(a){L(new C(s==="session-request-status"?"Failed to query broker session request status":s==="abandon-session-request"?"Failed to abandon broker session request":"Failed to release broker session",a),!0)}}function js(s,n){let o=n!==null&&typeof n==="object"&&"code"in n?n.code:void 0;if(o===Gf)return`The token no longer owns session ${s}'s liveness. Re-claim with a fresh --liveness-owner-token and --claim-liveness-ownership, or stop the keeper.`;if(o===Yf)return`Session ${s}'s liveness is unowned. Explicitly claim with --claim-liveness-ownership before sending keeper ticks, or stop the keeper. [${Yf}]`;if(o===YN)return`${r(n)} [${YN}] Stop this keeper; heartbeat only works for one-shot CLI sessions.`;return`Failed to record session heartbeat: ${r(n)}${ii(n)}`}function ii(s){let n=Es(s),o=Vs(s)?.idle===!0;return n?Us(n,o,B6(s)):""}async function ai(s,n){try{let{sessionId:o,livenessOwnerToken:a,claimLivenessOwnership:c}=We(s),d=n.getDaemonState();if(d.isInitialized()){let m=Yo(d,o);console.log(m?`Session ${o} heartbeat recorded`:qs(o));return}{let m=n.createClient();try{if(await m.connect(),(await m.callDaemonMethod("daemon/heartbeat",{sessionId:o,livenessPolicy:Lh,livenessOwnerKind:vC,idleTimeoutMs:Vu(),...a?{livenessOwnerToken:a}:{},...c?{claimLivenessOwnership:!0}:{}}))?.livenessUnchanged===!0){console.log(qs(o));return}}catch(p){throw new t(js(o,p))}finally{await m.close()}}console.log(`Session ${o} heartbeat recorded`);return}catch(o){if(o instanceof t)console.error(`Error: ${o.message}`);else console.error(`Unexpected error: ${r(o)}`);process.exit(1)}}async function ci(s,n){try{let o=Ke(s),a=n.getDaemonState();if(a.isInitialized()){let d=await UM({id:"release-liveness-ownership",type:"daemon_request",method:sL,params:o},a);if(!d.success)throw new t(`${d.error} [${d.code}]`);console.log(JSON.stringify(d.result));return}let c=n.createClient();try{await c.connect(),console.log(JSON.stringify(await c.callDaemonMethod(sL,o)))}finally{await c.close()}}catch(o){let a=o!==null&&typeof o==="object"&&"code"in o?o.code:void 0;console.error(`Failed to release liveness ownership: ${r(o)}${typeof a==="string"?` [${a}]`:""}`),process.exit(1)}}var di=new Set(["start","stop","restart","restart-admitted","restart-acceptance-session","release-session","set-feature-flag","abandon-session-request","release-broker-session","release-liveness-ownership"]);function mi(s,n,o){if(!di.has(s))return!1;try{return Q1(`run daemon ${s}`,n,o),!1}catch(a){return console.error(`Error: ${r(a)}`),process.exit(1),!0}}async function BG(s,n,o,a){let c=Nm(n,[U])===!0,d=n.filter((w)=>yi(w).flag!==U),m=new a({clientFactory:o.clientFactory,stateProvider:o.stateProvider}),p={start:()=>J(s,d,o,m),stop:()=>J(s,d,o,m),restart:()=>J(s,d,o,m),"restart-admitted":()=>J(s,d,o,m),"restart-acceptance-session":()=>J(s,d,o,m),status:()=>Qe(s,d,m),capabilities:()=>si(d,m),health:()=>Qe(s,d,m),diagnose:()=>Qe(s,d,m),"available-devices":()=>Xo(d,m),"active-sessions":()=>ei(d,m),"session-info":()=>Zo(d,m),"release-session":()=>oi(d,m),"set-feature-flag":()=>ti(d,m),"session-request-status":()=>Xe("session-request-status",d,m),"abandon-session-request":()=>Xe("abandon-session-request",d,m),"release-broker-session":()=>Xe("release-broker-session",d,m),heartbeat:()=>ai(d,m),"release-liveness-ownership":()=>ci(d,m)},h=Object.hasOwn(p,s)?p[s]:void 0;if(!h)return LG(s);let S=ze(s,d);if(S!==void 0)return Ge(S);if(o.namespaceEnv&&mi(s,o.namespaceEnv,c))return;return h()}
|
|
15
|
+
export{uX,JE,OP,ly,DM,As,G1,Cp,OM,MP,IG,MM,NM,FM,pX,_G,XE,Tf,Dp,NP,xG,mX,LM,Y1,CG,fX,BM,hX,DG,OG,$M,gX,J1,MG,X1,Z1,UM,ZE,NG,FG,Q1,FP,Op,eH,yX,LG,BG};
|
|
16
|
+
|
|
17
|
+
//# debugId=D982D2130DA728AE64756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{pC,yi,Mm,Fs,oi}from"./chunk-h3n4adc6.js";import"./chunk-mf9spd4g.js";import"./chunk-z8t0v07j.js";import"./chunk-32jpxz2y.js";import"./chunk-ggtd5x5a.js";import{Ry,GP,YP,iZ,iS}from"./chunk-nwm2pq5v.js";import{Xf}from"./chunk-hmke8nhx.js";import{t}from"./chunk-9rkfyt6q.js";function m(r,o,e){let i=Mm(r,o);if(!i.value)throw new t(`${e} requires a value.`);return{value:i.value,consumed:i.last-o}}function v(r,o){let e=Fs(yi(r).inlineValue);if(e===void 0)throw new t(`${o} must be true or false.`);return e}function d(r){let o={preferRunning:!0};for(let e=0;e<r.length;e++)e+=f(o,r,e,yi(r[e]).flag);if(o.platform!=="android"&&o.platform!=="ios")throw new t("--platform must be android or ios.");return o}function f(r,o,e,i){let u={"--platform":"platform","--device-id":"deviceId","--name":"name","--min-os-version":"minOsVersion","--max-os-version":"maxOsVersion"}[i];if(u){let{value:s,consumed:a}=m(o,e,i);return r[u]=s,a}if(i==="--timeout-ms"){let{value:s,consumed:a}=m(o,e,i),c=Number(s);if(!Number.isFinite(c)||c<=0)throw new t("--timeout-ms must be a positive number.");return r.timeoutMs=c,a}if(i==="--create-if-missing")return r.createIfMissing=v(o[e],i),0;if(i==="--no-prefer-running")return r.preferRunning=!v(o[e],i),0;throw new t(`Unknown boot-device argument: ${i}`)}async function I(r){let o=d(r),e=await iZ(o),n=await new iS({deviceManager:e?.deviceManager??new oi,deviceMatcher:new pC,deviceCreationGate:GP(),deviceProvisioner:e?.deviceProvisioner??YP(void 0,void 0,Ry()),matchingStrategy:Xf,bootRecovery:e?.recovery}).boot(e?.request??o);console.log(JSON.stringify({deviceId:n.device.deviceId,name:n.device.name,platform:n.device.platform,osVersion:n.device.osVersion,source:n.source,processId:n.processId,provisioned:n.provisioned}))}export{I as runBootDeviceCommand};
|
|
3
|
+
|
|
4
|
+
//# debugId=68FD9B742DFF2BF164756E2164756E21
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{g,$e}from"./chunk-mf9spd4g.js";import{iF}from"./chunk-z04jrpjy.js";import{ye,f,ao,HD,vu}from"./chunk-79q5xsdc.js";var T=Symbol("Let zodToJsonSchema decide on which parser to use");var j={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},Z=(e)=>typeof e==="string"?{...j,name:e}:{...j,...e};var E=(e)=>{let t=Z(e),r=t.name!==void 0?[...t.basePath,t.definitionPath,t.name]:t.basePath;return{...t,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(t.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...t.basePath,t.definitionPath,n],jsonSchema:void 0}]))}};function D(e,t,r,n){if(!n?.errorMessages)return;if(r)e.errorMessage={...e.errorMessage,[t]:r}}function p(e,t,r,n,o){e[t]=r,D(e,t,n,o)}var x=(e,t)=>{let r=0;for(;r<e.length&&r<t.length;r++)if(e[r]!==t[r])break;return[(e.length-r).toString(),...t.slice(r)].join("/")};function m(e){if(e.target!=="openAi")return{};let t=[...e.basePath,e.definitionPath,e.openAiAnyTypeName];return e.flags.hasReferencedOpenAiAnyType=!0,{$ref:e.$refStrategy==="relative"?x(t,e.currentPath):t.join("/")}}function N(e,t){let r={type:"array"};if(e.type?._def&&e.type?._def?.typeName!==ye.ZodAny)r.items=a(e.type._def,{...t,currentPath:[...t.currentPath,"items"]});if(e.minLength)p(r,"minItems",e.minLength.value,e.minLength.message,t);if(e.maxLength)p(r,"maxItems",e.maxLength.value,e.maxLength.message,t);if(e.exactLength)p(r,"minItems",e.exactLength.value,e.exactLength.message,t),p(r,"maxItems",e.exactLength.value,e.exactLength.message,t);return r}function R(e,t){let r={type:"integer",format:"int64"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"min":if(t.target==="jsonSchema7")if(n.inclusive)p(r,"minimum",n.value,n.message,t);else p(r,"exclusiveMinimum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMinimum=!0;p(r,"minimum",n.value,n.message,t)}break;case"max":if(t.target==="jsonSchema7")if(n.inclusive)p(r,"maximum",n.value,n.message,t);else p(r,"exclusiveMaximum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMaximum=!0;p(r,"maximum",n.value,n.message,t)}break;case"multipleOf":p(r,"multipleOf",n.value,n.message,t);break}return r}function M(){return{type:"boolean"}}function A(e,t){return a(e.type._def,t)}var w=(e,t)=>a(e.innerType._def,t);function _(e,t,r){let n=r??t.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>_(e,t,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return ce(e,t)}}var ce=(e,t)=>{let r={type:"integer",format:"unix-time"};if(t.target==="openApi3")return r;for(let n of e.checks)switch(n.kind){case"min":p(r,"minimum",n.value,n.message,t);break;case"max":p(r,"maximum",n.value,n.message,t);break}return r};function L(e,t){return{...a(e.innerType._def,t),default:e.defaultValue()}}function I(e,t){return t.effectStrategy==="input"?a(e.schema._def,t):m(t)}function z(e){return{type:"string",enum:Array.from(e.values)}}var me=(e)=>{if("type"in e&&e.type==="string")return!1;return"allOf"in e};function F(e,t){let r=[a(e.left._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),a(e.right._def,{...t,currentPath:[...t.currentPath,"allOf","1"]})].filter((i)=>!!i),n=t.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach((i)=>{if(me(i)){if(o.push(...i.allOf),i.unevaluatedProperties===void 0)n=void 0}else{let u=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:c,...s}=i;u=s}else n=void 0;o.push(u)}}),o.length?{allOf:o,...n}:void 0}function J(e,t){let r=typeof e.value;if(r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string")return{type:Array.isArray(e.value)?"array":"object"};if(t.target==="openApi3")return{type:r==="bigint"?"integer":r,enum:[e.value]};return{type:r==="bigint"?"integer":r,const:e.value}}var S=void 0,d={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(S===void 0)S=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return S},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function v(e,t){let r={type:"string"};if(e.checks)for(let n of e.checks)switch(n.kind){case"min":p(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t);break;case"max":p(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"email":switch(t.emailStrategy){case"format:email":y(r,"email",n.message,t);break;case"format:idn-email":y(r,"idn-email",n.message,t);break;case"pattern:zod":l(r,d.email,n.message,t);break}break;case"url":y(r,"uri",n.message,t);break;case"uuid":y(r,"uuid",n.message,t);break;case"regex":l(r,n.regex,n.message,t);break;case"cuid":l(r,d.cuid,n.message,t);break;case"cuid2":l(r,d.cuid2,n.message,t);break;case"startsWith":l(r,RegExp(`^${k(n.value,t)}`),n.message,t);break;case"endsWith":l(r,RegExp(`${k(n.value,t)}$`),n.message,t);break;case"datetime":y(r,"date-time",n.message,t);break;case"date":y(r,"date",n.message,t);break;case"time":y(r,"time",n.message,t);break;case"duration":y(r,"duration",n.message,t);break;case"length":p(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t),p(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"includes":{l(r,RegExp(k(n.value,t)),n.message,t);break}case"ip":{if(n.version!=="v6")y(r,"ipv4",n.message,t);if(n.version!=="v4")y(r,"ipv6",n.message,t);break}case"base64url":l(r,d.base64url,n.message,t);break;case"jwt":l(r,d.jwt,n.message,t);break;case"cidr":{if(n.version!=="v6")l(r,d.ipv4Cidr,n.message,t);if(n.version!=="v4")l(r,d.ipv6Cidr,n.message,t);break}case"emoji":l(r,d.emoji(),n.message,t);break;case"ulid":{l(r,d.ulid,n.message,t);break}case"base64":{switch(t.base64Strategy){case"format:binary":{y(r,"binary",n.message,t);break}case"contentEncoding:base64":{p(r,"contentEncoding","base64",n.message,t);break}case"pattern:zod":{l(r,d.base64,n.message,t);break}}break}case"nanoid":l(r,d.nanoid,n.message,t);case"toLowerCase":case"toUpperCase":case"trim":break;default:((o)=>{})(n)}return r}function k(e,t){return t.patternStrategy==="escape"?fe(e):e}var le=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function fe(e){let t="";for(let r=0;r<e.length;r++){if(!le.has(e[r]))t+="\\";t+=e[r]}return t}function y(e,t,r,n){if(e.format||e.anyOf?.some((o)=>o.format)){if(!e.anyOf)e.anyOf=[];if(e.format){if(e.anyOf.push({format:e.format,...e.errorMessage&&n.errorMessages&&{errorMessage:{format:e.errorMessage.format}}}),delete e.format,e.errorMessage){if(delete e.errorMessage.format,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.anyOf.push({format:t,...r&&n.errorMessages&&{errorMessage:{format:r}}})}else p(e,"format",t,r,n)}function l(e,t,r,n){if(e.pattern||e.allOf?.some((o)=>o.pattern)){if(!e.allOf)e.allOf=[];if(e.pattern){if(e.allOf.push({pattern:e.pattern,...e.errorMessage&&n.errorMessages&&{errorMessage:{pattern:e.errorMessage.pattern}}}),delete e.pattern,e.errorMessage){if(delete e.errorMessage.pattern,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.allOf.push({pattern:C(t,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})}else p(e,"pattern",C(t,n),r,n)}function C(e,t){if(!t.applyRegexFlags||!e.flags)return e.source;let r={i:e.flags.includes("i"),m:e.flags.includes("m"),s:e.flags.includes("s")},n=r.i?e.source.toLowerCase():e.source,o="",i=!1,u=!1,c=!1;for(let s=0;s<n.length;s++){if(i){o+=n[s],i=!1;continue}if(r.i){if(u){if(n[s].match(/[a-z]/)){if(c)o+=n[s],o+=`${n[s-2]}-${n[s]}`.toUpperCase(),c=!1;else if(n[s+1]==="-"&&n[s+2]?.match(/[a-z]/))o+=n[s],c=!0;else o+=`${n[s]}${n[s].toUpperCase()}`;continue}}else if(n[s].match(/[a-z]/)){o+=`[${n[s]}${n[s].toUpperCase()}]`;continue}}if(r.m){if(n[s]==="^"){o+=`(^|(?<=[\r
|
|
3
|
+
]))`;continue}else if(n[s]==="$"){o+=`($|(?=[\r
|
|
4
|
+
]))`;continue}}if(r.s&&n[s]==="."){o+=u?`${n[s]}\r
|
|
5
|
+
`:`[${n[s]}\r
|
|
6
|
+
]`;continue}if(o+=n[s],n[s]==="\\")i=!0;else if(u&&n[s]==="]")u=!1;else if(!u&&n[s]==="[")u=!0}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${t.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),e.source}return o}function O(e,t){if(t.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(t.target==="openApi3"&&e.keyType?._def.typeName===ye.ZodEnum)return{type:"object",required:e.keyType._def.values,properties:e.keyType._def.values.reduce((n,o)=>({...n,[o]:a(e.valueType._def,{...t,currentPath:[...t.currentPath,"properties",o]})??m(t)}),{}),additionalProperties:t.rejectedAdditionalProperties};let r={type:"object",additionalProperties:a(e.valueType._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]})??t.allowedAdditionalProperties};if(t.target==="openApi3")return r;if(e.keyType?._def.typeName===ye.ZodString&&e.keyType._def.checks?.length){let{type:n,...o}=v(e.keyType._def,t);return{...r,propertyNames:o}}else if(e.keyType?._def.typeName===ye.ZodEnum)return{...r,propertyNames:{enum:e.keyType._def.values}};else if(e.keyType?._def.typeName===ye.ZodBranded&&e.keyType._def.type._def.typeName===ye.ZodString&&e.keyType._def.type._def.checks?.length){let{type:n,...o}=A(e.keyType._def,t);return{...r,propertyNames:o}}return r}function U(e,t){if(t.mapStrategy==="record")return O(e,t);let r=a(e.keyType._def,{...t,currentPath:[...t.currentPath,"items","items","0"]})||m(t),n=a(e.valueType._def,{...t,currentPath:[...t.currentPath,"items","items","1"]})||m(t);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function B(e){let t=e.values,n=Object.keys(e.values).filter((i)=>typeof t[t[i]]!=="number").map((i)=>t[i]),o=Array.from(new Set(n.map((i)=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function V(e){return e.target==="openAi"?void 0:{not:m({...e,currentPath:[...e.currentPath,"not"]})}}function q(e){return e.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var b={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Y(e,t){if(t.target==="openApi3")return K(e,t);let r=e.options instanceof Map?Array.from(e.options.values()):e.options;if(r.every((n)=>(n._def.typeName in b)&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let u=b[i._def.typeName];return u&&!o.includes(u)?[...o,u]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every((n)=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let u=typeof i._def.value;switch(u){case"string":case"number":case"boolean":return[...o,u];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((i,u,c)=>c.indexOf(i)===u);return{type:o.length>1?o:o[0],enum:r.reduce((i,u)=>i.includes(u._def.value)?i:[...i,u._def.value],[])}}}else if(r.every((n)=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter((i)=>!n.includes(i))],[])};return K(e,t)}var K=(e,t)=>{let r=(e.options instanceof Map?Array.from(e.options.values()):e.options).map((n,o)=>a(n._def,{...t,currentPath:[...t.currentPath,"anyOf",`${o}`]})).filter((n)=>!!n&&(!t.strictUnions||typeof n==="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function H(e,t){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(e.innerType._def.typeName)&&(!e.innerType._def.checks||!e.innerType._def.checks.length)){if(t.target==="openApi3")return{type:b[e.innerType._def.typeName],nullable:!0};return{type:[b[e.innerType._def.typeName],"null"]}}if(t.target==="openApi3"){let n=a(e.innerType._def,{...t,currentPath:[...t.currentPath]});if(n&&"$ref"in n)return{allOf:[n],nullable:!0};return n&&{...n,nullable:!0}}let r=a(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function W(e,t){let r={type:"number"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"int":r.type="integer",D(r,"type",n.message,t);break;case"min":if(t.target==="jsonSchema7")if(n.inclusive)p(r,"minimum",n.value,n.message,t);else p(r,"exclusiveMinimum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMinimum=!0;p(r,"minimum",n.value,n.message,t)}break;case"max":if(t.target==="jsonSchema7")if(n.inclusive)p(r,"maximum",n.value,n.message,t);else p(r,"exclusiveMaximum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMaximum=!0;p(r,"maximum",n.value,n.message,t)}break;case"multipleOf":p(r,"multipleOf",n.value,n.message,t);break}return r}function G(e,t){let r=t.target==="openAi",n={type:"object",properties:{}},o=[],i=e.shape();for(let c in i){let s=i[c];if(s===void 0||s._def===void 0)continue;let h=ge(s);if(h&&r){if(s._def.typeName==="ZodOptional")s=s._def.innerType;if(!s.isNullable())s=s.nullable();h=!1}let P=a(s._def,{...t,currentPath:[...t.currentPath,"properties",c],propertyPath:[...t.currentPath,"properties",c]});if(P===void 0)continue;if(n.properties[c]=P,!h)o.push(c)}if(o.length)n.required=o;let u=de(e,t);if(u!==void 0)n.additionalProperties=u;return n}function de(e,t){if(e.catchall._def.typeName!=="ZodNever")return a(e.catchall._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]});switch(e.unknownKeys){case"passthrough":return t.allowedAdditionalProperties;case"strict":return t.rejectedAdditionalProperties;case"strip":return t.removeAdditionalStrategy==="strict"?t.allowedAdditionalProperties:t.rejectedAdditionalProperties}}function ge(e){try{return e.isOptional()}catch{return!0}}var X=(e,t)=>{if(t.currentPath.toString()===t.propertyPath?.toString())return a(e.innerType._def,t);let r=a(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","1"]});return r?{anyOf:[{not:m(t)},r]}:m(t)};var Q=(e,t)=>{if(t.pipeStrategy==="input")return a(e.in._def,t);else if(t.pipeStrategy==="output")return a(e.out._def,t);let r=a(e.in._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),n=a(e.out._def,{...t,currentPath:[...t.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter((o)=>o!==void 0)}};function ee(e,t){return a(e.type._def,t)}function te(e,t){let n={type:"array",uniqueItems:!0,items:a(e.valueType._def,{...t,currentPath:[...t.currentPath,"items"]})};if(e.minSize)p(n,"minItems",e.minSize.value,e.minSize.message,t);if(e.maxSize)p(n,"maxItems",e.maxSize.value,e.maxSize.message,t);return n}function re(e,t){if(e.rest)return{type:"array",minItems:e.items.length,items:e.items.map((r,n)=>a(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:a(e.rest._def,{...t,currentPath:[...t.currentPath,"additionalItems"]})};else return{type:"array",minItems:e.items.length,maxItems:e.items.length,items:e.items.map((r,n)=>a(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function ne(e){return{not:m(e)}}function oe(e){return m(e)}var ae=(e,t)=>a(e.innerType._def,t);var ie=(e,t,r)=>{switch(t){case ye.ZodString:return v(e,r);case ye.ZodNumber:return W(e,r);case ye.ZodObject:return G(e,r);case ye.ZodBigInt:return R(e,r);case ye.ZodBoolean:return M();case ye.ZodDate:return _(e,r);case ye.ZodUndefined:return ne(r);case ye.ZodNull:return q(r);case ye.ZodArray:return N(e,r);case ye.ZodUnion:case ye.ZodDiscriminatedUnion:return Y(e,r);case ye.ZodIntersection:return F(e,r);case ye.ZodTuple:return re(e,r);case ye.ZodRecord:return O(e,r);case ye.ZodLiteral:return J(e,r);case ye.ZodEnum:return z(e);case ye.ZodNativeEnum:return B(e);case ye.ZodNullable:return H(e,r);case ye.ZodOptional:return X(e,r);case ye.ZodMap:return U(e,r);case ye.ZodSet:return te(e,r);case ye.ZodLazy:return()=>e.getter()._def;case ye.ZodPromise:return ee(e,r);case ye.ZodNaN:case ye.ZodNever:return V(r);case ye.ZodEffects:return I(e,r);case ye.ZodAny:return m(r);case ye.ZodUnknown:return oe(r);case ye.ZodDefault:return L(e,r);case ye.ZodBranded:return A(e,r);case ye.ZodReadonly:return ae(e,r);case ye.ZodCatch:return w(e,r);case ye.ZodPipeline:return Q(e,r);case ye.ZodFunction:case ye.ZodVoid:case ye.ZodSymbol:return;default:return((n)=>{return})(t)}};function a(e,t,r=!1){let n=t.seen.get(e);if(t.override){let c=t.override?.(e,t,n,r);if(c!==T)return c}if(n&&!r){let c=he(n,t);if(c!==void 0)return c}let o={def:e,path:t.currentPath,jsonSchema:void 0};t.seen.set(e,o);let i=ie(e,e.typeName,t),u=typeof i==="function"?a(i(),t):i;if(u)be(e,t,u);if(t.postProcess){let c=t.postProcess(u,e,t);return o.jsonSchema=u,c}return o.jsonSchema=u,u}var he=(e,t)=>{switch(t.$refStrategy){case"root":return{$ref:e.path.join("/")};case"relative":return{$ref:x(t.currentPath,e.path)};case"none":case"seen":{if(e.path.length<t.currentPath.length&&e.path.every((r,n)=>t.currentPath[n]===r))return console.warn(`Recursive reference detected at ${t.currentPath.join("/")}! Defaulting to any`),m(t);return t.$refStrategy==="seen"?m(t):void 0}}},be=(e,t,r)=>{if(e.description){if(r.description=e.description,t.markdownDescription)r.markdownDescription=e.description}return r};var eF=(e,t)=>{let r=E(t),n=typeof t==="object"&&t.definitions?Object.entries(t.definitions).reduce((s,[h,P])=>({...s,[h]:a(P._def,{...r,currentPath:[...r.basePath,r.definitionPath,h]},!0)??m(r)}),{}):void 0,o=typeof t==="string"?t:t?.nameStrategy==="title"?void 0:t?.name,i=a(e._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},!1)??m(r),u=typeof t==="object"&&t.name!==void 0&&t.nameStrategy==="title"?t.name:void 0;if(u!==void 0)i.title=u;if(r.flags.hasReferencedOpenAiAnyType){if(!n)n={};if(!n[r.openAiAnyTypeName])n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}}let c=o===void 0?n?{...i,[r.definitionPath]:n}:i:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:i}};if(r.target==="jsonSchema7")c.$schema="http://json-schema.org/draft-07/schema#";else if(r.target==="jsonSchema2019-09"||r.target==="openAi")c.$schema="https://json-schema.org/draft/2019-09/schema#";if(r.target==="openAi"&&(("anyOf"in c)||("oneOf"in c)||("allOf"in c)||("type"in c)&&Array.isArray(c.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return c};var Hx="automobile:prototype",LS="automobile:prototype/spec-schema",W7="automobile:prototype/icons{?query}",tF="automobile:prototype/icons",FA=100;function Pe(e=process.env){return $e(g.PROTOTYPE_FULL_SCHEMA,e)}var xe=(e)=>eF(e,{strictUnions:!0,pipeStrategy:"input"});function Ae(e){let t=e.properties?.theme;if(!t)return;t.minProperties=1;let r=t.properties?.colors;if(r)r.minProperties=1}function ve(e){let t=e.properties,r=t?.root;if(!t||!Array.isArray(r?.anyOf))return;let n={type:"string",pattern:ao.source};r.anyOf=[...r.anyOf,{type:"object",description:"Replaced on the host by components[component].root with {props.<field>} bound in the fields repeat binds; a placeholder that is the whole value keeps the prop's type",properties:{type:{type:"string",enum:["use"]},component:n,props:{type:"object",additionalProperties:{type:["string","number","boolean"]}}},required:["type","component"],additionalProperties:!1}],t.components={type:"object",description:`Reusable node templates by name, placed with {type:"use",component,props}; expanded on the host before validation (use nesting up to ${HD} deep, no cycles, every prop used); limits apply to the expanded spec`,propertyNames:{pattern:ao.source},additionalProperties:{type:"object",properties:{root:{$ref:"#/properties/root"}},required:["root"],additionalProperties:!1}}}function Oe(){let{root:e,...t}=vu.shape,r=xe(f({root:e,...t}).strict());return Ae(r),ve(r),r}var se;function z7(){return se??=Oe(),se}function pe(e,t){if(!e||typeof e!=="object")return;for(let[r,n]of Object.entries(e))if(r==="$ref"&&typeof n==="string"&&n.startsWith("#"))e[r]=`${t}${n.slice(1)}`;else pe(n,t)}function ue(){let e=structuredClone(z7());return pe(e,"#/properties/spec"),delete e.$schema,e}function koe(e){let t=structuredClone(e),r=t.properties;return r.spec={description:r.spec?.description,...ue()},iF(t),t}var De=["type","enum","const","minLength"];function _e(e){let t={};for(let r of De)if(Object.hasOwn(e,r))t[r]=e[r];if(t.type===void 0&&Object.keys(e).length>0)t.type="object";return t}function Se(e){let t=Array.isArray(e?.anyOf)?e.anyOf:[];return[...new Set(t.flatMap((r)=>{let n=r.properties?.type;return Array.isArray(n?.enum)?n.enum:[]}))]}function ke(){let e=z7(),t=e.properties,r=Object.fromEntries(Object.entries(t).map(([n,o])=>[n,_e(o)]));return r.root={type:"object",description:`Root node {type,...}; type is one of ${Se(t.root).join(", ")}. Every node's fields are in ${LS}.`},{type:"object",properties:r,required:e.required,additionalProperties:!1}}function d4(e=Pe()){return e?ue():ke()}
|
|
7
|
+
export{eF,Hx,LS,W7,tF,FA,z7,koe,d4};
|
|
8
|
+
|
|
9
|
+
//# debugId=A95C120F1C91308564756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{i,lb,GD,hd,tf,Wi,l,e}from"./chunk-z8t0v07j.js";import{g,E,ft,$e,b$}from"./chunk-mf9spd4g.js";import"./chunk-32jpxz2y.js";import"./chunk-ggtd5x5a.js";import{VP,yI,XX,Of,tS,Et,yN,eZ,tZ,rZ,rS,vN,Ic,EI,II,EN,_c,CN,hZ,Up,yZ,vZ,DN,xI,xc,ON,MN,_u,NN,qH,wZ,EZ,CI,IZ}from"./chunk-nwm2pq5v.js";import{w,bee,AC,yv,vv,Sw,bv,Mee,Nee,PL,AT,b5,yi,Fs,XT,Zw,QL}from"./chunk-h3n4adc6.js";import{yl}from"./chunk-79q5xsdc.js";import{e5}from"./chunk-zg67wjkh.js";import"./chunk-6d3mmqxt.js";import{r}from"./chunk-9rkfyt6q.js";function Q(t,o){return{refresh:()=>t.refresh({fresh:!0,requireCurrent:!0,refuseUpgradePending:!0}),isAutoMobileOwned:(n)=>t.stableIdsFor("ios").has(n)||(o()?.getAssignedDevices().has(n)??!1)}}XX(Q(VP(i),()=>w.sessionManager()));Mee({androidColdBootAdmitter:()=>Of().android,iosBootInstrumentation:()=>{let t=Of();return yI({timer:i,history:t.iosBootHistory,gate:t.ios})},assertBootCapacityAvailable:(t,o)=>tS(t,o)});var Be=500;function U(t){return t.success&&!t.error?void 0:{code:t.errorCode??"restore_failed",reason:t.error??"Device refused saved prototype restore"}}async function Ue(t,o){let n=t.assets.filter((a)=>a.bytes===void 0||a.mimeType===void 0);if(n.length>0)return{code:"asset_unavailable",reason:`Missing mirrored assets: ${n.map((a)=>a.id).join(", ")}`};for(let a of t.assets){if(a.bytes===void 0||a.mimeType===void 0)continue;let s=U(await o.putAsset({id:a.id,mimeType:a.mimeType,bytes:a.bytes}));if(s)return s}return U(await o.save({spec:t.spec,label:t.label,icon:t.icon}))}async function Ve(t,o){try{return await Ue(t,o)}catch(n){return e.warn(`[PROTOTYPE] Restore failed for ${t.id}`,n),{code:"restore_failed",reason:r(n)}}}async function X(t,o,n){let a={restored:[],skipped:[],failed:[]};try{let s=await o.list(t);if(s.length===0)return a;let d=[];try{let u=await n.list();if(!U(u))d=(u.savedPrototypes??[]).filter((f)=>!f.hostOnly);else e.warn(`[PROTOTYPE] Device saved prototype list failed for ${t}`,u)}catch(u){e.warn(`[PROTOTYPE] Device saved prototype list failed for ${t}`,u)}let c=b5(s,d),p=new Set(c.map((u)=>u.id));a.skipped=s.filter((u)=>!p.has(u.id)).map((u)=>u.id);for(let u of c){let f=await Ve(u,n);if(f)a.failed.push({id:u.id,...f}),e.warn(`[PROTOTYPE] Restore failed for ${u.id}`,f);else a.restored.push(u.id)}}catch(s){e.warn(`[PROTOTYPE] Saved prototype restore failed for ${t}`,s),a.failed.push({id:"*",code:"restore_failed",reason:r(s)})}return a}class V{device;timer;resolveClient;timeoutMs;ready;constructor(t,o=i,n=async()=>{let{AndroidCtrlProxyClient:s}=await import("./chunk-2d4wmp8b.js");return s.getExistingInstance(t.deviceId)??s.getInstance(t)},a=20000){this.device=t;this.timer=o;this.resolveClient=n;this.timeoutMs=a}async client(){if(this.ready)return{client:this.ready};let t=!1;try{let o=await l(async()=>{let n=await this.resolveClient();while(!t){let a=await n.ensureConnected().catch((s)=>(e.warn("[PROTOTYPE] Restore connection attempt failed",s),!1));if(t)break;if(a)return(await n.getSupportedCommands())?.includes(yl)?{client:n}:{failure:this.unsupported()};await this.timer.sleep(Be)}return{failure:this.unavailable()}},{timer:this.timer,timeoutMs:this.timeoutMs,label:"Saved prototype restore connection",onTimeout:()=>{t=!0}});if(o.client)this.ready=o.client;return o}catch(o){return e.warn("[PROTOTYPE] Restore connection unavailable",o),{failure:this.unavailable(r(o))}}}unavailable(t=`Saved prototype restore connection timed out after ${this.timeoutMs}ms`){return{success:!1,errorCode:"service_unavailable",error:t}}unsupported(){return{success:!1,errorCode:"device_unsupported",error:`Device does not advertise ${yl}`}}async list(){let{client:t,failure:o}=await this.client();return t?t.requestListSavedPrototypes():o}async putAsset(t){let{client:o,failure:n}=await this.client();return o?o.requestPutPrototypeAsset(t):n}async save(t){let{client:o,failure:n}=await this.client();return o?o.requestSavePrototype(t):n}}Nee({createForeignForwardEvidence:(t)=>PL(t),savedPrototypes:()=>{let t=AT();return{list:(o)=>t.list(o),restore:(o,n)=>X(o.deviceId,t,new V(o,n))}}});function Z(t){let o=t.findIndex((a)=>["--cli","--daemon","--boot-device","--ios-network-filter","--ios-templates"].includes(a)),n=o>=0?t.slice(0,o):t;return n.includes("--help")||n.includes("-h")}function ee(t,o){if(!t)return!1;let[n]=o;return n===void 0||n==="help"||n==="--help"||n==="-h"}async function te(t){if(Z(t)){let{runCliCommand:s}=await import("./chunk-2e6s75qv.js");await s(["help"]),process.exit(0)}let o=t.indexOf("--boot-device");if(o>=0){let{runBootDeviceCommand:s}=await import("./chunk-w2mwa0jk.js");Et.endPhase("moduleImports"),await s(t.slice(o+1)),process.exit(0)}let n=t.indexOf("--ios-templates");if(n>=0){let{runIosTemplatesCommand:s}=await import("./chunk-v90es00d.js");Et.endPhase("moduleImports"),process.exit(await s(t.slice(n+1)))}let a=t.indexOf("--ios-network-filter");if(a>=0){let{runIosNetworkFilterCommand:s}=await import("./chunk-sz1a7p43.js");Et.endPhase("moduleImports"),process.exit(await s(t.slice(a+1)))}}async function oe(t){let{createStdioServerTransport:o}=await import("./chunk-yw436axy.js"),{OutputGatedTransport:n}=await import("./chunk-eka89q3k.js"),{createMcpServer:a,registerMcpTools:s}=await import("./chunk-mct91p1f.js"),{createDaemonMcpProxy:d,createProxyMcpServer:c}=await import("./chunk-y58270hd.js"),{logger:p,LogLevel:u}=await import("./chunk-h5pjbb83.js");t(p);let{runCliCommand:f,cliCommandSkipsServerBootstrap:S}=await import("./chunk-2e6s75qv.js"),{runDaemonCommand:h}=await import("./chunk-488vt2bp.js"),{startDaemon:y}=await import("./chunk-fk927f4q.js"),{guardDatabaseStartup:A}=await import("./chunk-mgrcansb.js"),{DefaultDatabaseInitializer:M}=await import("./chunk-4vhr9e4t.js"),R=await import("./chunk-gndcfrm7.js"),m=await import("./chunk-j2bx12hn.js"),P=await import("./chunk-xhhv854c.js"),b=await import("./chunk-ncyjf63g.js"),C=await import("./chunk-f2tc08m2.js"),x=await import("./chunk-aa5ng3d1.js"),{FeatureFlagService:D}=await import("./chunk-teznhase.js"),{serverConfig:I}=await import("./chunk-z4xnrgps.js"),{AndroidCtrlProxyManager:L}=await import("./chunk-j70y1a2g.js"),{IosCtrlProxyBuilder:F}=await import("./chunk-z7csyszv.js"),{IOSCtrlProxyManager:_}=await import("./chunk-b3h0a6ca.js"),{cleanupDaemonChildProcesses:N}=await import("./chunk-kzwctna2.js"),{stopManagedAdbServer:B}=await import("./chunk-fxmr3a0f.js");return Et.endPhase("moduleImports"),{createStdioServerTransport:o,OutputGatedTransport:n,createMcpServer:a,registerMcpTools:s,createDaemonMcpProxy:d,createProxyMcpServer:c,logger:p,LogLevel:u,runCliCommand:f,cliCommandSkipsServerBootstrap:S,runDaemonCommand:h,startDaemon:y,guardDatabaseStartup:A,DefaultDatabaseInitializer:M,startVideoRecordingSocketServer:R.startVideoRecordingSocketServer,stopVideoRecordingSocketServer:R.stopVideoRecordingSocketServer,startDeviceGestureRecordingSocketServer:m.startDeviceGestureRecordingSocketServer,stopDeviceGestureRecordingSocketServer:m.stopDeviceGestureRecordingSocketServer,startDeviceSnapshotSocketServer:P.startDeviceSnapshotSocketServer,stopDeviceSnapshotSocketServer:P.stopDeviceSnapshotSocketServer,startAppearanceSocketServer:b.startAppearanceSocketServer,createDirectModeAppearanceDeviceSource:b.createDirectModeAppearanceDeviceSource,stopAppearanceSocketServer:b.stopAppearanceSocketServer,startWebRtcStreamSocketServer:C.startWebRtcStreamSocketServer,stopWebRtcStreamSocketServer:C.stopWebRtcStreamSocketServer,stopAppearanceSyncScheduler:x.stopAppearanceSyncScheduler,FeatureFlagService:D,serverConfig:I,AndroidCtrlProxyManager:L,IosCtrlProxyBuilder:F,IOSCtrlProxyManager:_,cleanupDaemonChildProcesses:N,stopManagedAdbServer:B}}import{readFileSync as We}from"fs";import{parseArgs as Ge}from"util";var He=Object.fromEntries(["cli","daemon-mode","no-proxy","direct","no-daemon","debug-perf","ui-perf-debug","debug","no-ui-perf-mode","mem-perf-audit","accessibility-audit","predictive","predictive-ui","raw-element-search","embedded-sdk","network-mockable","dismiss-keyboard-after-input","tool-call-recording","no-navigation-screenshots","no-waitfor-polling-overhead","no-include-not-important-views","no-report-view-ids","no-retrieve-interactive-windows","no-occlusion","strict-port"].map((t)=>[t,{type:"boolean"}])),G={...He,"daemon-socket-path":{type:"string"},"enable-tool":{type:"string",multiple:!0},"disable-tool":{type:"string",multiple:!0}},Ke=[...Object.entries(G).filter(([,t])=>t.type==="string").map(([t])=>`--${t}`),xc,EI,II];function re(t,o,n=process.env,a=(s)=>We(s,"utf8")){let{values:s}=Ge({args:t,options:G,allowPositionals:!0,strict:!1}),d=(j)=>{let O=s[j];if(O===void 0)return!1;let J=O===!0?!0:Fs(String(O));if(J===void 0)o.warn(`Invalid value for --${j}: ${String(O)}; expected true or false`);return J===!0},{enabledTools:c,disabledTools:p}=qe(s,n),u=d("cli"),f=d("daemon-mode"),S=d("no-proxy")||d("direct"),h=d("no-daemon"),{daemonRequested:y,daemonCommand:A,daemonArgs:M}=at(t),R=d("debug-perf")||d("ui-perf-debug")||$e(g.DEBUG_PERF,n),m=d("debug")||$e(g.DEBUG,n),P=d("strict-port"),b=!d("no-ui-perf-mode"),C=d("mem-perf-audit"),x=d("accessibility-audit"),D=d("predictive")||d("predictive-ui"),I=d("raw-element-search"),L=QL(t),F=d("embedded-sdk"),_=d("network-mockable"),N=d("dismiss-keyboard-after-input"),B=MN(t,process.env),Ae=ON(t),Re=d("tool-call-recording"),Ce=!d("no-navigation-screenshots"),Me=d("no-waitfor-polling-overhead"),xe=d("no-include-not-important-views"),Oe=d("no-report-view-ids"),ke=d("no-retrieve-interactive-windows"),Te=d("no-occlusion"),De=NN(t,process.env),Ee=EN(t,process.env,hd()),Ie=st(n,o),Y=ze(o),{videoRecordingDefaults:Le}=Y,Fe=t.indexOf("--cli"),_e=u?t.slice(Fe+1):[],v=Ye(t,o,Y,Ie),Ne=yZ({flagValue:v.sessionConfigValue,envValue:u||f||y?void 0:n[hZ],readFile:a,hasInitialSessionUuid:v.initialSessionUuid!==void 0,noProxy:S});return{cliMode:u,cliArgs:_e,invalidInvocation:v.invalidInvocation,daemonPort:v.daemonPort,daemonHost:v.daemonHost,initialSessionUuid:v.initialSessionUuid,livenessOwnerToken:v.livenessOwnerToken,sessionConfig:Ne,debugPerf:R,debug:m,strictPort:P,uiPerfMode:b,memPerfAuditMode:C,a11yAuditMode:x,a11yLevel:v.a11yLevel,a11yFailureMode:v.a11yFailureMode,a11yMinSeverity:v.a11yMinSeverity,a11yUseBaseline:v.a11yUseBaseline,predictiveUi:D,rawElementSearch:I,planExecutionLockScope:v.planExecutionLockScope,planExecutionLockScopeExplicit:v.planExecutionLockScopeExplicit,videoRecordingDefaults:Le,runnerReadinessTimeoutMs:v.runnerReadinessTimeoutMs,daemonMode:f,daemonRequested:y,daemonCommand:A,daemonArgs:M,skipCtrlProxyDownload:L,embeddedSdk:F,networkMockable:_,dismissKeyboardAfterInput:N,eventAllMarkers:B,eventAllMarkersCliOverride:Ae,toolCallRecording:Re,navigationScreenshots:Ce,noWaitForPollingOverhead:Me,noProxy:S,noDaemon:h,noA11yIncludeNotImportantViews:xe,noA11yReportViewIds:Oe,noA11yRetrieveInteractiveWindows:ke,noOcclusion:Te,outputReduction:De,toolOutputsDir:Ee,enabledTools:c,disabledTools:p}}function qe(t,o){let n=Object.keys(o).find((m)=>b$(m));if(n)throw Error(`${n} is retired; use AUTOMOBILE_ENABLED_TOOLS or AUTOMOBILE_DISABLED_TOOLS.`);let a=(m)=>{let P=t[m];if(Array.isArray(P))return P.filter((b)=>typeof b==="string");return typeof P==="string"?[P]:[]},s=Array.from(new Set(a("enable-tool"))),d=Array.from(new Set(a("disable-tool"))),c=new Set(d),p=s.find((m)=>c.has(m));if(p)throw Error(`Tool '${p}' cannot be both enabled and disabled by CLI defaults.`);let u=(m)=>m?.split(",").map((P)=>P.trim()).filter(Boolean)??[],f=u(E(g.ENABLED_TOOLS,o)),S=u(E(g.DISABLED_TOOLS,o)),h=new Set(S),y=f.find((m)=>h.has(m));if(y)throw Error(`Tool '${y}' cannot be both enabled and disabled by environment defaults.`);let A=new Map([...f.map((m)=>[m,!0]),...S.map((m)=>[m,!1]),...s.map((m)=>[m,!0]),...d.map((m)=>[m,!1])]),M=Array.from(A).filter(([,m])=>m).map(([m])=>m),R=Array.from(A).filter(([,m])=>!m).map(([m])=>m);return{enabledTools:M,disabledTools:R}}function ze(t){let o={},n=(d,c)=>{if(!d)return;if(!new Set(["low","medium","high"]).has(d)){t.warn(`Invalid video quality preset (${c}): ${d}`);return}o.qualityPreset=d},a=(d,c)=>{if(!d)return;if(d!=="mp4"){t.warn(`Invalid video format (${c}): ${d}`);return}o.format=d};n(E(g.VIDEO_QUALITY_PRESET),"env");let s=[[E(g.VIDEO_TARGET_BITRATE_KBPS),"video target bitrate",!1,"targetBitrateKbps"],[E(g.VIDEO_MAX_THROUGHPUT_MBPS),"video max throughput",!0,"maxThroughputMbps"],[E(g.VIDEO_FPS),"video fps",!1,"fps"],[E(g.VIDEO_MAX_ARCHIVE_MB),"video max archive size",!0,"maxArchiveSizeMb"]];for(let[d,c,p,u]of s){let f=xI(d,c,p,t);if(f!==void 0)o[u]=f}return a(E(g.VIDEO_FORMAT),"env"),{videoRecordingDefaults:o,applyQualityPreset:n,applyFormat:a}}function Ye(t,o,n,a){let s={a11yUseBaseline:!1,planExecutionLockScope:"session",planExecutionLockScopeExplicit:!1,runnerReadinessTimeoutMs:a},d=t.indexOf("--daemon");for(let c=0;c<t.length;c++){if(["--cli","--boot-device","--"].includes(t[c]))break;let{flag:p,inlineValue:u}=yi(t[c]),f=u!==void 0&&je.has(p),S=f?[p,u]:t,h=f?0:c;if(p==="--a11y-use-baseline"&&u!==void 0){let A=Fs(u);if(A===void 0)o.warn(`Invalid value for ${p}: ${u}; expected true or false`);else s.a11yUseBaseline=A;continue}let y=Je(S,h,o,{options:s,video:n});if(y!==void 0){c=f?c:y;continue}c=Qe(t,c,d,s)}return s}var je=new Set(["--port","--host","--initial-session-uuid","--liveness-owner-token","--a11y-level","--a11y-failure-mode","--a11y-min-severity","--plan-execution-lock-scope",yv,"--video-quality","--video-quality-preset","--video-target-bitrate-kbps","--video-max-throughput-mbps","--video-fps","--video-format","--video-archive-size-mb"]);function Je(t,o,n,a){let{options:s,video:d}=a,c=et(t,o,n,s);if(c!==void 0)return Math.max(c,W(t,o));return rt(t,o,n,s)??nt(t,o,n,s)??it(t,o,n,d)}function W(t,o){return t[o+1]!==void 0&&!t[o+1].startsWith("--")?o+1:o}function Qe(t,o,n,a){if(Ke.includes(t[o]))return W(t,o);if(n>=0&&o>=n)return o;let s=Xe(t[o]);if(s)a.invalidInvocation??=s;else if(t[o]!==""&&!t[o].startsWith("-"))a.invalidInvocation??=`Unexpected argument: ${t[o]}; did you mean --cli ${t[o]}?`;return Ze(t[o])?W(t,o):o}function Xe(t){if(t.startsWith("--cli="))return"Invalid CLI invocation. Use --cli <tool> instead of --cli=<tool>.";if(t.startsWith("--daemon=")||t.startsWith("--boot-device=")){let[o,...n]=t.split("=");return`Invalid invocation. Use ${o==="--boot-device"?"--boot-device --platform <android|ios>":`${o} ${n.join("=")}`} instead of ${t}.`}return}function Ze(t){return t.startsWith("-")&&!t.includes("=")&&!Object.hasOwn(G,t.replace(/^-+/,""))&&!_u.some((o)=>o.cli===t||o.disableCli===t)}function et(t,o,n,a){let s=t[o];if(s==="--port"){let d=t[o+1],c=DN(d,n);if(c!==void 0)a.daemonPort=c,o++}else if(s==="--host"){let d=t[o+1];if(d&&!d.startsWith("--"))a.daemonHost=d,o++;else n.warn(`Invalid host: ${d}`)}else return tt(t,o,n,a);return o}function tt(t,o,n,a){let s=t[o],d=t[o+1]?.trim(),c=d!==void 0&&d.length>0&&!d.startsWith("--");if(s==="--initial-session-uuid"){if(!c)return n.warn(`Invalid initial session UUID: ${t[o+1]}`),o;return a.initialSessionUuid=t[o+1],o+1}let p=ot(t,o,a);if(p!==void 0)return p;if(s==="--liveness-owner-token"){if(!c)return n.warn("--liveness-owner-token requires a non-empty value"),o;return a.livenessOwnerToken=d,o+1}return}function ot(t,o,n){let a=t[o];if(a===CN){let s=t[o+1]?.trim();if(!s||s.startsWith("--")&&!s.startsWith("{"))throw new Up(`${CN} requires inline JSON or a file path`);return n.sessionConfigValue=s,o+1}if(a.startsWith(`${CN}=`))return n.sessionConfigValue=a.slice(CN.length+1),o;return}function rt(t,o,n,a){let s=t[o];if(s==="--a11y-level")a.a11yLevel=t[++o];else if(s==="--a11y-failure-mode")a.a11yFailureMode=t[++o];else if(s==="--a11y-min-severity")a.a11yMinSeverity=t[++o];else if(s==="--a11y-use-baseline")a.a11yUseBaseline=!0;else return;return o}function nt(t,o,n,a){let s=t[o];if(s==="--plan-execution-lock-scope"){let d=t[++o];if(d==="global"||d==="session")a.planExecutionLockScope=d,a.planExecutionLockScopeExplicit=!0;else n.warn(`Invalid plan execution lock scope: ${d}. Using default: ${a.planExecutionLockScope}`)}else if(s===yv){let d=t[++o],c=bv(d);if(c!==void 0)a.runnerReadinessTimeoutMs=c;else n.warn(`Invalid runner readiness timeout: ${d}; expected an integer from ${vv} to ${Sw}`)}else return;return o}function it(t,o,n,a){let s=t[o],{videoRecordingDefaults:d,applyQualityPreset:c,applyFormat:p}=a;if(s==="--video-quality"||s==="--video-quality-preset")c(t[++o],"cli");else if(s==="--video-target-bitrate-kbps")k(d,t[++o],n,{label:"video target bitrate",allowFloat:!1,key:"targetBitrateKbps"});else if(s==="--video-max-throughput-mbps")k(d,t[++o],n,{label:"video max throughput",allowFloat:!0,key:"maxThroughputMbps"});else if(s==="--video-fps")k(d,t[++o],n,{label:"video fps",allowFloat:!1,key:"fps"});else if(s==="--video-format")p(t[++o],"cli");else if(s==="--video-archive-size-mb")k(d,t[++o],n,{label:"video max archive size",allowFloat:!0,key:"maxArchiveSizeMb"});else return;return o}function k(t,o,n,a){let{label:s,allowFloat:d,key:c}=a,p=xI(o,s,d,n);if(p!==void 0)t[c]=p}function st(t,o){let n=t[AC]??t.AUTO_MOBILE_RUNNER_READINESS_TIMEOUT_MS,a=bv(n),s=a;if(n!==void 0&&a===void 0)o.warn(`Invalid ${AC}: ${n}; expected an integer from ${vv} to ${Sw}`);return s}function at(t){let o=t.indexOf("--daemon"),n=o>=0,a=o>=0?t[o+1]||void 0:void 0,s=o>=0?t.slice(o+2):[];return{daemonRequested:n,daemonCommand:a,daemonArgs:s}}function ne(t,o){o.terminate(t.exitCode)}async function H(t){try{await t.closeAfterFlush()}catch(o){t.error(`Daemon command completed successfully, but logger teardown failed; exiting 0: ${r(o)}`),await t.flush()}}async function K(t,o){await H(t),o.exit(0)}var dt=new Set(["start","restart","restart-admitted","restart-acceptance-session"]);function ie(t){return!dt.has(t)}var se=5000;function de(t){let o=t.timer??i,n=t.logger??e;if(q("Android CtrlProxy prefetch cleanup",t.startAndroidSweep,o,n),q("native helper cleanup",t.startNativeHelperSweep,o,n),t.platform==="darwin")q("iOS CtrlProxy runner cleanup",t.startIosReap,o,n)}function q(t,o,n,a){let s;try{s=o()}catch(c){a.warn(`[STARTUP_MAINTENANCE] ${t} failed: ${ae(c)}`);return}let d=n.setTimeout(()=>{a.warn(`[STARTUP_MAINTENANCE] ${t} exceeded ${se}ms; continuing startup`)},se);d.unref?.(),s.catch((c)=>{a.warn(`[STARTUP_MAINTENANCE] ${t} failed: ${ae(c)}`)}).finally(()=>{n.clearTimeout(d)})}function ae(t){return r(t)}function ce(t,o,n){if(!n)de({platform:process.platform,startAndroidSweep:()=>t.AndroidCtrlProxyManager.sweepStalePrefetchDirsOnStartup(),startIosReap:()=>t.IOSCtrlProxyManager.startOrphanRunnerReapOnStartup(),startNativeHelperSweep:async()=>{await bee()}});ct(t,o,n),lt(t,o,n),ut(t)}function ct(t,o,n){if(n)Et.recordPhase("androidCtrlProxyPrefetch",0);else if(o)t.logger.info(`CtrlProxy downloads disabled (${XT} or ${Zw})`),Et.recordPhase("androidCtrlProxyPrefetch",0);else Et.startPhase("androidCtrlProxyPrefetch"),t.AndroidCtrlProxyManager.prefetchApk().then(()=>{Et.endPhase("androidCtrlProxyPrefetch")})}function lt(t,o,n){if(process.platform!=="darwin"||n)return;if(o){t.logger.info(`CtrlProxy iOS prefetch disabled (${XT} or ${Zw})`),Et.recordPhase("iosCtrlProxyPrefetch",0);return}Et.startPhase("iosCtrlProxyPrefetch"),t.IosCtrlProxyBuilder.prefetchBuild().then(()=>{Et.endPhase("iosCtrlProxyPrefetch")})}function ut(t){if(EZ(),process.platform==="darwin"&&ft(g.WEBRTC_WHIP_ENDPOINT)&&!E(g.IOS_SCREEN_CAPTURE_HELPER))_c.getInstance().ensure().catch((o)=>{t.logger.warn(`[SCREEN_CAPTURE_HELPER] Background prefetch failed: ${r(o)}`)})}function le(t){let{eventAllMarkers:o,eventAllMarkersCliOverride:n}=t;return o.length>0||n?{eventAllMarkers:o,eventAllMarkersCliOverride:n}:{}}function ue(t,o){let{videoRecordingDefaults:n,runnerReadinessTimeoutMs:a,daemonHost:s}=t;return{port:t.daemonPort,...s!==void 0?{host:s}:{},strictPort:t.strictPort,debug:t.debug,debugPerf:t.debugPerf,planExecutionLockScope:t.planExecutionLockScope,...a!==void 0?{runnerReadinessTimeoutMs:a}:{},videoQualityPreset:n.qualityPreset,videoTargetBitrateKbps:n.targetBitrateKbps,videoMaxThroughputMbps:n.maxThroughputMbps,videoFps:n.fps,videoFormat:n.format,videoMaxArchiveSizeMb:n.maxArchiveSizeMb,toolOutputsDir:t.toolOutputsDir,networkMockable:t.networkMockable,embeddedSdk:t.embeddedSdk,enabledTools:t.enabledTools,disabledTools:t.disabledTools,dismissKeyboardAfterInput:t.dismissKeyboardAfterInput,...o,noUiPerfMode:!t.uiPerfMode,memPerfAudit:t.memPerfAuditMode,accessibilityAudit:t.a11yAuditMode,accessibilityLevel:t.a11yLevel,accessibilityFailureMode:t.a11yFailureMode,accessibilityMinSeverity:t.a11yMinSeverity,accessibilityUseBaseline:t.a11yUseBaseline,predictiveUi:t.predictiveUi,rawElementSearch:t.rawElementSearch,skipCtrlProxyDownload:t.skipCtrlProxyDownload,toolCallRecording:t.toolCallRecording,noNavigationScreenshots:!t.navigationScreenshots,noWaitForPollingOverhead:t.noWaitForPollingOverhead,noA11yIncludeNotImportantViews:t.noA11yIncludeNotImportantViews,noA11yReportViewIds:t.noA11yReportViewIds,noA11yRetrieveInteractiveWindows:t.noA11yRetrieveInteractiveWindows,noOcclusion:t.noOcclusion,...t.outputReduction}}function pe(t,o,n){return{...pt(t),...mt(t),...n,...vt(t),...St(t,o),...t.outputReduction,toolResultsNoStructuredContent:t.outputReduction.toolResultsNoStructuredContent?!0:void 0}}function pt(t){let{daemonPort:o,daemonHost:n,runnerReadinessTimeoutMs:a}=t;return{...o!==void 0?{port:o}:{},...n!==void 0?{host:n}:{},...t.strictPort?{strictPort:!0}:{},...t.debug?{debug:!0}:{},...t.debugPerf?{debugPerf:!0}:{},...t.planExecutionLockScopeExplicit?{planExecutionLockScope:t.planExecutionLockScope}:{},...a!==void 0?{runnerReadinessTimeoutMs:a}:{},...t.toolCallRecording?{toolCallRecording:!0}:{}}}function mt(t){let o=t.videoRecordingDefaults;return{videoQualityPreset:o.qualityPreset,videoTargetBitrateKbps:o.targetBitrateKbps,videoMaxThroughputMbps:o.maxThroughputMbps,videoFps:o.fps,videoFormat:o.format,videoMaxArchiveSizeMb:o.maxArchiveSizeMb,toolOutputsDir:t.toolOutputsDir,...t.networkMockable?{networkMockable:!0}:{},...t.embeddedSdk?{embeddedSdk:!0}:{},...t.enabledTools.length>0?{enabledTools:t.enabledTools}:{},...t.disabledTools.length>0?{disabledTools:t.disabledTools}:{},...t.dismissKeyboardAfterInput?{dismissKeyboardAfterInput:!0}:{}}}function vt(t){return{...!t.uiPerfMode?{noUiPerfMode:!0}:{},...!t.navigationScreenshots?{noNavigationScreenshots:!0}:{},...t.noWaitForPollingOverhead?{noWaitForPollingOverhead:!0}:{},...t.noA11yIncludeNotImportantViews?{noA11yIncludeNotImportantViews:!0}:{},...t.noA11yReportViewIds?{noA11yReportViewIds:!0}:{},...t.noA11yRetrieveInteractiveWindows?{noA11yRetrieveInteractiveWindows:!0}:{},...t.noOcclusion?{noOcclusion:!0}:{}}}function St(t,o){return{...t.memPerfAuditMode?{memPerfAudit:!0}:{},...t.a11yAuditMode?{accessibilityAudit:!0}:{},...o?{accessibilityLevel:o.level,accessibilityFailureMode:o.failureMode,accessibilityMinSeverity:o.minSeverity,accessibilityUseBaseline:o.useBaseline}:{},...t.predictiveUi?{predictiveUi:!0}:{},...t.rawElementSearch?{rawElementSearch:!0}:{},...t.skipCtrlProxyDownload?{skipCtrlProxyDownload:!0}:{}}}function me(t){return _u.filter((o)=>o.field!=="actionsCompactMetadata"&&t[o.field]===!0).map((o)=>({key:o.featureFlagKey,label:o.label}))}function fe(t){if(!t.a11yAuditMode)return null;return{level:t.a11yLevel||"AA",failureMode:t.a11yFailureMode||"report",minSeverity:t.a11yMinSeverity||(t.a11yFailureMode==="strict"?"error":"warning"),useBaseline:t.a11yUseBaseline}}function yt(t,o){return[["debug",t.debug,"--debug"],["debug-perf",t.debugPerf,"--debug-perf/--ui-perf-debug"],["ui-perf-mode",t.uiPerfMode,"--ui-perf-mode"],["mem-perf-audit",t.memPerfAuditMode,"--mem-perf-audit"],["accessibility-audit",t.a11yAuditMode,"--accessibility-audit",o],["predictive-ui",t.predictiveUi,"--predictive/--predictive-ui"],["raw-element-search",t.rawElementSearch,"--raw-element-search"],["tool-call-recording",t.toolCallRecording,"--tool-call-recording"],...me(t.outputReduction).map(({key:n,label:a})=>[n,!0,a,void 0])]}function ve(t,o,n){let{logger:a,serverConfig:s}=o,d=o.FeatureFlagService.getInstance(),c=yt(t,n);return async()=>{await d.initialize();for(let[p,u,f,S]of c){if(!u)continue;await d.setFlag(p,u,S),a.info(`Feature flag ${u?"enabled":"disabled"} (${f})`)}if(s.setActionsCompactMetadataEnabled(qH(t.outputReduction.actionsCompactMetadata,d.isEnabled("actions-compact-metadata"))),!t.navigationScreenshots)await d.setFlag("navigation-screenshots",!1),a.info("Navigation screenshots disabled (--no-navigation-screenshots)")}}async function Se(t,o,n){await Et.runPhase("databasePreflight",async()=>{if(t.daemonMode){await o.guardDatabaseStartup(async()=>{await new o.DefaultDatabaseInitializer().initialize(),await n()});return}let{runDirectModeStartup:a}=await import("./chunk-6pg7bqck.js");await a({noProxy:t.noProxy,assertDbOwnership:async()=>{let{assertDirectModeDbOwnership:s,createDefaultDirectModeGuardDeps:d}=await import("./chunk-s123kn7n.js");s(d())},applyFeatureFlagStartup:n})})}function ye(t,o){let{serverConfig:n,logger:a,LogLevel:s}=o;if(t.debug)a.setLogLevel(s.DEBUG);if(n.setPlanExecutionLockScope(t.planExecutionLockScope),t.runnerReadinessTimeoutMs!==void 0)n.setRunnerReadinessTimeoutMs(t.runnerReadinessTimeoutMs);n.setActionsCompactMetadataEnabled(qH(t.outputReduction.actionsCompactMetadata,n.isActionsCompactMetadataEnabled())),n.setVideoRecordingDefaults(t.videoRecordingDefaults),n.setToolOutputsDir(t.toolOutputsDir),n.setSkipCtrlProxyDownload(t.skipCtrlProxyDownload),n.setEmbeddedSdkEnabled(t.embeddedSdk),n.setNetworkMockableEnabled(t.networkMockable),n.setDismissKeyboardAfterInputEnabled(t.dismissKeyboardAfterInput),n.setEventAllMarkers(t.eventAllMarkers)}function ge(t,o){let n=[[!t.uiPerfMode,"UI perf mode disabled (--no-ui-perf-mode): skipping selection-state visual capture on taps and UI perf auditing"],[t.embeddedSdk,"Embedded SDK tools enabled (--embedded-sdk)"],[t.dismissKeyboardAfterInput,"Dismiss keyboard after internal text input enabled (--dismiss-keyboard-after-input)"],[t.noA11yIncludeNotImportantViews,"Accessibility includeNotImportantViews disabled (--no-include-not-important-views)"],[t.noA11yReportViewIds,"Accessibility reportViewIds disabled (--no-report-view-ids)"],[t.noA11yRetrieveInteractiveWindows,"Accessibility retrieveInteractiveWindows disabled (--no-retrieve-interactive-windows)"],[t.noOcclusion,"Observe occlusion pass disabled (--no-occlusion)"]];for(let[a,s]of n)if(a)o.info(s);gt(t.eventAllMarkers,o)}function gt(t,o){if(t.length>0){o.info(`Internal text-input eventAll auto-promotion markers configured (--event-all-markers): ${JSON.stringify(t)}`);return}if(process.argv.slice(2).some((a)=>a===xc||a.startsWith(`${xc}=`)))o.warn(`${xc} was provided but resolved to no markers; internal text-input eventAll auto-promotion stays disabled`)}async function Pe(t,o,n,a){let{logger:s}=o,d=!t.noProxy,c=d?void 0:Ic.createInstance();if(n.directModeActive=!d,d)s.info("Starting MCP server in proxy mode (connecting to daemon)");else s.info("Starting MCP server in direct mode (--no-proxy flag)"),await Pt(o,c);let p=new o.OutputGatedTransport(o.createStdioServerTransport()),u=await bt(p),f=d&&t.sessionConfig?new(await import("./chunk-5s645vr4.js")).EarlyStartTransport(p):void 0;await f?.startEarly();let{server:S,proxyToClaimInitialSession:h}=await wt(t,o,n,{launch:a,useProxyMode:d,deviceReadiness:c});try{s.info("Connecting MCP server to stdio transport"),Et.startPhase("serverListening"),u.value=!0,await S.connect(f??p),Et.endPhase("serverListening"),s.info("MCP server connected to stdio transport"),h?.claimInitialSession(),s.info(`AutoMobile MCP server running on stdio (${d?"proxy":"direct"} mode)`),Et.emit("mcp-server",{transport:"stdio",mode:d?"proxy":"direct"})}catch(y){throw s.error("MCP server connect failed:",y),y}}async function Pt(t,o){await t.startVideoRecordingSocketServer(),await t.startDeviceGestureRecordingSocketServer(o),await t.startDeviceSnapshotSocketServer(),await t.startAppearanceSocketServer(t.createDirectModeAppearanceDeviceSource(()=>{let n=o.getExplicitDevicePin();return n?[n]:[]})),await t.startWebRtcStreamSocketServer()}async function bt(t){let{MAX_CALLER_MCP_REQUEST_TIMEOUT_MS:o}=await import("./chunk-1zmh2eak.js"),n={value:!1};return eZ(process.stdin,()=>n.value?t.answerReceivedThenStop("stdin closed"):t.stopSending("stdin closed"),o),tZ(process.stdout,()=>t.stopSending("stdout closed or write failed")),n}async function wt(t,o,n,{launch:a,useProxyMode:s,deviceReadiness:d}){try{if(!s)return{server:o.createMcpServer({debug:t.debug,deviceReadiness:d}),proxyToClaimInitialSession:void 0};let{getDefaultSessionHeartbeatTimeoutMs:c}=await import("./chunk-b6a737qt.js"),p=o.createDaemonMcpProxy({autoStartDaemon:!t.noDaemon,lifecycleNamespaceEnv:process.env,daemonOptions:a.daemonStartupOptions,initialSessionUuid:t.initialSessionUuid,livenessOwnerToken:t.livenessOwnerToken,heartbeatTimeoutMs:c()});n.stdioProxy=p;let u=t.sessionConfig?await ht(p,t.sessionConfig,{launchParentPid:a.launchParentPid,ownerGenerationToken:a.ownerGenerationToken,modules:o}):void 0,f=o.createProxyMcpServer({proxy:p,...u?{session:u}:{}});return{server:f.server,proxyToClaimInitialSession:f.proxy}}catch(c){throw o.logger.error("Failed to create MCP server:",c),c}}async function ht(t,o,{launchParentPid:n,ownerGenerationToken:a,modules:s}){let d=await At(n,o.executionOwnerPid,a);t.setExecutionOwnerLossProbe(()=>d.check()!==void 0);let c=await t.acquireBrokerSession(o);return s.logger.info(`[SessionBroker] Acquisition ${c.outcome}`+(c.failure?` (${c.failure.code})`:"")),c}async function At(t,o,n){let[{ExecutionOwnerWatch:a},{isProcessRunning:s},{defaultTimer:d},{defaultLockOwnerGenerationProbe:c},{processGenerationReadIsCheap:p}]=await Promise.all([import("./chunk-wry6skrm.js"),import("./chunk-gaqwhd44.js"),import("./chunk-yk0hmbex.js"),import("./chunk-da08tx5v.js"),import("./chunk-7bdgand3.js")]),u=new a({launchParentPid:t,ownerPid:o,ownerGenerationToken:n,generationCheckEvery:p()?1:void 0,onOwnerLost:()=>rZ("execution-owner-lost")},{isProcessRunning:(f)=>s(f),currentParentPid:()=>process.ppid},d,c);return u.start(),u}async function be(t,o,n){let{logger:a}=t,s=re(process.argv.slice(2),a);if(s.invalidInvocation){console.error(s.invalidInvocation),process.exit(1);return}let d=await Rt(s);if(await Ct(s,t))return;if(await Mt(s,t))return;xt(s,t);let c=fe(s);if(await Se(s,t,ve(s,t,c)),s.noWaitForPollingOverhead)t.serverConfig.setWaitForPollingOverheadEnabled(!1),a.info("WaitFor polling overhead disabled (--no-waitfor-polling-overhead): back stack skipped during observe waitFor polling");ge(s,a);let p=le(s);if(s.daemonMode){await t.startDaemon(ue(s,p));return}if(s.daemonCommand){await Ot(s,s.daemonCommand,t);return}let u=pe(s,c,p);if(s.cliMode){await we(s,t,u);return}await Pe(s,t,o,{launchParentPid:n,ownerGenerationToken:d,daemonStartupOptions:u})}async function Rt(t){let{sessionConfig:o}=t;if(t.cliMode||t.daemonMode||t.daemonRequested||o?.executionOwnerPid===void 0)return;let[{isProcessRunning:n},{defaultLockOwnerGenerationProbe:a}]=await Promise.all([import("./chunk-gaqwhd44.js"),import("./chunk-da08tx5v.js")]);return vZ(o,{isProcessRunning:(s)=>n(s),probe:a})}async function Ct(t,o){let{daemonCommand:n,daemonArgs:a}=t;if(t.daemonRequested&&n===void 0){let{printUnknownDaemonCommand:s}=await import("./chunk-rdpgkjf6.js");return s(void 0),!0}if(n&&ie(n))return await o.runDaemonCommand(n,a,{namespaceEnv:process.env}),await K(o.logger,process),!0;return!1}async function Mt(t,o){if(!t.cliMode||!o.cliCommandSkipsServerBootstrap(t.cliArgs))return!1;return await we(t,o,void 0),!0}function xt(t,o){wZ(t.enabledTools,t.disabledTools),o.registerMcpTools(t.daemonMode),ye(t,o),ce(o,t.skipCtrlProxyDownload,ee(t.cliMode,t.cliArgs))}async function Ot(t,o,n){let{enabledTools:a,disabledTools:s}=t,d=a.length>0||E(g.ENABLED_TOOLS)!==void 0,c=s.length>0||E(g.DISABLED_TOOLS)!==void 0,p=d||c;await n.runDaemonCommand(o,t.daemonArgs,{namespaceEnv:process.env,...p?{startupToolDefaults:{...d?{enabledTools:a}:{},...c?{disabledTools:s}:{}}}:{}}),await K(n.logger,process)}async function we(t,o,n){let{logger:a}=o;a.info("Running in CLI mode");let s=await o.runCliCommand(t.cliArgs,n);if(await H(a),s){ne(s,{terminate:(d)=>process.exit(d)});return}process.exit(process.exitCode??0)}function he(t,o){let{logger:n}=t,a=!1;rS(async(s)=>{a=!1,n.info(`Received ${s} signal, shutting down`),await CI(IZ({directModeActive:()=>o.directModeActive,cleanupChildProcesses:()=>t.cleanupDaemonChildProcesses(),stopManagedAdbServer:()=>t.stopManagedAdbServer(),stopVideoRecordingSocketServer:()=>t.stopVideoRecordingSocketServer(),stopDeviceGestureRecordingSocketServer:()=>t.stopDeviceGestureRecordingSocketServer(),stopDeviceSnapshotSocketServer:()=>t.stopDeviceSnapshotSocketServer(),stopAppearanceSocketServer:()=>t.stopAppearanceSocketServer(),stopWebRtcStreamSocketServer:()=>t.stopWebRtcStreamSocketServer(),stopAppearanceSyncScheduler:()=>t.stopAppearanceSyncScheduler(),cleanupPrefetchedApk:()=>t.AndroidCtrlProxyManager.cleanupPrefetchedApk(),closeStdioProxy:()=>o.stdioProxy?.close({executionOwnerLost:s==="execution-owner-lost"}),drainDatabaseWrites:async(d)=>{let{getDbWriteBarrier:c}=await import("./chunk-q50s00ry.js");if(!await c().drain(d))n.warn(`Timed out after ${d}ms draining in-flight DB writes; closing database anyway`)},settleMigrations:async(d)=>{let{awaitInFlightMigrations:c}=await import("./chunk-fd2z0sze.js");if(!await c(d))n.warn(`Timed out after ${d}ms awaiting in-flight startup migration; closing database anyway`)},closeDatabase:async()=>{let{closeDatabase:d}=await import("./chunk-fd2z0sze.js");await d({forShutdown:!0})},refusedDatabaseAccessCount:async()=>{let{refusedDatabaseAccessCountAfterShutdownClose:d}=await import("./chunk-fd2z0sze.js");return d()},closeLogger:()=>n.closeAfterFlush(),warn:(d)=>n.warn(d)}),(d,c)=>{a=!0,n.warn(d,c)},{timer:i})},async()=>(await n.closeAfterFlush(),a?{exitCode:1}:void 0))}e5();process.env[lb]??=GD();var T;function z(t,o){let n=o instanceof Error?o.stack??o.message:String(o);if(T){if(T.error(`${t}: ${n}`),tf()==="file")Wi(t,n)}else Wi(t,n)}yN();vN((t)=>{if(t.type==="uncaughtException"){z("Uncaught exception",t.error);return}z("Unhandled rejection",t.reason)});async function kt(){let t=process.ppid;Et.mark("processEntry"),Et.startPhase("moduleImports"),await te(process.argv.slice(2));let o=await oe((a)=>{T=a}),n={stdioProxy:void 0,directModeActive:!1};he(o,n);try{await be(o,n,t)}catch(a){throw o.logger.error("Error initializing server:",a),a}}function Mr(){kt().catch(async(t)=>{z("Fatal error in main()",t),await T?.closeAfterFlush();let{resolveDaemonStartupExitCode:o}=await import("./chunk-mgrcansb.js");process.exit(o(t))})}export{Mr as runServerEntry};
|
|
3
|
+
|
|
4
|
+
//# debugId=2591AE98A0B7789564756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{e}from"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";import{r}from"./chunk-9rkfyt6q.js";var s=1000,o=5,a=1;class d{options;probe;timer;generation;handle;lost;ownerPid;intervalMs;generationCheckEvery;ownerGenerationToken;checks=0;constructor(n,t,c,h){this.options=n;this.probe=t;this.timer=c;this.generation=h;this.ownerGenerationToken=n.ownerGenerationToken,this.ownerPid=n.ownerPid??n.launchParentPid,this.intervalMs=n.intervalMs??s;let i=n.generationCheckEvery??o;this.generationCheckEvery=Number.isInteger(i)&&i>=1?i:o}start(){if(this.handle!==void 0||this.lost!==void 0)return;if(this.ownerGenerationToken===void 0)this.captureGeneration();this.handle=this.timer.setInterval(()=>{this.check()},this.intervalMs),this.check()}stop(){if(this.handle!==void 0)this.timer.clearInterval(this.handle),this.handle=void 0}get lossReason(){return this.lost}check(){if(this.lost!==void 0)return this.lost;let n=this.judge();if(n===void 0)return;return this.lost=n,this.stop(),e.warn(`[ExecutionOwnerWatch] Managed execution owner lost (${n}; owner pid ${this.ownerPid}, launch parent ${this.options.launchParentPid}); releasing the execution's sessions`),Promise.resolve().then(()=>this.options.onOwnerLost(n)).catch((t)=>{e.warn(`[ExecutionOwnerWatch] Releasing after owner loss failed: ${r(t)}`,t)}),n}judge(){if(this.options.ownerPid===void 0&&this.options.launchParentPid===a)return"parent-changed";if(this.options.ownerPid===void 0&&this.probe.currentParentPid()!==this.options.launchParentPid)return"parent-changed";if(!this.probe.isProcessRunning(this.ownerPid))return"owner-exited";return this.checks++,this.checks%this.generationCheckEvery===0&&this.generationChanged()?"owner-exited":void 0}captureGeneration(){try{this.ownerGenerationToken=this.generation?.current(this.ownerPid)}catch(n){e.debug(`[ExecutionOwnerWatch] Owner identity unreadable: ${r(n)}`)}}generationChanged(){if(this.ownerGenerationToken===void 0)return this.captureGeneration(),!1;try{if(this.generation?.compare(this.ownerPid,this.ownerGenerationToken)==="different")return e.warn(`[ExecutionOwnerWatch] Owner PID ${this.ownerPid} now names a different process`),!0}catch(n){e.debug(`[ExecutionOwnerWatch] Owner identity comparison unavailable: ${r(n)}`)}return!1}}export{d as ExecutionOwnerWatch};
|
|
3
|
+
|
|
4
|
+
//# debugId=D5966DC37A15A57864756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{LS,z7,koe,d4}from"./chunk-w7zsh13a.js";import"./chunk-z04jrpjy.js";import"./chunk-79q5xsdc.js";import"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";export{LS as PROTOTYPE_SPEC_SCHEMA_URI,d4 as advertisedSpecSchema,z7 as prototypeSpecJsonSchema,koe as withFullAdvertisedSpecSchema};
|
|
3
|
+
|
|
4
|
+
//# debugId=F12C4749F073B16564756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{p2,m2,f2}from"./chunk-3swvfhqt.js";import"./chunk-cxyf04jc.js";import"./chunk-a4k9rt7z.js";import"./chunk-6d3mmqxt.js";import"./chunk-zg67wjkh.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{p2 as getDeviceSnapshotSocketPath,m2 as startDeviceSnapshotSocketServer,f2 as stopDeviceSnapshotSocketServer};
|
|
3
|
+
|
|
4
|
+
//# debugId=3D8D43530256C31264756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Qp}from"./chunk-tyazf3sk.js";import{g,E}from"./chunk-mf9spd4g.js";import"./chunk-h3n4adc6.js";import{e}from"./chunk-z8t0v07j.js";import{d8,zi,i1,iM,o1,N,Hs,di,I1,Rr,kd,_l,wP,VE}from"./chunk-3jmvqygr.js";import"./chunk-6d3mmqxt.js";import"./chunk-32jpxz2y.js";import{kn}from"./chunk-ggtd5x5a.js";import{n,Oe,IR,Me}from"./chunk-79q5xsdc.js";import{ui,gZ,VH}from"./chunk-nwm2pq5v.js";import"./chunk-a2sc4jm0.js";import{Nb,RM,zE,RP}from"./chunk-qwye1958.js";import{NI,Ud,Uf,XH,zs,xr,Iy,Hf,UN,eq,zZ,_y}from"./chunk-8cghfzb2.js";import"./chunk-44bt78m9.js";import"./chunk-jhnbfj19.js";import"./chunk-4fgdhcwx.js";import"./chunk-0e4gm1kj.js";import"./chunk-vs9r72ta.js";import{_r,YE}from"./chunk-zd9vmkzn.js";import"./chunk-mqc1d0eb.js";import"./chunk-hmke8nhx.js";import"./chunk-z04jrpjy.js";import"./chunk-vefd8qee.js";import"./chunk-4xd6zs3y.js";import"./chunk-pm06b05d.js";import"./chunk-rn84t3sf.js";import"./chunk-0rjm4nx7.js";import{uO,mO,mb,fb,_2}from"./chunk-zj939v0h.js";import"./chunk-a4k9rt7z.js";import"./chunk-sjn0nj4p.js";import"./chunk-bn64x5z5.js";import"./chunk-sns0c35v.js";import"./chunk-zg67wjkh.js";import{r,t,u}from"./chunk-9rkfyt6q.js";function L(){if(E(g.ACCEPTANCE_LIVE)!=="1")return;let o=E(g.ACCEPTANCE_DISCOVERY_ORDER),s=E(g.ACCEPTANCE_DISCOVERY_CAPABILITY);return(o==="forward"||o==="reverse")&&s?{order:o,capability:s}:void 0}function M(o,s,i){if(o.outcome!=="ready"||s!==void 0&&s!==o.sessionUuid)return;return{success:!1,error:{code:"broker_session_ended",message:`Broker session ${o.sessionUuid} for request ${o.requestId} ended (${i}). Device tools cannot acquire a generic replacement on this connection; the launcher must start a new broker request.`,requestId:o.requestId,sessionUuid:o.sessionUuid,reason:i,...ui(i),retryable:!1,nextAction:"relaunch_session_request"}}}function T(o,s){let i=zE(o),d=s&&i&&M(s,i.sessionUuid,i.reason??"unknown");return d?{content:[{type:"text",text:JSON.stringify(d)}],isError:!0}:o}function _(o,s){let i=M(o,s.sessionUuid,s.reason);return i?{content:[{type:"text",text:JSON.stringify(i)}],isError:!0}:void 0}function B(o,s){if(o instanceof kd&&o.handover.code===di)return;return o instanceof Rr&&s?_(s,o):void 0}function H(o,s){return s!==void 0&&o.getTerminalSessionRelease()?.sessionUuid===s.sessionUuid}function F(o){return o.sessions.length>0?[I1(o)]:[]}function k(o){if(o instanceof kd)return o.toPayload();return RP({message:`Session ownership lost for ${o.sessionUuid}: ${o.reason}. `+Nb,sessionUuid:o.sessionUuid,reason:o.reason,release:o.release})}function P(o){return JSON.stringify(k(o))}function U(o){return{content:[{type:"text",text:P(o)}],isError:!0}}function w(o){let s=k(o);return new zi(-32603,P(o),s)}function O(o){return JSON.stringify(RM(o))}function J(o){return{content:[{type:"text",text:O(o)}],isError:!0}}function V(o){return{content:[{type:"text",text:JSON.stringify({error:{code:"ambiguous_session_selector",message:o.message,platform:o.platform,candidates:o.candidates,retryable:!1}})}],isError:!0}}function x(o){return new zi(-32603,O(o),RM(o))}function j(o,s=!1){let i=NI(s),d={content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i,isError:!0};return fb(d,mb(o,!1))}function Y(o){if(o instanceof Ud){let s=NI(o.requestMayHaveDispatched);return new zi(-32603,JSON.stringify(s),s)}if(o instanceof _r){let s=YE(o);return new zi(-32603,JSON.stringify(s),s)}return}function z(o){let s=YE(o);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s,isError:!0}}function q(o){return{error:{code:o.failure.code,message:o.message,retryable:o.failure.retryable,retryAfterMs:o.failure.retryAfterMs,queueWaitMs:o.failure.queueWaitMs,remainingTimeoutMs:o.failure.remainingTimeoutMs}}}function W(o,s=!0){let i=q(o),d={content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i,isError:!0};return fb(d,mb(s,!1))}function b(o){let s=q(o);return new zi(-32603,JSON.stringify(s),s)}var h=-32602;function X(o){if(o===null||typeof o!=="object"||!("code"in o)||o.code!==h)return;let s=r(o).replace(`MCP error ${h}: `,"");return new zi(h,s)}function C(o){let s=r(o),i=o instanceof Error?o.cause:void 0;if(i instanceof _y)return`${s} (daemon connection closed before the response arrived while handling ${i.toolName})`;if(i instanceof xr)return`${s} (request timed out after ${i.timeoutMs}ms while handling ${i.toolName})`;if(i instanceof Error&&(i.name==="AbortError"||i.name==="TimeoutError"))return`${s} (request ${i.name==="TimeoutError"?"timed out":"was aborted"})`;return s}function G(o){let s=XH(o.failure);return{content:[{type:"text",text:JSON.stringify({error:{message:o.message,...s}})}],isError:!0}}async function K(o,s){try{for(let i of F(s))await o.server.sendLoggingMessage({level:"error",logger:"auto-mobile.liveness",data:i})}catch(i){e.warn("[ProxyServer] Failed to forward liveness handover notification",i)}}async function Q(o,s){try{await o.server.sendLoggingMessage({level:"info",logger:"auto-mobile.liveness",data:{code:"session_device_rebound",sessionUuid:s.sessionId,previousDeviceId:s.previousDeviceId,deviceId:s.deviceId,avdName:s.avdName,stableDeviceId:s.stableDeviceId,generation:s.generation}})}catch(i){e.warn("[ProxyServer] Failed to forward session-device rebound",i)}}async function Z(o,s){try{await o.server.notification({method:"notifications/resources/updated",params:{uri:s}})}catch(i){e.warn("[ProxyServer] Failed to forward resource update notification",i)}}function ee(o,s,i){if(o instanceof Rr)return e.warn(`[ProxyServer] Session ownership lost for ${o.sessionUuid}: ${o.reason}`),U(o);if(o instanceof _l)return e.warn(`[ProxyServer] No active device session (released: ${o.reason})`),J(o);if(o instanceof wP)return e.warn(`[ProxyServer] Ambiguous session selector: ${o.message}`),V(o);if(o instanceof Ud)return j(i,o.requestMayHaveDispatched);if(o instanceof _r)return z(o);if(o instanceof zs)return W(o,i);if(o instanceof Uf)return e.warn(`[ProxyServer] Device-control transport failure for ${o.failure.toolName} during ${o.failure.phase}`),G(o);return Hs(o,{toolName:s,source:"ProxyServer"})}function re(o){let s={...o?{[gZ]:{...o}}:{}};return Object.keys(s).length>0?{experimental:s}:{}}function oe(o){return{resources:{subscribe:!0,listChanged:!0},tools:{listChanged:!0},logging:{},prompts:{},...re(o.session)}}function te(o,s){let i={success:!1,error:{code:"session_unavailable",message:`Tool ${s} is unavailable because session request ${o.requestId} is ${o.outcome}. Use the exact bound sessionUuid only after initialize reports ready.`,requestId:o.requestId,outcome:o.outcome,cleanupPending:o.cleanupPending,failure:o.failure??null}};return{isError:!0,content:[{type:"text",text:JSON.stringify(i)}]}}function se(o,s){o.server.setRequestHandler("tools/list",async()=>({tools:[]})),o.server.setRequestHandler("tools/call",async(i)=>te(s,i.params.name))}function ne(o,s){if(s&&s.outcome!=="ready")se(o,s)}async function ie(o,s,i,d){let{name:a,args:c,progressToken:f,extra:m}=s,v=Iy({envelope:m.envelope,meta:m._meta});if(!v){let p=await o.callTool(a,c,f,{onProgress:i,signal:m.signal});return T(p,d.session)}let l=await o.callTool(a,c,f,{onProgress:i,signal:m.signal,declaresTasks:v});return Hf(l)?l:T(l,d.session)}var D=IR({taskId:n()}),ae=IR({taskId:n(),inputResponses:Me(n(),Oe()).optional()});function ce(o){let s=o!==null&&typeof o==="object"?Reflect.get(o,"jsonRpcError"):void 0;return eq(s)?zZ(s):o}function ue(o,s){let i=o.server;_2(i);let d=async(a,c,f)=>{if(!Iy({envelope:f.mcpReq.envelope,meta:f.mcpReq._meta}))throw UN();try{return await s.relayTaskMethod(a,c,!0,f.mcpReq.signal)}catch(m){throw f.mcpReq.signal.throwIfAborted(),ce(m)}};i.setRequestHandler("tasks/get",{params:D},async(a,c)=>d("tasks/get",{taskId:a.taskId},c)),i.setRequestHandler("tasks/update",{params:ae},async(a,c)=>{let f=c.mcpReq.inputResponses??a.inputResponses;return d("tasks/update",{taskId:a.taskId,...f!==void 0&&{inputResponses:f}},c)}),i.setRequestHandler("tasks/cancel",{params:D},async(a,c)=>d("tasks/cancel",{taskId:a.taskId},c))}function le(o,s){o.server.setRequestHandler("resources/list",async()=>{try{return{resources:await s.listAdvertisedResources()}}catch(i){if(i instanceof Rr)throw w(i);if(i instanceof _l)throw x(i);if(i instanceof zs)throw b(i);throw e.error(`[ProxyServer] Failed to list resources: ${i}`),new t(`Failed to list resources from daemon: ${C(i)}`,{cause:i})}}),o.server.setRequestHandler("resources/templates/list",async()=>{try{return{resourceTemplates:await s.listAdvertisedResourceTemplates()}}catch(i){if(i instanceof Rr)throw w(i);if(i instanceof _l)throw x(i);if(i instanceof zs)throw b(i);throw e.error(`[ProxyServer] Failed to list resource templates: ${i}`),new t(`Failed to list resource templates from daemon: ${C(i)}`,{cause:i})}}),o.server.setRequestHandler("resources/read",async(i,d)=>{let a=i.params.uri;if(!a)throw new t("Resource URI is missing in the request");if(i1(a)){let c=await o1(a);if(c)return c;throw new Qp(a)}e.info(`[ProxyServer] Forwarding resource read: ${a}`);try{let c=d8(o.server.getClientCapabilities());return await s.readResource(a,{signal:d.mcpReq.signal,...c!==void 0&&{_meta:c}})}catch(c){if(d.mcpReq.signal.throwIfAborted(),c instanceof Rr)throw w(c);if(c instanceof _l)throw x(c);if(c instanceof zs)throw b(c);let f=Y(c);if(f)throw e.warn(`[ProxyServer] Resource read refused, retryable: ${a} - ${c}`),f;let m=X(c);if(m)throw e.warn(`[ProxyServer] Resource read rejected as invalid params: ${a}`),m;throw e.error(`[ProxyServer] Resource read failed: ${a} - ${c}`),new t(`Failed to read resource from daemon: ${C(c)}`,{cause:c})}})}function de(o){let s=L();return new VE({...o,...s?{acceptanceDiscovery:s}:{}})}function fe(o,s,i){return async({name:d,args:a,progressToken:c,progress:f,extra:m})=>{let v=i.get(d)??!1;e.info(`[ProxyServer] Forwarding tool call: ${d}`);let l=f?(p,y,R)=>{f(p,y,R)}:void 0;try{return await ie(o,{name:d,args:a,progressToken:c,extra:m},l,s)}catch(p){m.signal.throwIfAborted();let y=B(p,s.session);if(y)return y;return ee(p,d,v)}}}function Ye(o={}){let s=o.proxy??de(o.proxyConfig),i=new Map,d=0,a=uO({name:"AutoMobile",version:kn()},oe(o));iM(a),s.onListChanged((l)=>{try{if(l==="tools")d+=1,i.clear(),a.sendToolListChanged();else a.sendResourceListChanged()}catch(p){e.warn(`[ProxyServer] Failed to forward ${l} list_changed notification: ${p}`)}});let c=s.onResourceUpdated((l)=>{Z(a,l)}),f=s.onLivenessHandover((l)=>{K(a,l)}),m=s.onSessionDeviceRebound((l)=>{Q(a,l)}),v=a.server.onclose;return a.server.onclose=()=>{c(),f(),m(),v?.(),s.close().catch((l)=>{e.warn("[ProxyServer] Failed to close daemon proxy",l)})},a.server.setRequestHandler("resources/subscribe",async(l)=>{try{return await s.subscribeResource(l.params.uri),{}}catch(p){throw u(p,"Failed to subscribe to daemon resource")}}),a.server.setRequestHandler("resources/unsubscribe",async(l)=>{try{return await s.unsubscribeResource(l.params.uri),{}}catch(p){throw u(p,"Failed to unsubscribe from daemon resource")}}),a.server.setRequestHandler("ping",async()=>({})),a.server.setRequestHandler("prompts/list",async()=>({prompts:[]})),a.server.setRequestHandler("tools/list",async()=>{try{if(H(s,o.session))return{tools:[]};let l=d,p=await s.listAdvertisedTools(),y=s.isConnected()?p:(()=>{let R=N.getAllTools({includeUnavailable:!0}),I=VH(process.env,new Set(N.getConfigurableToolNames()),o.proxyConfig?.daemonOptions?.enabledTools,o.proxyConfig?.daemonOptions?.disabledTools),A=new Map(R.map((S)=>[S.name,S.defaultEnabled]));return p.filter((S)=>I.get(S.name)??A.get(S.name)??!0)})();if(l===d){i.clear();for(let R of y)i.set(R.name,R.outputSchema!==void 0)}return{tools:y}}catch(l){if(l instanceof Rr)throw w(l);if(l instanceof _l)throw x(l);if(l instanceof zs)throw b(l);throw e.error(`[ProxyServer] Failed to list tools: ${l}`),new t(`Failed to list tools from daemon: ${C(l)}`,{cause:l})}}),mO(a,{progressFailureMessage:"[ProxyServer] Failed to relay progress notification",execute:fe(s,o,i)},{ambiguousDeviceElicitation:o.ambiguousDeviceElicitation??{}}),le(a,s),ue(a,s),ne(a,o.session),{server:a,proxy:s}}export{de as createDaemonMcpProxy,Ye as createProxyMcpServer};
|
|
3
|
+
|
|
4
|
+
//# debugId=E7947795A916DA6364756E2164756E21
|